Python débutant touche Pytorch (3)

C'est une suite de Les débutants en Python touchent Pytorch (2). J'écris personnellement un article trois fois. Enfin, j'expliquerai le réseau de neurones qui m'a inspiré à toucher Pytorch.

1. Réseau neuronal Parlons d'abord des réseaux de neurones. Un réseau de neurones est une représentation mathématique d'un modèle neuronal du cerveau utilisant des nœuds et des liens. ![ニューラルネットワーク.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/722110/607493df-3240-7e1f-a17a-8e4069043127.png)

Vous pouvez voir pourquoi on l'appelle un réseau dans la figure. À propos, le nœud a la forme d'un cercle et le lien est celui qui relie les nœuds représentés par les flèches.

"Deep learning", qui est devenu un sujet brûlant ces dernières années, est un empilement de "couches intermédiaires (deux couches entre les deux)" </ strong> dans cette figure. Ce modèle est également appelé hiérarchique </ strong> </ font>. Il existe également un modèle appelé récursif (RNN) </ strong> </ font>. Veuillez voir l'image ci-dessous. シンプルrnn.png C'est bon pour l'apprentissage qui conserve les séries chronologiques. Cependant, la quantité de calcul est importante, ce qui rend le calcul difficile.

Ce qui suit est une comparaison des deux réseaux. ネットワーク比較.png Vous devez sélectionner le réseau en fonction de l'application que vous souhaitez résoudre. Soit dit en passant, le type hiérarchique </ strong> est souvent utilisé pour la reconnaissance d'image, et le type récursif </ strong> est souvent utilisé pour le traitement du langage naturel (reconnaissance de caractères, reconnaissance vocale).

2. Considérons un réseau neuronal hiérarchique Cette fois, nous allons créer un réseau neuronal hiérarchique qui est à la base de la fondation. Par conséquent, nous en apprendrons un peu plus sur les réseaux de neurones hiérarchiques. Tout d'abord, comprenons les calculs effectués par le réseau de neurones. Je n'expliquerai que par simple multiplication et addition, donc merci.

2-1. Pondérations et propagation vers l'avant

Le poids représente l'importance de l'entrée. Si le poids est élevé, la partie avec le poids élevé est d'une grande importance pour discriminer l'événement qui est un réseau de neurones.

Examinons un peu plus les poids en utilisant un exemple concret. Par exemple, lors de l'achat d'un sac, je pense qu'il y a quelque chose d'important pour chaque personne à décider (déterminer) d'acheter ou non. En gros, il y a «durabilité», «capacité», «design», «reconnaissance de nom», etc. Puisque j'attache une grande importance à la conception, si chaque poids est exprimé numériquement, "élément" = poids: "durabilité" = 5, "capacity = 5", "design = 8", " Familiarité = 5 "</ font>. Le design étant de la plus haute importance, il est naturel que le poids du design soit élevé.

Montrons-le dans un diagramme. ニューラルネットワーク1.png

Le diagramme est facile à comprendre et simple. Dans cette figure, vous pouvez voir que "Input 1" est un élément important dans cette couche. De plus, à mesure que la couche d'entrée suivante augmente, le nombre de pondérations augmentera en conséquence. ニューラルネットワーク2.png En regardant la figure, vous pouvez voir que différents nombres sont passés aux deux couches suivantes.

À propos, ce type de propagation séquentielle des entrées est appelé propagation avant </ font>.

Dans le réseau neuronal, chaque poids est corrigé par «entraînement» pour trouver le poids approprié. Donc, cette fois, il n'y a pas de problème si vous comprenez quel est le poids. Ensuite, je vais expliquer la fonction inconnue appelée "fonction d'activation".

2-2. Fonction d'activation Parlons maintenant de la fonction d'activation. La fonction d'activation est très importante pour ajouter plus de flexibilité au réseau neuronal.

En tant que célèbre fonction d'activation

  1. Fonction sigmoïde
  2. Fonction ReLU 3.tanh (tangente hyperbolique)
  3. Fonction latérale lourde

