Datawhale——PyTorch基础(一)

PyTorch的基本概念

任务

  1. 什么是Pytorch,为什么选择Pytroch?
  2. Pytroch的安装
  3. 配置Python环境
  4. 准备Python管理器
  5. 通过命令行安装PyTorch
  6. PyTorch基础概念
  7. 通用代码实现流程(实现一个深度学习的代码流程)

参考资料

新手必备 | 史上最全的PyTorch学习资源汇总

快速上手笔记,PyTorch模型训练实用教程(附代码)

PyTorch学习笔记

《深度学习框架PyTorch:入门与实践》的对应代码

PyTorch 中文文档

作业

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

  • 深度学习框架
    深度学习框架的出现降低了入门的门槛,你不需要从复杂的神经网络开始编代码,你可以根据需要选择已有的模型,通过训练得到模型参数,你也可以在已有模型的基础上增加自己的layer,或者是在顶端选择自己需要的分类器和优化算法(比如常用的梯度下降法)。当然也正因如此,没有什么框架是完美的,就像一套积木里可能没有你需要的那一种积木,所以不同的框架适用的领域不完全一致。 总的来说深度学习框架提供了一些列的深度学习的组件(对于通用的算法,里面会有实现),当需要使用新的算法的时候就需要用户自己去定义,然后调用深度学习框架的函数接口使用用户自定义的新算法。
  • Torch
    Torch是一个有大量机器学习算法支持的科学计算框架,其诞生已有十年之久,但是真正起势得益于Facebook开源了大量Torch的深度学习模块和扩展。Torch的特点在于特别灵活,但是另一个特殊之处是采用了编程语言Lua,在深度学习大部分以Python为编程语言的大环境之下,一个以Lua为编程语言的框架有着更多的劣势,这一项小众的语言增加了学习使用Torch这个框架的成本。
  • PyTorch
    PyTorch的前身便是Torch,其底层和Torch框架一样,但是使用Python重新写了很多内容,不仅更加灵活,支持动态图,而且提供了Python接口。它是由Torch7团队开发,是一个以Python优先的深度学习框架,不仅能够实现强大的GPU加速,同时还支持动态神经网络,这是很多主流深度学习框架比如Tensorflow等都不支持的。
    PyTorch既可以看作加入了GPU支持的numpy,同时也可以看成一个拥有自动求导功能的强大的深度神经网络。除了Facebook外,它已经被Twitter、CMU和Salesforce等机构采用。
  • 为何要使用PyTorch
    1)掌握一个框架并不能一劳永逸,现在深度学习并没有谁拥有绝对的垄断地位,就算是Google 也没有,所以只学习Tensorflow 并不够。同时现在的研究者使用各个框架的都有,如果你要去看他们实现的代码,至少也需要了解他们使用的框架,所以多学一个框架,以备不时之需。

(2)Tensorflow 与Caffe 都是命令式的编程语言,而且是静态的,首先必须构建一个神经网络,然后一次又一次使用同样的结构,如果想要改变网络的结构,就必须从头开始。但是对于PyTorch,通过一种反向自动求导的技术,可以让你零延迟地任意改变神经网络的行为,尽管这项技术不是PyTorch 独有,但目前为止它实现是最快的,能够为你任何疯狂想法的实现获得最高的速度和最佳的灵活性,这也是PyTorch 对比Tensorflow 最大的优势。

(3)PyTorch 的设计思路是线性、直观且易于使用的,当你执行一行代码时,它会忠实地执行,并没有异步的世界观,所以当你的代码出现Bug 的时候,可以通过这些信息轻松快捷地找到出错的代码,不会让你在Debug 的时候因为错误的指向或者异步和不透明的引擎浪费太多的时间。

(4)PyTorch 的代码相对于Tensorflow 而言,更加简洁直观,同时对于Tensorflow高度工业化的很难看懂的底层代码,PyTorch 的源代码就要友好得多,更容易看懂。深入API,理解PyTorch 底层肯定是一件令人高兴的事。一个底层架构能够看懂的框架,你对其的理解会更深。

最后,我们简要总结一下PyTorch 的特点:

  • 支持GPU;
  • 动态神经网络;
  • Python 优先;
  • 命令式体验;
  • 轻松扩展。

