Pytorch学习

作者介绍

张伟伟,男,西安工程大学电子信息学院,2019级硕士研究生,张宏伟人工智能课题组。
研究方向:机器视觉与人工智能。
微信公众号:可随时查阅,搜索—张二牛的笔记,回复“python‘’获取整理好的专栏。
电子邮件:zhangweiweicpp@163.com

Pytorch学习(10days)

学习Pytorch不知道如何学起,那么本帖一定可以帮助到你,主要是一个导向作用。有补充的部分可以评论区相互交流补充。以下主要根据个人的学习经验,列举出学习的部分,快速入门 Pytorch。

1.1 Pytorch简介:

Pytorch是一个优秀的开源机器学习和深度学习算法框架,pytorch官方网址: https://pytorch.org/.
除此之外的开源框架还有TensorFlow、MXNet、CNTK、Keras等。Pytorch语法简洁、优美。个人感觉比起TensorFlow更容易上手。PyTorch 的奥秘,重点在于‘’张量‘’。pytorch的热度:
在这里插入图片描述

学习注意的点:浏览学习一些基础知识,如中文文档和官方的pytorch 60 分钟入门视频和链接。
然后熟悉各个模块的作用,从实例和代码边实现边学习pytorch最为高效。

1.2 Pytorch的环境安装

1.3 Pytorch资料

1.4.1 pytorch的基础知识

1.4.1Pytoch的张量(Tensor)

tensor就是张量的英文,表示多维的矩阵,比如一维就是向量,二维就是一般的矩阵等等,关于维度的理解很重要,另外需要学习张量间的运算如加减乘除求导等,具体可自行百度。

1.4.2 Pytorch的自动求导功能

1.4.3 Pytorch的Tensor与numpy的关系及类型转换

1.4.4 Pytorch的核心模块的学习

主要学习各模块的作用,熟悉pytorch中文文档中的模块,熟悉模块的作用,深度学习中各个模块的关系博主找到一张比较清晰的图如下:

在这里插入图片描述


1.4.4.1 Pytorch的核心模块的学习之torch.nn

(主要用于定义模型,)

1.4.4.2 Pytorch的核心模块的学习之torch.nn.functional

(损失函数和一些不需要优化的网络层)

1.4.4.3 Pytorch的核心模块的学习之torch.optim

(定义优化器等)


1.4.2 学习要点

  • 理解各个常用包的用途,比如matplib,os等。通过minist数据集数字分类熟悉整个流程。
  • 读取数据,主要会调用两个类即可,Dataset和Dataloader,如何得到数据集的列表和按照batchsize进行输出。
  • 搭建神经网络。卷积,激活层,BN层Pooling,全连接的语句。将其写到模型类中两个函数,_init_和forward函数。
  • 优化器根据实际情况选择优化器,一般选取Adam优化器即可。

1.5 pytorch的实例

阅读源代码是快速上手pytorch的最好的手段。相比其他框架,pytorch代码量不大,而且抽象层次没有那么多,很容易读懂。通过阅读代码可以了解函数和类的机制,将python的知识。

1.5.1 利用pytorch编写手写字符分类的实验,训练和测试,输出准确率。

#1.导入相关的包
import torch
import torch.nn as nn
import torch.nn.functional as F
import torch.optim as optim
from torchvision import datasets, transforms
from torch.autograd import Variable

# 2.设置超参数,例如学习率,层数,批大小(batch_size)
batch_size = 64

# 3.给定路径读入数据集的图片列表,利用MNIST Dataset数据集。使用datasets函数
train_dataset = datasets.MNIST(root='./data/',
                train=True,
                transform=transforms.ToTensor(),
                download=True)

test_dataset = datasets.MNIST(root='./data/',
               train=False,
               transform=transforms.ToTensor())

# 4.按照给定的batch_size大小划分数据,利用torch.utils.data.DataLoader读入训练和测试数据
train_loader = torch.utils.data.DataLoader(dataset=train_dataset,
                      batch_size=batch_size,
                      shuffle=True)

