你如何在 Python 中使用 Keras LeakyReLU?

Posted

技术标签:

【中文标题】你如何在 Python 中使用 Keras LeakyReLU?【英文标题】:How do you use Keras LeakyReLU in Python? 【发布时间】:2018-07-27 11:07:26 【问题描述】:

我正在尝试使用 Keras 生成一个 CNN,并编写了以下代码:

batch_size = 64
epochs = 20
num_classes = 5

cnn_model = Sequential()
cnn_model.add(Conv2D(32, kernel_size=(3, 3), activation='linear',
                     input_shape=(380, 380, 1), padding='same'))
cnn_model.add(Activation('relu'))
cnn_model.add(MaxPooling2D((2, 2), padding='same'))
cnn_model.add(Conv2D(64, (3, 3), activation='linear', padding='same'))
cnn_model.add(Activation('relu'))
cnn_model.add(MaxPooling2D(pool_size=(2, 2), padding='same'))
cnn_model.add(Conv2D(128, (3, 3), activation='linear', padding='same'))
cnn_model.add(Activation('relu'))
cnn_model.add(MaxPooling2D(pool_size=(2, 2), padding='same'))
cnn_model.add(Flatten())
cnn_model.add(Dense(128, activation='linear'))
cnn_model.add(Activation('relu'))
cnn_model.add(Dense(num_classes, activation='softmax'))

cnn_model.compile(loss=keras.losses.categorical_crossentropy,
                  optimizer=keras.optimizers.Adam(), metrics=['accuracy'])

我想使用 Keras 的 LeakyReLU 激活层,而不是使用 Activation('relu')。但是,我尝试使用 LeakyReLU(alpha=0.1),但这是 Keras 中的激活层,我收到关于使用激活层而不是激活函数的错误。

在本例中如何使用 LeakyReLU

【问题讨论】:

【参考方案1】:

Keras 中的所有高级激活,包括LeakyReLU,都以layers 的形式提供,而不是以激活的形式提供;因此,您应该这样使用它:

from keras.layers import LeakyReLU

# instead of cnn_model.add(Activation('relu'))
# use
cnn_model.add(LeakyReLU(alpha=0.1))

【讨论】:

我用过这个方法,但是报错:ValueError: Unknown activation function: LeakyRelu.请确保将此对象传递给 custom_objects 参数。见 @TariqS 请打开一个包含确切细节的新问题;如有必要,请在此处链接【参考方案2】:

有时您只想直接替换内置激活层,而不必为此添加额外的激活层。

为此,您可以使用 activation 参数可以是可调用对象这一事实。

lrelu = lambda x: tf.keras.activations.relu(x, alpha=0.1)
model.add(Conv2D(..., activation=lrelu, ...)

由于Layer 也是一个可调用对象,您也可以简单地使用

model.add(Conv2D(..., activation=tf.keras.layers.LeakyReLU(alpha=0.1), ...)

现在可以在 TF2 中使用。这是一个更好的解决方案,因为这避免了在加载过程中使用custom_object 的需要,正如@ChristophorusReyhan 提到的那样。

【讨论】:

非常方便的方法可以避免为了泄漏而创建单独的层,这正是我想要的! 在 tf2.0 中我不得不稍微修改一下:lrelu = lambda x: tf.keras.layers.LeakyReLU(alpha=0.1)(x) 加载保存的模型,使用:keras.models.load_model("/path/to/model.h5", custom_objects = '<lambda>': lrelu )

以上是关于你如何在 Python 中使用 Keras LeakyReLU?的主要内容,如果未能解决你的问题,请参考以下文章

使用Python+OpenCV+Keras创建自己的图像分类模型

keras 和 scikit-learn 中 MLP 回归器的不同损失值和准确度

TensorRT 和 TensorFlow 2

如何使用 Python 在 Keras 中加载数据集?

如何在 Python 2.7.18 中安装 Keras 和 Tensorflow?

如何在 Windows 上的 Anaconda Python 中安装 Keras 和 Theano?