我正在尝试使用带有 TensorFlow 后端的 Keras 来构建人工神经网络。在每个纪元之后,我想存储在指定答案的 x 点内的数据数量(目前我使用的是 8)。我相信在 Keras/TensorFlow 中执行此操作的方法是构建一个新指标。我已经用这段代码试过了:
import keras.backend as K
def inRange(y_true, y_pred):
return K.sum(K.less_equal(K.abs(y_true-y_pred), 8)) / y_true.shape[0]
# Compile model
model.compile(loss='mean_squared_error', optimizer='adam', metrics=['accuracy', inRange])
但我不断收到错误,最新的是:
TypeError: Value passed to parameter 'input' has DataType bool not in list of allowed values: float32, float64, int64, int32, uint8, uint16, int16, int8, complex64, complex128, qint8, quint8, qint32, float16
谁能帮我解决这个问题?
我在使用 Spyder IDE 的 Windows 10 环境中使用 Anaconda Python 3.5、Tensorflow 1.1.0 和 Keras 2.0.6。
非常感谢
请您参考如下方法:
K.less_equal(x, y)返回 bool 值的 tensor,在 Tensorflow 中 bool 与整数不同(正如我们在类 C 语言中习惯的那样) .您需要使用 K.cast(x, dtype) 进行转换相应地为 int32 或 float32。一般来说,张量是一个代数变量,所以你不能把它当作常规数组。因此,您应该使用 K.shape(x)而不是 x.shape。尝试这样的事情:
def inRange(y_true, y_pred):
t = K.sum(K.cast(K.less_equal(K.abs(y_true-y_pred), 8.0), 'float32'))
return t / K.shape(y_true)[0]
请注意 float 或 32 位整数的工作范围。在某些情况下,您可能希望改用 int64 或 float64。
