WARNING:tensorflow:Layer my_model将输入的张量从dtype float64转为层的dtype float32,这是在TensorFlow 2中的新行为。

问题描述 投票:0回答:1

在我的Tensorflow神经网络开始训练之前,打印出以下警告。

WARNING:tensorflow:Layer my_model正在将一个输入张量从dtype float64投到该层的dtype float32,这是TensorFlow 2中的新行为。 该层的dtype float32是因为它的dtype默认为floatx。如果你打算用float32运行这个层,你可以放心地忽略这个警告。

如果有疑问,这个警告可能只是在你将TensorFlow 1.X模型移植到TensorFlow 2中时才会出现的问题。 要改变所有层的默认值为dtype float64,调用 tf.keras.backend.set_floatx('float64').

如果只想改变这个图层,可以将dtype='float64'传递给图层构造函数。如果你是这个图层的作者,你可以通过传递autocast=False到基础图层构造函数来禁止自动转换。

现在,根据给出的建议。我可以让这个错误信息静音. 但是,我想弄清楚这一点,并设置正确的。dtypes 手动。

完整的代码。

import tensorflow as tf
from tensorflow.keras.layers import Dense, Concatenate
from tensorflow.keras import Model
from sklearn.datasets import load_iris
iris, target = load_iris(return_X_y=True)

X = iris[:, :3]
y = iris[:, 3]

ds = tf.data.Dataset.from_tensor_slices((X, y)).shuffle(25).batch(8)

class MyModel(Model):
  def __init__(self):
    super(MyModel, self).__init__()
    self.d0 = Dense(16, activation='relu')
    self.d1 = Dense(32, activation='relu')
    self.d2 = Dense(1, activation='linear')

  def call(self, x):
    x = self.d0(x)
    x = self.d1(x)
    x = self.d2(x)
    return x

model = MyModel()

loss_object = tf.keras.losses.MeanSquaredError()

optimizer = tf.keras.optimizers.Adam(learning_rate=5e-4)

loss = tf.keras.metrics.Mean(name='loss')
error = tf.keras.metrics.MeanSquaredError()

@tf.function
def train_step(inputs, targets):
    with tf.GradientTape() as tape:
        predictions = model(inputs)
        run_loss = loss_object(targets, predictions)
    gradients = tape.gradient(run_loss, model.trainable_variables)
    optimizer.apply_gradients(zip(gradients, model.trainable_variables))
    loss(run_loss)
    error(predictions, targets)

for epoch in range(10):
  for data, labels in ds:
    train_step(data, labels)

  template = 'Epoch {:>2}, Loss: {:>7.4f}, MSE: {:>6.2f}'
  print(template.format(epoch+1,
                        loss.result(),
                        error.result()*100))
  # Reset the metrics for the next epoch
  loss.reset_states()
  error.reset_states()
python tensorflow machine-learning deep-learning neural-network
1个回答
0
投票

tl;dr 要想不发出这个警告,请手动将你的输入投向 float32

X = tf.cast(iris[:, :3], tf.float32) 
y = tf.cast(iris[:, 3], tf.float32)

或与 numpy:

X = np.array(iris[:, :3], dtype=np.float32)
y = np.array(iris[:, 3], dtype=np.float32)

解释

默认情况下,Tensorflow使用 floatx,默认为 float32,因为对于深度学习来说,这已经足够了。你可以验证一下。

import tensorflow as tf
tf.keras.backend.floatx()
Out[3]: 'float32'

你提供的输入(Iris数据集), 是dtype的. float64,所以Tensorflow默认的权重dtype和输入之间不匹配。Tensorflow不喜欢这样,因为铸造(改变dtype)的成本很高。Tensorflow一般会在操作不同dtype的时侯抛出一个错误(例如,比较不同dtype的时侯,Tensorflow会抛出一个错误。float32 对数和 float64 标签)。)

新行为 它在说什么。

图层my_model_1将输入的张量从dtype float64转换为图层的dtype float32,这是TensorFlow 2中的新行为。

是否会自动将输入的dtype转为 float32. Tensorflow 1.X可能在这种情况下抛出了一个异常,虽然我不能说我曾经使用过它。

© www.soinside.com 2019 - 2024. All rights reserved.