Vision par ordinateur - Pratique d'apprentissage en profondeur Flying Paddle - Modèle de réseau d'apprentissage en profondeur

L'architecture globale du modèle de réseau d'apprentissage profond se compose principalement de trois parties : ensemble de données, mise en réseau du modèle et processus d'optimisation de l'apprentissage. Ce chapitre présente principalement en détail l'architecture algorithmique et les modèles communs du modèle de réseau d'apprentissage profond, en commençant par le modèle de réseau d'apprentissage profond classique. apprenant le modèle de réseau à CNN, RNN est représenté par une conception de réseau légère pour résoudre des problèmes tels que l'insuffisance de mémoire et les performances en temps réel, ainsi que par les modèles de réseau de pointe Transformer et MLP qui ont été impliqués dans des tâches majeures de vision par ordinateur ces dernières années. . Afin d'analyser plus en détail le processus de création d'un modèle de réseau d'apprentissage profond, enfin, en prenant l'algorithme du modèle LeNet comme exemple, un cas de création de réseau a été démontré dans le cadre d'apprentissage profond Flying Paddle. Après avoir étudié ce chapitre, j'espère que les lecteurs pourront maîtriser les points de connaissances suivants :

  1. Comprendre les modèles de réseaux classiques (CNN et RNN) ;
  2. Familier avec les modèles de réseaux de pointe (Transformer et MLP);
  3. Maîtrisez l'utilisation de pagaies volantes pour créer un modèle de réseau d'apprentissage profond-LeNet.

Dans l'étude précédente, nous aurions dû comprendre à peu près la situation actuelle et l'histoire de la vision par ordinateur au pays et à l'étranger, ainsi que les bases des algorithmes d'apprentissage profond. Nous devrions également avoir une compréhension générale du cadre de l'apprentissage profond. sur les choses mentionnées ci-dessus vous-même. C'est très bien, ce ne sera pas trop difficile. Cet article explique principalement le modèle de réseau du deep learning. Tout en comprenant les modèles de réseau classiques, vous pouvez également comprendre les modèles de réseau de pointe, et nous utiliserons un exemple simple pour donner à chacun une impression générale du réseau d'apprentissage profond.

Avec le soutien du cadre de développement de l'apprentissage profond, le modèle de réseau d'apprentissage profond est constamment mis à jour et itéré. L'architecture du modèle va du réseau neuronal convolutif classique CNN au réseau neuronal récurrent RNN. Le Transformer d'aujourd'hui, le MLP perceptron multicouche, peut être collectivement considéré comme la construction d'un modèle de réseau d'apprentissage profond à travers une série d'opérations telles que les paramètres de fonction d'activation des composants de réseau et les stratégies d'optimisation, et l'utilisation d'un mappage complexe non linéaire pour transformer les données d'origine en données supérieures. niveaux d’expression abstraite.

L'architecture globale du modèle de réseau d'apprentissage profond se compose principalement de trois parties, à savoir l'ensemble de données, la mise en réseau du modèle et le processus d'optimisation de l'apprentissage. Le processus de formation du modèle de réseau d'apprentissage profond est le processus d'optimisation.L'objectif le plus direct de l'optimisation du modèle est de trouver les paramètres de modèle optimaux qui rendent la fonction de perte aussi petite que possible grâce à plusieurs mises à jour itératives. Généralement, le processus d'optimisation des réseaux de neurones peut être divisé en deux étapes. La première étape consiste à obtenir la valeur prédite du modèle par propagation vers l'avant, à comparer la valeur prédite avec l'étiquette positive et à calculer la différence entre les deux sous forme de perte. valeur ; La deuxième étape consiste à calculer le gradient de la fonction de perte pour chaque paramètre par rétropropagation et à mettre à jour la valeur de chaque paramètre en fonction du taux d'apprentissage et de l'élan prédéfinis.

En bref, un bon modèle de réseau présente généralement les caractéristiques suivantes : 1. Le modèle est facile à entraîner et les étapes de formation sont simples et faciles à converger ; 2. Le modèle a une grande précision et peut bien saisir la nature intrinsèque des données. et peut extraire des fonctionnalités clés utiles ; 3. , Le modèle a une forte capacité de généralisation et le modèle fonctionne non seulement bien sur des données connues, mais peut également montrer sa robustesse sur des ensembles de données inconnus avec une distribution cohérente des données connues.