test_loader = torch.utils.data.DataLoader(dataset=test_dataset,
                     batch_size=batch_size,
                     shuffle=False)

# 5 加载已训练模型或者定义模型。 搭建神经网络。卷积,激活层,注意如何搭建并编写的。
class Net(nn.Module):
  def __init__(self):
    super(Net, self).__init__()
    # 输入1通道,输出10通道,kernel 5*5
    self.conv1 = nn.Conv2d(1, 10, kernel_size=5)
    self.conv2 = nn.Conv2d(10, 20, kernel_size=5)
    self.mp = nn.MaxPool2d(2)
    # fully connect
    self.fc = nn.Linear(320, 10)

  def forward(self, x):
    # in_size = 64
    in_size = x.size(0) # one batch
    # x: 64*10*12*12
    x = F.relu(self.mp(self.conv1(x)))
    # x: 64*20*4*4
    x = F.relu(self.mp(self.conv2(x)))
    # x: 64*320
    x = x.view(in_size, -1) # flatten the tensor
    # x: 64*10
    x = self.fc(x)
    return F.log_softmax(x)

# 6 对定义的模型进行实例化,如果电脑支持GPU,则if语句会将模型加载到GPU上运行,本实例使用cpu可满足计算要求
model = Net()
#if torch.cuda.is_available():
#   model = model.cuda() 

# 7 定义并实例化优化器,设置学习率等,optim函数中可以选择优化器,例如SGD和Adam等
optimizer = optim.SGD(model.parameters(), lr=0.01, momentum=0.5)

# 8 训练过程
def train(epoch):
  for batch_idx, (data, target) in enumerate(train_loader):
    # 8.1 读入数据
    data, target = Variable(data), Variable(target)
    # 8.2 优化器梯度清零,为了后续参数更新
    optimizer.zero_grad()
    # 8.3 数据输如模型中,通过前向传播,得到预测结果
    output = model(data)
    # 8.4 损失函数。计算输入和预测的损失
    loss = F.nll_loss(output, target)
    # 8.5 利用计算的损失进行反向传播计算梯度
    loss.backward()
    # 8.6 利用优化器进行参数更新
    optimizer.step()
    # 8.7 训练过程的损失可视化
    if batch_idx % 200 == 0:
      print('Train Epoch: {} [{}/{} ({:.0f}%)]\tLoss: {:.6f}'.format(
        epoch, batch_idx * len(data), len(train_loader.dataset),
        100. * batch_idx / len(train_loader), loss.item()))

# 9 测试过程,无需优化器和参数更新,计算并统计预测正确的个数。 
def test():
  test_loss = 0
  correct = 0
  for data, target in test_loader:
    data, target = Variable(data, volatile=True), Variable(target)
    output = model(data)
    # sum up batch loss
    test_loss += F.nll_loss(output, target, size_average=False).item()
    # get the index of the max log-probability
    pred = output.data.max(1, keepdim=True)[1]
    correct += pred.eq(target.data.view_as(pred)).cpu().sum()

  test_loss /= len(test_loader.dataset)
  print('\nTest set: Average loss: {:.4f}, Accuracy: {}/{} ({:.0f}%)\n'.format(
    test_loss, correct, len(test_loader.dataset),
    100. * correct / len(test_loader.dataset)))

# 10 开始训练和测试。epoch 数量设置为10
for epoch in range(1, 10):
  train(epoch)
  test()
  • 测试主要将训练保存的模型读入,然后输出待测图片。后续可将训练和测试分开编写在不同的文件中。==关键是学习完成如何保存模型。==编写测试代码时将训练的代码去掉优化器,损失函数,直接读入已训练的模型,输入图片,将模型冻结,不作参数更新,然后编写可视化程序例如:显示图片,打印预测结果等。

后续待补充---------

  • 2
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值