ValueError: Ошибка при проверке целевого объекта: ожидалось, что dens_32 будет иметь форму (1,), но получил массив с формой (10000,) - PullRequest
0 голосов
/ 08 июля 2019

x имеет shape=(33,10000,1), а y имеет shape=(33,10000).но эта ошибка появляется, когда я запускаю код:

ValueError: Error when checking input: expected lstm_40_input to have shape (1, 10000) but got array with shape (10000, 1)

я пытался изменить input_shape=(10000,1) в слое lstm, но эта ошибка возникает тогда:

ValueError: Error when checking target: expected dense_39 to have shape (1,) but got array with shape (10000,)

from keras.models import Sequential
from keras.layers import Dense
from keras.layers import LSTM

x = np.reshape(x, (33, 10000, 1))

regressor = Sequential()
regressor.add(LSTM(units=4, activation='sigmoid', input_shape=(1, 10000)))
regressor.add(Dense(units=1))

regressor.compile(optimizer='adam', loss='categorical_crossentropy')

regressor.fit(x, y, batch_size=32, epochs=1)

1 Ответ

0 голосов
/ 09 июля 2019

Я думаю, здесь происходит пара вещей. Как уже упоминалось в комментариях, ваши метки имеют длину 10000, так что, похоже, вы пытаетесь классифицировать каждый пиксель в вашем изображении? Это немного странно. Кроме того, вы используете категориальную кросс-энтропийную потерю, но у вас есть только одно выходное значение из вашего плотного слоя. Если вы хотите использовать категориальную кросс-энтропию, у вас должно быть столько выходных единиц в вашем конечном плотном слое, сколько у вас есть классов, и, вероятно, также следует использовать активацию softmax.

Используя некоторые фиктивные данные, которые мы не сможем обучить, но, по крайней мере, сообщим нам, если у нас есть ошибки. Обратите внимание, что цели здесь либо 0, либо 1, поэтому две категории .

x = np.random.randint(0, 2, size=(33, 10000, 1))
y = np.random.randint(0, 2, size=(33, 10000, 1))

Я переписал вашу сеть, чтобы обернуть TimeDistributed() вокруг вашего плотного слоя, и установил return_sequences=True в LSTM, чтобы убедиться, что мы получаем его вывод для каждого шага во временном ряду. Ваша форма ввода должна быть (10000, 1) или, в общем, (sequence_length, num_features). Я также установил units=2 в плотном слое и установил его активацию на softmax для задачи классификации.

regressor = Sequential()
regressor.add(LSTM(units=4,
                   activation='sigmoid',
                   input_shape=(10000, 1),
                   return_sequences=True))
regressor.add(TimeDistributed(Dense(units=2,
                                    activation='softmax')))

Наконец, я установил для вашей потери значение sparse категорической кросс-энтропии, поскольку похоже, что ваши метки не подходят для использования регулярной категориальной кросс-энтропии. Разреженная версия просто выводит однократное кодирование из целых значений меток. Вы можете попробовать оба варианта, но я думаю, что вам нужен этот для указанных размеров.

regressor.compile(optimizer='adam', loss='sparse_categorical_crossentropy')
regressor.summary()
regressor.fit(x, y, batch_size=32, epochs=1)

Сводная информация по сети и результаты обучения:

_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
lstm_15 (LSTM)               (None, 10000, 4)          96        
_________________________________________________________________
time_distributed_10 (TimeDis (None, 10000, 2)          10        
=================================================================
Total params: 106
Trainable params: 106
Non-trainable params: 0

_________________________________________________________________
Epoch 1/1
33/33 [==============================] - 14s 435ms/step - loss: 0.7048
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...