Κοινή χρήση τεχνολογίας

Pytorch (σημειώσεις 8 νευρωνικό δίκτυο nn)

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

1、nn.Ενότητα

Το torch.nn είναι μια ενότητα ειδικά σχεδιασμένη για βαθιά μάθηση. Η βασική δομή δεδομένων του torch.nn είναι το Module, το οποίο είναι μια αφηρημένη έννοια που μπορεί να αναπαριστά είτε ένα συγκεκριμένο επίπεδο σε ένα νευρωνικό δίκτυο είτε ένα νευρωνικό δίκτυο που περιέχει πολλά επίπεδα. Στην πραγματική χρήση, η πιο κοινή προσέγγιση είναι να κληρονομήσετε το nn.Module και να γράψετε το δικό σας δίκτυο/επίπεδο. Ας ρίξουμε πρώτα μια ματιά στον τρόπο χρήσης του nn.Module για να εφαρμόσετε το δικό σας πλήρως συνδεδεμένο επίπεδο.Υ=ΑΧ+Β

import torch as t
import torch.nn as nn

class network(nn.Module):
    def __init__(self, input, output):
        super().__init__()
        # 定义权重矩阵a,它是一个可训练的参数,形状为(input, output)
        self.a = nn.Parameter(t.randn(input, output))
        # 定义偏置向量b,它也是一个可训练的参数,形状为(output,)
        # 注意:偏置向量的长度应与输出特征的维度相匹配
        self.b = nn.Parameter(t.randn(output))

    def forward(self, x):
        """
        定义前向传播过程

        参数:
            x (torch.Tensor): 输入数据,形状应为(batch_size, input)

        返回:
            torch.Tensor: 输出数据,形状为(batch_size, output)
        """
        # 首先,使用权重矩阵a对输入x进行线性变换
        # [email protected]执行矩阵乘法,x的每一行与a相乘,结果形状为(batch_size, output)
        x = x @ self.a
        # 然后,将偏置向量b扩展(通过broadcasting)到与x相同的形状,并加到x上
        # self.b.expand_as(x)将b的形状从(output,)扩展到(batch_size, output)
        # x + self.b.expand_as(x)将偏置加到每个样本的输出上
        x = x + self.b.expand_as(x)
        # 返回变换后的输出
        return x


a = network(4, 3)
# 创建输入数据,形状为(6, 4),表示有6个样本,每个样本有4个特征
input = t.rand(6, 4)
# 通过网络前向传播得到输出
output = a(input)
# 打印输出,形状应为(6, 3),表示有6个样本,每个样本的输出特征维度为3
print(output)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • Το δίκτυο προσαρμοσμένου επιπέδου πρέπει να κληρονομήσει το nn.Module και ο κατασκευαστής του nn.Module πρέπει να κληθεί στον κατασκευαστή του, δηλαδή super().μέσα σε αυτό() ή nn.Ενότητα.μέσα σε αυτό(αυτο), συνιστάται η πρώτη χρήση.
  • Στον κατασκευαστή __init__, πρέπει να ορίσετε μόνοι σας τις παραμέτρους που μπορούν να μάθουν και να τις ενσωματώσετε σε Παράμετρους. Η παράμετρος είναι ένας ειδικός τανυστής, αλλά απαιτεί παράγωγα από προεπιλογή (requires_grad
    = αλήθεια)
  • Η συνάρτηση προς τα εμπρός υλοποιεί τη διαδικασία διάδοσης προς τα εμπρός και η είσοδος της μπορεί να είναι ένας ή περισσότεροι τανυστές.
  • Δεν χρειάζεται να γράψετε μια συνάρτηση backpropagation nn. Το Module μπορεί να χρησιμοποιήσει το autograd για να εφαρμόσει αυτόματα backpropagation, το οποίο είναι πολύ πιο απλό από το Function.
  • Οι παράμετροι με δυνατότητα εκμάθησης στο Module μπορούν να επιστρέψουν έναν επαναλήπτη μέσω της named_parameters() ή της παραμέτρους().

