【问题标题】:Keras/TensorFlow: Adding a new metric with an inequalityKeras/TensorFlow:添加一个不等式的新指标
【发布时间】:2017-07-26 13:23:42
【问题描述】:

我正在尝试使用带有 TensorFlow 后端的 Keras 来构建 ANN。在每个时代之后,我想存储在所述答案的 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。

非常感谢

【问题讨论】:

    标签: python tensorflow keras


    【解决方案1】:

    K.less_equal(x, y) 返回一个tensorbool 值,并且在Tensorflow 中bool 与整数不同(正如我们在类C 语言中所习惯的那样)。您需要相应地使用K.cast(x, dtype) 将其转换为int32float32。一般来说,张量是一个代数变量,因此您不能将其视为常规数组。因此,您应该使用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]
    

    请注意浮点数或 32 位整数的工作范围。在某些情况下,您可能希望改用 int64float64

    【讨论】:

    • 谢谢。但是,这似乎不起作用,我收到错误 ValueError: Cannot convert an unknown Dimension to a Tensor: ?
    • @jlt199 你的新错误是由y_true.shape[0]引起的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-14
    • 2018-02-07
    • 1970-01-01
    • 1970-01-01
    • 2021-09-06
    • 2020-06-17
    • 2020-09-26
    相关资源
    最近更新 更多