【问题标题】:How to include batch normalization in non-sequential keras model如何在非序列 keras 模型中包含批量标准化
【发布时间】:2018-03-01 04:45:12
【问题描述】:

我是 DL 和 Keras 的新手。目前我尝试实现一个类似 Unet 的 CNN,现在我想将批量标准化层包含到我的非序列模型中,但现在还没有真正做到。

这是我目前尝试包含它的:

input_1 = Input((X_train.shape[1],X_train.shape[2], X_train.shape[3]))

conv1 = Conv2D(16, (3,3), strides=(2,2), activation='relu', padding='same')(input_1)
batch1 = BatchNormalization(axis=3)(conv1)
conv2 = Conv2D(32, (3,3), strides=(2,2), activation='relu', padding='same')(batch1)
batch2 = BatchNormalization(axis=3)(conv2)
conv3 = Conv2D(64, (3,3), strides=(2,2), activation='relu', padding='same')(batch2)
batch3 = BatchNormalization(axis=3)(conv3)
conv4 = Conv2D(128, (3,3), strides=(2,2), activation='relu', padding='same')(batch3)
batch4 = BatchNormalization(axis=3)(conv4)
conv5 = Conv2D(256, (3,3), strides=(2,2), activation='relu', padding='same')(batch4)
batch5 = BatchNormalization(axis=3)(conv5)
conv6 = Conv2D(512, (3,3), strides=(2,2), activation='relu', padding='same')(batch5)
drop1 = Dropout(0.25)(conv6)

upconv1 = Conv2DTranspose(256, (3,3), strides=(1,1), padding='same')(drop1)
upconv2 = Conv2DTranspose(128, (3,3), strides=(2,2), padding='same')(upconv1)
upconv3 = Conv2DTranspose(64, (3,3), strides=(2,2), padding='same')(upconv2)
upconv4 = Conv2DTranspose(32, (3,3), strides=(2,2), padding='same')(upconv3)
upconv5 = Conv2DTranspose(16, (3,3), strides=(2,2), padding='same')(upconv4)
upconv5_1 = concatenate([upconv5,conv2], axis=3)
upconv6 = Conv2DTranspose(8, (3,3), strides=(2,2), padding='same')(upconv5_1)
upconv6_1 = concatenate([upconv6,conv1], axis=3)
upconv7 = Conv2DTranspose(1, (3,3), strides=(2,2), activation='linear', padding='same')(upconv6_1)

model = Model(outputs=upconv7, inputs=input_1)

是否以正确的方式使用了批量标准化?在我读到的 keras 文档中,您通常想要规范化“特征轴”!? 这是模型摘要中的一个简短的 sn-p:

====================================================================================================
input_1 (InputLayer)             (None, 512, 512, 9)   0
____________________________________________________________________________________________________
conv2d_1 (Conv2D)                (None, 256, 256, 16)  1312        input_1[0][0]
____________________________________________________________________________________________________
conv2d_2 (Conv2D)                (None, 128, 128, 32)  4640        conv2d_1[0][0]
____________________________________________________________________________________________________
conv2d_3 (Conv2D)                (None, 64, 64, 64)    18496       conv2d_2[0][0]
____________________________________________________________________________________________________

在这种情况下,我的特征轴是轴 3(从 0 开始计数),对吗? 我阅读了有关是否应该在激活函数之前或之后实施批量标准化的讨论。在这种情况下,它是在激活函数之后使用的,对吧?有没有可能在激活函数之前使用它?

非常感谢您的帮助和反馈!真的很感激!

【问题讨论】:

    标签: deep-learning keras conv-neural-network batch-normalization nonsequential


    【解决方案1】:

    第 1 部分:批标准化的使用方式是否正确?

    您调用 BatchNormalization 层的方式是正确的;根据文档的建议,axis=3 是您想要的。 请记住,对于您的模型,axis=3 等效于默认设置 axis=-1,因此您无需显式调用它。

    第 2 部分:在此case 是在激活函数之后使用的吧?有没有可能在激活函数之前使用它?

    是的,the 2014 research paper by Ioffe and Szegedy 中定义的批量归一化旨在在激活层之后使用,作为减少内部协变量偏移的一种手段。您的代码在卷积层上激活后正确应用了 batchnorm。它在激活层之后的使用可以被认为是信息在作为输入到达下一层之前的“预处理步骤”。

    出于这个原因,批量标准化也可以作为数据预处理步骤,您可以在输入层之后立即使用它(如this response 中所述)。但是,正如该答案所提到的,不应滥用批处理规范;它的计算成本很高,并且可能会迫使您的模型接近线性行为(this answer 对此问题进行了更详细的介绍)。

    在模型的其他步骤中使用 batchnorm(不是在激活层或输入层之后)会对模型性能产生难以理解的影响;这是一个旨在明确应用于激活层输出的过程。

    根据我使用 u-net 的经验,我仅在最大池化之前的卷积层之后应用 batchnorm 取得了很大的成功;这有效地使归一化的计算“物有所值”翻了一番,因为这些张量在 u-net 架构中被重用。除此之外,我不使用batchnorm(如果每张图像的平均像素强度超级异构,则可能在输入上除外。)

    【讨论】:

      【解决方案2】:

      轴 3 = 轴 -1,这是默认参数。

      【讨论】:

      • 这是否比其他答案添加了更多内容?
      猜你喜欢
      • 2017-10-21
      • 1970-01-01
      • 1970-01-01
      • 2018-07-28
      • 2019-10-07
      • 2020-01-15
      • 2019-10-30
      • 2017-07-10
      • 2019-05-23
      相关资源
      最近更新 更多