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





