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.
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. 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. 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).
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.
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. 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".
En tant que célèbre fonction d'activation
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.
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
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 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.
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.
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>.
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