CNN-LSTM 的批量归一化层

use*_*243 6 conv-neural-network lstm keras tensorflow batch-normalization

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

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
Run Code Online (Sandbox Code Playgroud)

现在我想向这个网络添加批量标准化层。考虑到批量标准化不适用于 LSTM,我可以在Conv1D层之前添加它吗?我认为在LSTM.

另外,我在哪里可以在这个网络中添加 Dropout?一样的地方?(在批量标准化之后还是之前?)

  • AveragePooling1DConv1D和之间添加怎么样LSTM?在这种情况下,是否可以在层之间Conv1D和之间添加批量标准化AveragePooling1D而不对LSTM层产生任何影响?

Ove*_*gon 7

更新:我使用的 LayerNormalization 实现是层间的,不像原始论文中那样重复;后者的结果可能会更好。


BatchNormalization 可以与 LSTM 一起使用 - 链接的 SO 给出了错误的建议;事实上,在我的脑电分类应用中,它占主导地位LayerNormalization。现在你的情况:

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

下面是一个示例模板,您可以将其用作起点;我还推荐以下 SO 以供进一步阅读:Regularizing RNNsVisualizing 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)
Run Code Online (Sandbox Code Playgroud)

使用的功能

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])
Run Code Online (Sandbox Code Playgroud)

Spatial Dropout : pass noise_shape = (batch_size, 1, channels)to Dropout- 效果如下;代码见Git 要点


归档时间:

查看次数:

2188 次

最近记录:

5 年,10 月 前