Cas:

1. Présentation de la tâche

La reconnaissance numérique manuscrite est une branche de la technologie de reconnaissance optique de caractères (reconnaissance optique de caractères, OCR). Elle constitue la base de départ pour les jeunes chercheurs. Elle occupe également une position très importante dans l'industrie réelle. Ses principaux contenus de recherche sont : Comment utiliser des ordinateurs et une technologie de classification d'images pour identifier automatiquement les chiffres arabes (0 ~ 9) écrits par des personnes sur papier. Par conséquent, une description simple de cette tâche expérimentale est la suivante : 

2. Principe du modèle

近年来,神经网络模型一直层出不穷,在各个计算机视觉任务中都呈现百花齐放的态势。为了让开发者更清楚地了解网络模型的搭建过程,以及为了在后续的各项视觉子任务实战中奠定基础。下面本节将以MNIST手写数字识别为例,在PaddlePaddle深度学习开发平台下构建一个LeNet网络模型并进行详细说明。

LeNet是第一个将卷积神经网络推上计算机视觉舞台的算法模型,它由LeCun在1998年提出。在早期应用于手写数字图像识别任务。该模型采用顺序结构,主要包括7层(2个卷积层、2个池化层和3个全连接层),卷积层和池化层交替排列。以mnist手写数字分类为例构建一个LeNet-5模型。每个手写数字图片样本的宽与高均为28像素,样本标签值是0~9,代表0至9十个数字。

Ce qui suit est une analyse détaillée de la structure du réseau et du principe du modèle LeNet-5.

Figure 1 Modèle de réseau global LeNet-5

(1) Couche convolutive L1

La forme et la taille des données d'entrée de la couche L1 sont ��×1×28×28Rm×1×28×28, ce qui signifie que la taille du lot d'échantillons est m, le nombre de canaux est 1 et les tailles de lignes et de colonnes sont tous deux 28. La taille de la forme des données de sortie de la couche L1 est ��×6×24×24Rm×6×24×24, ce qui signifie que le lot d'échantillons est m, le nombre de canaux est 6 et les dimensions des lignes et des colonnes sont 24.

Deux questions clés se posent ici : Premièrement, pourquoi le nombre de canaux est-il passé de 1 à 6 ? La raison en est que la couche de convolution L1 du modèle est définie avec 6 noyaux de convolution. Chaque noyau de convolution opère sur les données d'entrée et finalement 6 ensembles de données sont obtenus. Deuxièmement, pourquoi la taille des lignes et des colonnes est-elle passée de 28 à 24 ? La raison en est que les dimensions des lignes et des colonnes de chaque noyau de convolution sont de 5. Le noyau de convolution (5 × 5) se déplace sur les données d'entrée (28 × 28), et la taille du pas de chaque mouvement est de 1, puis les lignes et les colonnes des données de sortie Les tailles sont respectivement 28-5+1=24.

(2) Couche de pooling L2

La taille de la forme des données d'entrée de la couche L2 est ��×6×24×24Rm×6×24×24, ce qui signifie que la taille du lot d'échantillons est m, le nombre de canaux est 6 et les tailles de lignes et de colonnes sont toutes deux 24. La taille de la forme des données de sortie de la couche L2 est ��×6×12×12Rm×6×12×12, ce qui signifie que la taille du lot d'échantillons est m, le nombre de canaux est 6 et les dimensions des lignes et des colonnes sont 12. .

Ici, pourquoi la taille des lignes et des colonnes passe-t-elle de 24 à 12 ? La raison en est que la taille de la forme du filtre dans la couche de pooling est de 2 × 2, il se déplace sur les données d'entrée (24 × 24) et la taille du pas (envergure) de chaque mouvement est de 2 et 4 nombres (2 × 24) sont sélectionnés à chaque fois 2) La valeur maximale de est utilisée comme sortie, alors les tailles de ligne et de colonne des données de sortie sont respectivement de 24÷2=12.

(3) Couche convolutive L3

La taille de la forme des données d'entrée de la couche L3 est ��×6×12×12Rm×6×12×12, ce qui signifie que la taille du lot d'échantillons est m, le nombre de canaux est 6 et les tailles de lignes et de colonnes sont toutes deux 12. La taille de la forme des données de sortie de la couche L3 est ��×16×8×8Rm×16×8×8, ce qui signifie que la taille du lot d'échantillons est m, le nombre de canaux est 16 et les dimensions des lignes et des colonnes sont toutes deux 8.

