在Keras中添加神经网络层的这两种方法有什么区别?

时间:2016-05-09 03:34:23

标签: python neural-network keras conv-neural-network theano

我正在使用Keras和Theano作为后端,我有顺序神经网络模型。

我想知道以下是否存在差异?

model.add(Convolution2D(32, 3, 3, activation='relu'))

model.add(Convolution2D(32, 3, 3))
model.add(Activation('relu'))

1 个答案:

答案 0 :(得分:6)

它们基本相同。单独放置它的好处是你可以在其间添加其他层(比如BatchNormalization)。

在Keras,如果没有指定,Convolution2D默认会使用'线性'激活,这只是身份函数

def linear(x):
    '''
    The function returns the variable that is passed in, so all types work.
    '''
    return x 

并且Activation层所做的就是将激活函数应用于输入

def call(self, x, mask=None):
    return self.activation(x)

编辑:

  

所以基本上Convolution2D(activation = 'relu')在执行卷积后应用relu激活函数,这与在Activation('relu')

之后应用Convolution2D(32, 3, 3)相同

call图层的Convolution2D函数的最后两行是

output = self.activation(output)
return output

其中output是卷积的输出。所以我们知道应用激活函数是Convolution2D的最后一步。

源代码:
Convolution2D图层:https://github.com/fchollet/keras/blob/a981a8c42c316831183cac7598266d577a1ea96a/keras/layers/convolutional.py
Activation图层:https://github.com/fchollet/keras/blob/a981a8c42c316831183cac7598266d577a1ea96a/keras/layers/core.py
激活功能:https://github.com/fchollet/keras/blob/master/keras/activations.py