在我的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传递给基本Layer构造函数来禁用自动广播。
现在,基于错误消息, 我可以 通过将后端设置为
来使此错误消息静音'float64'
。但是,我想深入了解并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'
您提供的输入(虹膜数据集)的输入类型为dtype
float64
,因此Tensorflow的默认权重dtype与输入之间不匹配。Tensorflow不喜欢这样,因为强制转换(更改dtype)的成本很高。操作不同dtype的张量时(例如,比较float32
logit和float64
标签),Tensorflow通常会引发错误。
它所谈论的“新行为”:
图层my_model_1正在将dtype float64的输入张量转换为该图层的float32的dtype,这是TensorFlow 2中的新行为
是它将自动将输入dtype强制转换为float32
。在这种情况下,Tensorflow 1.X可能引发了异常,尽管我不能说我曾经使用过它。
问题内容: 将Tensorflow与Python绑定一起使用时,如何将张量转换为numpy数组? 问题答案: 急切执行默认情况下 处于启用状态,因此只需调用Tensor对象即可。 有关更多信息,请参见NumPy兼容性。值得注意的是(来自文档), Numpy数组可以与Tensor对象共享内存。 对一个的任何更改都可能反映在另一个上。 大胆强调我的。副本可以返回也可以不返回,这是基于数据是在CPU还是
奇怪的情况-下面是代码: 构建项目时(在项目属性中使用编译器选项Xlint:unchecked),我得到一个警告: 警告:[未选中]未选中的强制转换 ArrayList list=(ArrayList)obj[1]; 必需:ArrayList 找到:对象 但用同样的方法来浇铸字符串是可以的。这里有什么问题?
根据keras文件(https://keras.io/layers/convolutional/)Conv1D输出张量的形状为(batch\u size,new\u steps,filters),而输入张量的形状为(batch\u size,steps,input\u dim)。我不明白这是怎么回事,因为这意味着如果你传递一个长度为8000的1d输入,其中batch\u size=1,steps=
我想使用两个包,一个用Keras1.2编写,另一个用TensorFlow编写。我想将构建在tensorflow中的体系结构的一部分用于Keras模型。 这里提出了一个部分的解决方案,但它是针对顺序模型的。关于功能模型的建议--将预处理包装在一个Lambda层中--没有奏效。
我正在查看TensorFlow中的官方批处理规范化层(BN),但它并没有真正解释如何将其用于卷积层。有人知道如何做到这一点吗?特别重要的是,它应用并学习每个特征映射(而不是每个激活)的相同参数。以其他顺序,它应用并学习每个过滤器的BN。 在一个特定的玩具示例中,我想用MNIST上的BN(基本上是2D数据)执行conv2d。因此,我们可以做到: 其中,z=BN(z)将BN应用于每个过滤器创建的每个特
好的,这里有一些东西:我有一个元素 当用户在这个元素中键入内容时,我需要这个元素来强制将键盘布局从任何其他语言切换到英语。我不需要将其发送到服务器。我只需要在输入时强制切换语言。 有人有简单的JS解决方案吗? 这是我一直在想的:理论上。如果我知道它应该转换的语言,那么我就可以写一个JS,把每个符号都替换成英语