(4) Couche de pooling L4

La taille de la forme des données d'entrée de la couche L4 est ��×16×8×8Rm×16×8×8, ce qui signifie que la taille du lot d'échantillons est m, le nombre de canaux est 16 et les tailles de lignes et de colonnes sont toutes deux 8. La taille de la forme des données de sortie de la couche L4 est ��×16×4×4Rm×16×4×4, ce qui signifie que la taille du lot d'échantillons est m, le nombre de canaux est 16 et les dimensions des lignes et des colonnes sont toutes deux 4. La taille de la forme du filtre dans la couche de regroupement L4 est de 2 × 2. Il se déplace sur les données d'entrée (taille de la forme 24 × 24), et la taille du pas (envergure) de chaque mouvement est de 2, et 4 nombres (forme) sont sélectionnés à chaque fois. La valeur maximale de taille 2 × 2) est utilisée comme sortie.

(5) Couche linéaire L5

La taille de la forme des données d'entrée de la couche L5 est de ��×256Rm×256, ce qui signifie que la taille du lot d'échantillons est de m et que le nombre d'entités d'entrée est de 256. La taille de forme des données de sortie est ��×120Rm×120, ce qui signifie que la taille du lot d'échantillons est de m et que le nombre d'entités de sortie est de 120.

(6) Couche linéaire L6

La taille de la forme des données d'entrée de la couche L6 est de ��×120Rm×120, ce qui signifie que le lot d'échantillons est de m et que le nombre d'entités d'entrée est de 120. La taille de la forme des données de sortie de la couche L6 est ��×84Rm×84, ce qui signifie que la taille du lot d'échantillons est de m et le nombre d'entités de sortie est de 84.

(7) Couche linéaire L7

La taille de la forme des données d'entrée de la couche L7 est ��×84Rm×84, ce qui signifie que la taille du lot d'échantillons est de m et le nombre d'entités d'entrée est de 84. La taille de la forme des données de sortie de la couche L7 est ��×10Rm×10, ce qui signifie que la taille du lot d'échantillons est de m et le nombre d'entités de sortie est de 10.

3. Ensemble de données MNIST

3.1 Introduction aux ensembles de données

L'ensemble de données de classification des chiffres manuscrits provient de l'ensemble de données MNIST, qui est accessible au public et gratuitement. Le nombre d’échantillons d’ensembles de formation dans cet ensemble de données est de 60 000 et le nombre d’échantillons d’ensembles de test est de 10 000. Chaque échantillon est une matrice composée de 28×28 pixels, et la valeur de chaque pixel est un scalaire, allant de 0 à 255. On peut considérer que le nombre de canaux de couleur de cet ensemble de données est de 1. Les données sont divisées en images et en étiquettes. L'image est une matrice de 28*28 pixels et les étiquettes sont constituées de 10 nombres de 0 à 9.

3.2 Lecture des données

(1) La fonction de transformation normalise et standardise les données

(2) train_dataset et test_dataset

mode='train' et mode='test' dans paddle.vision.datasets.MNIST() sont utilisés pour obtenir respectivement l'ensemble d'entraînement mnist et l'ensemble de test.

#导入数据集Compose的作用是将用于数据集预处理的接口以列表的方式进行组合。
#导入数据集Normalize的作用是图像归一化处理,支持两种方式: 1. 用统一的均值和标准差值对图像的每个通道进行归一化处理; 2. 对每个通道指定不同的均值和标准差值进行归一化处理。
import paddle
from paddle.vision.transforms import Compose, Normalize
import os
import matplotlib.pyplot as plt
transform = Compose([Normalize(mean=[127.5],std=[127.5],data_format='CHW')])
# 使用transform对数据集做归一化
print('下载并加载训练数据')
train_dataset = paddle.vision.datasets.MNIST(mode='train', transform=transform)
val_dataset = paddle.vision.datasets.MNIST(mode='test', transform=transform)
print('加载完成')

Jetons un coup d'œil à quoi ressemblent les images de l'ensemble de données

