极简Pytorch入门

目录

  • 什么是Pytorch,为什么选择Pytroch?
  • 通过命令行安装PyTorch
  • 配置Python环境
  • PyTorch基础概念
  • 完成一个深度学习的代码

原文发表于简书 2019.5.11

1.什么是Pytorch,为什么选择Pytroch?

PyTorch 是 PyTorch 在 Python 上的衍生。因为 PyTorch 是一个使用 PyTorch 语言的神经网络库, Torch 很好用, 但是 Lua 又不是特别流行(其实Lua是一门比Python还简单的语言), 所有开发团队将 Lua 的 Torch 移植到了更流行的语言 Python 上,使其能够发挥出更大的价值。当今世界,著名的 Facebook、twitter、Google、Microsoft 等公司都在使用它, 足以见得Pytorch的确好用。
以下是常见的一些深度学习框架,具体就不赘述了:

以上详细介绍见:常见深度学习框架简介

2.通过命令行安装PyTorch

我们只需要访问https://pytorch.org/既可以轻松获取安装途径。

这里我采用的是Windows平台下Python3.7的Pip稳定版安装(附带GPU加速)
在命令行中粘贴以下内容即可安装

pip3 install https://download.pytorch.org/whl/cu100/torch-1.1.0-cp37-cp37m-win_amd64.whl
pip3 install torchvision

3.配置Python环境

安装Python时勾选添加到PATH即可,也可以手动操作,尤其是我们需要同时安装两个不同的版本(不用虚拟环境)时,需要多注意环境配置问题!
多版本可以参考以下资料配置环境:
多版本Python共存的配置和使用
Windows10下解决多个版本Python共存问题初探

4.PyTorch基础概念

PyTorch 是一个建立在 Torch 库之上的 Python 包,旨在加速深度学习应用。
PyTorch 提供一种类似 NumPy 的抽象方法来表征张量(或多维数组,标量是零级张量、向量是一阶张量,矩阵是二阶张量),它可以利用 GPU 来加速训练。在神经网络中Torch可以替换Numpy。
而PyTorch相比TensorFlow,其最大的优点是建立的神经网络是动态的,相比静态的TensorFlow,它能更加有效地去处理一些问题,比如RNN变化时间长度的输出,TensorFlow相比PyTorch的有点在于分布式训练上。
Vector:向量/Matrix:矩阵/Tensor:张量

  • Tensor和Numpy之间的转换(Numpy桥)
import torch
import numpy as np
 
np_data = np.arange(6).reshape((2, 3))
torch_data = torch.from_numpy(np_data)
tensor2array = torch_data.numpy()
print(
    '\nnumpy', np_data,
    '\ntorch', torch_data,
    '\ntensor2array', tensor2array
)

运行结果:

numpy [[0 1 2]
 [3 4 5]] 
torch tensor([[0, 1, 2],
        [3, 4, 5]], dtype=torch.int32) 
tensor2array [[0 1 2]
 [3 4 5]]

再说几个重点:

  • 张量(Tensor)是线性代数中的一种数据结构,是向量和矩阵的推广,我们可以在张量上进行算术运算。参考文档:什么是张量?
import torch 
x = torch.ones(2,3,4) 
print(x) 

输出:

tensor([[[1., 1., 1., 1.],
        [1., 1., 1., 1.],
        [1., 1., 1., 1.]],

       [[1., 1., 1., 1.],
        [1., 1., 1., 1.],
        [1., 1., 1., 1.]]])
  • Tensor与numpy的Array之间的相互转换时,要时刻注意Tensor和numpy的Array共享潜在的内存,改变其中任一值,另外一个也会相应改变
  • 如果安装了GPU版(CUDA张量)的Pytorch,可将张量转移到GPU上进行计算,从而可以提高运算效率

可参考笔记:Torch or Numpy

5.完成一个深度学习的代码

1>建立数据集(并绘制图像)

# -*- coding: utf-8 -*-
#demo.py
import torch
import torch.nn.functional as F  # 主要实现激活函数
import matplotlib.pyplot as plt  # 绘图的工具
from torch.autograd import Variable
# 生成伪数据
x = torch.unsqueeze(torch.linspace(-1, 1, 100), dim=1)
y = x.pow(3) + 0.2*torch.rand(x.size())    #y=x³+b

# 变为Variable
x, y = Variable(x), Variable(y)

# 绘制数据图像
plt.scatter(x.data.numpy(), y.data.numpy())
plt.show()

其中torch.linspace是为了生成连续间断的数据,第一个参数表示起点,第二个参数表示终点,第三个参数表示将这个区间分成平均几份,即生成几个数据。因为torch只能处理二维的数据,所以我们用torch.unsqueeze给伪数据添加一个维度,dim表示添加在第几维。torch.rand返回的是[0,1)之间的均匀分布。

得到下图:

2>建立神经网络

lass Net(torch.nn.Module):    # 继承 torch 的 Module
    def __init__(self, n_feature, n_hidden, n_output):
        super(Net, self).__init__()   # 继承 __init__ 功能
        self.hidden = torch.nn.Linear(n_feature, n_hidden)   # 隐藏层线性输出
        self.predict = torch.nn.Linear(n_hidden, n_output)   # 输出层线性输出

    def forward(self, x):
        x = F.relu(self.hidden(x))       # 激励函数(隐藏层的线性值)
        x = self.predict(x)             # 输出值
        return x

net = Net(n_feature=1, n_hidden=10, n_output=1)     # 定义神经网络
print(net)  # net 的结构

一般神经网络的类都继承自torch.nn.Module__init__()forward()两个函数是自定义类的主要函数。在__init__()中都要添加一句super(Net, self).__init__(),这是固定的标准写法,用于继承父类的初始化函数。__init__()中只是对神经网络的模块进行了声明,真正的搭建是在forwad()中实现。自定义类中的成员都通过 self指针来进行访问,所以参数列表中都包含了self

3>训练神经网络(并可视化训练过程)

# optimizer 是训练的工具
optimizer = torch.optim.SGD(net.parameters(), lr=0.2)  # 传入 net 的所有参数, 学习率
loss_func = torch.nn.MSELoss()      # 预测值和真实值的误差计算公式 (均方差)

# 训练100次
for t in range(100):
    prediction = net(x)      # 喂给 net 训练数据 x, 输出预测值

    loss = loss_func(prediction, y)     #计算两者的误差,一定要是输出在前,标签在后 (1. nn output, 2. target)

    optimizer.zero_grad()   # 清空上一步的残余更新参数值
    loss.backward()         # 误差反向传播, 计算参数更新值
    optimizer.step()        # 将参数更新值施加到 net 的 parameters 上

plt.ion()   # 画图

训练网络之前我们需要先定义优化器和损失函数。torch.optim包中包括了各种优化器,这里我们选用最常见的SGD作为优化器。因为我们要对网络的参数进行优化,所以我们要把网络的参数net.parameters()传入优化器中,并设置学习率(一般小于1)。由于这里是回归任务,我们选择torch.nn.MSELoss()作为损失函数。由于优化器是基于梯度来优化参数的,并且梯度会保存在其中。所以在每次优化前要通过optimizer.zero_grad()把梯度置零,然后再后向传播及更新。

可视化训练过程:

for t in range(100):

    ...
    loss.backward()
    optimizer.step()
    if t % 5 == 0:
        # plot and show learning process
        plt.cla()
        plt.scatter(x.data.numpy(), y.data.numpy())
        plt.plot(x.data.numpy(), prediction.data.numpy(), 'r-', lw=5)
        plt.text(0.5, 0, 'Loss=%.4f' % loss.data[0], fontdict={'size': 20, 'color':  'red'})
        plt.pause(0.1)

plt.ioff()
plt.show()

###摘取了几个过程:

###最终结果:


参考文档:
基于pytorch的简易卷积神经网络结构搭建-卷积神经网络(CNN)浅析
卷积神经网络CNN入门[pytorch学习]

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PyTorch是一个广泛应用于深度学习的开源机器学习库,它提供了丰富的工具和接口,使得开发者可以更加便捷地构建和训练深度神经网络模型。 PyTorch入门教程可以通过以下几个步骤进行: 1. 安装PyTorch:首先需要在计算机中安装PyTorch库。可以通过官方网站或者使用包管理工具(如pip或conda)进行安装。安装完成后,可以在Python环境中导入PyTorch库。 2. 张量操作:PyTorch的核心是张量(Tensor),它是一个多维数组。学习如何创建、操作和使用张量是入门的关键。可以学习如何创建随机张量、更改张量形状、进行基本数学运算等。 3. 构建模型:在PyTorch中构建模型通常使用nn.Module类。可以学习如何定义自己的模型类,包括初始化函数、前向传播函数等。还可以学习如何添加层和激活函数,并了解常用的网络结构,如全连接层、卷积层等。 4. 训练模型:在PyTorch中训练模型通常需要定义损失函数和优化器。可以学习如何选择合适的损失函数,如交叉熵损失函数,以及常用的优化器,如随机梯度下降优化器。还可以学习如何使用训练数据批次来进行前向传播和反向传播,并进行参数更新。 5. 测试和评估:在训练完成后,需要对模型进行测试和评估。可以学习如何使用测试数据进行模型预测,并计算预测结果的准确率、精确率、召回率等指标。 虽然PyTorch入门教程只有300字,但这些步骤可以帮助初学者了解PyTorch的基本概念和操作。通过实践和深入学习,可以逐渐掌握更多高级功能和技巧,从而更好地应用PyTorch进行深度学习研究和应用开发。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值