1

我有 5 个输入的 LSTM 网络。第一个输入的典型值是从 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 裸层为第一个输入创建模型,然后将其与其余层连接起来。但我不确定也不知道具体是怎么做的。

4

2 回答 2

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
于 2017-11-06T13:31:42.753 回答
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可能会导致性能下降。

于 2017-11-06T21:36:24.540 回答