2. Συνήθως χρησιμοποιούμενα επίπεδα νευρωνικών δικτύων

2.1 Επίπεδο σχετικό με την εικόνα

Τα επίπεδα που σχετίζονται με την εικόνα περιλαμβάνουν κυρίως επίπεδα συνέλιξης (Conv), στρώματα συγκέντρωσης (Pool) κ.λπ. Στην πραγματική χρήση, αυτά τα επίπεδα μπορούν να χωριστούν σε μονοδιάστατα (1D), δισδιάστατα (2D) και τρισδιάστατα (3D) Η μέθοδος συγκέντρωσης χωρίζεται επίσης σε μέση συγκέντρωση (AvgPool), μέγιστη συγκέντρωση (MaxPool), προσαρμοστική συγκέντρωση (AdaptiveAvgPool) κ.λπ. Εκτός από τη συνήθη συνέλιξη προς τα εμπρός, το επίπεδο συνέλιξης έχει επίσης αντίστροφη συνέλιξη (TransposeConv) και ούτω καθεξής. Ένα παράδειγμα θα δοθεί παρακάτω.

  • Εξαγωγή χαρακτηριστικών
  • Διατηρήστε τη δομή του χώρου δεδομένων
  • Εισαγωγή μη γραμμικού μετασχηματισμού Μετά τη λειτουργία συνέλιξης, μια συνάρτηση ενεργοποίησης (όπως ReLU, Sigmoid ή Tanh) εφαρμόζεται συνήθως για την εισαγωγή μη γραμμικού μετασχηματισμού. Αυτές οι συναρτήσεις ενεργοποίησης μπορούν να αυξήσουν την εκφραστική δύναμη του CNN και να του επιτρέψουν να μάθει πιο σύνθετες μη γραμμικές σχέσεις.
  • Βελτίωση της υπολογιστικής απόδοσης Μέσω της συνδυασμένης χρήσης των λειτουργιών συνέλιξης και των επιπέδων συγκέντρωσης, το επίπεδο συνέλιξης μπορεί να μειώσει τη χωρική διάσταση του χάρτη χαρακτηριστικών, μειώνοντας έτσι τον όγκο υπολογισμού και βελτιώνοντας την υπολογιστική απόδοση του μοντέλου. Ταυτόχρονα, το επίπεδο συγκέντρωσης μπορεί επίσης να ενισχύσει τη μεταβλητότητα της μετάφρασης των χαρακτηριστικών, καθιστώντας το μοντέλο πιο ανθεκτικό σε μικρές αλλαγές στα δεδομένα εισόδου.

στρώμα συνέλιξης

Στη βαθιά μάθηση, η πιο σημαντική δομή δικτύου που σχετίζεται με την επεξεργασία εικόνας είναι το συνελικτικό στρώμα (Conv). Η ουσία ενός συνελικτικού νευρωνικού δικτύου είναι η υπέρθεση των συνελικτικών στρωμάτων, των στρωμάτων ενεργοποίησης και άλλων στρωμάτων. Ως εκ τούτου, είναι εξαιρετικά σημαντικό να κατανοήσουμε την αρχή λειτουργίας του συνελικτικού στρώματος λειτουργία συνέλιξης.
Εισαγάγετε την περιγραφή της εικόνας εδώ

# 导入PyTorch库  
import torch  
import torch.nn as nn  
  
# 从torchvision.transforms导入ToTensor和ToPILImage,用于图像张量和PIL图像之间的转换  
from torchvision.transforms import ToTensor, ToPILImage  
  
# 从PIL(Python Imaging Library,Pillow是其一个分支)导入Image模块,用于处理图像文件  
from PIL import Image  
  
# 使用PIL的Image.open函数打开指定路径的图片文件,并通过.convert("L")将其转换为灰度图像(单通道)  
img = Image.open("H:\PYTHON_Proj\handlearnpytorch\OIP-C.jpg").convert("L")  
  
