目录
Pytorch入门笔记
PyTorch是一个开源的Python机器学习库,基于Torch,用于自然语言处理等应用程序.
PyTorch既可以看作加入了GPU支持的numpy,同时也可以看成一个拥有自动求导功能的强大的深度神经网络。除了Facebook外,它已经被Twitter、CMU和Salesforce等机构采用.
张量——数据在神经网络中的表示方式
通过python list和numpy array都可以创建
torch.tensor( [1.,-1],[1.,-1].requires grad = True)
tensor([1.0000, -1.0000], [1.0000, -1.0000])
torch.tensor(np.array([[1,2,3],[4,5,6]])
tensor([1,2,3], [4,5,6])
vector = tensor([2.,3.,4.,5.]
vector[3].item()
通过取值
vector = tensor([2.,3.,4.,5.])
Data = vector.data
Data = vector,detach()
Data = vector[3].item()
基本运算(或算子)
torch.add(input, other)
,或+,如:torch.add(a,b)
类似的减法,乘法,除法
矩阵乘法(常规): torch.mm(input,mat2)
数据加载
Data 抽象类
为方便Loader读取,需要数据包装为Dataset类。自定义的Dataset需要继承它并且实现两个成员方法:
def_len_(self)
:告诉Loader总共有多少数据def_getitem_(self,idx)
:告诉idx把对应的那条数据读出来并转换为tensor。当然,你还可以在变为tensor前对图像做一些预处理
Dataloader
对Dataset进行读取操作,常用参数有:batch_size(每个batch大小)、shuffle(是否进行shuffle操作)、num_workers(加载数据的时候使用几个子进程)
dataloader = torch.utils.data.Dataloader(dataset, batch_size = 10, shuffle = True, num_workers = 0)
图像分类网络的实现
网络矩阵的运算过程:
[, 900] x [900, 1500] → [, 1500]
[, 1500] x [1500, 100] → [, 100]
[, 100] x [100, 1] → [, 1]
模型优化
import torch.optim
常见:LBFGS, RMSprop,Rprop, SGD, Adamax, Adam
如:optimizer = torch.optim.SGD(net.parameters(), lr=0.01)
更新参数
-
清楚梯度(torch会缓存parameter的导数):
optimizer.zero_grad()
module.zero_grad()
-
求导:
loss.backward()
-
更新参数:
optimizer.step()
整个训练过程:
加载数据——>构建网络——>构建优化器——>更新参数
Module——模块化的神经网络
讲网络的计算过程封装在一个类中,属于pytorch containers中的一种
在定义网络的时候,需要继承nn.module
类,并重新实现构造函数_init_
和forward()
这两个方法
class Linear(nn.Module):
def _init_(self):
super(Linear. self)._init_()
pass
def forward(self,x):
pass
torch.nn.functional
定义更复杂的一些计算过程,但此过程不引入新的参数
torch.nn.functional:
Convolution functions
Pooling functions
Non-linear activation functions
Normalization functions
Linear functions
Dropout functions
Sparse functions
Distance functions
Loss functions
Vision functions
DataParallel functions (multi-GPU, distributed)
神经网络构架
module堆叠来构建网络
class Linear(nn.Module):
def _init_(self):
super(Linear.self)._init_()
self.fc1 = nn.Linear(900, 1500)
self.fc2 = nn.Linear(1500, 100)
self.fc3 = nn.Linear(100,1)
def forward(self,x):
out = self.fc1(x)
out = self.relu(out)
out = batch_norm(out, runing_mean = 0, running_var = 1)
...