スクイーズアンド励起 (SE) モジュールまたは SEnet
def SE_Block(input_tensor,ratio = 16):
input_shape = K.int_shape(input_tensor)
squeeze = tf.keras.layers.GlobalAveragePooling1D()(input_tensor)
excitation = tf.keras.layers.Dense(units = input_shape[-1]//ratio, kernel_initializer='he_normal',activation='relu')(squeeze)
excitation = tf.keras.layers.Dense(units = input_shape[-1],activation='sigmoid')(excitation)
#excitation = tf.reshape(excitation, [-1, 1, input_shape[-1]])
scale = tf.keras.layers.Multiply()([input_tensor, excitation])
return scale
#X = tf.random.uniform((32, 352))
X = tf.keras.Input(shape=(32,352))
Y = SE_Block(X,16)
model = tf.keras.Model(inputs=[X], outputs=[Y])
model.summary()
print(Y.shape)
1 次元の場合の SE ブロック入力は
(バッチ サイズ、シーケンス長、チャネル数) です
。ratio は圧縮率で、ここでは 16 です。
たとえば、入力は 352 チャネルですが、中央の完全接続層を通過すると 352/16=22 に削減され、2 番目の接続層を通過すると 352 に変換されます
。