【问题标题】:How to apply advanced activation layers with a CNN layer?如何使用 CNN 层应用高级激活层?
【发布时间】:2020-04-18 02:33:02
【问题描述】:

我尝试将 ReLU 和 PReLU 与 CNN 层一起应用来比较结果,我尝试了以下代码:

使用 ReLU:

model.add(Conv1D(filters, kernel_size, activation='relu'))

使用 PReLU:

model.add(Conv1D(filters, kernel_size))
model.add(PReLU())

Conv1D 层是否使用 PReLU 作为激活函数?

我怀疑是因为我打印了模型摘要,它显示了具有不同数量参数的 CNN 和 PReLU 之间的单独层,同时具有 ReLU 函数的 CNN 层它们在同一层中。

如果我使用了错误的代码,我该如何纠正?

【问题讨论】:

    标签: tensorflow keras neural-network conv-neural-network


    【解决方案1】:

    是的,Conv1D 层将使用 PReLu 激活函数。当您定义 Conv2D 层时,

    x = tf.keras.layers.Conv2D( 13 , kernel_size=( 3 , 3 ) , strides=1 , activation='relu' )( inputs )
    

    上面的语句等价于,

    x = tf.keras.layers.Conv2D( 13 , kernel_size=( 3 , 3 ) , strides=1 )( inputs )
    x = tf.keras.layers.Activation( 'relu' )( x )
    

    将激活函数作为单独的层提供的原因是,有时我们需要在将特征图传递给激活函数之前将我们的逻辑添加到特征图中。

    例如,在将特征图传递给激活函数之前添加了BatchNormalization 层,

    x = tf.keras.layers.Conv2D( 13 , kernel_size=( 3 , 3 ) , strides=1 )( inputs )
    x = tf.keras.layers.BatchNormalization()(x)
    x = tf.keras.layers.Activation( 'relu' )( x )
    

    回到你的问题,

    eluLeakyReLUPReLU 等一些特殊的激活函数作为单独的层添加,我们不能使用 activation= 参数将它们包含在 Conv1D 层中。

    关于可训练参数,conv1d_18 层有 15050 个参数,这些参数构成一维卷积中的内核。这些参数与激活函数无关。

    PReLU 的 4900 个参数是经过反向传播优化的斜率参数。这些参数以及内核权重将随着每个批次更新,因此包含在可训练参数中。

    因此,Conv1D 层的输出(未激活)将通过PReLU 激活,该激活确实使用斜率参数来计算激活的输出。

    【讨论】:

    • 解释很清楚,感谢您的帮助。谢谢
    【解决方案2】:

    根据keras docs

    这将是等价的

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

    到这个

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

    我不知道为什么必须使用高级激活函数作为层,而 PReLu 可以与 CNN 一起使用,完全没有问题。

    【讨论】:

      猜你喜欢
      • 2018-11-24
      • 2018-09-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-06
      • 1970-01-01
      • 2021-03-19
      • 2018-03-21
      相关资源
      最近更新 更多