Pytorch

作者: SunJi_ | 来源:发表于2020-05-12 18:02 被阅读0次

    视频教程:
    莫烦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属性可以获取到梯度.
    Variable结构图

    Function

    • 每个通过Function函数计算得到的变量都有一个.grad_fn属性
    • 用户自己定义的变量(不是通过函数计算得到的)的.grad_fn值为空
    • 计算某个变量的梯度,可以调用.backward()函数
      变量是标量:不需要指定任何参数,.backward()
      变量不是标量:需要指定一个跟该变量同样大小的张量grad_output用来存放计算好的梯度,.backgrad(grad_output)

    1.3 搭建神经网络

    • torch.nn是用来构建神经网络
    • nn包内部通过调用autograd包来实现神经网络模块的定义及梯度的计算
    • nn.Module类包含了神经网络各层的定义,以及forward(input)前向传播函数的定义,返回输出值output

    神经网络的典型训练过程如下:

    1. 定义神经网络模型,一些可学习的参数(如权重)
    2. 数据集输入
    3. 对输入进行处理,网络的向前传播
    4. 计算loss function(输出结果和正确值的差距大小)
    5. 反向传播求梯度
    6. 根据梯度更新网络的参数,最简单的更新方法:
      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()

    
    

    相关文章

      网友评论

          本文标题:Pytorch

          本文链接:https://www.haomeiwen.com/subject/tddbnhtx.html