Tensorflow ValueError:层cu_dnnlstm的输入0与层不兼容:预期ndim=3,发现ndim=2。收到完整形状:[无,175]
我正在使用CuDNNLSTMs进行实验,我不知道为什么,尽管我遵循了有关此的教程,但我得到了一个奇怪的错误,我可以理解,但我无法调试: 因此,我有一个4073时间序列*175特征数组,我试图将这175个特征传递给顺序模型,一次传递一个,传递给CuDNNLSTM层,以便模型从中学习一些东西 “阿尔沃”是RNN的目标 守则:Tensorflow ValueError:层cu_dnnlstm的输入0与层不兼容:预期ndim=3,发现ndim=2。收到完整形状:[无,175],tensorflow,tensorflow2.0,Tensorflow,Tensorflow2.0,我正在使用CuDNNLSTMs进行实验,我不知道为什么,尽管我遵循了有关此的教程,但我得到了一个奇怪的错误,我可以理解,但我无法调试: 因此,我有一个4073时间序列*175特征数组,我试图将这175个特征传递给顺序模型,一次传递一个,传递给CuDNNLSTM层,以便模型从中学习一些东西 “阿尔沃”是RNN的目标 守则: train_x, train_y = trainDF, trainDF["AlvoH"] validation_x, validation_y = vali
train_x, train_y = trainDF, trainDF["AlvoH"]
validation_x, validation_y = validationDF[:-Sequencia], validationDF["AlvoH"][:-Sequencia]
print(train_x.shape[1:])
model = Sequential()
model.add(CuDNNLSTM(512, input_shape=(train_x.shape[1:]), return_sequences=True))
model.add(Dropout(0.2))
model.add(BatchNormalization())
model.add(Dense(3, activation="softmax"))
opt = tf.keras.optimizers.Adam(learning_rate=0.001, decay=1e-6)
model.compile(loss="sparse_categorical_crossentropy", optimizer=opt, metrics=["accuracy"])
tensorboard = TensorBoard(log_dir=f'logs/{NAME}')
checkpoint = tf.keras.callbacks.ModelCheckpoint("models/{}.model".format("RNN_Final-{EPOCH:02d}",
monitor="val_acc",
verbose=1,
save_best_only=True,
mode="max"))
history = model.fit(train_x, train_y,
batch_size=BATCH_SIZE,
epochs=EPOCHS,
validation_data=(validation_x, validation_y),
callbacks=[tensorboard, checkpoint])
错误:
回溯(最近一次呼叫最后一次):
文件“ml.py”,第64行,在
model.add(CuDNNLSTM(512, input_shape=(train_x.shape[1:None]), return_sequences=True))
文件“C:\Users\Anaconda3\lib\site packages\tensorflow\python\training\tracking\base.py”,第456行,在方法包装中
结果=方法(自身、*args、**kwargs)
文件“C:\Users\Anaconda3\lib\site packages\tensorflow\python\keras\engine\sequential.py”,第198行,添加
层(x)
文件“C:\Users\Anaconda3\lib\site packages\tensorflow\python\keras\layers\recurrent.py”,第654行,在调用中
返回超级(RNN,自我)。调用(输入,**kwargs)
文件“C:\Users\Anaconda3\lib\site packages\tensorflow\python\keras\engine\base\u layer.py”,第886行,在调用中
(姓名)
文件“C:\Users\Anaconda3\lib\site packages\tensorflow\python\keras\engine\input\u spec.py”,第180行,在assert\u input\u compatibility中
str(x.shape.as_list())
ValueError:层cu_dnnlstm的输入0与层不兼容:预期ndim=3,发现ndim=2。收到完整形状:[无,175]
据我所知,本教程是在Tensorflow 2.0之前编写的,在安装了2.0之后,我注意到有些东西发生了变化,特别是CuDNNLSTMs层,它有一个dif方法要导入,因此问题可能就在那里
这是2.0变化的结果吗?我尝试了一切,从超车到超车,从超车到超车,从超车到超车,从超车到超车,从超车,从超车到超车,从超车到超车,从超车到超车,从超车,从超车到超车,从超车到超车,从超车到超车,从超车到超车,从超车到超车,我都试过了
提前感谢您的回答 在tensorflow 2.x中,您不必使用CuDNNLSTM,默认情况下,简单LSTM层将在低级别使用CuDNNLSTM。 输入的形状_shape=(train_x.shape[1:])必须是范围2,将输入更改为形状(4073、175、1),然后尝试例如:
model = Sequential()
model.add(LSTM(512, input_shape=(175 ,1), return_sequences=True))
model.add(Dropout(0.2))
model.add(BatchNormalization())
为了使代码能够正确地训练,我必须进行的更改
train_x, train_y = array(trainDF[trainDF.columns.tolist()[:-1]]), array(trainDF["AlvoH"])
validation_x, validation_y = array(validationDF[validationDF.columns.tolist()[:-1]][:-Sequencia]), array(validationDF["AlvoH"][:-Sequencia])
train_x = train_x.reshape(train_x.shape[0],train_x.shape[1], 1)
train_y = train_y.reshape(train_y.shape[0], 1, 1)
validation_x = validation_x.reshape(validation_x.shape[0],validation_x.shape[1], 1)
validation_y = validation_y.reshape(validation_y.shape[0], 1, 1)
model = Sequential()
model.add(LSTM(1024, input_shape=(train_x.shape[1:]), return_sequences=True))
model.add(Dropout(0.2))
model.add(BatchNormalization())
model.add(Dense(3, activation="softmax"))
opt = tf.keras.optimizers.Adam(learning_rate=0.0001, decay=1e-8)
model.compile(loss="sparse_categorical_crossentropy", optimizer=opt, metrics=["accuracy"])
tensorboard = TensorBoard(log_dir=f'logs/{NAME}')
filepath = "RNN_Final-{epoch:02d}"
checkpoint = ModelCheckpoint("TEMP/{}.model".format(filepath,
monitor="val_acc",
verbose=1,
save_best_only=True,
mode="max"))
history = model.fit(train_x, train_y,
batch_size=BATCH_SIZE,
epochs=EPOCHS,
validation_data=(validation_x, validation_y),
callbacks=[tensorboard, checkpoint])
第一个方面已经解决,因为我必须将数组传递给numpy数组,并按照
但现在,我有另一个问题,这让我感到困惑,它与此相关:如果我在培训结束时编码:
print(len(model.layers[0].get_weights()[0][0]))
print(train_x.shape[1:])
我会得到:
4096
(174, 1)
这意味着,我认为,第一个LSTM层有4096个权重,其中应该只有174个。我说得对吗?ValueError:层顺序的输入0与层不兼容:预期的ndim=3,发现的ndim=2。收到完整形状:[None,175],代码为:model=Sequential()model.add(LSTM(512,input_shape=(175,1),return_sequences=True))model.add(Dropout(0.2))model.add(BatchNormalization())model.add(Dense(3,activation=“softmax”))opt=tf.keras.optimizers.Adam(学习率=0.001,衰减率=1e-6)model.compile(丢失=“稀疏分类交叉熵”,优化器=opt,度量=[“准确度”])tensorboard=tensorboard(log_dir=f'logs/{NAME}),如建议的那样..您的数据形状=(4073175,1)?这是张量还是tf.dataset或张量列表?这方面已经解决了,因为我必须将数组传递给numpy数组并进行一些更改,正如:但是,我有另一个问题,这让我感到困惑,这与此有关:如果我在培训结束时编码:print(len(model.layers[0]。get_weights()[0][0])print(train_x.shape[1:]我会得到:4096(174,1)这意味着,我认为,我的第一个LSTM层有4096个权重,其中我应该只有174个。对吗?我不知道您对数据做了哪些更改?您按照我在第一个答案中的建议更改了输入;您能选择它作为正确答案吗?这是另一个问题。正确的权重数是4096,因为每个LSTM单元有四个门,每个门作为密集层有自己的权重,1024个单元*4*输入特征(=1而非174)=4096。