一.Pytorch包介绍:
安装pytorch时,注意到还安装了一个pytorchvision的包,如下图所示,我们可以看到pytorch与pytorchvision会做不同的事情。pytorch主要是提供Numpy风格的Tensor、变量自动求导的BP算法、以及一些高级封装过的神经网络与损失函数等接口,主要来搭建神经网络。torchvision它主要是配合pytorch的独立计算机视觉数据集的一个工具库,可以对自带的数据集进行进一步处理,让神经网络运行起来更加方便、快速。
二.Pytorch内部接口介绍
Pytorch框架为搭建神经网络提供了许多高级的API接口,下面就从四个方面分别来介绍一下常用的接口功能。 Numpy形式的Tensor数据
Tensor是神经网络框架中重要的基础数据类型,可以简单理解为N维数组的容器对象,tensor之间的通过运算进行连接。
1).Torch 定义了七种 CPU tensor 类型和八种 GPU tensor 类型。默认Tensor类型为FloatTensor。
2).Numpy与Tensor数据格式之间相互转换 import torch
import numpy as np
“”“from_numpy(): 将numpy的ndarray数据格式转化为torch的LongTensor数据格式
numpy(): 将torch的LongTensor数据格式转化为numpy的ndarray数据格式”“”
np_data = np.arange(6).reshape(2, 3)
np_to_torch_data = torch.from_numpy(np_data_1) torch_to_np_data = np_to_torch_data.numpy()
# 运行之后,得到的结果如下: np_data:创建的Numpy格式数据 [[0 1 2] [3 4 5]]
np_to_torch_data: Numpy转化为Tensor格式数据: 0 1 2 3 4 5
[torch.LongTensor of size 2x3]
torch_to_np_data: Tensor转化为Numpy数据格式 [[0 1 2] [3 4 5]]
2).Tensor运算才是神经网络的重点(此处只演示常用的乘法和内积运算) import torch
import numpy as np
list_data_1 = [-2, -5, 2, 4] list_data_2 = [[1, 2], [3, 4]]
# 矩阵乘法
torch_data = torch.FloatTensor(list_data_2)
np_mm_data = np.matmul(list_data_2, list_data_2) torch_mm_data = torch.mm(torch_data, torch_data)
# dot:内积运算
np_dot_data = np.dot(list_data_2, list_data_2) # 会将乘积的每一项求和输出一维数据
torch_dot_data = torch.dot(torch_data, torch_data)
# 运行结果如下:
np_mm_data:Numpy格式数据相乘 [[ 7 10] [15 22]]
torch_mm_data:Tensor格式数据相乘 7 10 15 22
[torch.FloatTensor of size 2x2] np_dot_data:Numpy格式数据内积 [[ 7 10] [15 22]]
torch_dot_data:Tensor格式数据内积 30.0
变量Variable以及梯度
Torch里面的Variable是用来构建一个计算图,但是这张图与Tensorlow或Theano中的静态图相比是动态的。因此,Torch是没有占位符的,只能将变量传递给计算图。Variable将所有的计算步骤 (节点) 都连接起来, 最后进行误差反向传递的时候, 一次性将所有 variable 里面的修改幅度 (梯度) 都计算出来, 而 tensor 就没有这个能力。 from torch.autograd import Variable import torch
torch_tensor = torch.FloatTensor([[1, 2], [3, 4]]) # 构建Tensor
torch_var = Variable(torch_tensor, requires_grad=True) # 构建一个Variable
torch_var_out = torch.mean(torch_var * torch_var) #构建一个正向传递函数
torch_var_out.backward() # 进行反向传播
torch_grad = torch_var.grad # 初始化梯度值
torch_var_data = torch_var.data # 获取tensor类型数据
torch_var_data_to_numpy = torch_var_data.numpy() # 将Tensor格式数据转化为numpy格式数据
# 运行结果如下:
torch_tensor: Tensor数据类型 1 2 3 4
[torch.FloatTensor of size 2x2]
torch_var: Variable containing: 将Tensor数据放到Variable 1 2 3 4
[torch.FloatTensor of size 2x2]
torch_var_out: Variable containing: # 正向传递函数值 7.5000
[torch.FloatTensor of size 1]
torch_grad: Variable containing: # 获取到的初始化梯度值 0.5000 1.0000 1.5000 2.0000
[torch.FloatTensor of size 2x2]
torch_var_data: # 获取开始输入的Tensor数据 1 2 3 4
[torch.FloatTensor of size 2x2]
torch_var_data_to_numpy: # 将Tensor格式数据转化为numpy格式数据 [[1. 2.] [3. 4.]]
神经网络结构
网络层的接口都在torch.nn模块中,torch.nn.Module是所有网络的基类,一般网络都会继承它。
现在我们先让大家看一下怎么使用torch是构建一个简单的Linear神经网络,后边的教程会通过具体案例搭建不同结构的神经网络。
from torch.nn import Linear
from torch.nn import functional as F import torch
class Net(torch.nn.Module):
def __init__(self, n_feature, n_hidden, n_output): super(Net, self).__init__()
self.hidden = Linear(n_feature, n_hidden) self.predict = 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) # 定义一个linear类型的神经网络
print(net)
# 显示结果: Net (
(hidden): Linear (1 -> 10)
(predict): Linear (10 -> 1) )
torch.nn.Module中实现的都是一个特殊的类,可以去查阅,他们都是以class xxx 来定义的,会自动提取可学习的参数 ,所以一般有超参数的网络层,就需要去调用此接口里面的函数。
torch.nn.functional中的函数,更像是纯函数,由
def function()定义,只是进行简单的数学运算而已,没有超参数学习的就可以调用functional里面的函数。