Python 多标签图像分类预训练CNN训练中的学习问题
我正在训练CNN将图像分为三类。每个图像可以属于几个类。所以在网络输出中,我期望每个类都有一个概率 当我加载数据时,我有一个带有列的数据框:[imageID,class 1,class 2,class 3]。图像大小为(256256,3),标签为(3,1)(例如:如果图像属于类别1,类别2标签为[1,1,0]) 然后,这是我的模型:Python 多标签图像分类预训练CNN训练中的学习问题,python,keras,deep-learning,tensorflow2.0,multilabel-classification,Python,Keras,Deep Learning,Tensorflow2.0,Multilabel Classification,我正在训练CNN将图像分为三类。每个图像可以属于几个类。所以在网络输出中,我期望每个类都有一个概率 当我加载数据时,我有一个带有列的数据框:[imageID,class 1,class 2,class 3]。图像大小为(256256,3),标签为(3,1)(例如:如果图像属于类别1,类别2标签为[1,1,0]) 然后,这是我的模型: print("Define model") base_model = tf.keras.applications.VGG16(include_t
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)
但我的模型没有学到任何东西,有一个问题,我不知道如何解决它。
这是训练曲线:当只有两个标签类(假设为0和1)时,使用该交叉熵损失。对于每个示例,每个预测都应该有一个浮点值
y_true = [[0., 1.], [0., 0.]]
y_pred = [[0.6, 0.4], [0.4, 0.6]]
当存在两个或多个标签类时,使用此交叉熵损失函数。我们希望标签以单色表示形式提供。如果要以整数形式提供标签,请使用SparseCategoricalCrossentropy loss。每个功能应有#类浮点值
y_true = [[0, 1, 0], [0, 0, 1]]
y_pred = [[0.05, 0.95, 0], [0.1, 0.8, 0.1]]
training=False不应该改为True吗?OP说的是多标签分类,所以使用BinaryCrossentropy的网络设置对我来说似乎是正确的。嗨,谢谢你的回答。然而,我的模型仍然无法学习。@Leili_Kue您的数据集是否平衡?如果没有,也许你可以考虑一些焦点…也许这会有帮助