Tensorflow: Log dan Label harus berukuran sama

Sep 03 2020

Saat ini saya mencoba sebuah proyek di Kursus Tensorflow Google / Udacity menggunakan kumpulan data yang diperoleh sebagai berikut:

_URL = "https://storage.googleapis.com/download.tensorflow.org/example_images/flower_photos.tgz"

zip_file = tf.keras.utils.get_file(origin=_URL,
                                   fname="flower_photos.tgz",
                                   extract=True)

Sayangnya, saya mengalami kesalahan berikut:

InvalidArgumentError:  logits and labels must have the same first dimension, got logits shape [100,5] and labels shape [500]
     [[node sparse_categorical_crossentropy/SparseSoftmaxCrossEntropyWithLogits/SparseSoftmaxCrossEntropyWithLogits (defined at <ipython-input-43-02964d57939c>:8) ]] [Op:__inference_test_function_3591]

Saya melihat posting lain, tetapi masih tampak agak sulit untuk diketahui. Pikiran awal saya adalah bahwa saya mungkin menggunakan fungsi kerugian yang salah.

Berikut adalah kode yang mengalami masalah:

image_gen = ImageDataGenerator(rescale = 1./255, horizontal_flip=True, zoom_range=0.5, rotation_range=45, width_shift_range=0.15, height_shift_range=0.15)

train_data_gen = image_gen.flow_from_directory(batch_size=BATCH_SIZE, directory = train_dir, shuffle=True, target_size=(IMG_SHAPE,IMG_SHAPE),class_mode='binary')

image_gen = ImageDataGenerator(rescale = 1./255)

val_data_gen = image_gen.flow_from_directory(batch_size=BATCH_SIZE, directory = val_dir, shuffle=True, target_size=(IMG_SHAPE,IMG_SHAPE))


model = tf.keras.models.Sequential([
                                    tf.keras.layers.Conv2D(16, (3,3), activation='relu', input_shape=(150,150,3)),
                                    tf.keras.layers.MaxPooling2D(2,2),
                                    tf.keras.layers.Conv2D(32, (3,3), activation='relu'),
                                    tf.keras.layers.MaxPooling2D(2,2),
                                    tf.keras.layers.Conv2D(64, (3,3), activation='relu'),
                                    tf.keras.layers.MaxPooling2D(2,2),
                                    tf.keras.layers.Dropout(0.5),
                                    tf.keras.layers.Flatten(),
                                    tf.keras.layers.Dense(512, activation='relu'),
                                    tf.keras.layers.Dense(5),
                                    
])

model.compile(optimizer='adam',
              loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
              metrics=['accuracy'])
model.summary()

Ukuran tumpukan adalah 100 dan dimensi masukan adalah 150.150 Ringkasannya adalah sebagai berikut: Model: "sequential_4"


Layer (tipe) Parameter Bentuk Output #

konv2d_12 (Konv2D) (Tidak ada, 148, 148, 16) 448


max_pooling2d_12 (MaxPooling (Tidak Ada, 74, 74, 16) 0


konv2d_13 (Konv2D) (Tidak ada, 72, 72, 32) 4640


max_pooling2d_13 (MaxPooling (Tidak Ada, 36, 36, 32) 0


conv2d_14 (Conv2D) (Tidak Ada, 34, 34, 64) 18496


max_pooling2d_14 (MaxPooling (Tidak Ada, 17, 17, 64) 0


dropout_4 (Dropout) (Tidak ada, 17, 17, 64) 0


flatten_4 (Ratakan) (Tidak ada, 18496) 0


dense_8 (Dense) (Tidak ada, 512) 9470464


dense_9 (Dense) (Tidak ada, 5) 2565

Total parameter: 9.496.613 Parameter yang dapat dilatih: 9.496.613 Parameter yang tidak dapat dilatih: 0

Ada pemikiran tentang apa yang mungkin salah?

Jawaban

1 MarcoCerliani Sep 03 2020 at 03:59

perhatikan class_mode di generator Anda

'int': berarti bahwa label dikodekan sebagai integer (misalnya untuk kerugian sparse_categorical_crossentropy). 'kategorikal' berarti bahwa label dikodekan sebagai vektor kategorikal (misalnya untuk kerugian kategorikal_crossentropy). 'binary' berarti bahwa label (hanya ada 2) dikodekan sebagai skalar float32 dengan nilai 0 atau 1 (misalnya untuk binary_crossentropy). Tidak ada (tanpa label).

sepertinya Anda membutuhkan 'int' daripada 'binary' untuk train dan generator validasi