首页 > 解决方案 > TimeDistributed Layer:不兼容的形状:[32,3,3] vs. [32,3]

问题描述

我有一个以前可以工作的模型,但现在它不起作用。它给出了一个错误:

InvalidArgumentError:不兼容的形状:[32,3,3] 与 [32,3] [[{{node Nadam/gradients/loss/time_distributed_loss/SquaredDifference_grad/BroadcastGradientArgs}}]]

旧型号

class Model:
def set_the_model(self, look_back):
    self.model = Sequential()
    self.model.add(LSTM(16, activation="relu", input_shape=(look_back, 3),return_sequences=True)) #, stateful=True
    self.model.add(Dropout(0.2))
    self.model.add(LSTM(32, activation="relu", return_sequences=True))
    self.model.add(Dropout(0.2))
    self.model.add(TimeDistributed(Dense(look_back)))
    #self.model.add(Dense(3))
    self.model.compile(loss="mse", optimizer="nadam", metrics=['acc']) #mse
    self.model.summary()

def start_train(self, trainD1, trainD2):
    es = EarlyStopping(monitor='loss', patience = 2, mode='min')
    #for i, j in trainD1, trainD2:
    self.model.fit(trainD1, trainD2, epochs=200, batch_size = 32, verbose=1,  callbacks=[es])
    #  self.model.reset_states()

def predict_result(self, test_case):
    value = self.model.predict(test_case, verbose=0)
    return value

当我在start_train方法中取消注释两行代码时,错误就开始了,我把代码变成了这个(当前模型):

class Model:
def set_the_model(self, look_back):
    self.model = Sequential()
    self.model.add(LSTM(16, activation="relu", batch_input_shape=(1,look_back, 3),return_sequences=True, stateful=True))
    self.model.add(Dropout(0.2))
    self.model.add(LSTM(32, activation="relu", return_sequences=True))
    self.model.add(Dropout(0.2))
    self.model.add(TimeDistributed(Dense(look_back)))
    #self.model.add(Dense(3))
    self.model.compile(loss="mse", optimizer="nadam", metrics=['acc']) #mse
    self.model.summary()

def start_train(self, trainD1, trainD2):
    es = EarlyStopping(monitor='loss', patience = 2, mode='min')
    for i, j in zip(trainD1, trainD2):
        self.model.fit(i, j, epochs=200, batch_size = 1, verbose=1,  callbacks=[es])
        self.model.reset_states()

def predict_result(self, test_case):
    value = self.model.predict(test_case, verbose=0)
    return value

然后,我想回到旧模型。当我开始训练模型时,它给出了上面的错误。

这是模型的样子:

Model: "sequential"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
lstm (LSTM)                  (None, 3, 16)             1280      
_________________________________________________________________ 
dropout (Dropout)            (None, 3, 16)             0         
_________________________________________________________________
lstm_1 (LSTM)                (None, 3, 32)             6272      
_________________________________________________________________
dropout_1 (Dropout)          (None, 3, 32)             0         
_________________________________________________________________
time_distributed (TimeDistri (None, 3, 3)              99        
=================================================================
Total params: 7,651
Trainable params: 7,651
Non-trainable params: 0

编辑:我batch_size在旧模型上改为 1,现在它可以工作了,但是现在,它会非常慢。

标签: pythontensorflowmachine-learningneural-networktf.keras

解决方案


推荐阅读