ValueError: Несоответствие формы: Форма меток (получено (15,)) должно совпадать с формой логитов, за исключением последнего измерения (получено (5, 3)) - PullRequest
0 голосов
/ 15 октября 2019

Я получаю эту ошибку при попытке подгонки модели:

ValueError: Несоответствие формы: Форма меток (получено (15,)) должна совпадать с формой логитов, за исключением последнегоизмерение (получено (5, 3)).

Код, который выдает ошибку:

history = model.fit_generator(
  train_generator,
  epochs=10,
  validation_data=validation_generator)

Это генератор train_generator, генератор проверки похож:

train_datagen = ImageDataGenerator(rescale=1./255)
train_generator = train_datagen.flow_from_directory(
        train_dir,
        target_size=(IMG_WIDTH, IMG_HEIGHT),
        batch_size=5)

Я пытаюсь получить формы:

for data_batch, labels_batch in train_generator:
    print('data batch shape:', data_batch.shape)
    print('labels batch shape:', labels_batch.shape)
    break

форма пакета данных: (5, 192, 192, 3) форма пакета этикеток: (5, 3)

Когда я изменяю размер пакета, форма меток в ошибке изменяется соответственно (размер партии 3 дает ошибку с формой метки (9, например, у меня есть 3 класса). Но меня беспокоит то, что это делает train_generator, могу ли я что-нибудь сделать, чтобы это исправить? Более того, когда я печатаю фигуры из train_generator, это кажется правильным.

Вот модель, на случай, если она будет полезна:

model = models.Sequential()
model.add(layers.Conv2D(32, (3, 3), activation='relu',
                        input_shape=(IMG_WIDTH, IMG_HEIGHT, 3)))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
for i in range(2):
  model.add(layers.Conv2D(128, (3, 3), activation='relu'))
  model.add(layers.MaxPooling2D((2, 2)))

model.add(layers.Flatten())
model.add(layers.Dense(3, activation='softmax'))


model.compile(optimizer='adam',
          loss='sparse_categorical_crossentropy',
          metrics=['accuracy'])

Спасибо!

Правка - Полный код :

В каталоге есть две папки - обучающая и проверочная, и в каждой из них есть три подпапки с изображениями соответствующих классов.

try:
 %tensorflow_version 2.x # enable TF 2.x in Colab
except Exception:
  pass

from tensorflow.keras import datasets, layers, models

IMG_WIDTH = 192
IMG_HEIGHT = 192
train_dir = 'train'
validation_dir = 'validation'

from google.colab import drive
drive.mount('/content/drive')

import os
os.chdir("drive/My Drive/colab")

from tensorflow.keras.preprocessing.image import ImageDataGenerator

train_datagen = ImageDataGenerator(rescale=1./255)
train_generator = train_datagen.flow_from_directory(
        train_dir,
        target_size=(IMG_WIDTH, IMG_HEIGHT),
        batch_size=5)

validation_datagen = ImageDataGenerator(rescale=1./255)
validation_generator = validation_datagen.flow_from_directory(
        validation_dir,
        target_size=(IMG_WIDTH, IMG_HEIGHT),
        batch_size=5)

model = models.Sequential()
model.add(layers.Conv2D(32, (3, 3), activation='relu',
                        input_shape=(IMG_WIDTH, IMG_HEIGHT, 3)))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
for i in range(2):
  model.add(layers.Conv2D(128, (3, 3), activation='relu'))
  model.add(layers.MaxPooling2D((2, 2)))

model.add(layers.Flatten())
model.add(layers.Dense(3, activation='softmax'))

model.compile(optimizer='adam',
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])

history = model.fit_generator(
      train_generator,
      epochs=10,
      validation_data=validation_generator)

Спасибо!

1 Ответ

1 голос
/ 15 октября 2019

Разница между sparse_categorical_crossentropy и categorical_crossentropy заключается в том, закодированы ли ваши цели в горячем виде.

Форма пакета этикеток - (5,3), что означает, что она была закодирована горячим способом. Таким образом, вы должны использовать categorical_crossentropy функцию потери.

model.compile(optimizer='adam',
              loss='categorical_crossentropy',
              metrics=['accuracy'])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...