train_data0, train_label_0 = train_dataset[0][0],train_dataset[0][1]
train_data0 = train_data0.reshape([28,28])
plt.figure(figsize=(2,2))
print(plt.imshow(train_data0, cmap=plt.cm.binary))
print('train_data0 的标签为: ' + str(train_label_0))
AxesImage(18,18;111,6x108,72)
L'étiquette de train_data0 est : [5]
/opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/matplotlib/cbook/__init__.py:2349 : DeprecationWarning : utilisation ou importation des ABC à partir de "collections" au lieu de "collections". abc' est obsolète et dans la version 3.8, il cessera de fonctionner
  si isinstance (obj, collections.Iterator):
/opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/matplotlib/cbook/__init__.py:2366 : DeprecationWarning : utilisation ou importation des ABC à partir de "collections" au lieu de "collections". abc' est obsolète et dans la version 3.8, il cessera de fonctionner
  renvoyer la liste (données) si isinstance (données, collections.MappingView) sinon données
/opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/numpy/lib/type_check.py:546 : DeprecationWarning : np.asscalar(a) est obsolète depuis NumPy v1.16, utilisez a.item() à la place
  'a.item() à la place', DeprecationWarning, stacklevel=1)

<Taille de la figure 144x144 avec 1 axes>

Examinons à nouveau à quoi ressemblent les données.

print(train_data0)

4. Construction du modèle LeNet

Construction du modèle LeNet-5 pour la classification des chiffres manuscrits du MNIST

#导入需要的包
import paddle
import paddle.nn.functional as F
from paddle.vision.transforms import Compose, Normalize

#定义模型
class LeNetModel(paddle.nn.Layer):
    def __init__(self):
        super(LeNetModel, self).__init__()
        # 创建卷积和池化层块,每个卷积层后面接着2x2的池化层
        #卷积层L1
        self.conv1 = paddle.nn.Conv2D(in_channels=1,
                                      out_channels=6,
                                      kernel_size=5,
                                      stride=1)
        #池化层L2
        self.pool1 = paddle.nn.MaxPool2D(kernel_size=2,
                                         stride=2)
        #卷积层L3
        self.conv2 = paddle.nn.Conv2D(in_channels=6,
                                      out_channels=16,
                                      kernel_size=5,
                                      stride=1)
        #池化层L4
        self.pool2 = paddle.nn.MaxPool2D(kernel_size=2,
                                         stride=2)
        #线性层L5
        self.fc1=paddle.nn.Linear(256,120)
        #线性层L6
        self.fc2=paddle.nn.Linear(120,84)
        #线性层L7
        self.fc3=paddle.nn.Linear(84,10)

    #正向传播过程
    def forward(self, x):
        x = self.conv1(x)
        x = F.sigmoid(x)
        x = self.pool1(x)
        x = self.conv2(x)
        x = F.sigmoid(x)
        x = self.pool2(x)
        x = paddle.flatten(x, start_axis=1,stop_axis=-1)
        x = self.fc1(x)
        x = F.sigmoid(x)
        x = self.fc2(x)
        x = F.sigmoid(x)
        out = self.fc3(x)
        return out

model=paddle.Model(LeNetModel())

5. Processus d'optimisation du modèle

5.1 Fonction de perte

Puisqu’il s’agit d’un problème de classification, nous choisissons la fonction de perte d’entropie croisée. L'entropie croisée est principalement utilisée pour mesurer l'écart entre les valeurs estimées et les valeurs réelles. Plus la valeur d’entropie croisée est petite, meilleur est l’effet de prédiction du modèle. *

�(��,�^�)=−∑�=1������(�^��)E(yi,y^​i)=−∑j=1q​yji​ln(y^​ ji​)

Parmi eux, ��∈��yi∈Rq est la valeur réelle, ����yji​ est l'élément dans ��yi (la valeur est 0 ou 1), �=1,...,�j=1, .. .,q. �^�∈��y^​i∈Rq est la valeur prédite (la probabilité de l'échantillon sur chaque catégorie). Parmi eux, l'API correspondant à la perte d'entropie croisée dans paddle est paddle.nn.CrossEntropyLoss()

5.2 Optimisation des paramètres

Une fois le processus de propagation vers l'avant défini, les paramètres initiaux sont randomisés, puis les résultats de chaque couche peuvent être calculés. À chaque fois, une matrice m × 10 sera obtenue comme résultat de prédiction, où m est le nombre de mini-lots. des échantillons. Ensuite, le processus de rétropropagation est effectué. Il doit y avoir une différence entre les résultats prédits et les résultats réels. Dans le but de réduire la différence, le gradient des paramètres du modèle est calculé. Grâce à plusieurs itérations, le modèle peut être optimisé afin que les résultats prédits soient plus proches des résultats réels.

6. Formation et évaluation des modèles

Configuration de l'entraînement : définir les hyperparamètres d'entraînement

1. La taille du lot batch_size est définie sur 64, ce qui signifie que 64 images sont saisies à chaque fois ;

2. Le nombre d'époques d'itérations est fixé à 5, ce qui signifie 5 tours d'entraînement ;

3. Affichage du journal détaillé = 1, indiquant les informations du journal de sortie avec une barre de progression.

model.prepare(paddle.optimizer.Adam(parameters=model.parameters()),
              paddle.nn.CrossEntropyLoss(),
              paddle.metric.Accuracy())

model.fit(train_dataset,
          epochs=5,
          batch_size=64,
          verbose=1)

model.evaluate(val_dataset,verbose=1)
La valeur de perte imprimée dans le journal est l'étape en cours et la métrique est la valeur moyenne de l'étape précédente.
Époque 1/5
pas 10/938 [................................] - perte : 2.3076 - acc : 0.1062 - ETA : 21s - 23ms /étape
/opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/paddle/fluid/layers/utils.py:77 : DeprecationWarning : utilisation ou importation des ABC à partir de "collections" au lieu de " collections.abc' est obsolète et dans la version 3.8, il cessera de fonctionner
  retourner (isinstance (seq, collections.Sequence) et
pas 20/938 [................................] - perte : 2.3023 - acc : 0.1023 - ETA : 18s - 20ms /étape
pas 938/938 [==============================] - perte : 0,1927 - acc : 0,7765 - 16 ms/pas         
Époque 2/5
pas 938/938 [==============================] - perte : 0,0913 - acc : 0,9584 - 17 ms/pas        
Époque 3/5
pas 938/938 [==============================] - perte : 0,0232 - acc : 0,9700 - 17 ms/pas         
Époque 4/5
pas 938/938 [==============================] - perte : 0,0057 - acc : 0,9763 - 18 ms/pas        
Époque 5/5
pas 938/938 [===============================] - perte : 0,0907 - acc : 0,9798 - 17 ms/pas         
L'évaluation commence...
La valeur de perte imprimée dans le journal est le lot actuel et la métrique est la valeur moyenne de l'étape précédente.
pas 10000/10000 [==============================] - perte : 7.5607e-04 - acc : 0.9794 - 2ms/ étape         
Échantillons d'évaluation : 10 000
{'perte' : [0,00075607264], 'acc' : 0,9794}

Après 5 itérations de génération d'époque, la précision du modèle LeNet5 sur la tâche de classification d'images MNIST a atteint environ 98 %.

7. Visualisation du modèle

model.summary((1,1,28,28))
-------------------------------------------------- -------------------------
 Calque (type) Forme d’entrée Forme de sortie Param #    
=================================================== =========================
   Conv2D-1 [[1, 1, 28, 28]] [1, 6, 24, 24] 156      
  MaxPool2D-1 [[1, 6, 24, 24]] [1, 6, 12, 12] 0       
   Conv2D-2 [[1, 6, 12, 12]] [1, 16, 8, 8] 2 416     
  MaxPool2D-2 [[1, 16, 8, 8]] [1, 16, 4, 4] 0       
   Linéaire-1 [[1, 256]] [1, 120] 30 840     
   Linéaire-2 [[1, 120]] [1, 84] 10 164     
   Linéaire-3 [[1, 84]] [1, 10] 850      
=================================================== =========================
Paramètres totaux : 44 426
Paramètres entraînables : 44 426
Paramètres non entraînables : 0
-------------------------------------------------- -------------------------
Taille d'entrée (Mo) : 0,00
Taille du passage avant/arrière (Mo) : 0,04
Taille des paramètres (Mo) : 0,17
Taille totale estimée (Mo) : 0,22
-------------------------------------------------- -------------------------

{'total_params' : 44426, 'trainable_params' : 44426}

Je suppose que tu aimes

Origine blog.csdn.net/m0_63309778/article/details/133490586
conseillé
Classement