Tensorflow ValueError:层cu_dnnlstm的输入0与层不兼容:预期ndim=3,发现ndim=2。收到完整形状:[无,175]

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

我正在使用CuDNNLSTMs进行实验,我不知道为什么,尽管我遵循了有关此的教程,但我得到了一个奇怪的错误,我可以理解,但我无法调试: 因此,我有一个4073时间序列*175特征数组,我试图将这175个特征传递给顺序模型,一次传递一个,传递给CuDNNLSTM层,以便模型从中学习一些东西

“阿尔沃”是RNN的目标

守则:

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。