Python ValueError:检查输入时出错:预期cu_dnnlstm_22_输入为3维,但得到了具有形状的数组(2101,17)

Python ValueError:检查输入时出错:预期cu_dnnlstm_22_输入为3维,但得到了具有形状的数组(2101,17),python,tensorflow,machine-learning,lstm,Python,Tensorflow,Machine Learning,Lstm,我是机器学习新手。我无法将数据导入网络 这是我收到的错误: ValueError:检查输入时出错:预期cu_dnnlstm_22_输入为3维,但得到了形状为(2101,17)的数组。 我已经尝试在密集层之前添加model.add(flatte())。我非常感谢你的帮助 BATCH_SIZE = 64 test_size_length = int(len(main_df)*TESTING_SIZE) training_df = main_df[:test_size_length] valida

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

这是我收到的错误:

ValueError:检查输入时出错:预期cu_dnnlstm_22_输入为3维,但得到了形状为(2101,17)的数组。

我已经尝试在密集层之前添加
model.add(flatte())
。我非常感谢你的帮助


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

输入到LSTM层(
CuDNNLSTM
)的形状应为:
(批大小、时间步长、输入尺寸)

看起来您缺少其中一个维度

通常,在输入维度为1的情况下,我们可以监督最后一个维度。如果你的模型是这样的(如果你是从单个数字序列中预测的),那么你可以考虑在<代码> cUnnLSTM层之前扩展维度,类似于这样的:

model.add(Lambda(Lambda t:tf.expand_dims(t,axis=-1)))
模型添加(CuDNNLSTM(128))

在不知道您正在处理的问题的情况下,很难知道这是否是一种有效的前进方式,但您肯定应该记住LSTM层所需的形状,并相应地重塑/扩展dim。

输入到LSTM层(
CuDNNLSTM
)的形状应为:
(批量大小、时间步长、输入dim)

看起来您缺少其中一个维度

通常,在输入维度为1的情况下,我们可以监督最后一个维度。如果你的模型是这样的(如果你是从单个数字序列中预测的),那么你可以考虑在<代码> cUnnLSTM层之前扩展维度,类似于这样的:

model.add(Lambda(Lambda t:tf.expand_dims(t,axis=-1)))
模型添加(CuDNNLSTM(128))

在不知道您正在解决的问题的情况下,很难知道这是否是一种有效的解决方法,但您肯定应该记住所需的LSTM层形状,并相应地重塑/扩展DIM。

谢谢您的回答。因此,我对这一点是全新的,并且从一个类似的项目中复制了用于向网络添加层的代码。我传入的数据如下所示:数组([[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).value,training_df['target'].value train_x=train_x.astype('float32'))“``不确定这是否会产生影响,但我数组中的每一行都是经过预处理的一组股票数据。因此,由于数据形状是2101x17,我有2101天的股票数据。请记住,我对这一点(以及Python)是全新的谢谢你的回答。所以我对这个问题是全新的,从一个类似的项目中复制了用于向网络添加层的代码。我正在传递的数据如下所示:数组([0,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)是全新的我直接从这样的数据帧中提取我的train_x和train_y可以吗:`` train_x,train_y=training_df.drop('target',1')。value,training_df['target']。values train_x=train_x.astype('float32')``我的数据后面是这样的:``数组`([[ 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)是全新的我直接从这样的数据帧中提取我的train_x和train_y可以吗:`` train_x,train_y=training_df.drop('target',1')。value,training_df['target']。values train_x=train_x.astype('float32')``我的数据后面是这样的:``数组`([[ 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)是全新的