如何在功能 API 中正确使用 Tensorflow 插件的指标?

Joe*_*eBe 11 python keras tensorflow

我有一个 LSTM 模型,可以使用多元智能手机传感器数据对人类活动进行二元分类。这两个类是不平衡的(1:50)。因此,我想使用 F1-score 作为指标,但我看到它已被弃用作为指标。

然而,在最佳实践之前,对度量使用回调函数以确保将其应用于整个数据集,但最近TensorFlow 插件重新引入了 F1-Score

我现在在将此分数应用于我的功能 API 时遇到了问题。这是我目前正在运行的代码:

import tensorflow as tf 
import tensorflow_addons as tfa
from tensorflow import kerasdef

create_model(n_neurons=150, learning_rate=0.01, activation="relu", loss="binary_crossentropy"):

   #create input layer and assign to current output layer
   input_ = keras.layers.Input(shape=(X_train.shape[1],X_train.shape[2])) 

   #add LSTM layer
   lstm = keras.layers.LSTM(n_neurons, activation=activation)(input_)

   #Output Layer
   output = keras.layers.Dense(1, activation="sigmoid")(lstm)

   #Create Model
   model = keras.models.Model(inputs=[input_], outputs=[output])

   #Add optimizer
   optimizer=keras.optimizers.SGD(lr=learning_rate, clipvalue=0.5)

   #Compile model
   model.compile(loss=loss, optimizer=optimizer, metrics=[tfa.metrics.F1Score(num_classes=2, average="micro")])

   print(model.summary())

   return model

#Create the model
model = create_model()

#fit the model
history = model.fit(X_train,y_train, 
                epochs=300, 
                validation_data=(X_val, y_val))
Run Code Online (Sandbox Code Playgroud)

如果我为 metric 参数使用另一个值average(例如,average=Noneor average="macro"),那么在拟合模型时我会收到一条错误消息:

ValueError:两个形状中的维度 0 必须相等,但分别为 2 和 1。形状为 [ 2 ] 和 [ 1 ]。对于具有输入形状的“AssignAddVariableOp”(操作:“AssignAddVariableOp”):[ ]、[ 1 ]。

如果我使用这个值,average="micro"我不会得到错误,但是 F1 分数0贯穿整个学习过程,而我的损失会减少。

我相信我在这里仍然做错了什么。有人可以为我解释一下吗?

til*_*lmo 7

更新的答案:关键是导入 tf.keras,而不是 keras。然后你可以使用例如 tf.keras.metrics.Precision 或 tfa.metrics.F1Score 没有问题。另请参见此处

旧答案:tensorflow-addons 的问题在于当前版本 (0.6.0) 的实现只计算精确匹配,例如 1 和 0.99 的比较产生 0。当然,这在神经网络中实际上是无用的. 这已在 0.7.0(尚未发布)中修复。您可以按如下方式安装它:

pip3 install --upgrade pip
pip3 install tfa-nightly
Run Code Online (Sandbox Code Playgroud)

然后使用一个阈值(低于阈值的都计为 0,否则计为 1):

tfa.metrics.FBetaScore(num_classes=2,average="micro",threshold=0.9)
Run Code Online (Sandbox Code Playgroud)

另见https://github.com/tensorflow/addons/issues/490average此处讨论了其他值的问题:https : //github.com/tensorflow/addons/issues/746

请注意,还有另外两个问题可能会导致无用的结果,另请参见https://github.com/tensorflow/addons/issues/818

  1. 该模型使用二元分类,但 tfa 中的 f1-score 假设使用单热编码进行分类
  2. f1-score 在验证的每个批处理步骤中调用。

使用 Keras 指标时不应出现这些问题。