Еще одна «Ошибка при проверке цели: ожидалось, что dense_2 будет иметь форму (4,), но получил массив с формой (1,)»

#python #keras #tf.keras

#python #keras #tf.keras

Вопрос:

Я использую Keras в Python 3. Проблема, с которой я сталкиваюсь, похоже, похожа на многие другие, и, насколько я могу судить, мне может понадобиться использовать Flatten() , хотя я не вижу, как правильно установить параметры. Я получаю ошибку:

Ошибка при проверке цели: ожидалось, что dense_2 будет иметь форму (4,), но получил массив с формой (1,)

Мои данные не содержат изображений (пока), но это последовательности, которые я превратил в фреймы данных.

 model = Sequential()
model.add(Dense(30, input_dim=16, activation='relu'))
model.add(Dense(len(TheBinsizeList), activation='softmax'))
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])


model.fit(Train_Columns, TrainTarget_Columns.to_frame(), epochs=100, batch_size=64)

print(Train_Columns.shape)
# Gives a value of (1627, 16)


print((TrainTarget_Columns.to_frame()).shape)
# Gives a value of (1627,1)
  

Теперь значение TrainTarget_Columns равно 1627 из этих двух кортежей:

(1494, 3) (1080, 2) (1863, 2) (919, 4) (1700, 2) (710, 4) (1365, 4) (1815, 3) (1477, 2) (1618, 1)…

Номер объекта — это первая запись в каждом из tuble, а вторая запись — это значение, которое является целью обучения.

Хотя я вижу, что изменение размера с 4 на 2 в dense_2 приводит к переходу ожидаемой формы с (4,) на (2,), я не понимаю, как использовать Flatten (если это то, что нужно) для правильного форматирования значений.

 Model: "sequential_1"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
dense_1 (Dense)              (None, 30)                510       
_________________________________________________________________
dense_2 (Dense)              (None, 4)                 124       
=================================================================
Total params: 634
Trainable params: 634
Non-trainable params: 0
  

Любая помощь приветствуется и спасибо.

Ответ №1:

Учитывая сводку вашей модели, модель ожидает ввода формы (batch_size, 16) и цели формы (batch_size, 4) .

Если форма вашей цели (1627,1) есть, это ваша проблема.

Решение: измените его на одну горячую переменную (например, using tf.one_hot(y, n_classes) ), и ошибка должна исчезнуть

 import numpy as np
import tensorflow as tf

input_dim = 16
hidden_dim = 30
n_classes = 4

model = tf.keras.Sequential()
model.add(tf.keras.layers.Dense(hidden_dim, input_dim=input_dim, activation='relu'))
model.add(tf.keras.layers.Dense(n_classes, input_dim=hidden_dim, activation='relu'))
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])

X = np.random.randn(100, input_dim)
y = np.random.randint(0, n_classes, size=(100,))

model.fit(X, y)
# ValueError: Shapes (None, 1) and (None, 4) are incompatible

y = tf.one_hot(y, n_classes)
model.fit(X, y)
# Works !