使用Keras设置神经网络时,您可以使用Sequential
模型或Functional API
。我的理解是前者易于设置和管理,并且作为线性堆栈层运行,并且功能方法对于更复杂的架构是有用的,特别是那些涉及共享内部层的输出的架构。我个人喜欢使用功能API来实现多功能性,但是,我遇到了LeakyReLU等高级激活层的困难。使用标准激活时,在顺序模型中可以写:
model = Sequential()
model.add(Dense(32, activation='relu', input_dim=100))
model.add(Dense(10, activation='softmax'))
model.compile(optimizer='rmsprop',
loss='categorical_crossentropy',
metrics=['accuracy'])
类似地,在功能API中,可以将上面的内容写成:
inpt = Input(shape = (100,))
dense_1 = Dense(32, activation ='relu')(inpt)
out = Dense(10, activation ='softmax')(dense_2)
model = Model(inpt,out)
model.compile(optimizer='rmsprop',
loss='categorical_crossentropy',
metrics=['accuracy'])
但是,当使用LeakyReLU和PReLU等高级激活时,在该顺序模型中,我们将它们写为单独的层。例如:
model = Sequential()
model.add(Dense(32, input_dim=100))
model.add(LeakyReLU(alpha=0.1))
model.add(Dense(10, activation='softmax'))
model.compile(optimizer='rmsprop',
loss='categorical_crossentropy',
metrics=['accuracy'])
现在,我假设有人在功能API方法中做了相同的事情:
inpt = Input(shape = (100,))
dense_1 = Dense(32)(inpt)
LR = LeakyReLU(alpha=0.1)(dense_1)
out = Dense(10, activation ='softmax')(LR)
model = Model(inpt,out)
model.compile(optimizer='rmsprop',
loss='categorical_crossentropy',
metrics=['accuracy'])
我的问题是:
'relu'
?'relu'
的第一个示例中所示),因为我意识到你总是可以写您的激活功能,包括标准功能,作为新层,虽然已经读过应该避免的? 答案 0 :(得分:3)
不,您忘了将LeakyReLU连接到密集层:
LR = LeakyReLU(alpha = 0.1)(dense_1)
通常,高级激活具有可调参数或可学习参数,并且这些参数必须存储在某处,因此您可以访问并保存这些参数,因此它们更有意义。