gpt4 book ai didi

tensorflow - CNN-LSTM 的批量归一化层

转载 作者:行者123 更新时间:2023-12-03 13:03:07 26 4
gpt4 key购买 nike

假设我有一个这样的模型(这是一个用于时间序列预测的模型):

ipt   = Input((data.shape[1] ,data.shape[2])) # 1
x = Conv1D(filters = 10, kernel_size = 3, padding = 'causal', activation = 'relu')(ipt) # 2
x = LSTM(15, return_sequences = False)(x) # 3
x = BatchNormalization()(x) # 4
out = Dense(1, activation = 'relu')(x) # 5

现在我想向这个网络添加批量标准化层。考虑到 batch normalization doesn't work with LSTM , 之前可以加吗 Conv1D层?我认为在 LSTM 之后有一个批量归一化层是合理的。 .

另外,我在哪里可以在这个网络中添加 Dropout?一样的地方? (在批量标准化之后还是之前?)
  • 添加AveragePooling1D怎么样?之间Conv1DLSTM ?是否可以在 Conv1D 之间添加批量标准化?和 AveragePooling1D在这种情况下对LSTM没有任何影响层?
  • 最佳答案

    更新 :我使用的 LayerNormalization 实现是层间的,不像原始论文中那样重复;后者的结果可能会更好。
    BatchNormalization可以与 LSTM 一起使用 - 链接的 SO 给出了错误的建议;事实上,在我的脑电分类应用中,它占主导地位LayerNormalization .现在你的情况:

  • “我可以在 Conv1D 之前添加它吗?”?不要 - 相反,事先标准化您的数据,否则您将使用劣质变体来做同样的事情
  • 两个都试试:BatchNormalization激活之前和之后 - 适用于两者 Conv1DLSTM
  • 如果您的模型与您展示的完全一样,BN之后 LSTM引入噪声的能力可能适得其反,这可能会混淆分类器层 - 但这是输出前的一层,而不是 LSTM
  • 如果您不使用堆叠式 LSTMreturn_sequences=Truereturn_sequences=False ,您可以放置​​Dropout任何地方 - 之前 LSTM ,之后,或两者
  • 空间丢失 :丢弃单位/ channel 而不是随机激活(见底部); LeCun, et al 表明在减少论文中 CNN 中的协同适应方面更有效,带有适用于 RNN 的想法。可以大大增加收敛时间,同时也可以提高性能
  • recurrent_dropout仍然优于 DropoutLSTM - 但是,您可以同时进行;只是不要与 activation='relu' 一起使用,其中 LSTM由于错误而不稳定
  • 对于您的维度数据,任何类型的 Pooling是多余的,可能会损害性能;与简单平均操作相比,通过非线性更好地转换稀有数据
  • 我强烈推荐一个 SqueezeExcite在您的转化之后阻止;这是一种自我注意的形式 - 见 paper ;我在下面的一维实现
  • 我也建议尝试 activation='selu'AlphaDropout'lecun_normal'初始化,每篇论文 Self Normalizing Neural Networks
  • 免责声明:以上建议可能不适用于 NLP 和类似嵌入的任务

  • 下面是一个示例模板,您可以将其用作起点;我还推荐以下 SO 以供进一步阅读: Regularizing RNNs , 和 Visualizing RNN gradients

    from keras.layers import Input, Dense, LSTM, Conv1D, Activation
    from keras.layers import AlphaDropout, BatchNormalization
    from keras.layers import GlobalAveragePooling1D, Reshape, multiply
    from keras.models import Model
    import keras.backend as K
    import numpy as np


    def make_model(batch_shape):
    ipt = Input(batch_shape=batch_shape)
    x = ConvBlock(ipt)
    x = LSTM(16, return_sequences=False, recurrent_dropout=0.2)(x)
    # x = BatchNormalization()(x) # may or may not work well
    out = Dense(1, activation='relu')

    model = Model(ipt, out)
    model.compile('nadam', 'mse')
    return model

    def make_data(batch_shape): # toy data
    return (np.random.randn(*batch_shape),
    np.random.uniform(0, 2, (batch_shape[0], 1)))

    batch_shape = (32, 21, 20)
    model = make_model(batch_shape)
    x, y = make_data(batch_shape)

    model.train_on_batch(x, y)

    使用的函数 :

    def ConvBlock(_input):  # cleaner code
    x = Conv1D(filters=10, kernel_size=3, padding='causal', use_bias=False,
    kernel_initializer='lecun_normal')(_input)
    x = BatchNormalization(scale=False)(x)
    x = Activation('selu')(x)
    x = AlphaDropout(0.1)(x)
    out = SqueezeExcite(x)
    return out

    def SqueezeExcite(_input, r=4): # r == "reduction factor"; see paper
    filters = K.int_shape(_input)[-1]

    se = GlobalAveragePooling1D()(_input)
    se = Reshape((1, filters))(se)
    se = Dense(filters//r, activation='relu', use_bias=False,
    kernel_initializer='he_normal')(se)
    se = Dense(filters, activation='sigmoid', use_bias=False,
    kernel_initializer='he_normal')(se)
    return multiply([_input, se])

    空间丢失 :通过 noise_shape = (batch_size, 1, channels)Dropout - 具有以下效果;见 Git gist对于代码:

    关于tensorflow - CNN-LSTM 的批量归一化层,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59285058/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com