Deep learning 如何在非序列keras模型中包含批量规范化

Deep learning 如何在非序列keras模型中包含批量规范化,deep-learning,keras,conv-neural-network,batch-normalization,nonsequential,Deep Learning,Keras,Conv Neural Network,Batch Normalization,Nonsequential,我是DL和Keras的新手。目前,我尝试实现一个类似CNN的Unet,现在我想在我的非顺序模型中包括批量规范化层,但现在不知道如何实现 这是我当前的尝试,包括: 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 = Bat

我是DL和Keras的新手。目前,我尝试实现一个类似CNN的Unet,现在我想在我的非顺序模型中包括批量规范化层,但现在不知道如何实现

这是我当前的尝试,包括:

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文档中,我读到您通常希望规范化“特征轴”!? 这是模型摘要的一个简短片段:

====================================================================================================
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开始计数),对吗? 我阅读了关于是否应该在激活函数之前或之后实现批处理规范化的讨论。在这种情况下,它是在激活功能之后使用的,对吗?是否有可能在激活功能之前使用它


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

第1部分:批处理规范化的使用方法正确吗?

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

第2部分:在这种情况下,它在激活函数之后使用,对吗?是否可以在激活功能之前使用它?

是的,中定义的批次标准化用于激活层之后,作为减少内部协变量移位的手段。在卷积层上激活之后,代码正确地应用了batchnorm。它在激活层之后的使用可以被认为是信息作为输入到达下一层之前的“预处理步骤”。

因此,批处理规范化也可以作为数据预处理步骤,您可以在输入层之后立即使用(如中所述)。但是,正如答案所述,不应滥用batchnorm;它的计算成本很高,并且会迫使您的模型近似于线性行为(详细介绍了此问题)。

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


在我使用u型网络的经验中,我在最大池之前的卷积层之后才成功地应用了batchnorm;由于这些张量在u-net体系结构中被重复使用,因此这有效地将标准化的计算“砰的一声”翻了一番。除此之外,我不使用batchnorm(如果每张图像的平均像素强度是超异质的,则可能在输入上除外。)

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

这是否比其他答案增加了更多内容?