概要
FReLUという新たな活性化関数のkerasでの実装を紹介します。
FReLUについての詳細+pytorchでの実装は以下の記事を読んでみてください。
非常に丁寧に解説されています。
参考:新たな活性化関数「FReLU」誕生&解説!
本記事はtf.kerasでのFReLUの実装をしようという内容です。
DepthwiseConv2Dとtfのmaximumを使えばサクッと実装できてしまいます。
変更・追記(2020/9/30)
・Lambda関数が必要ありませんでしたので削除したコードに変更しました
・Layer版の実装を載せました
参考:カスタムレイヤー
定義
y= \max(x,\mathbb{T}(x))
$\mathbb{T}(\cdot)$はDepthwiseConv2Dです。
前提
tensorflow 2.3.0
実装:1つ1つレイヤーとして定義
FReLU.py
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):
#T(x)の部分
x = DepthwiseConv2D(kernel_size, strides=(1, 1), padding='same')(inputs)
x = BatchNormalization()(x)
#max(x, T(x))の部分
x = tf.maximum(inputs, x)
return x
実装:1つのLayerとして定義
FReLU.py
class FReLU(tf.keras.Model):
def __init__(self, kernel_size=3):
super(FReLU, self).__init__(name='')
self.depconv = DepthwiseConv2D(kernel_size, strides=(1, 1), padding='same')
self.bn = BatchNormalization()
def call(self, input_tensor, training=False):
x = self.depconv(input_tensor)
x = self.bn(x, training=training)
out = tf.maximum(input_tensor, x)
return out
終わりに
実装自体は簡単ですね。
不明点、おかしい点ありましたらコメントよろしくお願いします。