Pytorch API备忘

本文档详细记录了PyTorch的基础知识,包括Tensor、Variable、运算、数据集、nn.Module、优化器的使用,以及卷积和循环神经网络模块的实践。介绍了如何创建和操作Tensor,使用Variable进行计算,定义数据集和模型结构,应用优化算法,以及模型的保存与加载。此外,还涵盖了卷积层、池化层和RNN的标准实现,以及参数提取与自定义初始化的方法。
摘要由CSDN通过智能技术生成

之前一直用tensorflow和keras,最近在看一些CV领域的paper,发现相关的开源代码很多是pytorch实现的,于是打算学下pytorch。
以下主要根据《深度学习入门之Pytorch》这本书对一些常用API进行记录。

Pytorch基础

Tensor张量

名称类型
torch.FloatTensor(默认类型)32位浮点
torch.DoubleTensor64位浮点
torch.ShortTensor16位整型
torch.IntTensor32位整型
torch.LongTensor64位整型
a = torch.Tensor([[1,2],[3,4]])

创建全是0的空Tensor,01均匀分布或以正态分布作为初始值的Tensor

c = torch.zeros((3,2))
t = torch.rand((3,2))#0-1均匀分布
d = torch.randn((3,2))#正态分布
r = torch.range(1,10)#生成区间浮点数

像numpy一样通过索引的方式取得其中的元素,或改变其中的值

a[0,1]=100

Tensor与numpy.ndarray之间相互转换

numpy_b = b.numpy()
e = np.array([[2,3],[4,5]])
torch_e = torch.from_numpy(e)
f_torch_e = torch_e.float()

使用GPU进行加速

if torch.cuda.is_available():
    a_cuda = a.cuda()

Variable变量

Variable在torch.autograd.Variable中,通过调用Variable(a)可以将一个tensor a变成Variable。
构建时需要传递一个参数requires_grad=True,这个参数表示是否对这个变量求梯度,默认的是 False。
Variable中包括三个重要属性,data,grad,grad_fn

属性含义
dataVariable里面的tensor的值
gradVariable反向传播梯度
grad_fn得到这个Variable的操作

Tensor运算

操作功能
torch.abs绝对值
torch.add
torch.clamp裁剪
torch.div
torch.mul逐元素求积
torch.pow
torch.mm矩阵乘法
torch.mv矩阵向量乘法

Dataset数据集

通过torch.utils.data.DataLoader定义迭代器,collate_fn是表示如何取样本的,可以定义自己的函数来准确地实现想要的功能,默认的函数在一般情况下都是可以使用的。

dataiter = DataLoader(myDataset,batch_size=32,shuffle=True,collate_fn=default_collate)

torchvision中还有一个更高级的关于CV的数据读取类ImageFolder,主要功能是处理图片,且要求图片形式如下:

root/dog/xxx.png
root/dog/xxy.png
root/dog/xxz/png
...
root/cat/123.png
dset = ImageFolder(root='root_path',transform=None,loader=default_loader)

其中root是根目录,目录下每个文件夹表示一个类别,transformtarget_transform是图片增强,loader是图片读取的办法。

nn.Module模组

pytorch中所有的层结构和损失函数都来自于torch.nn,所有的模型构建都从这个基类nn.Module继承来的,模板如下

class net_name(nn.Module):
    def __init__(self,other_arguments):
        super(net_name,self).__init__()
        self.conv1 = nn.Conv2d(in_channels,out_channels,kernel_size)
        # other network layer
    def forward(self,x):
        x = self.conv1(x)
        return x
criterion = nn.CrossEntropyLoss()
loss = criterion(output,target)

torch.optim 优化

optimizer = torch.optim.SGD(model.parameters(),lr=0.01,momentum=0.9)

在优化之前需先将梯度归零,即optimizer.zeros(),然后通过loss.backward()反向传播,自动求导得到每个参数的梯度,最后调用optimizer.step()就可以通过梯度做一步参数更新。

模型的保存和加载

使用torch.save来保存模型的结构和参数,有两种保存方式

  1. 保存整个模型的结构信息和参数信息,保存的对象是模型model
  2. 保存模型的参数,保存的对象是模型的状态model.state_dict()

    torch.save(model,'./model.pth')
    torch.save(model.state_dict(),'./model_state.pth')

