仅在Keras中对某些输入进行BatchNormalization

时间:2017-11-06 13:21:46

标签: machine-learning keras deep-learning lstm batch-normalization

我有LSTM网络,有5个输入。第一个输入典型值为1000到3000.其余输入的值为-1到1.

我想插入BatchNormalization作为第一层。但是输入2-5已经在-1和1之间,第一个输入远大于第一个输入。我只想对第一个输入应用批量标准化,并按原样保留输入2-5。然后应将第一个(标准化)输入和2-5个输入传递给LSTM层。

      +----+   +---+
 1 -->| BN |-->|   |
      +----+   | L |
 2 ----------->| S |
 3 ----------->| T |
 4 ----------->| M | 
 5 ----------->|   |
               +---+

如何在Keras完成?

我认为我可以使用BatchNormalization裸层为第一个输入创建模型,然后将其与其余层连接起来。但我不确定,也不知道这究竟是怎么做的。

2 个答案:

答案 0 :(得分:2)

考虑到您的训练数据形状为(batch,timeSteps,5),也许您只需更改输入:

maxVal = abs(X_train[:,:,0].max())
minVal = abs(X_train[:,:,0].min())
maxVal = max(maxVal,minVal)

X_train[:,:,0] = X_train[:,:,0] / maxVal

答案 1 :(得分:1)

尝试以下定义:

from keras.layers.merge import concatenate

input_tensor = Input(shape=(timesteps, 5)) 

# now let's split tensors
split_1 = Lambda(lambda x: x[:, :, :1])(input_tensor)
split_2 = Lambda(lambda x: x[:, :, 1:])(input_tensor)

split_1 = BatchNormalization()(split_1)

# now let's concatenate them again
follow = concatenate([split_1, split_2])

但正如丹尼尔在评论中提到的那样 - 为了处理这种不一致而最好规范化数据 - 使用BatchNormalization可能会导致性能下降。