torch是什么?
Torch是一个科学计算框架,广泛支持将GPU放在首位的机器学习算法。
PyTorch是由facebook研究院退出的一个基于Torch的,开源的python机器学习库。
pytorch中的torch主要功能:定义多维张量(Tensor)结构及基于张量的多种数学操作。
torch.Tensor主要功能:
定义tensor类型,包含7种CPU tensor类型和8种GPU tensor类型(整型、浮点型)(8/16/32/64位)
实现基于Tensor的各种数学操作、各种类型的转换。比如相加、相乘、求绝对值等
torch.Storage主要功能:管理Tensor的存储
比如是以byte还是char类型存储在计算机中,就由这个库来管理。
以CPU类型还是GPU类型存储。一般情况以CPU类型存储,想要用cuda加速的话必须把模型和数据同时以GPU类型存储。 变量名.cuda()
torch.nn包含多种子类:
torch.nn.Parameter():Variable的子类,用于管理网络的参数,默认requires_grad=True.
torch.nn.functional:集合了损失函数,激活函数,标准化函数等函数
torch.nn.init:初始化各种参数
容器(Containers):
**torch.nn.Module:**所有网络的基类,操作者的模型也应该继承这个类。继承后自动注册该网络。
前向传播
梯度记录(用于反向传播)
**torch.nn.Sequential:**时序容器,可以更方便的搭建网络,把已有的网络层往里面放即可。
网络层:
torch.nn.Linear:全连接层
torch.nn.Conv1\2\3d:卷积层,有一维二维三维
torch.nn.XXXPool1\2\3:池化层,最大池化、平均池化等等,一维二维三维
函数包:torch.nn.functional
torch.nn.functional.(Activations):激活函数,包括ReLU、softmax等
torch.nn.functional.Nomalization:标准化(归一化)层,1d2d3d
torch.nn.functional.LossFunctions:损失函数,L1Loss、MSELoss(均方误差)、CrossEntropyLoss(交叉熵)…
搭建好的网络:
torch.nn.RNN:卷积神经网络
torch.nn.LSTM:长短期记忆人工神经网络
…
torch.autograd:
主要功能:对可求导的Variable变量进行求导。
torch.optim:
optim是什么:一个实现了各种优化算法的库。
主要功能:对需要优化的参数(必须是Variable对象)进行求导。
torch.cuda:
主要功能:实现了与CPU张量相同的功能,但使用GPU进行计算。
torch.utils:
torch.utils.data.Dataset:
主要功能:创建、保存数据集。
torch.utils.data.DataLoder:
主要功能:包含对数据集的一些操作,比如batch操作(每次取数据集中的一小批),shuffle操作(随机取样)。
torchvision
简介:包含了目前流行的数据集,模型结构和常用的图片转换工具。其实是基于pytorch中的torch实现的图像处理包。
PyTorch结构、架构介绍
提到pyTorch, 大家对它的印象肯定是在python上的一个机器学习库。大家对它的认识都是正确的,但我们在使用python导入库时,导入的却是Torch而不是pytorch,可能有一些跟我一样热爱学习的人就会想,为啥我用pytorch库,导入的却是torch呢。
其实torch本身就是一个科学计算框架,一开始并不支持python。而pytorch呢则是facebook研究院推出的一个基于Torch框架的,开源的python机器学习库。就是说成功把Torch移植到python上了,所以叫它pytorch。
按照官方手册,将pytroch分成了torch和torchvision两大块,但是torchvision其实是基于torch开发的,专门处理计算机视觉或者图像方面的库,所以我们主要还是分析torch这个包。
torch这个包就是pytorch库的主体了,它主要实现了对Tensor结构的多钟数学操作,比如切片之类的。然后这个包还包括了下面很多个包。
因为整个torch操作的大部分数据类型都是Tensor,所以torch.Tensor呢可以说是整个torch的结构基础,在这个包里定义了tensor这个数据结构,包括tensor的维度啊,tensor里面数据是整型还是浮点型啊。
下面这个Storage则是torch的存储基础,这个包管理着数据要怎么存放在硬件里面,比如是以bite的形式存储啊还是以char的形式存储,是存储在cpu中还是gpu中等等。
nn模块则是搭建网络最重要的模块。这个包下面还有很多子包,我们最后再来分析这它。
autograd,顾名思义,负责求导。
optim,顾名思义,负责优化网络参数,使得网络能够一步一步拟合所需要的函数
cuda,使用GPU加速计算的重要库
utils,没猜错的话应该是utility的简称,就是效率工具的意思,可以帮助我们更好的训练网络。它下面的Data子包包括了Dataset模块,可以让我们简单的调用数据集,Dataloader则可以让我们方便的使用数据集。
再回过头来看nn,nn这一个大模块负责搭建网络,它下面又有很多子模块。
Parameter负责管理网络中的参数,比如是否需要求导
init负责各种参数的初始化
functional则包含了很多函数,比如激活函数ReLU、sigmoid,之类的。Nomalizations则是归一化函数,LossFunctions就是均方误差、交叉熵之类的损失函数了
Containers是nn的主体,用来存放各种上面或者下面的结构的。用过pytroch的同学就知道,如果你要写一个网络模型,用类的方式来写,就得继承这个Module,相当于让你的网络类也具有容器的功能,可以往里放各种结构,比如全连接层,激活函数,卷积层之类的。sequential是更轻量化一点的容器,不过效果跟Module差不多,不细讲。
然后就是最核心的网络层了,nn里面也集成了很多常用的网络层,比如全连接层Linear,然后一二三维的卷积层、或者一二三维的池化层之类的。
nn里面也给我们直接集成了现在常用的网络模型,比如RNN、LSTM等,方便我们直接调用。
架构图
pyTorch的模块分成了4层,分别是数据存储层、网络搭建层、优化层、应用层。
数据存储层由Storage模块和Tensor模块组成,定义了torch操作的数据的存储结构和数据结构。
网络搭建层靠nn模块撑起来。如果要自己搭建网络的话,就使用Container声明一个容器,然后往里面放我们的网络层还有各种激活函数,归一化函数之类的。也可以直接使用nn里面现成的网络模型。然后可以用Parameter和init去操作这两种网络类型中的参数。
有了网络,我们还需要想想怎么让网络中的参数逼近我们想要的函数,这时候就需要用到优化层。优化层由Autograd和optim组成,功能就是优化我们的网络使它向目标网络靠近。
最后是应用层,也就是utility包里面的Dataset模块和Dataloader模块,一个负责存取数据集,一个负责调用数据集。当然这一层我们也可以用自己手动输入数据代替,不过如果是大量的数据还是把数据制作成数据集会更加方便操作一点。