Tujuan saya adalah membuat model yang dapat mengklasifikasikan gambar tergantung apakah SATU tanda air tertentu ada atau tidak. Jika saya ingin memeriksa tanda air yang berbeda, idealnya itu akan membuat kumpulan data lain dengan tanda air baru itu, dan melatih kembali modelnya. Seperti yang saya mengerti ini adalah pengklasifikasi biner.

Apakah ini pendekatan yang tepat?

Saya terjebak dengan model saya untuk mengidentifikasi apakah gambar memiliki tanda air di atasnya atau tidak. Metrik saya tidak berpindah dari. Contoh:

loss: 0.6931 - accuracy: 0.5000 - val_loss: 0.6931 - val_accuracy: 0.5000

Saya telah menyiapkan struktur folder data seperti:

Latihan

  • Tanda air
  • Tanpa_tanda air

Validasi

  • Tanda air
  • Tanpa_tanda air

Saya telah menggunakan kumpulan data dengan 1000 gambar di setiap kategori. Berikut adalah contoh dataset saya dengan tanda air saya sendiri:

Saya harap Anda dapat membantu dengan ini ....

  1. Bagaimana saya bisa mengubah model saya untuk "mengenali" tanda air?
  2. Mengapa "kerugian" dan "akurasi" saya tidak bergerak meskipun saya mengubah ukuran gambar, epoch, dataset?
  3. Haruskah saya melatih model hanya dengan gambar tanda air dengan augmentasi dan tanpa latar belakang?
model = tf.keras.models.Sequential([
        tf.keras.layers.Conv2D(64, (3,3), activation='relu', input_shape=(250, 250, 3)),
        tf.keras.layers.MaxPooling2D(2, 2),
        tf.keras.layers.Conv2D(64, (3,3), activation='relu'),
        tf.keras.layers.MaxPooling2D(2,2),
        tf.keras.layers.Conv2D(128, (3,3), activation='relu'),
        tf.keras.layers.MaxPooling2D(2,2),
        tf.keras.layers.Conv2D(128, (3,3), activation='relu'),
        tf.keras.layers.MaxPooling2D(2,2),
        tf.keras.layers.Flatten(),
        tf.keras.layers.Dropout(0.5),
        tf.keras.layers.Dense(512, activation='relu'),
        tf.keras.layers.Dense(1, activation='sigmoid')
])

model.compile(loss = 'binary_crossentropy',
                      optimizer='rmsprop',
                      metrics=['accuracy'])

history = model.fit(train_generator, 
                  epochs=25,
                  validation_data = validation_generator,
                  verbose = 1,
                  validation_steps=3)

Terima kasih

0
Javier Moncayo 12 Mei 2021, 20:12

1 menjawab

Jawaban Terbaik

Karena Anda melakukan klasifikasi biner, sudahkah Anda menyetel parameter class_mode dalam metode ImageDataGenerator.flow_from_directory ke 'binary'? Standarnya adalah 'categorical', yang seharusnya tidak Anda gunakan di sini karena Anda memiliki satu simpul keluaran.

Ini adalah jebakan yang umum. Saya menduga nilai akurasinya adalah 0,5 di awal karena Anda mungkin memiliki jumlah gambar yang diberi tanda air vs yang tidak diberi tanda air yang sama, dan kinerjanya tidak pernah meningkat karena Anda melewatkan nilai class_mode yang salah.

TL;DR: Tetapkan class_mode='binary' (bukan default class_mode='categorical') di flow_from_directory.

2
Nikhil Kumar 12 Mei 2021, 17:36