我正在使用Keras和Theano作为后端,我有顺序神经网络模型。
我想知道以下是否存在差异?
model.add(Convolution2D(32, 3, 3, activation='relu'))
和
model.add(Convolution2D(32, 3, 3))
model.add(Activation('relu'))
答案 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