我正在将一个多标签分类器拟合到(train_x, train_y)
上,在监控验证集(val_x, val_y)
上的损失和准确率:
classification_model.compile(optimizer=tf.keras.optimizers.Adam(learning_rate=0.0002),
loss=tf.keras.losses.BinaryCrossentropy(from_logits=True),
metrics=['accuracy'])
classification_model.fit(train_x, train_y, validation_data=(val_x, val_y), \
epochs=10,
batch_size=10
)
这将产生以下输出:
Epoch 1/10
50/50 [==============================] - ETA: 0s - loss: 0.1186 - accuracy: 0.7094
Epoch 1: val_loss improved from 0.15329 to 0.11998, saving model to best_classification_model.tf
50/50 [==============================] - 12s 186ms/step - loss: 0.1186 - accuracy: 0.7094 - val_loss: 0.1200 - val_accuracy: 0.6280
Epoch 2/10
50/50 [==============================] - ETA: 0s - loss: 0.0848 - accuracy: 0.7776
Epoch 2: val_loss improved from 0.11998 to 0.10281, saving model to best_classification_model.tf
50/50 [==============================] - 8s 167ms/step - loss: 0.0848 - accuracy: 0.7776 - val_loss: 0.1028 - val_accuracy: 0.7200
Epoch 3/10
50/50 [==============================] - ETA: 0s - loss: 0.0652 - accuracy: 0.8176
Epoch 3: val_loss improved from 0.10281 to 0.09259, saving model to best_classification_model.tf
50/50 [==============================] - 10s 202ms/step - loss: 0.0652 - accuracy: 0.8176 - val_loss: 0.0926 - val_accuracy: 0.7560
Epoch 4/10
50/50 [==============================] - ETA: 0s - loss: 0.0522 - accuracy: 0.8236
Epoch 4: val_loss improved from 0.09259 to 0.08710, saving model to best_classification_model.tf
50/50 [==============================] - 10s 206ms/step - loss: 0.0522 - accuracy: 0.8236 - val_loss: 0.0871 - val_accuracy: 0.7480
Epoch 5/10
50/50 [==============================] - ETA: 0s - loss: 0.0418 - accuracy: 0.8337
Epoch 5: val_loss improved from 0.08710 to 0.08441, saving model to best_classification_model.tf
50/50 [==============================] - 10s 209ms/step - loss: 0.0418 - accuracy: 0.8337 - val_loss: 0.0844 - val_accuracy: 0.7640
为了澄清每个选项的含义:
正确标签的总数量:对于每个图像,输出20个标签,其中一些是0,一些是1。报告正确标签的总数(=正确的0的数量+正确的1的数量),并将其除以标签的总数(=20*num_images)。我不认为这是发生的情况,因为这可能会导致更高的准确性。即使训练更长时间,仅仅预测0也会给出超过90%的准确率!而且事实并非如此。
所有标签都正确的行的总数:计算所有标签(0和1)都正确的图像数量,并将其除以图像的数量。
模型输出和验证标签如下所示。
>>> classification_model.predict(val_x) # shape: (250, 20)
array([[ -9.385, -5.443, -8.274, ..., 1.936, -11.607, -1.867],
[-10.523, 3.074, -7.765, ..., -2.925, -10.35 , -2.602],
[ -7.872, -7.525, -4.877, ..., -6.434, -9.063, -8.485],
...,
[ -6.04 , -4.826, 3.537, ..., -5.68 , -7.276, -6.05 ],
[ -5.734, -6.399, -5.288, ..., -5.495, -6.673, 0.06 ],
[ -9.458, -7.892, 1.391, ..., -6.422, -9.75 , -7.702]],
dtype=float32)
>>> val_y # also shape: (250,20)
array([[0., 0., 0., ..., 0., 0., 1.],
[0., 1., 0., ..., 0., 0., 0.],
[0., 0., 0., ..., 0., 0., 0.],
...,
[0., 0., 1., ..., 0., 0., 0.],
[0., 0., 0., ..., 0., 0., 1.],
[0., 0., 1., ..., 0., 0., 0.]])