Tensorflow 中的自定义指标 2. 转换 Y_true 和 Y_pred

问题描述 投票:0回答:1

我正在尝试为 Tensorflow 2 顺序模型实现自定义指标(F1 分数)。作为一种简单的方法,我创建了一个函数来接受 y_true 和 y_pred 并使用 SK learn 来计算结果。我在模型编译指标中添加了这个函数。

from sklearn.metrics import f1_score
def cust_f1_score(y_true,y_pred):
    print(type('Type Y_pred',y_pred))
    print(type('Type Y_true',y_true))
    print('Y_pred Shape',y_pred.shape)
    print('Y_true Shape',y_true.shape)
    print(y_pred)
    print(y_true)
    return f1_score(y_true,y_pred)

#Input layer
input_layer = Input(shape=(784,))
#Dense hidden layer
layer1 = Dense(50,activation='sigmoid',kernel_initializer=tf.keras.initializers.glorot_normal(seed=30))(input_layer)
#output layer
output = Dense(10,activation='softmax',kernel_initializer=tf.keras.initializers.glorot_normal(seed=0))(layer1)
#Creating a model
model = Model(inputs=input_layer,outputs=output)
optimizer = tf.keras.optimizers.Adam(0.01)
model.compile(optimizer=optimizer, loss='categorical_crossentropy',metrics=['accuracy',cust_f1_score])#get_f1
model.fit(X_train,Y_train,epochs=2, validation_data=(X_test,Y_test), batch_size=16, )

我得到以下关于形状和类型信息的输出,但过程失败,Sklearn 没有获得正确的数组

Type Y_pred <class 'tensorflow.python.framework.ops.Tensor'>
Type Y_true <class 'tensorflow.python.framework.ops.Tensor'>
Y_pred Shape (None, 10)
Y_true Shape (None, None)
Tensor("dense_71/Identity:0", shape=(None, 10), dtype=float32)
Tensor("dense_71_target:0", shape=(None, None), dtype=float32)
TypeError: Expected sequence or array-like, got

如何获取 y_true 和 y_pred 的正确值并使用它们?我知道有使用 Keras Backend 的解决方案,但它们不是很直观。

python tensorflow machine-learning deep-learning tensorflow2.0
1个回答
-1
投票

您的错误显示,“TypeError:预期序列或类似数组,得到...”

您的解决方案在于正确重新处理 y_true 值,因为您获得 [None,10] 形状的输出,(无,此处代表批次),您应该确保您的目标序列/数组应该是一个热编码为长度10 .您可以使用 sklearn 的 LabelBinarizer 来实现此目的。

© www.soinside.com 2019 - 2024. All rights reserved.