【问题标题】:Incompatible Shapes: Tensorflow/Keras Sequential LSTM with Autoencoder不兼容的形状:Tensorflow/Keras Sequential LSTM with Autoencoder
【发布时间】:2020-12-11 09:40:43
【问题描述】:

我正在尝试为时间序列数据设置 LSTM 自动编码器/解码器,并在尝试训练模型时不断收到 Incompatible shapes 错误。按照步骤并使用来自this example 的玩具数据。请参阅下面的代码和结果。注意 Tensorflow 版本 2.3.0。

创建数据。将数据放入序列中,以(样本、时间戳、特征)的形式对 LSTM 进行时间化。

timeseries = np.array([[0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9],
                       [0.1**3, 0.2**3, 0.3**3, 0.4**3, 0.5**3, 0.6**3, 0.7**3, 0.8**3, 0.9**3]]).transpose()

timeseries_df = pd.DataFrame(timeseries)

def create_sequenced_dataset(X, time_steps=10):
    Xs, ys = [], []  # start empty list
    for i in range(len(X) - time_steps):  # loop within range of data frame minus the time steps
        v = X.iloc[i:(i + time_steps)].values  # data from i to end of the time step
        Xs.append(v)
        ys.append(X.iloc[i + time_steps].values)

    return np.array(Xs), np.array(ys)  # convert lists into numpy arrays and return

X, y = create_sequenced_dataset(timeseries_df, time_steps=3)
timesteps = X.shape[1]
n_features = X.shape[2]

使用重复向量给出的自动编码器/解码器创建 LSTM 模型并尝试训练模型。

model = Sequential()
model.add(LSTM(128, input_shape=(timesteps, n_features), return_sequences=False))
model.add(RepeatVector(timesteps))
model.add(LSTM(128, return_sequences=True))
model.add(TimeDistributed(Dense(n_features)))
model.compile(optimizer='adam', loss='mse')
model.summary()

model.fit(X, y, epochs=10, batch_size=4)

一直报错:

tensorflow.python.framework.errors_impl.InvalidArgumentError:  Incompatible shapes: [4,3,2] vs. [4,2]
     [[node gradient_tape/mean_squared_error/BroadcastGradientArgs (defined at <ipython-input-9-56896428cea9>:1) ]] [Op:__inference_train_function_10833]

X 看起来像:

array([[[0.1  , 0.001],
        [0.2  , 0.008],
        [0.3  , 0.027]],
       [[0.2  , 0.008],
        [0.3  , 0.027],
        [0.4  , 0.064]],
       [[0.3  , 0.027],
        [0.4  , 0.064],
        [0.5  , 0.125]],
       [[0.4  , 0.064],
        [0.5  , 0.125],
        [0.6  , 0.216]],
       [[0.5  , 0.125],
        [0.6  , 0.216],
        [0.7  , 0.343]],
       [[0.6  , 0.216],
        [0.7  , 0.343],
        [0.8  , 0.512]]])

你看起来像:

array([[0.4  , 0.064],
       [0.5  , 0.125],
       [0.6  , 0.216],
       [0.7  , 0.343],
       [0.8  , 0.512],
       [0.9  , 0.729]])

【问题讨论】:

  • 你还能打印X和y的形状吗?

标签: python tensorflow keras deep-learning lstm


【解决方案1】:

我希望译者能正确翻译我的想法。起初我也不明白问题出在哪里,但后来我再次阅读了自动编码器的定义。由于这是一个自动编码器,我们将 X 应用于输入和输出(y 不以任何方式参与模型,因为我们试图确定数据 X 中的依赖关系,然后重新创建它们)。有些人有关于这个主题的代码(y = x.copy ()),而这里它适用(model.fit (X, X, epochs = 300, batch_size = 5, verbose = 0))。

【讨论】:

  • 我想我理解你的意思,它反映了我正在学习的东西。对于自动编码器,输入和输出必须具有相同的形状。但是,我不认为输出本身需要是输入的精确副本?
【解决方案2】:

正如消息中明确指出的,这是您传递给模型以进行拟合的形状问题。

根据您提供的上述数据,X 的形状为(6, 3, 2),而 Y 的形状为(6, 2),这是不兼容的。

下面是修改后的代码,其输入与您使用XY 具有形状(6,3,2) 的示例相同。

model = Sequential()
model.add(LSTM(128, input_shape=(timesteps, n_features), return_sequences=False))
model.add(RepeatVector(timesteps))
model.add(LSTM(128, return_sequences=True))
model.add(TimeDistributed(Dense(n_features)))
model.compile(optimizer='adam', loss='mse')
model.summary()  

model.fit(X,Y, epochs=10, batch_size=4)

结果:

Epoch 1/10
2/2 [==============================] - 0s 5ms/step - loss: 0.0069
Epoch 2/10
2/2 [==============================] - 0s 4ms/step - loss: 0.0065
Epoch 3/10
2/2 [==============================] - 0s 4ms/step - loss: 0.0065
Epoch 4/10
2/2 [==============================] - 0s 4ms/step - loss: 0.0062
Epoch 5/10
2/2 [==============================] - 0s 4ms/step - loss: 0.0059
Epoch 6/10
2/2 [==============================] - 0s 4ms/step - loss: 0.0053
Epoch 7/10
2/2 [==============================] - 0s 5ms/step - loss: 0.0048
Epoch 8/10
2/2 [==============================] - 0s 5ms/step - loss: 0.0046
Epoch 9/10
2/2 [==============================] - 0s 5ms/step - loss: 0.0044
Epoch 10/10
2/2 [==============================] - 0s 6ms/step - loss: 0.0043
<tensorflow.python.keras.callbacks.History at 0x7ff352f9ccf8>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-10
    • 2020-10-16
    • 2019-10-20
    • 2018-10-21
    相关资源
    最近更新 更多