Skip to main content
 首页 » 编程设计

python之凯拉斯/ tensorflow : Adding a new metric with an inequality

2025年02月15日25del

我正在尝试使用带有 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。