目次
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以上担当
理化学研究所にて研究員を拝命中 応用数理学会所属