繁体   English   中英

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

[英]WARNING:tensorflow:Layer my_model is casting an input tensor from dtype float64 to the layer's dtype of float32, which is new behavior in TensorFlow 2

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

警告:tensorflow:Layer my_model 正在将输入张量从 dtype float64 转换为 float32 层的 dtype,这是 TensorFlow 2 中的新行为。该层具有 dtype float32,因为它的 dtype 默认为 floatx。 如果您打算在 float32 中运行此层,则可以安全地忽略此警告。

如果有疑问,如果您将 TensorFlow 1.X 模型移植到 TensorFlow 2,此警告可能只是一个问题。要将所有层更改为默认情况下具有 dtype float64,请调用tf.keras.backend.set_floatx('float64')

要仅更改此图层,请将 dtype='float64' 传递给图层构造函数。 如果您是该层的作者,您可以通过将 autocast=False 传递给基础层构造函数来禁用自动转换。

现在,根据错误消息,我可以通过将后端设置为'float64'来消除此错误消息 但是,我想dtypes手动设置正确的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()

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 的张量时通常会抛出错误(例如,比较float32 logits 和float64标签)。

它正在谈论的“新行为”:

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

是它会自动将输入数据类型转换为float32 在这种情况下,Tensorflow 1.X 可能会抛出异常,尽管我不能说我曾经使用过它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM