我正在尝试训练 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)
答案 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]]