Teknologian jakaminen

Pytorch (muistiinpanot 8 neuroverkko nn)

2024-07-12

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

1、nn.Moduuli

torch.nn on moduuli, joka on erityisesti suunniteltu syvään oppimiseen. Torch.nn:n ydintietorakenne on Module, joka on abstrakti käsite, joka voi edustaa joko tiettyä tasoa hermoverkossa tai hermoverkkoa, joka sisältää useita kerroksia. Varsinaisessa käytössä yleisin tapa on periä nn.Module ja kirjoittaa oma verkko/kerros. Katsotaanpa ensin, kuinka nn.Modulea käytetään oman täysin yhdistetyn kerroksen toteuttamiseen.Y=AX+B

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
  • Mukautetun kerroksen verkon on perittävä nn.Module, ja nn.Modulen rakentaja on kutsuttava sen rakentajassa, eli super().sen sisällä() tai nn.Moduuli.sen sisällä(itse), ensimmäinen käyttökerta on suositeltavaa;
  • Konstruktorissa __init__ sinun on määritettävä opittavat parametrit itse ja kapseloitava ne parametreihin Esimerkiksi tässä esimerkissä kapseloimme w ja b parametreihin. Parametri on erityinen tensori, mutta se vaatii oletuksena johdannaisia ​​(requires_grad
    = Totta)
  • Forward-funktio toteuttaa eteenpäin etenemisprosessin, ja sen syöte voi olla yksi tai useampi tensori;
  • Ei tarvitse kirjoittaa backpropagation funktiota.
  • Moduulin opittavat parametrit voivat palauttaa iteraattorin named_parameters()- tai parametrs()-toiminnolla. Edellinen liittää jokaiseen parametriin nimen, jotta se olisi helpompi tunnistaa.

2. Yleisesti käytetyt hermoverkkokerrokset

2.1 Kuvaan liittyvä kerros

Kuvaan liittyvät kerrokset sisältävät pääasiassa konvoluutiokerroksia (Conv), poolauskerroksia (Pool) jne. Varsinaisessa käytössä nämä tasot voidaan jakaa yksiulotteisiin (1D), kaksiulotteisiin (2D) ja kolmiulotteisiin (3D) Poolausmenetelmä on myös Se jaetaan keskimääräiseen pooliin (AvgPool), maksimipooliin (MaxPool), mukautuvaan poolaukseen (AdaptiveAvgPool) jne. Yleisesti käytetyn myötäkonvoluution lisäksi konvoluutiokerroksessa on myös käänteinen konvoluutio (TransposeConv) ja niin edelleen. Alla annetaan esimerkki.

  • Ominaisuuksien erottaminen
  • Säilytä tietotilan rakenne
  • Epälineaarisen muunnoksen käyttöönotto Konvoluutiooperaation jälkeen käytetään yleensä aktivointifunktiota (kuten ReLU, Sigmoid tai Tanh) epälineaarisen muunnoksen käyttöön ottamiseksi. Nämä aktivointitoiminnot voivat lisätä CNN:n ilmaisuvoimaa ja antaa sille mahdollisuuden oppia monimutkaisempia epälineaarisia suhteita.
  • Laskennan tehokkuuden parantaminen Konvoluutiokerros voi vähentää ominaisuuskartan tilaulottuvuutta käyttämällä konvoluutiotoimintoja ja yhdistämällä kerroksia, mikä vähentää laskennan määrää ja parantaa mallin laskentatehoa. Samanaikaisesti yhdistävä kerros voi myös parantaa ominaisuuksien käännösinvarianssia, mikä tekee mallista kestävämmän pieniin syöttötiedon muutoksiin.

konvoluutiokerros

Syväoppimisessa tärkein kuvankäsittelyyn liittyvä verkkorakenne on konvoluutiokerros (Conv). Konvoluutiohermoverkon ydin on konvoluutiokerrosten, poolikerrosten, aktivointikerrosten ja muiden kerrosten superpositio. Siksi on erittäin tärkeää ymmärtää konvoluutiokerroksen toimintaperiaate. Seuraavassa on esimerkki konvoluutiokerroksen prosessista konvoluutiooperaatio.
Lisää kuvan kuvaus tähän

# 导入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

Yhdistelmäkerros

