Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 多标签图像分类预训练CNN训练中的学习问题_Python_Keras_Deep Learning_Tensorflow2.0_Multilabel Classification - Fatal编程技术网

Python 多标签图像分类预训练CNN训练中的学习问题

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

我正在训练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_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您的数据集是否平衡?如果没有,也许你可以考虑一些焦点…也许这会有帮助