我有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裸层为第一个输入创建模型,然后将其与其余层连接起来。但我不确定,也不知道这究竟是怎么做的。
答案 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
可能会导致性能下降。