2017-02-21 33 views
5
def conv2d_bn(x, nb_filter, nb_row, nb_col, 
       border_mode='same', subsample=(1, 1), 
       name=None): 
    '''Utility function to apply conv + BN. 
    ''' 

    x = Convolution2D(nb_filter, nb_row, nb_col, 
         subsample=subsample, 
         activation='relu', 
         border_mode=border_mode, 
         name=conv_name)(x) 
    x = BatchNormalization(axis=bn_axis, name=bn_name)(x) 
    return x 

当我在keras中使用官方inception_v3模型时,我发现他们在'relu'非线性之后使用BatchNormalization作为上面的代码脚本。在非线性之前或Keras之后添加批量标准化?

但是在批标准化论文中,作者说

我们添加BN立即把非线性之前,通过 正火X =武+ B。

然后我查看tensorflow中的初始实现,它在非线性之前立即添加BN,正如他们所说的那样。 inception ops.py

我很困惑。为什么人们在Keras以外的地方使用以上风格?

def conv2d_bn(x, nb_filter, nb_row, nb_col, 
       border_mode='same', subsample=(1, 1), 
       name=None): 
    '''Utility function to apply conv + BN. 
    ''' 

    x = Convolution2D(nb_filter, nb_row, nb_col, 
         subsample=subsample, 
         border_mode=border_mode, 
         name=conv_name)(x) 
    x = BatchNormalization(axis=bn_axis, name=bn_name)(x) 
    x = Activation('relu')(x) 
    return x 

在密集的情况下:

x = Dense(1024, name='fc')(x) 
x = BatchNormalization(axis=bn_axis, name=bn_name)(x) 
x = Activation('relu')(x) 

回答