LTSM - Несовместимый слой, несоответствие размеров? - PullRequest
0 голосов
/ 24 марта 2019

Я пытаюсь настроить модель LTSM с помощью Keras.Данные обучения имеют размерность [7165, 27], и при моей текущей настройке они выдают следующую ошибку:

  File "C:\Users\Eier\Anaconda3\lib\site-packages\keras\models.py", line 441, in __init__
    self.add(layer)

  File "C:\Users\Eier\Anaconda3\lib\site-packages\keras\models.py", line 497, in add
    layer(x)

  File "C:\Users\Eier\Anaconda3\lib\site-packages\keras\layers\recurrent.py", line 500, in __call__
    return super(RNN, self).__call__(inputs, **kwargs)

  File "C:\Users\Eier\Anaconda3\lib\site-packages\keras\engine\topology.py", line 575, in __call__
    self.assert_input_compatibility(inputs)

  File "C:\Users\Eier\Anaconda3\lib\site-packages\keras\engine\topology.py", line 474, in assert_input_compatibility
    str(K.ndim(x)))

ValueError: Input 0 is incompatible with layer lstm_64: expected ndim=3, found ndim=4 

Я знаю, что эта ошибка довольно распространена, но ни одно из множества различных решений, найденных в Интернете, не имеетработал для меня еще.Я уже пытался преобразовать тренировочные данные в трехмерную матрицу, дурачиться с различными комбинациями слоев, явно указывать размер партии, используя Flatten () и многое другое, но безрезультатно.Был бы очень признателен, если бы кто-то мог подтолкнуть меня в правильном направлении для исправления этого.

Фрагмент кода:

input_dim = 27
units = 5
timesteps = 1 
samples =  X_train.shape[0]

X_train = np.reshape(X_train, (X_train.shape[0], 1, X_train.shape[1]))
X_test = np.reshape(X_test, (X_test.shape[0], 1, X_test.shape[1]))

model = Sequential([
    LSTM(units, return_sequences=True, stateful = True, input_shape=(samples,timesteps,input_dim)),
    Dropout(0.2),
    LSTM(units,return_sequences=False),
    Dropout(0.2),
    Dense(1),
    Activation('softmax'),
])

model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['acc'])
model.fit(X_train, y_train, batch_size = 32, epochs = 60)

1 Ответ

0 голосов
/ 24 марта 2019

Как отметил @ShubhamPanchal в комментариях, вам не нужно указывать размерность выборки. Слой LSTM ожидает, что вход будет иметь форму [batch_size, time_steps, channel), поэтому, когда вы передаете аргумент input_shape, вы должны передать кортеж, указывающий time_steps и измерение каналов.

LSTM(32, return_sequences=True, stateful = True, input_shape=(time_steps, input_dim))

Поскольку вы используете lstm с сохранением состояния, вам также необходимо указать аргумент batch_size. Таким образом, полный код для модели будет,

model = Sequential([
    LSTM(units, return_sequences=True, stateful = True, input_shape=(timesteps,input_dim), batch_size=batch_size),
    Dropout(0.2),
    LSTM(units,return_sequences=False),
    Dropout(0.2),
    Dense(1),
    Activation('softmax'),
])

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