我创建了一个包含 27 列的数据集
。
我创建了一个 Autoencoder
用于异常检测,如下所示:
input_layer = Input(shape=(27,))
x = layers.Dense(20,activation='relu')(input_layer)
x = layers.Dense(14,activation='relu')(x)
x = layers.Dense(8, activation='relu')(x)
x = layers.Dense(14, activation='relu')(x)
x = layers.Dense(20,activation='relu')(x)
output = layers.Dense(27,activation='relu')(x)
AE = keras.models.Model(inputs=input_layer, outputs=output)
optimizer = keras.optimizers.Adam()
loss_fn = keras.losses.MeanSquaredError
iterator = iter(train_dataset)
a = iterator.get_next()
out = AE(a,training=True)
loss_value = loss_fn(a, out)
为什么会出现如下错误?
TypeError: Cannot convert 'auto' to EagerTensor of dtype float
最佳答案
免责声明
这个答案假设我们最初写了:
import tensorflow
from tensorflow import keras
请注意,如果没有任何示例数据,则很难确定这是否适用于您的情况。但是我通过了解以下内容解决了产生相同错误的问题。
解决方案 1:使用 MeanSquaredError 类
出现此问题是因为 keras.losses.MeanSquaredError
是一个类,according to the tensorflow website .因此,您必须首先使用括号 ()
对其进行实例化,而不是将其作为函数进行别名化。
因此,下面一行解决了这个问题:
loss_fn = keras.losses.MeanSquaredError()
方案二:使用MSE函数
另一种选择是别名 keras.losses.MSE
,它是 keras.metrics.mean_squared_error
的别名,according to this site .如果您查看源代码,您会发现这是一个在任何类定义之外的函数。
因此,下面一行解决了这个问题:
loss_fn = keras.losses.MSE
重要:两种解决方案产生不同的结果
如果输入多于一维,则上述两个解决方案的输出是不同的。第一个产生一个标量,第二个产生一个数组。为了使它们相同,您必须:
- 在实例化解决方案 1 中的类时传递一个
NONE
类型缩减。损失值现在是一个数组。
loss_fn = keras.losses.MeanSquaredError(reduction=keras.losses.Reduction.NONE)
或
- 另外从解决方案 2 中的损失函数的输出中取平均值。损失值现在是一个标量。
loss_value = tensorflow.reduce_mean(loss_fn(a, out))
关于python - 无法将 'auto' 转换为 dtype float 的 EagerTensor,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64831510/