# 实例化ToTensor转换对象,用于将PIL图像转换为PyTorch张量  
to_tensor = ToTensor()  
  
# 实例化ToPILImage转换对象,用于将PyTorch张量转换回PIL图像  
to_PIL = ToPILImage()  
  
# 使用to_tensor将PIL图像转换为PyTorch张量,并通过.unsqueeze(0)在批次大小维度上增加一个维度,使其形状变为(1, 1, H, W)  
img = to_tensor(img).unsqueeze(0)  
  
# 创建一个3x3的卷积核(滤波器),初始时所有元素都被设置为-1/9,然后将中心元素设置为1  
kernel = torch.ones(3, 3) / (-9.0)  
kernel[1][1] = 1  
  
# 创建一个Conv2d层,指定输入通道数为1(因为是灰度图像),输出通道数也为1,卷积核大小为3x3,步长为1,填充为1(保持输出尺寸与输入相同),且不使用偏置项  
conv = nn.Conv2d(1, 1, 3, 1, 1, bias=False)  
  
# 将之前定义的卷积核赋值给Conv2d层的权重,注意要调整形状以匹配Conv2d层的期望(out_channels, in_channels, kernel_size[0], kernel_size[1])  
conv.weight.data = kernel.reshape(1, 1, 3, 3)  
  
# 对图像应用卷积操作,此时img是一个四维张量,Conv2d层会处理它并返回一个新的四维张量  
img = conv(img)  
  
# 使用to_PIL将卷积后的PyTorch张量转换回PIL图像,并通过.squeeze(0)移除批次大小维度  
img = to_PIL(img.squeeze(0))  
  
# 使用PIL的.show()方法显示图像  
img.show()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40

Στρώμα συγκέντρωσης

Το στρώμα συγκέντρωσης μπορεί να θεωρηθεί ως ένα ειδικό στρώμα συνέλιξης, το οποίο χρησιμοποιείται κυρίως για τη μείωση του δείγματος Η προσθήκη ενός στρώματος συγκέντρωσης μπορεί να μειώσει τον αριθμό των παραμέτρων διατηρώντας τα κύρια χαρακτηριστικά, αποτρέποντας έτσι την υπερπροσαρμογή σε κάποιο βαθμό. Το στρώμα συγκέντρωσης δεν έχει παραμέτρους που μπορούν να μάθουν και το βάρος του είναι σταθερό. Διάφορα επίπεδα συγκέντρωσης είναι συσκευασμένα στην εργαλειοθήκη torch.nn Τα κοινά επίπεδα περιλαμβάνουν το Max Pooling (MaxPool) και το Average Pooling (AvgPool). Οι κύριες χρήσεις του μπορούν να συνοψιστούν ως εξής:

  • Μείωση διαστάσεων (μείωση του ποσού υπολογισμού): Το επίπεδο συγκέντρωσης μειώνει τον όγκο του υπολογισμού και τον αριθμό των παραμέτρων των επόμενων στρωμάτων μειώνοντας το χωρικό μέγεθος των δεδομένων (δηλαδή ύψος και πλάτος). Αυτό είναι πολύ ωφέλιμο για την αποφυγή υπερβολικής τοποθέτησης και την επιτάχυνση των υπολογισμών.
  • Αμετάβλητη δυνατότητα: Το επίπεδο συγκέντρωσης μπορεί να επιτρέψει στο μοντέλο να μάθει μια πιο ισχυρή αναπαράσταση χαρακτηριστικών, δηλαδή, αμετάβλητη σε μικρές αλλαγές στα δεδομένα εισόδου (όπως μετάφραση, περιστροφή κ.λπ.). Αυτό συμβαίνει επειδή οι λειτουργίες ομαδοποίησης (όπως η μέγιστη συγκέντρωση, η μέση συγκέντρωση κ.λπ.) επιλέγουν αντιπροσωπευτικά χαρακτηριστικά εντός της περιοχής αντί να βασίζονται σε συγκεκριμένες πληροφορίες τοποθεσίας.
  • Εξαγωγή βασικών χαρακτηριστικών: Μέσω της λειτουργίας ομαδοποίησης, τα πιο σημαντικά χαρακτηριστικά της εικόνας μπορούν να εξαχθούν ενώ αγνοούνται ορισμένες ασήμαντες λεπτομέρειες. Αυτό είναι χρήσιμο για τα επόμενα συνελικτικά επίπεδα για περαιτέρω εξαγωγή χαρακτηριστικών υψηλού επιπέδου.
  • Επέκταση του δεκτικού πεδίου: Καθώς ο αριθμός των επιπέδων δικτύου αυξάνεται, το επίπεδο συγκέντρωσης μπορεί σταδιακά να επεκτείνει την περιοχή εισόδου (δηλ. το πεδίο υποδοχής) που αντιστοιχεί σε κάθε νευρώνα στα επόμενα επίπεδα. Αυτό βοηθά το δίκτυο να μάθει περισσότερες παγκόσμιες πληροφορίες χαρακτηριστικών.
  • Μειώστε την υπερπροσαρμογή: Εφόσον το επίπεδο συγκέντρωσης μειώνει τον αριθμό των παραμέτρων μειώνοντας τη χωρική διάσταση των δεδομένων, αυτό μπορεί να μειώσει την πολυπλοκότητα του μοντέλου σε κάποιο βαθμό, συμβάλλοντας έτσι στην αποφυγή της υπερπροσαρμογής.

