使用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'])

我的问题是:
  • 函数式方法中的这种语法正确吗?
  • 为什么Keras需要这些高级激活功能的新层,而不是仅允许我们替换'relu'
  • 为激活函数创建新层,而不是将其分配给现有的层定义(如在我们编写'relu'的第一个示例中一样)有根本的不同,因为我意识到您总是可以编写激活函数,包括标准的层,作为新的层,虽然已经读到应该避免这种情况?
  • 最佳答案

  • 不,您忘记了将LeakyReLU连接到密集层:

    LR = LeakyReLU(alpha = 0.1)(dense_1)
  • 通常,高级激活具有可调整的或可学习的参数,并且这些参数必须存储在某个位置,因此将它们设置为分层更为有意义,因为您可以随后访问和保存这些参数。
  • 仅在有优势(例如可调参数)时才这样做。
  • 关于neural-network - Keras Functional API中的高级激活层,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49866874/

    10-12 22:51