Je pense que le plus célèbre des nombreux modèles légers d'apprentissage profond qui sont apparus l'année dernière est «mobilenet V3» (V2 est également implémenté dans keras).
H-swish (hard-swish) joue un rôle dans la réduction de poids.
Puisque le swish normal est lourd en utilisant le sigmoïde, le traitement est léger et l'erreur lors de la quantification approximative est faible.
Il paraît que. Veuillez vous reporter à l'article suivant pour une explication détaillée du japonais. Référence: [[Reading the article] Searching for Mobilenet V3](https://woodyzootopia.github.io/2019/09/%E8%AB%96%E6%96%87%E8%AA%AD%E3%81%BFsearching -pour-mobilenetv3)
Cet article concerne la mise en œuvre de hard-swish dans les keras. Cependant, la fonction elle-même n'est pas si difficile, elle peut donc être mise en œuvre rapidement sur le back-end. Comme c'est un gros problème, j'aimerais implémenter swish et le comparer dans un graphique. En outre, utiliser le backend comme moyen de mise en œuvre
tensorflow 1.15.0
keras 2.3.1
Vérifiez la définition pour le moment.
h-swish [x] = x\frac{ReLU6(x+3)}{6}
swish[x] = x×Sigmoid(x)
Je l'ai implémenté en me référant au document officiel de keras. Comment utiliser la fonction d'activation
h-swish.py
from keras import backend as K
#hard_définition de swish
def hard_swish(x):
return x * (K.relu(x + 3., max_value = 6.) / 6.)
#définition de swish
def swish(x):
return x * K.sigmoid(x)
Puisque le backend relu a un argument max_value
qui peut définir une limite supérieure, après avoir défini ReLU6 avec cela, implémentez-le simplement selon la formule.
Vérifiez si la fonction définie est telle que définie. Encore une fois, calculons avec un tableau numpy en utilisant le backend.
backend_result.py
from keras import backend as K
import numpy as np
import matplotlib.pyplot as plt
#-10 à 10 0.Définissez un tableau en 2 incréments
inputs = np.arange(-10, 10.2, 0.2)
#Changer le tableau numpy en tenseur
inputs_v = K.variable(inputs)
#Définir un graphe arithmétique avec la fonction définie
outputs_hs = hard_swish(inputs_v)
outputs_s = swish(inputs_v)
#Calculer et obtenir la sortie
outputs_hs = K.get_value(outputs_hs)
outputs_s = K.get_value(outputs_s)
#Voir les résultats
plt.figure(figsize=(14,7))
plt.yticks(range(0, 9, 1))
plt.xticks(range(-8, 9, 1))
plt.grid(True)
plt.plot(inputs, outputs_hs, label="hard_swish")
plt.plot(inputs, outputs_s, label="swish")
plt.legend(bbox_to_anchor=(1, 1), loc='lower right', borderaxespad=0, fontsize=18)
** Résultats de la mise en œuvre de cet article ** ** Résultats papier ** URL de l'article: Recherche de MobileNetV3
Ça m'a l'air bien.
Appliquez simplement la fonction que vous avez définie précédemment à l'activation.
conv.py
from keras.layers import Conv2D
Conv2D(16,(3,3),padding = "SAME", activation = hard_swish)
Ou
conv.py
from keras.layers import Activation
Activation(hard_swish)
Je me suis référé à l'implémentation des «Activations avancées» de keras postées sur github. URL du papier: advanced_activations.py
h-swish_layer.py
from keras import backend as K
from keras.engine.topology import Layer
#hard_définition de swish
class Hard_swish(Layer):
def __init__(self):
super(Hard_swish, self).__init__()
def call(self, inputs):
return inputs * (K.relu(inputs + 3., max_value=6.) / 6.)
def compute_output_shape(self, input_shape):
return input_shape
Voici un exemple de son utilisation. Je suppose cifar10.
h-swish_use.py
inputs = Input(shape = (32,32,3))
x = Conv2D(64,(3,3),padding = "SAME")(inputs)
x = Hard_swish()(x)
x = Conv2D(64,(3,3),padding = "SAME")(x)
x = Hard_swish()(x)
x = MaxPooling2D()(x)
x = Conv2D(128,(3,3),padding = "SAME")(x)
x = Hard_swish()(x)
x = Conv2D(128,(3,3),padding = "SAME")(x)
x = Hard_swish()(x)
x = MaxPooling2D()(x)
x = Conv2D(256,(3,3),padding = "SAME")(x)
x = Hard_swish()(x)
x = Conv2D(256,(3,3),padding = "SAME")(x)
x = Hard_swish()(x)
x = GlobalAveragePooling2D()(x)
x = Dense(1024)(x)
x = Hard_swish()(x)
prediction = Dense(10,activation = "softmax")(x)
model = Model(inputs, prediction )
model.summary()
model_output
Model: "model"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
input_1 (InputLayer) [(None, 32, 32, 3)] 0
_________________________________________________________________
conv2d (Conv2D) (None, 32, 32, 64) 1792
_________________________________________________________________
hard_swish (Hard_swish) (None, 32, 32, 64) 0
_________________________________________________________________
conv2d_1 (Conv2D) (None, 32, 32, 64) 36928
_________________________________________________________________
hard_swish_1 (Hard_swish) (None, 32, 32, 64) 0
_________________________________________________________________
max_pooling2d (MaxPooling2D) (None, 16, 16, 64) 0
_________________________________________________________________
conv2d_2 (Conv2D) (None, 16, 16, 128) 73856
_________________________________________________________________
hard_swish_2 (Hard_swish) (None, 16, 16, 128) 0
_________________________________________________________________
conv2d_3 (Conv2D) (None, 16, 16, 128) 147584
_________________________________________________________________
hard_swish_3 (Hard_swish) (None, 16, 16, 128) 0
_________________________________________________________________
max_pooling2d_1 (MaxPooling2 (None, 8, 8, 128) 0
_________________________________________________________________
conv2d_4 (Conv2D) (None, 8, 8, 256) 295168
_________________________________________________________________
hard_swish_4 (Hard_swish) (None, 8, 8, 256) 0
_________________________________________________________________
conv2d_5 (Conv2D) (None, 8, 8, 256) 590080
_________________________________________________________________
hard_swish_5 (Hard_swish) (None, 8, 8, 256) 0
_________________________________________________________________
global_average_pooling2d (Gl (None, 256) 0
_________________________________________________________________
dense (Dense) (None, 1024) 263168
_________________________________________________________________
hard_swish_6 (Hard_swish) (None, 1024) 0
_________________________________________________________________
dense_1 (Dense) (None, 10) 10250
=================================================================
Total params: 1,418,826
Trainable params: 1,418,826
Non-trainable params: 0
_________________________________________________________________
Le mérite (?) Par rapport à la définition de la fonction d'activation, c'est que vous pouvez voir que hard-swish
est utilisé lorsqu'il est visualisé avec summary
(about).
Cette fois, je n'ai pas pu trouver l'implémentation hard-swish keras même si je l'ai recherchée sur Google, alors j'ai essayé de l'implémenter. C'était une bonne occasion de découvrir que la fonction ReLU que j'utilisais souvent a un argument de max_value. Si vous avez des questions ou des préoccupations, veuillez laisser un commentaire.
Recommended Posts