【问题标题】:How to use TimeDsitributed layer for neural network ensmeble (specifically CNN+LSTM)?如何将 TimeDsitributed 层用于神经网络集成(特别是 CNN+LSTM)?
【发布时间】:2020-05-29 11:44:35
【问题描述】:

所以这是我尝试的两种方法中的第一种:

inputs=Input(shape=(frames, 103*4, 1))

z=TimeDistributed(Conv2D(32, (5,25), padding='same', activation='relu'), input_shape=(frames, 103*4, 1))(inputs)
z=TimeDistributed(BatchNormalization())(z)
z=TimeDistributed(ReLU())(z)
z=TimeDistributed(Dropout(0.2))(z)
z=TimeDistributed(MaxPooling2D(pool_size=(1,2)))(z)

z=TimeDistributed(Conv2D(32, (3,5), padding='same', activation='relu'))(z)
z=TimeDistributed(BatchNormalization())(z)
z=TimeDistributed(ReLU())(z)
z=TimeDistributed(Dropout(0.2))(z)
z=TimeDistributed(MaxPooling2D(pool_size=(1,2)))(z)

z=TimeDistributed(Flatten())(z)

z=LSTM(1000, dropout=0.1, recurrent_dropout=0.2, return_sequences=True)(z)
z=LSTM(1000, dropout=0.1, recurrent_dropout=0.2, return_sequences=True)(z)
z=LSTM(1000, dropout=0.1, recurrent_dropout=0.2, return_sequences=True)(z)

z=Flatten()(z)

z=Dense(1000, activation='relu')(z)
z=Dropout(0.5)(z)

z=Dense(500, activation='relu')(z)
z=Dropout(0.5)(z)

z=Dense(200, activation='relu')(z)
z=Dropout(0.5)(z)

outputs=Dense(88, activation='sigmoid')(z)

我收到此错误(尽管我的代码中的任何地方都没有步幅大小为 2):

ValueError: strides should be of length 1, 1 or 3 but was 2

我已经查看了this question,似乎我已经实现了我的代码中给出的建议。但问题是什么?我无法理解它。

最后我设法通过 Keras 的 FunctionalAPI 将 CNN 和 LSTM 结合起来:

inputs=Input(shape=(frames, 103*4, 1))

z=Conv2D(32, (5,25), padding='same', activation='relu')(inputs)
z=BatchNormalization()(z)
z=ReLU()(z)
z=Dropout(0.2)(z)
z=MaxPooling2D(pool_size=(1,2))(z)

z=Conv2D(32, (3,5), padding='same', activation='relu')(z)
z=BatchNormalization()(z)
z=ReLU()(z)
z=Dropout(0.2)(z)
z=MaxPooling2D(pool_size=(1,2))(z)

z=TimeDistributed(Flatten())(z)

z=LSTM(1000, dropout=0.1, recurrent_dropout=0.2, return_sequences=True)(z)
z=LSTM(1000, dropout=0.1, recurrent_dropout=0.2, return_sequences=True)(z)
z=LSTM(1000, dropout=0.1, recurrent_dropout=0.2, return_sequences=True)(z)

z=Flatten()(z)

z=Dense(1000, activation='relu')(z)
z=Dropout(0.5)(z)

z=Dense(500, activation='relu')(z)
z=Dropout(0.5)(z)

z=Dense(200, activation='relu')(z)
z=Dropout(0.5)(z)

outputs=Dense(88, activation='sigmoid')(z)


model=Model(inputs=inputs, outputs=outputs)

它有效,但如果这是正确的方法,我仍然不知所措。我可以通过model.summary() 看到我的 TimeDstributed 包装器的输出形状为(None, 7, 3296),并且所有 LSTM 层的输出形状为(None, 7, 1000)。我应该改变什么来给它中心框架而不是 7 框架?

说到我的数据集,我给出了 7 帧频率值的幅度来预测中心帧中的值。

【问题讨论】:

    标签: python keras deep-learning lstm conv-neural-network


    【解决方案1】:

    我假设您想在帧维度上应用 TimeDistributed 层,这使得我们的输入是二维的,并被发送到卷积层。 如果是这种情况,那么您应该使用 Conv1D 而不是 Conv2D。相应地更改内核大小。 同时将 Maxpooling2D 更改为 Maxpooling1D。

    例如。

    z=TimeDistributed(Conv1D(32, 2, padding='same', activation='relu'))(inputs)
    

    【讨论】:

      【解决方案2】:

      @priyach 你是对的,但正如我所见,我对我的数据集的解释有点糟糕。我有 2d 数组,时间在 x 轴上,频率在 y 轴上(试图根据频率信息预测正在播放的音符)

      因此,如果我将二维数组的列(每列代表给定时间的所有频率)输入到我的网络中,那么 Conv1D 和 MaxPooling1D 将是正确的选择

      但是,我没有将列作为输入,而是将每列提供给它的左侧 3 列和右侧的 3 列(或者使用零填充,然后我无法获取列)。所以我的输入本质上是 2d 的,我将其视为图像。

      我设法创建了另一个网络 (CNN+DNN+LSTM+DNN),并在第一个 LSTM 层之前使用了 Reshape 层(而不是 TimeDistributed)。

      问题仍然存在(出于好奇和未来的编程)。我对 TimeDistributed 层的使用有什么问题?

      【讨论】:

        猜你喜欢
        • 2015-04-02
        • 2018-09-23
        • 2023-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-02-25
        • 2022-08-15
        • 1970-01-01
        相关资源
        最近更新 更多