Saya mencoba untuk melatih implementasi Keras Deeplabv3 + ini pada Pascal VOC2012, menggunakan model yang sudah dilatih sebelumnya (yang juga dilatih tentang dataset itu).
Saya mendapat hasil yang aneh dengan akurasi dengan cepat konvergen ke 1.0:
5/5 [==============================] - 182s 36s/step - loss: 26864.4418 - acc: 0.7669 - val_loss: 19385.8555 - val_acc: 0.4818
Epoch 2/3
5/5 [==============================] - 77s 15s/step - loss: 42117.3555 - acc: 0.9815 - val_loss: 69088.5469 - val_acc: 0.9948
Epoch 3/3
5/5 [==============================] - 78s 16s/step - loss: 45300.6992 - acc: 1.0000 - val_loss: 44569.9414 - val_acc: 1.0000
Pengujian model juga memberikan akurasi 100%.
Saya memutuskan untuk merencanakan prediksi pada kumpulan gambar acak yang sama sebelum dan sesudah pelatihan, dan menemukan bahwa model tersebut didorong untuk mengatakan bahwa semuanya hanyalah latar belakang (itulah kelas 1 di Pascal VOC2012).
Saya cukup baru dalam belajar mendalam dan akan membutuhkan bantuan untuk mencari tahu dari mana ini bisa berasal.
Saya pikir mungkin itu adalah fungsi kerugian saya, yang saya definisikan sebagai:
def image_categorical_cross_entropy(y_true, y_pred):
"""
:param y_true: tensor of shape (batch_size, height, width) representing the ground truth.
:param y_pred: tensor of shape (batch_size, height, width) representing the prediction.
:return: The mean cross-entropy on softmaxed tensors.
"""
return tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits_v2(logits=y_pred, labels=y_true))
Saya agak tidak yakin apakah tensor saya memiliki bentuk yang tepat. Saya menggunakan dataset API TF untuk memuat .tfrecord
file, dan tensor anotasi saya berbentuk (batch_size, height, width)
. Apakah (batch_size, height, width, 21)
yang dibutuhkan? Kesalahan lain dari dalam model muncul ketika saya mencoba untuk memisahkan gambar penjelasan menjadi tensor yang berisi 21 gambar (satu untuk setiap kelas):
tensorflow.python.framework.errors_impl.InvalidArgumentError: Incompatible shapes: [12,512,512,21] vs. [12,512,512]
[[Node: metrics/acc/Equal = Equal[T=DT_INT64, _device="/job:localhost/replica:0/task:0/device:GPU:0"](metrics/acc/ArgMax, metrics/acc/ArgMax_1)]]
[[Node: training/Adam/gradients/bilinear_upsampling_2_1/concat_grad/Slice_1/_13277 = _Recv[client_terminated=false, recv_device="/job:localhost/replica:0/task:0/device:GPU:1", send_device="/job:localhost/replica:0/task:0/device:CPU:0", send_device_incarnation=1, tensor_name="edge_62151_training/Adam/gradients/bilinear_upsampling_2_1/concat_grad/Slice_1", tensor_type=DT_FLOAT, _device="/job:localhost/replica:0/task:0/device:GPU:1"]()]]
Terima kasih untuk bantuannya!