【问题标题】:tensorflow: InvalidArgumentError while find the AUC scoretensorflow:InvalidArgumentError 同时找到 AUC 分数
【发布时间】:2021-05-18 07:56:05
【问题描述】:

我有一个标签为 0 和 1 的数据集,这是二元分类问题。尝试使用 tf.keras.metrics.AUC() 作为 model.compile(.. 函数中的指标来查找 AUC 分数时出错。

代码:

initializer = tf.keras.initializers.RandomUniform(minval=0., maxval=1.)

model = tf.keras.models.Sequential()
model.add(tf.keras.Input(shape=(2,)))
model.add(tf.keras.layers.Dense(4, activation='tanh', kernel_initializer=initializer))
model.add(tf.keras.layers.Dense(8, activation='tanh', kernel_initializer=initializer))
model.add(tf.keras.layers.Dense(16, activation='tanh', kernel_initializer=initializer))
model.add(tf.keras.layers.Dense(8, activation='tanh', kernel_initializer=initializer))
model.add(tf.keras.layers.Dense(4, activation='tanh', kernel_initializer=initializer))
model.add(tf.keras.layers.Dense(1))

model.compile(loss= tf.keras.losses.BinaryCrossentropy(),
                      optimizer = tf.optimizers.SGD(momentum=0.9,), 
            metrics=['accuracy', tf.keras.metrics.AUC()])

model.fit(X, y, validation_data=(X_val, y_val), epochs=10)

如果我从指标中删除 AUC,代码运行良好。

错误:

InvalidArgumentError:断言失败:[预测必须 >= 0] [条件 x >= y 在元素方面不成立:] [x (sequential_48/dense_293/BiasAdd:0) = ] [[2.12408257][2.12408257][-2.12408257]...] [y (Cast_10/x:0) = ] [0]
[[{{节点 assert_greater_equal/Assert/AssertGuard/else/_1/assert_greater_equal/Assert/AssertGuard/Assert}}]] [操作:__inference_train_function_120642]

函数调用栈:train_function

如何找到 AUC 分数/如何将 AUC 分数设置为编译中的指标?

【问题讨论】:

    标签: python tensorflow tensorflow2.0 auc


    【解决方案1】:

    您在最后一个密集层中缺少激活函数。如果我们不提及默认情况下,它将考虑线性激活,这意味着您可以获得任何值,包括负值。

    InvalidArgumentError:断言失败:[预测必须 >= 0] [条件 x >= y 在元素方面不成立:] [x (sequential_48/dense_293/BiasAdd:0) = ] [[2.12408257][2.12408257][-2.12408257]...]

    If you can check above error, it is saying the same (i.e predictions for your model must be >=0), but your model return [[2.12408257][2.12408257][-2.12408257]...] values.

    为避免这种情况,您应该在最后一个密集层添加sigmoid 激活函数,如下所示。

    initializer = tf.keras.initializers.RandomUniform(minval=0., maxval=1.)
    model = tf.keras.models.Sequential()
    model.add(tf.keras.Input(shape=(2,)))
    model.add(tf.keras.layers.Dense(4, activation='tanh', kernel_initializer=initializer))
    model.add(tf.keras.layers.Dense(8, activation='tanh', kernel_initializer=initializer))
    model.add(tf.keras.layers.Dense(16, activation='tanh', kernel_initializer=initializer))
    model.add(tf.keras.layers.Dense(8, activation='tanh', kernel_initializer=initializer))
    model.add(tf.keras.layers.Dense(4, activation='tanh', kernel_initializer=initializer))
    model.add(tf.keras.layers.Dense(1, activation='sigmoid'))
    
    model.compile(loss= tf.keras.losses.BinaryCrossentropy(),
                          optimizer = tf.optimizers.SGD(momentum=0.9,), 
                metrics=['accuracy', tf.keras.metrics.AUC()])
    
    model.fit(X, y, validation_data=(X_val, y_val), epochs=10)
    

    【讨论】:

    • 正值或有界值绝不是计算 PR/ROC 的要求。为什么tensorflow会这样实现?
    猜你喜欢
    • 2020-02-23
    • 2017-07-16
    • 2017-10-25
    • 2020-07-13
    • 2020-08-15
    • 2016-04-09
    • 2020-11-27
    • 2018-09-07
    • 2016-06-19
    相关资源
    最近更新 更多