【问题标题】:relu as a parameter in Dense() ( or any other layer) vs ReLu as a layer in Kerasrelu 作为 Dense() (或任何其他层)中的参数与 ReLu 作为 Keras 中的层
【发布时间】:2019-12-25 21:43:21
【问题描述】:

我只是想知道使用和专业之间是否有任何显着差异

Dense(activation='relu')

keras.layers.ReLu

如何以及在哪里可以使用后一个?我最好的猜测是在功能 API 用例中,但我不知道如何。

【问题讨论】:

  • 如果您满意,请不要忘记接受我的回答,谢谢。
  • 请阅读我的更新,因为我错过了你的最后一个问题
  • 当然,感谢您提供的非常有见地的帮助。

标签: python keras deep-learning neural-network


【解决方案1】:

创建一些 Layer 实例将激活作为参数传递,即 activation='relu' 与创建一些 Layer 实例然后创建激活相同,例如Relu 实例。 Relu() 是在inputs 之上返回K.relu() 函数的层:

class ReLU(Layer):
.
.
.
     def call(self, inputs):
            return K.relu(inputs,
                          alpha=self.negative_slope,
                          max_value=self.max_value,
                          threshold=self.threshold)

来自 Keras 文档:

激活的使用

激活可以通过激活层使用,也可以通过 所有人都支持的激活参数 前向层:

from keras.layers import Activation, Dense

model.add(Dense(64))
model.add(Activation('tanh'))

这相当于:

model.add(Dense(64, activation='tanh'))

您还可以将逐元素的 TensorFlow/Theano/CNTK 函数传递为 激活:

from keras import backend as K

model.add(Dense(64, activation=K.tanh))

更新:

回答 OP 的附加问题:如何以及在哪里可以使用后一个?

您可以在使用某些层时使用它,该层不接受 activation 参数,例如tf.keras.layers.Addtf.keras.layers.Subtract 等,但您希望得到这些层的校正输出:

added = tf.keras.layers.Add()([x1, x2])
relu = tf.keras.layers.ReLU(added)

【讨论】:

    【解决方案2】:

    最明显的用例是当您需要放置一个没有Dense 层的 ReLU 时,例如在实现 ResNet 时,设计需要在对残差连接求和后激活 ReLU,如图所示 here

    x = layers.add([x, shortcut])
    x = layers.Activation('relu')(x)
    return x
    

    当您想在Dense 层的预激活和 ReLU 激活之间放置一个 BatchNormalization 层时,它也很有用。当使用GlobalAveragePooling 分类器时(例如在 SqueezeNet 架构中),您需要在 GAP 之后使用Activation("softmax") 放置一个 softmax 激活,并且网络中没有Dense 层。

    可能还有更多案例,这些只是示例。

    【讨论】:

    • 这些可以单独使用,没有任何层,或者它们必须跟随一个层,比如 Dense?
    • ResNet 示例展示了如何在没有 Dense 层的情况下使用它们,没有这样的限制
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多