gpt4 book ai didi

python - 无法将 'auto' 转换为 dtype float 的 EagerTensor

转载 作者:行者123 更新时间:2023-12-04 03:48:06 30 4
gpt4 key购买 nike

我创建了一个包含 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/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com