[PYTHON] Visualisez les fonctions d'activation côte à côte

(Une addition)

Ajout de l'explication du code.

J'étais un débutant. Bien que j'aie appris par moi-même, j'ai réussi à le comprendre. Au début, j'ai ajouté un commentaire que je voulais entendre comme ça. Je pense que cet article sera probablement lu par les débutants et les intermédiaires. C'était difficile au début d'étudier par moi-même, et parfois je ne pouvais pas le comprendre et j'étais susceptible d'être frustré. J'ai écrit que je pourrais même aider un peu dans un tel cas.

1.Tout d'abord

Une fonction d'activation a été proposée en apprentissage profond et est toujours en cours de recherche. J'ai essayé d'afficher chaque côte à côte. J'utilise souvent ReLU exclusivement, mais quand j'y ai pensé, j'ai pensé que je ne m'en souvenais pas avec précision, alors j'ai essayé de le lister.

2. Essayez de vous aligner

Je l'ai implémenté en utilisant Jupyter Notebook. Chaque fonction d'activation peut être affichée côte à côte.

%matplotlib inline
#Importation de module
import numpy as np
import matplotlib.pyplot as plt

#Paramètres du graphique
n_cols = 4
n_rows = 2
plt.figure(figsize=(20,8))

#Générer la valeur de x
x = np.arange(-10, 10, 0.01)

#Liste de chaque fonction à afficher
activation_function_list = [ 'Indentity', 'Step', 'Sigmoid', 'tanh', 'ReLU', 'Leaky ReLU','Swish', 'Mish']

#affichage graphique
def graph(x,y):
    plt.subplot(n_rows, n_cols, i+1)
    plt.grid()
    plt.title(f)
    plt.ylim(-1, 1)
    plt.xlim(-5, 5)
    plt.plot(x,y)
    
#Calcul de chaque fonction
for i, f in enumerate(activation_function_list):
    #Fonction égale
    if f == 'Indentity':
        y = x
    #Fonction Step
    elif f == 'Step':
        y = np.where(x<=0, 0, 1)
    #Fonction sigmoïde
    elif f == 'Sigmoid':
        y = 1./(1. + np.exp(-x))
    #fonction tanh
    elif f == 'tanh':
        y = (np.exp(x) - np.exp(-x)) / (np.exp(x) + np.exp(-x))
    #Fonction ReLU
    elif f == 'ReLU':
        y = np.maximum(0,x)
    #Fonction Leaky ReLU
    elif f == 'Leaky ReLU':
        y = np.where(x > 0, x , 0.01 * x)
    #Fonction Swish
    elif f == 'Swish':
        y = x*1./(1. + np.exp(-x))
    #fonction mish
    elif f == 'Mish':
        x_sp = np.log(1+np.exp(x))     #Fonction Softplus
        y = x * ((np.exp(x_sp ) - np.exp(-x_sp)) / (np.exp(x_sp) + np.exp(-x_sp)))    
        
    #Créer un graphique
    graph(x,y)
        
#Dessiner un graphique
plt.show()

#Enregistrer le graphique
fig.savefig('activation_function_list.png')

3. Fonction de sortie

Le graphique créé par matplotlip à la fin du code est enregistré sous forme de fichier png. Dans le cas ci-dessus, ce fichier sera enregistré dans le même répertoire où se trouve le fichier notebook. Swish et Mish sont de nouvelles fonctions d'activation.

À l'avenir, je voudrais vérifier la différence de performance entre ces fonctions d'activation. activation_function_list.png

C'est la fin.

4. Expliquez le code ci-dessus.

De là, je vais expliquer le code écrit ci-dessus. J'ai écrit le commentaire que je voulais entendre quand j'étais débutant. Je pense que ce n'est pas suffisant pour les utilisateurs intermédiaires et avancés, mais si vous êtes intéressé, jetez un œil.

4-1. Affichage graphique

%matplotlib inline

Il est dessiné dans le Notebook en écrivant % matplotlib inline.

4-2. Importation de modules

Le code ci-dessous importe deux modules, NumPy et Matplotlib.

#Importation de module
import numpy as np
import matplotlib.pyplot as plt

Vérifions d'où ce module est importé. Quand j'exécute le code suivant sur mon notebook


import numpy as np
print(np.__file__)

production /Users/username/.pyenv/versions/3.6.2/lib/python3.6/site-packages/numpy/__init__.py

Cette sortie dépend de chaque environnement, mais ce que vous pouvez voir à partir de ce résultat de sortie est que numpy installé sur le PC local est référencé. __init __. py est décrit en détail dans l'article de @ PYTHONISTA. Comment écrire Python __init __.py

Comme il est ajouté lors de l'importation, vous pouvez faire référence à numpy avec np après cela.

import numpy
print(numpy.__file__)

Même ainsi, vous pouvez faire de même.

4-3. Paramètres du graphique

Ici, le graphique qui affiche les fonctions d'activation côte à côte est défini. J'utilise la sous-parcelle décrite ci-dessous pour définir les graphiques à organiser horizontalement 4 horizontalement et 2 verticalement. La figure est faite avec la taille spécifiée par figsize.

La liste est enregistrée sous forme de fichier png à la fin du code, mais le graphique placé dans la figure devient un fichier.

#Paramètres du graphique
n_cols = 4
n_rows = 2
plt.figure(figsize=(20,8))

4-4. Génération de valeur X

#Générer des valeurs sur l'axe des x
x = np.arange(-10, 10, 0.01)

Essayons-en un ici. スクリーンショット 2020-03-07 22.43.54.png