拥有着如此多优点的PyTorch 也有着它的缺点,首先PyTorch 于2017 年3 月开源发布,目前还是beta 测试版,没有发布正式版本,所以可能有一些小的Bug;其次因为这款框架比较新,所以使用的人也就比较少,这也就使得它的社区没有那么强大,但是PyTorch 提供了一个官方的论坛,大多数碰到的问题都可以去里面搜索,里面的答案一般都是由作者或者其他PyTorch 使用者提供的,论坛的更新也特别频繁,同时也可以去Github 上面提Issue,一般很快就会得到开发者的回应,也算是一定程度上解决了社区的问题。

配置Python环境

  • Anacond下载
    Anaconda 官网下载地址:https://www.continuum.io/downloads

  • 安装 Anaconda(安装之前记得卸载之前电脑里的python)
    安装较为简单,基本都是下一步,为了避免不必要的麻烦,最后默认安装路径,具体安装过程为:
    双击安装文件
    Datawhale——PyTorch基础(一)_第1张图片
    两个默认就好,第一个是加入环境变量,第二个是默认使用Python 3.5。
    安装完成后可以点击系统左下角的 Windows 图标找到 Anaconda3 文件夹,查看所包含的内容。
    Datawhale——PyTorch基础(一)_第2张图片

  • 验证conda已被安装

    conda --version	
    
  • 更新conda至最新版本

    conda update conda
    
  • 管理环境
    创建新环境

    conda create --name PyTorch python=3.5
    

    显示已创建环境

    conda info --envs
    

    复制环境

    conda create --name  --clone 
    

    删除环境

    conda remove --name  --all
    
  • 管理包

    获取当前环境中已安装的包信息

    conda list
    

    安装包

    conda install 
    

通过命令行安装PyTorch

	```
	pip install torchvision
	# cpu版本
	conda install pytorch-cpu torchvision-cpu -c pytorch
	# GPU版 
	conda install pytorch torchvision cudatoolkit=10.0 -c pytorch
	# cudatoolkit后跟着相应的cuda版本
	# 目前测试 8.0、9.0、9.1、9.2、10.0都可安装成功
	```

PyTorch基础操作

Tensor基础

通用代码实现流程(实现一个深度学习的代码流程)

  • 定义CNN网络
import torch
import torch.nn as nn
import torch.nn.functional as F


'''
CNN计算

(H - k +2 * P) / S + 1
(W - k +2 * P) / S + 1

LetNet-5 
input: 32*32*3

out_conv1 = (32-5)+1 = 28 
max_pool1 = 28 / 2 = 14
out_conv2 = (14 - 5) + 1 = 10
max_pool2 = 10 / 2 = 5
'''

'''

定义一个神经网络

https://pytorch.org/tutorials/beginner/blitz/neural_networks_tutorial.html#sphx-glr-beginner-blitz-neural-networks-tutorial-py
'''


class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        #  conv1层,输入的灰度图,所以 in_channels=1, out_channels=6 说明使用了6个滤波器/卷积核,
        # kernel_size=5卷积核大小5x5
        self.conv1 = nn.Conv2d(in_channels=1, out_channels=6, kernel_size=5)
        # conv2层, 输入通道in_channels 要等于上一层的 out_channels
        self.conv2 = nn.Conv2d(in_channels=6, out_channels=16, kernel_size=5)
        # an affine operarion: y = Wx + b
        # 全连接层fc1,因为32x32图像输入到fc1层时候,feature map为: 5x5x16
        # 因此,全连接层的输入特征维度为16*5*5,  因为上一层conv2的out_channels=16
        # out_features=84,输出维度为84,代表该层为84个神经元
        self.fc1 = nn.Linear(16*5*5, 120)
        self.fc2 = nn.Linear(in_features=120, out_features=84)
        self.fc3 = nn.Linear(in_features=84, out_features=10)

    def forward(self, x):
        # Max pooling over a (2, 2) window
        x = F.max_pool2d(F.relu(self.conv1(x)), (2, 2))
        # If the size is a square you can only specify a single number
        x = F.max_pool2d(F.relu(self.conv2(x)), 2)
        # 特征图转换为一个1维的向量
        x = x.view(-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:]     # all dimensions except the batch dimension
        num_features = 1
        for s in size:
            num_features *= s
        return num_features


net = Net()
print(net)

你可能感兴趣的:(深度学习)