Dendrobiumcgk

Back

PyTorch基础笔记_01Blur image

PyTorch基础笔记_01#

常用库:torch,numpy,pandas,matplotlib

import torch
import numpy as np
import torch.nn as nn
from torch import optim as optim#优化器
import torch.nn.functional as F#用到的函数
python

基础使用#

假设一个最简单的神经网络,没有隐藏层,只有输入层和输出层

eg:5个输入神经元,7个输出神经元,全连接

y=wx+by=w\cdot x+b

x为输入层,形状为(1,5);

[x1x2x3x4x5]\begin{bmatrix}x_1 & x_2&x_3&x_4&x_5\end{bmatrix}

Y为输出层,形状为(1,7)#同上

[y1y2y3y4y5y6y7]\begin{bmatrix}y_1 & y_2&y_3&y_4&y_5&y_6&y_7\end{bmatrix}

w为权重,形状为(5,7) #全连接,

[w11w12w13w14w15w16w17\w21w22w23w24w25w26w27\w31w32w33w34w35w36w37\w41w42w43w44w45w46w47\w51w52w53w54w55w56w57]\begin{bmatrix}w_{11}&w_{12}&w_{13}&w_{14}&w_{15}&w_{16}&w_{17} \\\w_{21} & w_{22}&w_{23}&w_{24}&w_{25}&w_{26}&w_{27} \\\w_{31} & w_{32}&w_{33}&w_{34}&w_{35}&w_{36}&w_{37} \\\w_{41} & w_{42}&w_{43}&w_{44}&w_{45}&w_{46}&w_{47} \\\w_{51} & w_{52}&w_{53}&w_{54}&w_{55}&w_{56}&w_{57} \end{bmatrix}

b为bias偏置,每个输出神经元输出前都会经过bias调整,所以形状为7

#定义各个参数
w=torch.randn(5,7,requires_grad=True)#生成5*7的随机数矩阵来填充w,同时设定w是需要后续进行梯度下降更新的属性,后半部分缺失会导致程序报错
b=torch.randn(7,requires_grad=True)
x=torch.randn(1,5)
Y=torch.randn(1,7)
lr=0.001#设置学习率
y=F.relu(x @ w + b) #x与w为矩阵,使用矩阵乘法@,同时调用事前导入为F的激活函数,这里选择relu函数(1)
#开始求loss,假定本案例为一个分类任务,选择交叉熵损失函数
loss=F.cross_entropy(y,Y)
#开始求参数梯度,进行梯度下降算法更新参数,pytorch提供了一个函数方法backward(),可以直接帮助我们找到所有参数梯度,无需自己算
loss.backward()#这步只求了梯度,顺利运行的前提是需要提前设定参数是需要求梯度的属性
w.grad#查看w经过梯度下降所得的参数值,!还没有进行参数的更新!见(2)
w=w -lr * w.grad#这步才是更新了参数(3)
python

两种损失函数#

1.分类任务一般使用交叉熵损失函数:

Cross-Entropy=i=1n[yilog(y^i)+(1yi)log(1y^i)]\yi: 类别的真实标签(通常为0或1)yi^:对应类别的预测概率\text{Cross-Entropy}= -\sum_{i=1}^n [y_i \log(\hat{y}_i) + (1-y_i) \log(1-\hat{y}_i)] \\\y_i:\text{ 类别的真实标签(通常为0或1)} \\\\\hat{y_i}: \text{对应类别的预测概率}

2.回归任务一般使用均方误差损失函数

MSE=1ni=1n(yiy^i)2\yi:真实值yi^:预测值\n:样本数量\text{MSE} = \frac{1}{n} \sum_{i=1}^n (y_i - \hat{y}_i)^2 \\\y_i:\text{真实值} \\\\\hat{y_i}:预测值 \\\n:样本数量

损失函数使用时需注意该函数的传参

(1)结果:

y

(2)结果:

w_grad

(3)结果:

image-20240418172233464

搭建模型#

搭建网络需要定义一个类,eg此处输入图像为rgb彩色图像,像素为48*48

ps: jupyter lab查看函数参数快捷键shift+tab

全连接层参数计算:#

一个(3,48times48)图像通过一个(3,16,kernel=3times3,步长为1)的卷积层,\输出为(16,48times48)图像,\通过第一个池化层,窗口为2times2,步长为2\输出为(1624times24),\经过第二个卷积层(1632kernel=3×3,步长为1)\输出为(32,24times24)\通过第二个池化层,变为(3212times12)一个(3,48\\times48)图像通过一个(3,16,kernel=3\\times3,步长为1)的卷积层,\\\输出为(16,48\\times48)图像,\\\通过第一个池化层,窗口为2\\times2,步长为2,\\\输出为(16,24\\times24),\\\经过第二个卷积层(16,32,kernel=3\times3,步长为1)\\\输出为(32,24\\times24),\\\通过第二个池化层,变为(32,12\\times12)

(4)nn.Conv2d函数的参数:

image-20240418174521676

数据处理#

读取数据,转化为dataset,再由dataset转化为dataloader

from torch.utils.data import DataLoader
from torchvision import datasets,tranforms
from torchvision.datasets import ImageFolder
transform=transforms.Compose([
	transforms.ToTensor()#读取图像后将数据转换为tensor类型
	transforms.Normalize(mean=(0.5,),std=(0.5,))#去均值,除标准差的归一化操作
])
dataset=ImageFolder('file_path',tansform=transform)#通过imagefolder来为读取的数据进行标注,后半部分使用tranform进行格式转化
dataloader=DataLoader(dataset,batch_size=32,shuffle=True)#shuffle意义为每个batch开始时顺序是否要被打乱
python

跑模型#

ps:最后来一张之前tutu带我看的不认识的Vtuber演唱会#

PyTorch基础笔记_01
Author dendrobium
Published at April 18, 2024
Comment seems to stuck. Try to refresh?✨