PyTorch零基础入门(一)

什么是Pytorch

PyTorch是一个开源Python机器学习,基于Torch,应用于人工智能领域,如自然语言处理。 它最初由Facebook的人工智能研究团队开发,并且被用于Uber概率编程软件"Pyro"。

PyTorch主要有两大特征:

为什么选择Pytroch?

此段选自《深度学习框架PyTorch:入门与实践 》一书,作者陈云。

因为PyTorch是当前难得的简洁优雅且高效快速的框架。在笔者眼里,PyTorch达到目前深度学习框架的最高水平。当前开源的框架中,没有哪一个框架能够在灵活性、易用性、速度这三个方面有两个能同时超过PyTorch。下面是许多研究人员选择PyTorch的原因。

① 简洁:PyTorch的设计追求最少的封装,尽量避免重复造轮子。不像TensorFlow中充斥着session、graph、operation、name_scope、variable、tensor、layer等全新的概念,PyTorch的设计遵循tensor→variable(autograd)→nn.Module 三个由低到高的抽象层次,分别代表高维数组(张量)、自动求导(变量)和神经网络(层/模块),而且这三个抽象之间联系紧密,可以同时进行修改和操作。

简洁的设计带来的另外一个好处就是代码易于理解。PyTorch的源码只有TensorFlow的十分之一左右,更少的抽象、更直观的设计使得PyTorch的源码十分易于阅读。在笔者眼里,PyTorch的源码甚至比许多框架的文档更容易理解。

② 速度:PyTorch的灵活性不以速度为代价,在许多评测中,PyTorch的速度表现胜过TensorFlow和Keras等框架  。框架的运行速度和程序员的编码水平有极大关系,但同样的算法,使用PyTorch实现的那个更有可能快过用其他框架实现的。

③易用:PyTorch是所有的框架中面向对象设计的最优雅的一个。PyTorch的面向对象的接口设计来源于Torch,而Torch的接口设计以灵活易用而著称,Keras作者最初就是受Torch的启发才开发了Keras。PyTorch继承了Torch的衣钵,尤其是API的设计和模块的接口都与Torch高度一致。PyTorch的设计最符合人们的思维,它让用户尽可能地专注于实现自己的想法,即所思即所得,不需要考虑太多关于框架本身的束缚。

④活跃的社区:PyTorch提供了完整的文档,循序渐进的指南,作者亲自维护的论坛 供用户交流和求教问题。Facebook 人工智能研究院对PyTorch提供了强力支持,作为当今排名前三的深度学习研究机构,FAIR的支持足以确保PyTorch获得持续的开发更新,不至于像许多由个人开发的框架那样昙花一现。

在PyTorch推出不到一年的时间内,各类深度学习问题都有利用PyTorch实现的解决方案在GitHub上开源。同时也有许多新发表的论文采用PyTorch作为论文实现的工具,PyTorch正在受到越来越多人的追捧 。

如果说 TensorFlow的设计是“Make It Complicated”,Keras的设计是“Make It Complicated And Hide It”,那么PyTorch的设计真正做到了“Keep it Simple,Stupid”。简洁即是美。

使用TensorFlow能找到很多别人的代码,使用PyTorch能轻松实现自己的想法。

Pytroch的安装与环境配置

本文采用win10+anaconda环境安装 主要参考红色石头的博客

https://redstonewill.com/1948/

 

PyTorch基础概念

1. PyTorch张量

Tensor又名张量,也是Theano、TensorFlow、PyTorch和MxNet中重要维数组(向量)、二维数组(矩阵)和更高维的数的数据结构。关于张量的本质不乏深度的剖析,但从工程角度来讲,可简单地认为它就是一个数组,且支持高效的科学计算。它可以是一个数(标量)、一组(高阶数据)。Tensor和Numpy的ndarrays类似,但PyTorch的tensor支持GPU加速。

Tensor是PyTorch的torch包中内置数据类型,安装了PyTorch后无需再单独安装。

通用代码实现流程

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

  • 定义具有一些可学习参数(或权重)的神经网络
  • 迭代读入数据集
  • 通过网络处理输入
  • 计算损失
  • 反向传播网络参数
  • 更新网络权重: weight = weight - learning_rate*gradient

使用torch.nn来实现线性回归

# 导入必须的库
import torch
import torch.nn as nn
import numpy as np
import matplotlib.pyplot as plt

# 定义超参数
input_size = 1
output_size = 1
num_epochs = 1000
learning_rate = 0.001

# 数据
x_train = np.array([[2.3], [4.4], [3.7], [6.1], [7.3], [2.1],[5.6], [7.7], [8.7], [4.1],
                    [6.7], [6.1], [7.5], [2.1], [7.2],
                    [5.6], [5.7], [7.7], [3.1]], dtype=np.float32)
# xtrain生成矩阵数据
y_train = np.array([[3.7], [4.76], [4.], [7.1], [8.6], [3.5],[5.4], [7.6], [7.9], [5.3],
                    [7.3], [7.5], [8.5], [3.2], [8.7],
                    [6.4], [6.6], [7.9], [5.3]], dtype=np.float32)

plt.figure() 
#画图散点图
plt.scatter(x_train,y_train)
plt.xlabel('x_train')#x轴名称
plt.ylabel('y_train') #y轴名称
plt.show() #显示图片

plt.figure() 
#画图散点图
plt.scatter(x_train,y_train)
plt.xlabel('x_train')#x轴名称
plt.ylabel('y_train') #y轴名称
plt.show() #显示图片

# 损失和优化器
criterion = nn.MSELoss() # 均方误差损失
optimizer = torch.optim.SGD(model.parameters(), lr=learning_rate)

# 训练模型
for epoch in range(num_epochs):
    # 把numpy转成tensor
    inputs = torch.from_numpy(x_train)
    targets =torch.from_numpy(y_train)
    optimizer.zero_grad()  # 所有梯度置零
    outputs = model(inputs) # 前向传播
    loss = criterion(outputs, targets) # 计算loss
    loss.backward() # 后向传播
    optimizer.step() # 更新参数
    if (epoch+1) % 5 == 0:
        print ('Epoch [%d/%d], Loss: %.4f'  %(epoch+1, num_epochs, loss.item()))

# Plot the graph
model.eval() # 切换到估计模式
predicted = model(torch.from_numpy(x_train)).data.numpy()
plt.plot(x_train, y_train, 'ro')
plt.plot(x_train, predicted, label='predict')
plt.legend()
plt.show()

 

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值