在Python中如何使用Keras LeakyReLU?

2024-05-26 21:54:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试使用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?


Tags: addsizemodelactivationnumcnnkeraslinear
3条回答

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

from keras.layers import LeakyReLU

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

所以在这里,Conv2D层的默认激活函数设置为“线性”。写的是真的吗:(我的意思是下面几行,Conv2D层的激活函数设置为LeakyRelu?

model.add(Conv2D(32, kernel_size=(3, 3),
           input_shape=(380,380,1))
model.add(LeakyReLU(alpha=0.01))

有时你只需要一个替换内置激活层的插件,而不必为此目的添加额外的激活层。

为此,可以使用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), ...)

现在可以在tf中使用。这是一个更好的解决方案,因为这样可以避免在加载期间使用custom_object,正如@ChristophorusReyhan提到的那样。

相关问题 更多 >

    热门问题