训练预训练 CNN 进行多标签图像分类时的学习问题

时间:2021-05-07 07:02:30

标签: python keras deep-learning tensorflow2.0 multilabel-classification

我正在尝试训练 CNN 对图像进行 3 类分类。每个图像可以属于多个类。所以在网络输出中,我希望每个类都有一个概率。

当我加载数据时,我有一个带有列的 Pandas 数据框:[imageID, class 1, class 2, class 3]。图片大小为 (256,256,3),标签为 (3,1)(例如:如果图片属于第 1 类,第 2 类标签为 [1,1,0])

然后,这是我的模型:

print("Define model")
base_model = tf.keras.applications.VGG16(include_top=False, input_shape=(256,256,3),weights='imagenet')
base_model.trainable = True
fine_tune_at = 15

for layer in base_model.layers[:fine_tune_at]:
    layer.trainable =  False


global_average_layer = tf.keras.layers.GlobalAveragePooling2D()
prediction_layer = tf.keras.layers.Dense(3, activation='sigmoid')
inputs = tf.keras.Input(shape=(256,256,3))
x = base_model(inputs, training=False)

x = global_average_layer(x)
x = tf.keras.layers.Dropout(0.2)(x)
outputs = prediction_layer(x)

model = tf.keras.Model(inputs, outputs)


base_learning_rate = 0.00001
model.compile(optimizer=tf.keras.optimizers.Adam(lr=base_learning_rate),
              loss=tf.keras.losses.BinaryCrossentropy(from_logits=False), #True
              metrics=['accuracy'])

print("Training")
history = model.fit(train_generator, epochs = 75, validation_data= val_generator)

但是我的模型没有学到任何东西,有一个问题,我不知道如何解决。 这是训练曲线:training curve

1 个答案:

答案 0 :(得分:0)

https://www.tensorflow.org/api_docs/python/tf/keras/losses/BinaryCrossentropy
只有两个标签类别(假设为 0 和 1)时,使用此交叉熵损失。对于每个示例,每个预测都应该有一个浮点值。

y_true = [[0., 1.], [0., 0.]]
y_pred = [[0.6, 0.4], [0.4, 0.6]]

https://www.tensorflow.org/api_docs/python/tf/keras/losses/CategoricalCrossentropy
当有两个或多个标签类别时,使用此交叉熵损失函数。我们希望标签以 one_hot 表示形式提供。如果您想以整数形式提供标签,请使用 SparseCategoricalCrossentropy loss。每个特征应该有 # 个类浮点值。

y_true = [[0, 1, 0], [0, 0, 1]]
y_pred = [[0.05, 0.95, 0], [0.1, 0.8, 0.1]]