KerasでのFReLU活性化関数

目次

1. FReLU
2. 実験
_2.1 データロード
_2.2 FReLU活性化関数
_2.3 モデル作成
_2.4 モデル学習
_2.5 モデル評価

1. FReLU

Megvii ResearchInstituteが新しい活性化関数成果を紹介します。活性化関数の分野での革新て画像分類タスクでReLUを大幅に超える新しい活性化関数ファンネル活性化(FReLU)が提案されています。

Megvii Research Instituteは、ごくわずかなspace conditionを追加することにより、ReLUとPReLUを2D活性化関数に拡張しました。 ReLUとPReLUは、それぞれy = max(x、0)とy = max(x、px)として表されますが、FReLUの形式はy = max(x、T(x))です。ここで、T(・)は2D spatial conditionです。

 

spatial conditions は、ピクセルレベルのモデリング機能を簡単な方法で実装し、従来の畳み込みによって複雑な視覚的レイアウトをキャプチャします。 最後に、ImageNetデータセット、COCOデータセット検出タスク、およびセマンティックセグメンテーションタスクで実験が行われ、視覚認識タスクにおけるFReLU活性化関数の大幅な改善と堅牢性が実証されました。

 

論文:FReLU: Flexible Rectified Linear Units for Improving Convolutional Neural Networks

https://arxiv.org/abs/1706.08098

論文:Funnel Activation for Visual Recognition

https://arxiv.org/abs/2007.11824

 

2. 実験

環境:Google Colab

データセット:MNISTは7万枚の手書き数字の「画像+ラベル」データです。

モデル:FReLU関数

モデル評価:Accuracy

 

2.1 データロード

ライブラリインポート

import numpy as np

 

import tensorflow.keras as keras

from tensorflow.keras.layers import Input, Activation

from tensorflow.keras.models import Model

from tensorflow.keras.layers import Conv2D, MaxPooling2D, GlobalAveragePooling2D

from tensorflow.keras.layers import Dense, Dropout, BatchNormalization

from tensorflow.keras.optimizers import Adam

from tensorflow.keras.callbacks import EarlyStopping

from sklearn.metrics import accuracy_score

 

import matplotlib.pyplot as plt

 

MNISTのデータをロードして加工します。

mnist = keras.datasets.mnist

(train_images, train_labels), (test_images, test_labels) = mnist.load_data()

 

train_images_norm = (train_images / 255.0).astype(np.float16)

test_images_norm = (test_images / 255.0).astype(np.float16)

 

train_images_norm_rs = train_images_norm.reshape(-1, 28, 28, 1)

test_images_norm_rs  = test_images_norm.reshape(-1, 28, 28, 1)

 

train_labels_ct = keras.utils.to_categorical(train_labels, 10)

test_labels_ct = keras.utils.to_categorical(test_labels, 10)

 

2.2 FReLU活性化関数

「tf.kerasでFReLUを実装」の記事を書かれている方がいらっしゃったので、それを使ってみようと思います。

https://qiita.com/rabbitcaptain/items/26304b5a5e401db5bae2

from tensorflow.keras.layers import DepthwiseConv2D,BatchNormalization

import tensorflow as tf

from tensorflow.keras.layers import Lambda

from tensorflow.keras import backend as K

 

def FReLU(inputs, kernel_size = 3):

x = DepthwiseConv2D(kernel_size, strides=(1, 1), padding=’same’)(inputs)

x = BatchNormalization()(x)

x = tf.maximum(inputs, x)

return x

 

2.3 モデル作成

CNNのネットワークを作成します。

#  Network

 

main_input = Input(shape=(28,28,1,), name=’main_input’)

x = Conv2D(32, kernel_size=(3, 3), padding=’same’)(main_input)

x = FReLU(x)

x = Conv2D(32, kernel_size=(3, 3), padding=’same’)(x)

x = FReLU(x)

 

x = MaxPooling2D()(x)

 

x = Conv2D(32, kernel_size=(3, 3), padding=’same’)(x)

x = FReLU(x)

x = Conv2D(32, kernel_size=(3, 3), padding=’same’)(x)

x = FReLU(x)

 

x = MaxPooling2D()(x)

 

x = Conv2D(32, kernel_size=(3, 3), padding=’same’)(x)

x = FReLU(x)

x = Conv2D(32, kernel_size=(3, 3), padding=’same’)(x)

x = FReLU(x)

 

x = GlobalAveragePooling2D()(x)

x = Dense(units=10, activation=’softmax’)(x)

 

model =  Model(inputs=[main_input], outputs=[x])

 

2.4 モデル学習

モデルのコンパイル

model.compile(loss=’categorical_crossentropy’, optimizer=Adam(lr=0.0001), metrics=[‘accuracy’])

early_stopping = EarlyStopping(monitor=’val_loss’, mode=’min’, patience=20)

 

モデルの学習

history = model.fit(train_images_norm_rs,

train_labels_ct,

epochs=100,

validation_split=0.1,

batch_size=1000,

verbose=2,

callbacks=[early_stopping])

 

Epoch 1/100

54/54 – 7s – loss: 0.0882 – accuracy: 0.9807 – val_loss: 0.2427 – val_accuracy: 0.9522

Epoch 51/100

54/54 – 5s – loss: 0.0048 – accuracy: 0.9994 – val_loss: 0.0318 – val_accuracy: 0.9917

 

モデルの学習結果

良いモデルが出来ました。

# Plot result

 

plt.xlabel(‘Epoch’)

plt.ylabel(‘accuracy’)

plt.plot(history.history[‘accuracy’])

plt.plot(history.history[‘val_accuracy’])

plt.legend()

plt.show()

2.5 モデル評価

テストデータもよい結果が出ました。

#  Model evaluation

 

train_pred_proba = model.predict(train_images_norm_rs)

train_pred_labels = np.argmax(train_pred_proba, axis=1)

 

test_pred_proba = model.predict(test_images_norm_rs)

test_pred_labels = np.argmax(test_pred_proba, axis=1)

 

print(‘train_accuracy : ‘, accuracy_score(train_labels, train_pred_labels))

print(‘test_accuracy : ‘, accuracy_score(test_labels, test_pred_labels))

train_accuracy :  0.9983666666666666

test_accuracy :  0.9896

 

担当者:HM

香川県高松市出身 データ分析にて、博士(理学)を取得後、自動車メーカー会社にてデータ分析に関わる。その後コンサルティングファームでデータ分析プロジェクトを歴任後独立 気が付けばデータ分析プロジェクトだけで50以上担当

理化学研究所にて研究員を拝命中 応用数理学会所属