加载模型有两种方式对应于保存模型的方式:

  1. 加载完整的模型结构和参数使用

    load_model = torch.load('model.pth')

    ,在网络较大的时候加载的时间比较长,同时还存储空间也比较大

  2. 加载模型参数信息,需要先导入模型的结构,然后通过
model.load_state_dic(torch.load('model_staet.pth'))

导入

Pytorch卷积模块

  1. 卷积层

    nn.Conv2d()是卷积模块,里面常用的参数有5个

    参数名说明
    in_channels输入数据的深度
    out_channels输出数据的深度
    kernel_size卷积核大小
    stride滑动的步长
    padding0不填充,1进行1个像素点的0填充
    bias默认bias=True
    groups输出数据深度和输入数据深度上的联系,默认groups=1,表示所有输出和输入是关联的。groups=2,表示输入的深度被分割成两份,输出的深度也被分割成两份,它们之间分别对应起来,要求输出和输入都必须能被groups整除
    dilation表示卷积堆输入数据体的空间间隔,默认=1(没太明白
  2. 池化层
    nn.MaxPool2d()表示最大值池化,其中的参数有kernel_size,stride,padding,dilation,return_indices,ceil_mode

    参数名含义
    return_indices是否返回最大值所处的下标,默认return_indices=False
    ceil_mode表示使用一些方格代替层结构,默认为False

nn.AvgPool2d()均值池化,多一个参数count_include_pad表示计算均值时候是否包含零填充,默认为True
其他池化层如nn.LPPool2dnn.AdaptiveMaxPool2d()等。

提取层结构

nn.Module有几个重要属性。
children(),这个会返回下一级模块的迭代器,不会返回它们内部的东西。
modules()会返回模型中所有模块的迭代器,能够访问到最内层。
named_children()named_modules()不仅返回模块的迭代器,还会返回网络层的名字。

提取参数及自定义初始化

nn.Module里面有两个特别重要的关于参数的属性,分别是named_parameters()parameters()named_parameters()给出网络层的名字和参数的迭代器,parameters()会给出一个网络的全部参数的迭代器。

for parm in model.named_parameters():
    print(param[0])

权重是一个Variable,去除其中的data属性,对它进行所需要的处理就可以

for m in model.modules():
    if isinstance(m,nn.Conv2d):
        init.normal(m.weight.data)
        init.xavier_noraml(m.weight.data)
        init.kaiming_normal(m.weight.data)
        m.bias.data.fill_(0)
    elif isinstance(m,nn.Linear):
        m.weight.data.normal_()

Pytorch循环神经网络模块

标准RNN

nn.RNN()

参数名说明
input_size输入 xt x t 的特征维度
hidden_size输出 ht h t 的特征维度
num_layers网络层数,默认1层
nonlinearity非线性激活函数,默认tanh,可选relu
bias默认bias=True
batch_first默认(seq,batch,feature),可选(batch,seq,feature)
dropout在除了最后一层之外的其他输出层加上dropout
bidirectional默认False

网络接收一个序列输入 xt x t 和记忆输入 h0 h 0 xt x t 的维度是 (seq,batch,feature) ( s e q , b a t c h , f e a t u r e ) h0 h 0 的维度是 (layersdirection,batch,hidden) ( l a y e r s ∗ d i r e c t i o n , b a t c h , h i d d e n )
网络输出 output o u t p u t hn h n output o u t p u t 维度是 (seq,batch,hiddendirection) ( s e q , b a t c h , h i d d e n ∗ d i r e c t i o n ) , hn h n 表示记忆单元,维度是 (layerdirection,batch,hidden) ( l a y e r ∗ d i r e c t i o n , b a t c h , h i d d e n )

Embedding词嵌入

通过nn.Embedding(m,n)实现,m表示所有的单词数目,n表示词嵌入的维度

word_to_idx = {'hello':0,'world':1}
embeds = nn.Embedding(2,5)
hello_idx = torch.LongTensor([word_to_ix['hello']])
hello_idx = Variable(hello_idx)
hello_embed = embeds(hello_idx)
print(hello_embed)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值