Οι κοινές λειτουργίες συγκέντρωσης περιλαμβάνουν:

  • Μέγιστη συγκέντρωση: Επιλέξτε τη μέγιστη τιμή στο παράθυρο συγκέντρωσης ως έξοδο. Αυτή η προσέγγιση βοηθά στη διατήρηση των πληροφοριών άκρων και υφής της εικόνας.
  • Μέση συγκέντρωση: Υπολογίστε τον μέσο όρο όλων των τιμών μέσα στο παράθυρο συγκέντρωσης ως έξοδο. Αυτή η προσέγγιση βοηθά στη διατήρηση των πληροφοριών φόντου της εικόνας.
  • Στοχαστική συγκέντρωση: Με βάση την τιμή κάθε στοιχείου στο παράθυρο συγκέντρωσης, τα στοιχεία επιλέγονται τυχαία ως έξοδοι ανάλογα με την πιθανότητα. Αυτή η μέθοδος συνδυάζει τα πλεονεκτήματα της μέγιστης συγκέντρωσης και της μέσης συγκέντρωσης, αλλά έχει υψηλότερη υπολογιστική πολυπλοκότητα.

Εν ολίγοις, το επίπεδο συγκέντρωσης είναι απαραίτητο μέρος του συνελικτικού νευρικού δικτύου υποστήριξη.

# 导入PyTorch库  
import torch  
  
# 导入PyTorch的神经网络模块,用于构建和训练神经网络  
import torch.nn as nn  
  
# 从torchvision.transforms模块导入ToTensor和ToPILImage,这两个转换工具用于图像数据的预处理和后处理  
from torchvision.transforms import ToTensor, ToPILImage  
  
# 从PIL库导入Image模块,用于图像的打开、显示等操作  
from PIL import Image  
  
# 创建一个ToTensor的实例,用于将PIL图像或numpy.ndarray转换为FloatTensor,并归一化到[0.0, 1.0]  
to_tensor = ToTensor()  
  
# 创建一个ToPILImage的实例,用于将Tensor或ndarray转换为PIL图像  
to_pil = ToPILImage()  
  
# 使用PIL的Image.open方法打开指定路径的图像文件,并将其转换为灰度图像('L'模式)  
img = Image.open("H:\PYTHON_Proj\handlearnpytorch\OIP-C.jpg").convert('L')  
  
# 使用PIL的show方法显示图像  
img.show()  
  
# 使用ToTensor转换将PIL图像转换为Tensor,并增加一个维度使其成为[1, H, W]形状,即增加一个批次维度  
img = to_tensor(img).unsqueeze(0)  
  
