web-dev-qa-db-ja.com

PythonでKeras LeakyReLUをどのように使用しますか?

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

Activation('relu')を使用する代わりに、KerasのLeakyReLアクティベーションレイヤーを使用します。ただし、LeakyReLU(alpha=0.1)を使用してみましたが、これはKerasのアクティベーションレイヤーであり、アクティベーション関数ではなくアクティベーションレイヤーの使用に関するエラーが発生します。

この例でLeakyReLを使用するにはどうすればよいですか?

19
Jack Trute

LeakyReLUを含むKerasのすべての高度なアクティベーションは、アクティベーションとしてではなく layers として利用できます。したがって、次のように使用する必要があります。

from keras.layers import LeakyReLU

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

組み込みのアクティベーションレイヤーのドロップイン置換が必要な場合があり、この目的のためだけに追加のアクティベーションレイヤーを追加する必要はありません。

そのために、activation引数が関数になり得るという事実を使用できます。

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

そのため、ここではデフォルトのアクティベーション関数がConv2Dレイヤーの「線形」として設定されています。書くのは本当ですか:(次の行では、Conv2Dレイヤーのアクティベーション関数はLeakyReluとして設定されていますか?

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