keras版本CReLU

将深度学习网络的前几层的卷积结构,换成CReLU可以提升效果。CReLU在pytorch中嵌入非常简单,按照定义和前向推理的方式即可定义CReLU。

今天项目需求,在keras上嵌入CReLU,由于对keras用法并不熟悉,遇到了一些困难,发现了一些问题,这里记录。

一开始我的写法如下

def CReLU(out_channels, input):
    _x = Conv2D(out_channels // 2, kernel_size=(7,7), strides=(2,2), padding='same', activation='relu')(input)
    channel_axis = 1 if K.image_data_format() == 'channels_first' else -1
    out = concatenate([_x, -_x], channel_axis)
    return out

发现总是爆出'Nonetype'的问题,这里定位问题出现在 ‘-_x’ 上,由于_x的定义为Layer的定义,因此不能直接取反,这里通过Lambda函数实现逐点取反,如下所示: 

def minus_layer(input):
    _x = -1 * input
    return _x

def CReLU(out_channels, input):
    _x = Conv2D(out_channels // 2, kernel_size=(7,7), strides=(2,2), padding='same', activation='relu')(input)
    channel_axis = 1 if K.image_data_format() == 'channels_first' else -1
    _x_minus = Lambda(minus_layer)
    out = concatenate([_x, _x_minus], channel_axis)
    return out

 

你可能感兴趣的:(深度学习)