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を使用するにはどうすればよいですか?
LeakyReLU
を含むKerasのすべての高度なアクティベーションは、アクティベーションとしてではなく layers として利用できます。したがって、次のように使用する必要があります。
from keras.layers import LeakyReLU
# instead of cnn_model.add(Activation('relu'))
# use
cnn_model.add(LeakyReLU(alpha=0.1))
組み込みのアクティベーションレイヤーのドロップイン置換が必要な場合があり、この目的のためだけに追加のアクティベーションレイヤーを追加する必要はありません。
そのために、activation
引数が関数になり得るという事実を使用できます。
lrelu = lambda x: tf.keras.activations.relu(x, alpha=0.1)
model.add(Conv2D(..., activation=lrelu, ...)
そのため、ここではデフォルトのアクティベーション関数がConv2Dレイヤーの「線形」として設定されています。書くのは本当ですか:(次の行では、Conv2Dレイヤーのアクティベーション関数はLeakyReluとして設定されていますか?)
model.add(Conv2D(32, kernel_size=(3, 3),
input_shape=(380,380,1))
model.add(LeakyReLU(alpha=0.01))