最近做实验发现了一个奇怪的现象,让我有些迷
我的样本属于文本多标签分类问题,在metrics的选择上出现了问题,放几个实验结果。
模型是这样的
def birnn2(max_len = 29, vocab_size=394, embed_size=23):
inputs = Input(shape=(max_len))
embedding_layer = Embedding(input_dim=394,
output_dim=23,
input_length=29,
trainable=True)(inputs)
bi_lsty_layer = Bidirectional(LSTM(units=100))(embedding_layer)
out = Dense(units=504, activation='sigmoid')(bi_lsty_layer)
model = Model(inputs, out)
return model
有两个自定义函数
def myloss(y_true, y_pred):
loss = tf.reduce_mean(tf.keras.losses.binary_crossentropy(y_true=y_true, y_pred=y_pred))
return loss
def My_acc(y_true,y_pred):
return tf.reduce_sum(tf.cast(y_pred * y_true > 0.5, tf.float32)) / tf.reduce_sum(y_true)
第一个模型
model.compile(optimizer='adam',
loss = myloss,
metrics = ['acc'])
model.fit(X_Train,Y_Train,
epochs=10,
batch_size=2)
第二个模型,因为我的实验要改动loss,所以上一个自定义的loss计算其实就是binary_crossentropy,我只是想看一下自定义函数正不正确,结果。。
model1 = birnn2()
model1.summary()
model1.compile(optimizer='adam',
loss = 'binary_crossentropy',
metrics = ['acc'])
model1.fit(X_Train,Y_Train,
epochs=10,
batch_size=2)
以上两个模型除了在loss有所变动,并没有改变metrics的‘acc’,数据都是一样的。但是,这结果也差太多了吧
我想,会不会是编译自动根据loss选择metrics的acc
model3 = birnn2()
model3.summary()
model3.compile(optimizer='adam',
loss = 'binary_crossentropy',
metrics = ['acc','accuracy',tf.keras.metrics.CategoricalAccuracy(),tf.keras.metrics.BinaryAccuracy(),tf.keras.metrics.TopKCategoricalAccuracy(),My_acc])
model3.fit(X_Train,Y_Train,
epochs=10,
batch_size=2)
虽然是多标签,多分类的我也试了一下,还有一个自己的。
看这个结果的话,第一个模型的metrics结果和categorical_ accuracy是相近的。但是我在第一个模型metrics并没有选择它,从第三个实验也可以看出,‘acc’=‘accuracy’和‘categorical_accuracy'没什么关系。
这是怎么回事儿呢?