ValueError:检查输入时出错:预期cu_dnnlstm_22_input具有3个维度,但数组的形状为(2101,17)

时间:2019-07-05 23:43:33

标签: python tensorflow machine-learning lstm cudnn

我是机器学习的新手。我无法将数据导入网络。

这是我收到的错误:

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 :(得分:0)

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层所需的形状,并相应地重塑/扩展变暗。