【问题标题】:BatchNormalization for some inputs only in Keras仅在 Keras 中对某些输入进行 BatchNormalization
【发布时间】:2018-04-18 16:15:06
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    考虑到您的训练数据形状为 (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
    

    【讨论】:

    • 是的,我可以。我什至可以在输入 NN 之前对所有时间步手动应用归一化: input_0 = X_train[:, :, 0] X_train[:, :, 0] = (input_0 - input_0.mean()) / (math.sqrt(input_0 .std()) - 0.001)**2 但我不仅想对 1 个样本而且对整个批次都这样做。并将其委托给 Keras。
    • 但是有数千个输入样本。 Keras 将为特定批次选择(例如)随机 64 个样本。如果我正确理解批量标准化,则每次都会对每批 64 个样本应用它。不是整个输入集。如果我有序列 [0,0,0,1000,1000,1000] 和 timesteps=3 / batch_size=1,那么在没有 shuffle BN 的情况下会提供 2 个类似的批次:[0,0,0]。但是当 BN 分别应用于每个批次时,它将是:[-1, -1, -1] 和 [1, 1, 1]
    • 不确定我是否理解你如何处理你的输入......它们应该是(batch, steps, features)的形状。
    • 我只是为了解释而简化了它。 [0,0,0,1000,1000,1000] 是一个有 6 个时间步长的特征。因此,对于输入形状 (2, 3, 1),它将是:[[0,0,0], [1000,1000,1000]]。因此,Keras BN 将分别对 [0,0,0] 和 [1000,1000,1000] 进行归一化。但是上面的代码规范了整个序列 [0,0,0,1000,1000,1000]
    • Ok.... 我认为标准化整个数据会更好(毕竟,如果所有数据具有相同的性质,最好将它们保持在逻辑比例内),但如果您确实想要单独的规范化,然后想办法解决我的答案...
    【解决方案2】:

    试试下面的定义:

    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])
    

    但正如 Daniel 在他的评论中提到的那样 - 最好对数据进行规范化以处理这种不一致 - 使用 BatchNormalization 可能会导致性能下降。

    【讨论】:

      猜你喜欢
      • 2021-05-14
      • 1970-01-01
      • 1970-01-01
      • 2018-10-14
      • 2012-11-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多