【问题标题】:ValueError: Error when checking input: expected cu_dnnlstm_22_input to have 3 dimensions, but got array with shape (2101, 17)ValueError:检查输入时出错:预期 cu_dnnlstm_22_input 具有 3 个维度,但得到了形状为 (2101、17) 的数组
【发布时间】:2019-07-05 23:43:33
【问题描述】:

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

这是我收到的错误:

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))

【问题讨论】:

  • 我可以直接从这样的数据帧中获取我的 train_x 和 train_y:``` train_x, train_y = training_df.drop('target',1).values, training_df['target' ].values train_x=train_x.astype('float32') ``` 我的数据看起来像这样:``` array([[ 0. , 0. , 0. , ..., 0.1344 , -0.45 , -0.5844 ], [ 0. , 0. , 0. , ..., 0.1293 , -0.4209 , -0.5502 ], [ 0. , 0. , 0. , ..., 0.1238 , -0.3933 , -0.5171 ], ... ., ```
  • 不确定是否有区别,但我数组中的每一行都是经过预处理的一堆库存数据。所以,由于数据形状是 2101x17,我有 2101 天的股票数据。请记住,我是这个(和 Python)的新手

标签: python tensorflow machine-learning lstm


【解决方案1】:

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

【讨论】:

  • 感谢您的回答。所以我对此很陌生,并且已经从一个类似的项目中复制了用于将图层添加到网络的代码。我正在传递如下所示的数据: array([[ 0. , 0. , 0. , ..., 0.139 , -0.4806 , -0.6196 ], [ 0. , 0. , 0. , ..., 0.1344 , -0.45 , -0.5844 ], [ 0. , 0. , 0. , ..., 0.1293 , -0.4209 , -0.5502 ], ...,
  • 我可以直接从这样的数据帧中获取我的 train_x 和 train_y:``` train_x, train_y = training_df.drop('target',1).values, training_df['target' ].values train_x=train_x.astype('float32') ```
  • 不确定是否有区别,但我数组中的每一行都是经过预处理的一堆库存数据。所以,由于数据形状是 2101x17,我有 2101 天的股票数据。请记住,我是这个(和 Python)的新手
猜你喜欢
  • 2018-12-26
  • 1970-01-01
  • 1970-01-01
  • 2019-05-04
  • 2019-04-07
  • 1970-01-01
  • 2018-08-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多