[PYTHON] Implémentation hard-swish avec Keras

Aperçu

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

  1. Définition comme fonction d'activation
  2. Définition en tant que couche Il existe deux implémentations.

supposition

tensorflow 1.15.0 keras 2.3.1

Confirmation de la définition

Vérifiez la définition pour le moment.

h-swish [x] = x\frac{ReLU6(x+3)}{6}
swish[x] = x×Sigmoid(x)

[Motif 1] Défini comme une fonction d'activation

1. Définition de la fonction

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.

2. Confirmation des résultats

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 ** swish hard-swish.png ** Résultats papier ** swish hard-swish on doc.png URL de l'article: Recherche de MobileNetV3

Ça m'a l'air bien.

3. Comment utiliser

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)

[Motif 2] Définition en tant que couche

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).

en conclusion

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

Implémentation hard-swish avec Keras
Implémentation de Shiritori en Python
Implémenter LSTM AutoEncoder avec Keras
Implémentation de word2vec avec Theano + Keras
Implémentation de Supreme Solver dans Python 3
Implémentation d'un GAN efficace avec keras
Implémentation de la segmentation d'image en python (Union-Find)
Règles d'apprentissage Widrow-Hoff implémentées en Python
Solution pour ValueError dans Keras imdb.load_data
Implémentation de la méthode de propagation d'étiquettes en Python
Utiliser des API non implémentées dans twython
Implémentation des notifications push iOS dans Firebase
Mise en œuvre du tri à bulles en Java (BubbleSort)
Implémentation des règles d'apprentissage Perceptron en Python
Implémentation simple de l'analyse de régression avec Keras
Implémenté en 1 minute! LINE Notify en Python
J'ai implémenté le modèle VGG16 avec Keras et essayé d'identifier CIFAR10
Classification CIFAR-10 implémentée dans près de 60 lignes dans PyTorch
Un client HTTP simple implémenté en Python
Implémenté en Python PRML Chapitre 7 SVM non linéaire
J'ai essayé d'implémenter la régression logistique de Cousera en Python
Implémenté dans Python PRML Chapter 5 Neural Network
Mise en œuvre du tri Stuge dans Python 3 (tri à bulles et tri rapide)
Hack GraphConvModel implémenté dans DeepChem avec résumé
Implémenté en Python PRML Chapitre 1 Estimation bayésienne
Implémentation de DQN avec TensorFlow (je voulais ...)
Implémentation du "taux d'apprentissage triangulaire incliné" dans Keras, qui est efficace dans le réglage fin de BERT