Pytorch
2020-05-12 本文已影响0人
SunJi_
视频教程:
莫烦B站Pytorch动态神经网络
参考教程:
PyTorch 深度学习:60分钟快速入门
torch.autograd官方文档
1. 基础知识
1.1 Tensor的基本用法
- 构建矩阵
- 获取Tensor size
- Tensor的计算方法
- Tensor索引方法
- Tensor与numpy array的相互转换
- Tensor移到GPU上
#torch的一些函数
torch.Tensor
torch.rand
torch.add
.cuda
torch.FloatTensor
Variable()
.backward
y.add_(x)
#array to tensor
b = torch.from_numpy(a)
#tensor to array
b = a.numpy()
#tensor移到GPU上
if torch.cuda.is_avaiable():
prrint('succ')
x = x.cuda()
y = y.cuda()
x + y
1.2 autograd 自动求梯度
autograd包为张量上的所有操作提供了自动求导,反向传播是根据代码如何运行来定义,并且每次迭代可以不同。autograd.Variable跟autograd.Function一起构建了非循环图,完成了前向传播的计算.
Variable
- autograd.Variable是这个包中的核心类.
- 封装了Tensor,并且支持了几乎所有Tensor的操作
- 完成张量计算之后就可以调用.backward()函数,计算好所有梯度
- 通过Variable的.data属性可以获取到张量.
- 通过Variabe的.grad属性可以获取到梯度.
Function
- 每个通过Function函数计算得到的变量都有一个.grad_fn属性
- 用户自己定义的变量(不是通过函数计算得到的)的.grad_fn值为空
- 计算某个变量的梯度,可以调用.backward()函数
变量是标量:不需要指定任何参数,.backward()
变量不是标量:需要指定一个跟该变量同样大小的张量grad_output用来存放计算好的梯度,.backgrad(grad_output)
1.3 搭建神经网络
- torch.nn是用来构建神经网络
- nn包内部通过调用autograd包来实现神经网络模块的定义及梯度的计算
- nn.Module类包含了神经网络各层的定义,以及forward(input)前向传播函数的定义,返回输出值output
神经网络的典型训练过程如下:
- 定义神经网络模型,一些可学习的参数(如权重)
- 数据集输入
- 对输入进行处理,网络的向前传播
- 计算loss function(输出结果和正确值的差距大小)
- 反向传播求梯度
- 根据梯度更新网络的参数,最简单的更新方法:
weight = weight - learning_rate * gradient
#搭建神经网络的一个例子
import torch
from torch.autograd import Variable
import torch.nn as nn
import torch.nn.functional as F
class Net(nn.Module):
def __init__(self):
super(Net,self).__init__()
self.conv1 = nn.Conv2d(1,6,5)
self.conv2 = nn.Conv2d(6,16,5)
self.fc1 = nn.Linear(16 * 5 * 5, 120)
self.fc2 = nn.Linear(120, 84)
self.fc3 = nn.Linear(84,10)
def forward(self,x):
x = F.max_pool2d(F.relu(self.conv1(x)), (2,2))
x = F.max_pool2d(F.relu(self.conv2(x)), 2)
x - x.vew(-1,self.num_flat_features(x))
x = F.relu(self.fc1(x))
x = F.relu(self.fc2(x))
x = self.fc3(x)
return x
def num_flat_features(self,x):
size = x.size()[1:]
num_features = 1
for s in size:
num_features *= s
return num_features
net = Net()
print(net)
#结果输出
Net(
(conv1): Conv2d(1, 6, kernel_size=(5, 5), stride=(1, 1))
(conv2): Conv2d(6, 16, kernel_size=(5, 5), stride=(1, 1))
(fc1): Linear(in_features=400, out_features=120, bias=True)
(fc2): Linear(in_features=120, out_features=84, bias=True)
(fc3): Linear(in_features=84, out_features=10, bias=True)
)
2. torch函数部分介绍
nn.Conv2d()
nn.Conv2d(self, in_channels, out_channels, kernel_size, stride=1, padding=0, dilation=1, groups=1, bias=True))
参数:
in_channel: 输入数据的通道数,例RGB图片通道数为3;
out_channel: 输出数据的通道数,这个根据模型调整;
kennel_size: 卷积核大小,可以是int,或tuple;kennel_size=2,意味着卷积大小2, kennel_size=(2,3),意味着卷积在第一维度大小为2,在第二维度大小为3;
stride:步长,默认为1,与kennel_size类似,stride=2,意味在所有维度步长为2, stride=(2,3),意味着在第一维度步长为2,意味着在第二维度步长为3;
padding: 零填充
nn.Linear()