Si vous appuyez sur les touches [shift] + [tab] alors que le curseur est entre () comme ceci, les détails seront affichés comme indiqué ci-dessous. スクリーンショット 2020-03-07 22.43.15.png

De là, vous pouvez voir ce que les paramètres qui organisent prennent comme argument. Si x = np.arange (-10, 10, 0,1), start est -10, stop est 10, step est 0,1, et ainsi de suite. Une liste de nombres de -10 à 10 sera renvoyée par incréments de 0,1. Vérifions-le.

print('Liste de x:',x)
print('x longueur:',len(x))
print('type de x', type(x))

Liste de x: [-10. -9,99 -9,98 ... 9,97 9,98 9,99] Longueur de x: 2000 type de x <class'numpy.ndarray '> 2000 numéros ont été générés. Vous pouvez voir que les 10 spécifiés pour l'arrêt ne sont pas inclus.

4-5. Liste de chaque fonction à afficher

Ici, nous faisons une liste des fonctions que nous voulons lister.

activation_function_list = [ 'Indentity', 'Step', 'Sigmoid', 'tanh', 'ReLU', 'Leaky ReLU','Swish', 'Mish']

4-6. Affichage graphique

Cette partie définit la fonction de dessin de graphe. Cette fonction est appelée dans le processus 4-7 pour créer un graphe. La partie i de celle-ci montre l'emplacement du graphe lors de l'organisation en 4x2. De haut de gauche à droite 1 2 3 4 5 6 7 8 Ce sera. Je suis placé dans le troisième argument de plt.subplot. Cela signifie que i lorsque vous appelez la fonction graphique spécifie l'emplacement du graphique lui-même.

Extrayez les noms des fonctions d'index et d'activation de la liste en 4-7.

#affichage graphique
def graph(x, y):
    #L'index commence à 0, mais l'emplacement du graphique est spécifié à partir de 1, donc
    #Ajoutez 1 ici et 4-Il appelle la fonction graphique définie en 6.
    plt.subplot(n_rows, n_cols, i+1)
    plt.grid()   #Activer les lignes de la grille sur le graphique
    plt.title(f)    #Définir le nom de la fonction sur le titre du graphique
    plt.ylim(-1, 1)    #Spécifiez la plage de l'axe y à afficher
    plt.xlim(-5, 5)    #Spécifiez la plage de l'axe x à afficher
    plt.plot(x, y)    #Tracez les valeurs de x et y

4-7 Calcul de chaque fonction

C'est un peu long, je vais donc ajouter un commentaire dans le code. Les détails de chaque fonction sont trop importants à consacrer au magazine ici, je les omettrai donc dans cet article.


#Calcul de chaque fonction
#Utilisez la fonction énumération pour activer_function_Extraction des index et des valeurs de liste de la liste.
#i est l'indice et f est le nom de la fonction.
#i est entré dans l'ordre à partir de 0.
for i, f in enumerate(activation_function_list):
    #La valeur de y est calculée en fonction du nom de la fonction extraite.
    #La valeur de x est 2,Puisqu'il y en avait 000, la valeur de y est également 2.,000 ont été générés.
    if f == 'Indentity':    #Fonction égale
        y = x
    elif f == 'Step':    #Fonction Step
        y = np.where(x<=0, 0, 1)
    elif f == 'Sigmoid':    #Fonction Sigmaid
        y = 1./(1. + np.exp(-x))
    elif f == 'tanh':    #Fonction tangente hyperbolique
        y = (np.exp(x) - np.exp(-x)) / (np.exp(x) + np.exp(-x))
    elif f == 'ReLU':    #Fonction ReLU
        y = np.maximum(0,x)
    elif f == 'Leaky ReLU':    #Fonction Leaky ReLU
        y = np.where(x > 0, x , 0.01 * x)
    elif f == 'Swish':    #Fonction Swish
        y = x*1./(1. + np.exp(-x))
    elif f == 'Mish':    #Fonction Swish
        x_sp = np.log(1+np.exp(x))    #fonction softplus
        y = x * ((np.exp(x_sp ) - np.exp(-x_sp )) / (np.exp(x_sp ) + np.exp(-x_sp )))    
        
    #Dessiner un graphique
    #Passez y calculé en utilisant x comme argument de la fonction graphique.
    graph(x,y)

J'utilise la fonction ʻenumerate` pour obtenir l'index et la valeur de la liste. Vous pouvez voir quelle valeur est obtenue en exécutant le code suivant

for i, f in enumerate(activation_function_list):
    print('index:', i , 'value:', f)

production index: 0 value: Indentity index: 1 value: Step index: 2 value: Sigmoid index: 3 value: tanh index: 4 value: ReLU index: 5 value: Leaky ReLU index: 6 value: Swish index: 7 value: Mish Vous pouvez voir que les index et les valeurs peuvent être récupérés dans l'ordre.

4-8 Dessiner et enregistrer des graphiques

Le graphique est dessiné et enregistré dans les deux lignes suivantes. Le fichier png que vous enregistrez sera enregistré dans le dossier contenant votre fichier Notebook.

#Dessiner un graphique
plt.show()

#Enregistrer le graphique
fig.savefig('activation_function_list.png')

S'il y a des erreurs ou des erreurs, je vous serais reconnaissant de bien vouloir me le faire savoir.

Recommended Posts

Visualisez les fonctions d'activation côte à côte
Liste des fonctions d'activation (2020)
Musique jouée par des fonctions récursives
Challenge classification des images par TensorFlow2 + Keras 7-Compréhension des types de couches et des fonctions d'activation-