tensorflow:InvalidArgumentError,同时找到 AUC 分数

问题描述

我有一个标签为 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,kernel_initializer=initializer))
model.add(tf.keras.layers.Dense(16,kernel_initializer=initializer))
model.add(tf.keras.layers.Dense(4,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 分数设置为编译中的指标?

解决方法

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

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,kernel_initializer=initializer))
model.add(tf.keras.layers.Dense(16,kernel_initializer=initializer))
model.add(tf.keras.layers.Dense(4,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)