# 创建一个平均池化层实例,使用2x2的窗口大小和步长为2进行池化  
pool = nn.AvgPool2d(2, 2)  
  
# 对图像Tensor应用平均池化层,然后移除批次维度(squeeze(0)),使其变回[H', W']形状  
img = pool(img).squeeze(0)  
  
# 将Tensor转换回PIL图像以便显示  
img = to_pil(img)  
  
# 再次使用PIL的show方法显示经过池化处理的图像  
img.show()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38

άλλα στρώματα

Εκτός από τα συνελικτικά επίπεδα και τα επίπεδα συγκέντρωσης, τα ακόλουθα επίπεδα χρησιμοποιούνται επίσης συνήθως στη βαθιά εκμάθηση:

  • Γραμμικό: πλήρως συνδεδεμένο στρώμα.
  • BatchNorm: Επίπεδο ομαλοποίησης παρτίδας, χωρισμένο σε 1D, 2D και 3D. Εκτός από το τυπικό BatchNorm, υπάρχει επίσης το επίπεδο InstanceNorm που χρησιμοποιείται συνήθως στη μετεγκατάσταση στυλ.
  • Dropout: Το στρώμα εγκατάλειψης, που χρησιμοποιείται για την αποφυγή υπερπροσαρμογής, χωρίζεται επίσης σε 1D, 2D και 3D.

3. Στρατηγική αρχικοποίησης

Η αρχικοποίηση των παραμέτρων είναι πολύ σημαντική στη βαθιά εκμάθηση Η καλή προετοιμασία μπορεί να κάνει το μοντέλο να συγκλίνει πιο γρήγορα και να φτάσει σε υψηλότερο επίπεδο, ενώ η κακή προετοιμασία μπορεί να προκαλέσει τη γρήγορη κατάρρευση του μοντέλου. Οι παράμετροι της ενότητας του nn.Module στο PyTorch υιοθετούν μια πιο λογική στρατηγική αρχικοποίησης, επομένως γενικά δεν χρειάζεται να τη λάβουμε υπόψη. Φυσικά, μπορούμε επίσης να χρησιμοποιήσουμε προσαρμοσμένη προετοιμασία για να αντικαταστήσουμε την προεπιλεγμένη προετοιμασία του συστήματος. Όταν χρησιμοποιούμε Παράμετρο, η προσαρμοσμένη προετοιμασία είναι ιδιαίτερα σημαντική επειδή η torch.Tensor() επιστρέφει έναν τυχαίο αριθμό στη μνήμη, ο οποίος είναι πιθανό να έχει μια μέγιστη τιμή, η οποία θα προκαλέσει υπερχείλιση ή υπερχείλιση στο πραγματικό δίκτυο εκπαίδευσης . Η λειτουργική μονάδα nn.init στο PyTorch είναι μια λειτουργική μονάδα ειδικά σχεδιασμένη για προετοιμασία, η οποία υλοποιεί κοινά χρησιμοποιούμενες στρατηγικές αρχικοποίησης. Εάν μια συγκεκριμένη στρατηγική προετοιμασίας nn.init δεν παρέχει, οι χρήστες μπορούν επίσης να την αρχικοποιήσουν απευθείας οι ίδιοι.

import torch  
from torch.nn import init  
from torch import nn  
  
# 创建一个线性层,其权重和偏置会被随机初始化(与torch.manual_seed无关,因为这是在调用torch.manual_seed之前发生的)  
linear = nn.Linear(3, 4)  
  
# 打印层创建时默认初始化的权重  
print("默认初始化的权重:")  
print(linear.weight)  
  
# 设置随机数生成的种子,以确保接下来的随机数生成是可重复的  
torch.manual_seed(2021)  
  
# 使用Xavier正态分布重新初始化权重  
# 这个初始化是受torch.manual_seed(2021)影响的  
init.xavier_normal_(linear.weight)  
  
# 打印重新初始化后的权重  
print("Xavier正态分布初始化后的权重:")  
print(linear.weight)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21