Получение ValueError в тензорном потоке, говорящее, что мои формы несовместимы - PullRequest
1 голос
/ 29 мая 2020

Ошибка:

return K.categorical_crossentropy(y_true, y_pred, from_logits=from_logits)
    C:\Users\selvaa\miniconda3\envs\tensorflow\lib\site-packages\tensorflow\python\keras\backend.py:4619 categorical_crossentropy
        target.shape.assert_is_compatible_with(output.shape)
    C:\Users\selvaa\miniconda3\envs\tensorflow\lib\site-packages\tensorflow\python\framework\tensor_shape.py:1128 assert_is_compatible_with
        raise ValueError("Shapes %s and %s are incompatible" % (self, other))

    ValueError: Shapes (None, 1) and (None, 151) are incompatible

Моя модель:

x = np.array(x)
y = np.array(y)

x = x/255.0

model = Sequential()
model.add(Conv2D(3, (3,3), input_shape=(128,128,3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2,2)))

model.add(Flatten())
model.add(Dense(302, activation='relu'))
model.add(Dense(151, activation='softmax'))

model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
model.fit(x, y, batch_size=32, epochs=5, verbose=1, validation_split=0.1)

Я пытаюсь обучить модель распознавать разных покемонов, у меня есть две фотографии каждого 151 покемона для моих наборов данных (правильно размечено и все). Не уверен, что делаю неправильно.

Вот что происходит, когда я печатаю x.shape и y.shape:

(301, 128, 128, 3) (301,)

1 Ответ

0 голосов
/ 29 мая 2020

Используйте потерю tf.keras.losses.SparseCategoricalCrossEntropy, как показано в примере кода ниже.

Функция потерь tf.keras.losses.SparseCategoricalCrossEntropy принимает ссылочные метки в форме (n_samples,) и предсказанные метки в shape (n_samples, n_classes), который будет работать с вашими данными. Вы не можете использовать categorical_crossentropy, потому что это предполагает, что ваши метки будут закодированы в горячем режиме (см. Нижнюю часть ответа).

x = np.array(x)
y = np.array(y)

x = x / 255.0

model = Sequential()
model.add(Conv2D(3, (3,3), input_shape=(128,128,3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Flatten())
model.add(Dense(302, activation='relu'))
model.add(Dense(151, activation='softmax'))

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

model.fit(x, y, batch_size=32, epochs=5, verbose=1, validation_split=0.1)

Еще одно решение - мгновенное кодирование ваших этикеток перед обучением, например, используя функцию tf.one_hot. Если вы используете этот подход, вы можете использовать categorical_crossentropy.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...