ValueError: Ошибка при проверке ввода: ожидалось, что cu_dnnlstm_22_input будет иметь 3 измерения, но получит массив с формой (2101, 17) - PullRequest
1 голос
/ 06 июля 2019

Я новичок в машинном обучении.У меня проблемы с передачей данных в мою сеть.

Это ошибка, которую я получаю:

ValueError: Error when checking input: expected cu_dnnlstm_22_input to have 3 dimensions, but got array with shape (2101, 17)

Я попытался добавить model.add(Flatten()) перед плотным слоем.Буду очень признателен за вашу помощь!


BATCH_SIZE = 64

test_size_length = int(len(main_df)*TESTING_SIZE)
training_df = main_df[:test_size_length]
validation_df = main_df[test_size_length:]

train_x, train_y = training_df.drop('target',1).to_numpy(), training_df['target'].tolist()
validation_x, validation_y = validation_df.drop('target',1).to_numpy(), validation_df['target'].tolist()

#train_x.shape is  (2101, 17)

model = Sequential()
# model.add(Flatten())
model.add(CuDNNLSTM(128, input_shape=(train_x.shape), return_sequences=True))
model.add(Dropout(0.2))
model.add(BatchNormalization())

model.add(CuDNNLSTM(128, return_sequences=True))
model.add(Dropout(0.1))
model.add(BatchNormalization())

model.add(CuDNNLSTM(128))
model.add(Dropout(0.2))
model.add(BatchNormalization())

model.add(Dense(32, activation='relu'))
model.add(Dropout(0.2))

model.add(Dense(2, activation='softmax'))


opt = tf.keras.optimizers.Adam(lr=0.001, decay=1e-6)

# Compile model
model.compile(
    loss='sparse_categorical_crossentropy',
    optimizer=opt,
    metrics=['accuracy']
)

tensorboard = TensorBoard(log_dir="logs/{}".format(NAME))

filepath = "RNN_Final-{epoch:02d}-{val_acc:.3f}"  # unique file name that will include the epoch and the validation acc for that epoch
checkpoint = ModelCheckpoint("models/{}.model".format(filepath, monitor='val_acc', verbose=1, save_best_only=True, mode='max')) # saves only the best ones

# Train model
history = model.fit(
    train_x, train_y,
    batch_size=BATCH_SIZE,
    epochs=EPOCHS,
    validation_data=(validation_x, validation_y),
    callbacks=[tensorboard, checkpoint],
)

# Score model
score = model.evaluate(validation_x, validation_y, verbose=0)
print('Test loss:', score[0])
print('Test accuracy:', score[1])
# Save model
model.save("models/{}".format(NAME))

1 Ответ

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

Вход для вашего слоя LSTM (CuDNNLSTM) должен иметь форму: (batch_size, timesteps, input_dim).

Похоже, вам не хватает одного из этих измерений.

Часто мы можем наблюдать за последним измерением в случае, когда входное измерение равно 1. Если это имеет место с вашей моделью (если вы предсказываете последовательность последовательных чисел), то вы можете рассмотреть возможность расширения измерений до того, как CuDNNLSTM слой с чем-то вроде этого:

model.add(Lambda(lambda t: tf.expand_dims(t, axis=-1)))
model.add(CuDNNLSTM(128))

Не зная проблемы, над которой вы работаете, трудно понять, является ли это верным способом продвижения вперед, но, безусловно, вы должны иметь в виду требуемую форму слоя LSTM и соответственно изменять / уменьшать яркость.

...