il y a. Veuillez vérifier la fonction par vous-même. Il peut sembler difficile de n'utiliser que des formules mathématiques, mais ce qui est important dans la fonction d'activation n'est pas la difficulté des formules mathématiques. 1. Non linéaire, 2. Facile à différencier </ font>. Non linéaire signifie qu'il n'est pas droit. Jetons un coup d'œil au graphique de la fonction ReLU. Il est répertorié sur wikipedia. [Fonction d'activation (wikipedia)](https://ja.wikipedia.org/wiki/%E6%B4%BB%E6%80%A7%E5%8C%96%E9%96%A2%E6%95% B0 # ReLU% EF% BC% 88% E3% 83% A9% E3% 83% B3% E3% 83% 97% E9% 96% A2% E6% 95% B0% EF% BC% 89)

Qu'est-ce que tu penses. Ce n'était certainement pas linéaire. Vient ensuite la facilité de différenciation. Pour les bases de la différenciation, voir Article précédent et des sites et des livres qui expliquent plus professionnellement. La différenciation facile facilite la formation du réseau et les poids plus faciles à trouver. (Si vous créez un réseau de neurones en utilisant un framework, ne vous inquiétez pas car le programme le fera automatiquement.)

Ensuite, nous apprendrons quand utiliser la fonction d'activation. Le moment pour utiliser la fonction d'activation est immédiatement avant </ font>, qui se propage vers l'avant et est transmis à la couche suivante. 活性化関数.png

Que signifie rendre un réseau neuronal plus flexible avec une fonction d'activation? Vérifions cela également dans la figure. Tout d'abord, lors de la construction d'un réseau de neurones normalement linéairement sans insérer une fonction d'activation et discriminer 線形.png

Tous les objets ne sont pas parfaitement divisés, même s'ils sont discriminés. Tout comme nous, les humains, nous méprenons sur des choses faciles à comprendre, des choses qui ont une intelligence artificielle similaire peuvent être identifiées par erreur. Ajoutons une fonction d'activation et convertissons-la de manière non linéaire 非線形.png Le graphique semble un peu trop beau, mais vous pouvez modifier la largeur de la discrimination comme ceci. Il n'y a aucune garantie qu'il sera possible de porter un jugement correct, mais au moins il n'y a aucun doute que le taux de réponse correct changera par rapport à rester linéaire.

3. Construisez un réseau neuronal avec Pytorch Utilisons ce que nous avons appris jusqu'à présent pour construire un réseau de neurones
import torch
import torch.nn as nn
import torch.nn.functional as F

Tout d'abord, importez les modules requis. Ensuite, nous construirons un réseau. Au fait, le réseau à construire cette fois-ci est comme ça. qiitanet1.png

class Net(nn.Module):
    def __init__(self):
        super(Net,self).__init__()

        self.fc1 = nn.Linear(2,4)
        self.fc2 = nn.Linear(4,4)
        self.fc3 = nn.Linear(4,1)

    def forword(self,x):
        y = F.relu(self.fc1(x))
        y = F.relu(self.fc2(y))
        y = self.fc3(y)
        return y

Dans Pytorch, nous allons construire un réseau de neurones pour que le réseau soit défini puis appelé par une fonction. C'est un graphe dit dynamique (défini par exécution). Par rapport à TensorFlow (un framework développé par Google), je trouve qu'il est plus facile à comprendre car il conserve le caractère Python.

Je vais expliquer le code. La classe Net est créée à l'aide du module nn.Module </ strong> que possède Pytorch. Nous utiliserons ce nn.Modelu pour définir le graphe. Tout d'abord, créez def \ __ init \ __ (self) par initialisation et appelez \ __ init \ __ de nn.Module. Ensuite, créez un calque avec soi (nom du calque). Cette fois comme expliqué dans l'image

1ère couche (entrée = 2, sortie = 4) 2ème couche (entrée = 4, sortie = 4) 3e couche (entrée = 4, sortie = 1)

Configuration du réseau.

Dans le programme self. (Nom du calque) = nn.Linear (nombre d'entrées, nombre de sorties) </ strong>

Écrivons. nn.Linear </ strong> est un module appelé entièrement connecté </ font> qui est utilisé lors de la création d'un graphique dans lequel les nœuds de la couche d'entrée se propagent à tous les nœuds de la couche suivante. ..

La fonction avant décrit le comportement du réseau neuronal lorsqu'il y a une entrée réelle. Dans la première ligne, entrez l'argument "x" dans la première couche et exécutez la fonction d'activation ReLU. La deuxième ligne entre la sortie "y" de la première couche vers la deuxième couche et applique la fonction ReLU. Enfin, entrez dans la couche finale et renvoyez le résultat de sortie.

Jetez un œil à l'aperçu du réseau

net = Net()
print(net)
Net(
  (fc1): Linear(in_features=2, out_features=4, bias=True)
  (fc2): Linear(in_features=4, out_features=4, bias=True)
  (fc3): Linear(in_features=4, out_features=1, bias=True)
)

Vous pouvez confirmer que le réseau a été construit fermement.

En passant, vous pouvez également voir la valeur initiale du poids du réseau.

for param_tensor in net.state_dict():
    print(param_tensor, "\t", net.state_dict()[param_tensor].size())
fc1.weight 	 torch.Size([4, 2])
fc1.bias 	 torch.Size([4])
fc2.weight 	 torch.Size([4, 4])
fc2.bias 	 torch.Size([4])
fc3.weight 	 torch.Size([1, 4])
fc3.bias 	 torch.Size([1])

Il y a quelque chose appelé «biais» ici, qui est appelé biais et est ajouté au calcul de chaque couche.

2x+3

Le "3" dans la fonction linéaire ci-dessus est le biais. En termes mathématiques, c'est une section </ strong>.

Enfin Cette fois, j'ai donné une brève explication du réseau neuronal et construit un réseau neuronal avec Pytorch. Il y avait une partie sur laquelle j'ai fait un chiffre et expliqué, mais je pense qu'il y avait un point que je n'ai pas compris. Contactez-moi si vous avez des questions.

La prochaine fois, j'utiliserai la méthode de construction de réseau neuronal que j'ai apprise cette fois pour construire un réseau neuronal plus pratique. Plus précisément, nous allons résoudre le "circuit OU" et le "circuit ET" du circuit logique avec un réseau neuronal. Merci d'avoir lu jusqu'au bout.

Recommended Posts