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?一样的地方?(在批量标准化之后还是之前?)
AveragePooling1D在Conv1D和之间添加怎么样LSTM?在这种情况下,是否可以在层之间Conv1D和之间添加批量标准化AveragePooling1D而不对LSTM层产生任何影响?更新:我使用的 LayerNormalization 实现是层间的,不像原始论文中那样重复;后者的结果可能会更好。
BatchNormalization 可以与 LSTM 一起使用 - 链接的 SO 给出了错误的建议;事实上,在我的脑电分类应用中,它占主导地位LayerNormalization。现在你的情况:
Conv1D吗”?不要 - 相反,事先标准化您的数据,否则您将使用劣质变体来做同样的事情BatchNormalization在激活之前和之后 - 适用于两者Conv1D和LSTMBN之后LSTM可以是每噪音引进能力,它可以混淆分类层适得其反-但是这是关于输出之前是一层,并不LSTMLSTM与return_sequences=True前面的堆叠return_sequences=False,则可以放置Dropout在任何位置 - 之前LSTM、之后或两者recurrent_dropout仍然比Dropoutfor更可取LSTM-但是,您可以同时执行两者;只是不要使用 with activation='relu',因为LSTM每个错误都不稳定Pooling都是多余的,可能会损害性能;与简单的平均操作相比,通过非线性更好地转换稀缺数据SqueezeExcite在你的 Conv 之后放置一个块;这是一种自我注意的形式——见论文;我在下面的 1D 实现activation='selu'使用AlphaDropout并'lecun_normal'初始化,每篇论文Self Normalizing Neural Networks下面是一个示例模板,您可以将其用作起点;我还推荐以下 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)
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 次 |
| 最近记录: |