Poolauskerrosta voidaan pitää erityisenä konvoluutiokerroksena, jota käytetään pääasiassa alasnäytteistykseen. Poolikerroksen lisääminen voi vähentää parametrien määrää säilyttäen samalla tärkeimmät ominaisuudet, mikä estää jossain määrin ylisovituksen. Poolikerroksella ei ole opittavia parametreja ja sen paino on kiinteä. Torch.nn-työkalupakettiin on pakattu erilaisia ​​poolauskerroksia. Yleisiä ovat Max Pooling (MaxPool) ja Average Pooling (AvgPool) -kerroin. Sen tärkeimmät käyttötarkoitukset voidaan tiivistää seuraavasti:

  • Mittasuhteiden vähentäminen (laskennan määrän vähentäminen): Poolauskerros vähentää laskennan määrää ja seuraavien kerrosten parametrien määrää vähentämällä tietojen spatiaalista kokoa (eli korkeutta ja leveyttä). Tämä on erittäin hyödyllistä yliasennusten estämiseksi ja laskelmien nopeuttamiseksi.
  • Ominaisuuden muuttumattomuus: Poolauskerros voi mahdollistaa sen, että malli oppii vankemman ominaisuuden esityksen, toisin sanoen invariantin pienille syöttötiedon muutoksille (kuten muunnos, kierto jne.). Tämä johtuu siitä, että yhdistämistoiminnot (kuten max pooling, keskimääräinen poolaaminen jne.) valitsevat edustavia ominaisuuksia alueella sen sijaan, että luottaisivat tiettyihin sijaintitietoihin.
  • Poimi tärkeimmät ominaisuudet: Poolitoiminnon avulla kuvan tärkeimmät ominaisuudet voidaan poimia ja jättää huomiotta joitakin merkityksettömiä yksityiskohtia. Tämä on hyödyllistä myöhemmissä konvoluutiokerroksissa korkean tason ominaisuuksien erottamiseksi edelleen.
  • Reseptiivisen kentän laajentaminen: Kun verkkokerrosten lukumäärä kasvaa, poolauskerros voi vähitellen laajentaa kutakin neuronia vastaavaa syöttöaluetta (ts. vastaanottavaa kenttää) seuraavissa kerroksissa. Tämä auttaa verkkoa oppimaan enemmän maailmanlaajuisia ominaisuustietoja.
  • Vähennä ylisovitusta: Koska poolauskerros vähentää parametrien määrää pienentämällä tietojen spatiaalista ulottuvuutta, tämä voi vähentää mallin monimutkaisuutta jossain määrin, mikä auttaa estämään ylisovitusta.

Yleisiä poolaustoimintoja ovat:

  • Max Pooling: Valitse tulostukseksi poolausikkunan enimmäisarvo. Tämä lähestymistapa auttaa säilyttämään kuvan reuna- ja tekstuuritiedot.
  • Keskimääräinen yhdistäminen: Laske tulosteena kaikkien poolausikkunan arvojen keskiarvo. Tämä lähestymistapa auttaa säilyttämään kuvan taustatiedot.
  • Stokastinen poolaus: Jokaisen poolausikkunan elementin arvon perusteella elementit valitaan satunnaisesti tulosteiksi todennäköisyyden mukaan. Tämä menetelmä yhdistää max poolingin ja keskimääräisen poolauksen edut, mutta sillä on suurempi laskennallinen monimutkaisuus.

Lyhyesti sanottuna poolauskerros on välttämätön osa konvoluutiohermoverkkoa. Se tarjoaa koko verkon oppimiskyvyn ja suorituskyvyn vähentämällä datan tilaulottuvuutta, poimimalla pääpiirteitä, laajentamalla vastaanottavaa kenttää ja estämällä ylisovituksen tuki.

# 导入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

muita kerroksia

Konvoluutiokerrosten ja poolauskerrosten lisäksi syväoppimisessa käytetään yleisesti myös seuraavia kerroksia:

  • Lineaarinen: täysin yhdistetty kerros;
  • BatchNorm: Erän normalisointikerros, jaettu 1D-, 2D- ja 3D-tasoon. Normaalin BatchNormin lisäksi on myös InstanceNorm-taso, jota käytetään yleisesti tyylin siirtämisessä;
  • Dropout: Dropout-kerros, jota käytetään estämään ylisovitusta, jaetaan myös 1D-, 2D- ja 3D-tasoon.

3. Alustusstrategia

Parametrien alustus on erittäin tärkeä syvässä oppimisessa. Hyvä alustus voi saada mallin konvergoimaan nopeammin ja saavuttamaan korkeamman tason, kun taas huono alustus voi aiheuttaa mallin nopean romahtamisen. PyTorchin nn.Modulen moduuliparametrit omaksuvat järkevämmän alustusstrategian, joten meidän ei yleensä tarvitse ottaa sitä huomioon. Tietysti voimme myös käyttää mukautettua alustusta korvaamaan järjestelmän oletusalustuksen. Kun käytämme parametria, mukautettu alustus on erityisen tärkeää. Tämä johtuu siitä, että torch.Tensor() palauttaa muistiin satunnaisluvun, jolla on todennäköisesti maksimiarvo, mikä aiheuttaa ylivuodon todellisessa harjoitusverkossa . PyTorchin nn.init-moduuli on erityisesti alustusta varten suunniteltu moduuli, joka toteuttaa yleisesti käytettyjä alustusstrategioita. Jos tietty alustusstrategia nn.init ei tarjoa, käyttäjät voivat myös alustaa sen suoraan itse.

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