《动手学深度学习Pytorch版》之Pytorch常用操作

未完待续。。。。。

GPU操作

二、模型保存读取操作

1、访问模块模型参数

model.parameters()

一个从参数名称隐射到参数Tesnor的字典对象

state_dict

举例1

import torch
from torch import nn

net = MLP()   #这里我省略了MLP()的定义,详见《动手学习深度学习Pytorch》对应章节
net.state_dict()

输出1

class MLP(nn.Module):...
OrderedDict([('hidden.weight',
              tensor([[-0.1291, -0.4541, -0.0159],
                      [-0.5555, -0.3319,  0.4285]])),
             ('hidden.bias', tensor([-0.3046, -0.0209])),
             ('output.weight', tensor([[-0.4204,  0.4508]])),
             ('output.bias', tensor([-0.5094]))])

举例2

optimizer = torch.optim.SGD(net.parameters(), lr=0.001, momentum=0.9)
optimizer.state_dict()

输出2

optimizer = torch.optim.SGD(net.parameters(), lr=0.001, momentum=0.9)...
{'state': {},
 'param_groups': [{'lr': 0.001,
   'momentum': 0.9,
   'dampening': 0,
   'weight_decay': 0,
   'nesterov': False,
   'params': [0, 1, 2, 3]}]}

2、保存加载模型

1)仅保存和加载模型参数(state_dict)(推荐)

保存

 torch.save(model.state_dict(), PATH) # 推荐的⽂件后缀名是pt或pth

加载

model = TheModelClass(*args, **kwargs)
model.load_state_dict(torch.load(PATH))
2)保存和加载整个模型

保存

torch.save(model, PATH)

加载

model = torch.load(PATH)

三、网络操作

1、named_children:获取一级子模块及其名字

# named_children获取一级子模块及其名字(named_modules会返回所有子模块,包括子模块的子模块)
for name, blk in net.named_children(): 
    X = blk(X)
    print(name, 'output shape: ', X.shape)

输出:

vgg_block_1 output shape:  torch.Size([1, 64, 112, 112])
vgg_block_2 output shape:  torch.Size([1, 128, 56, 56])
vgg_block_3 output shape:  torch.Size([1, 256, 28, 28])
vgg_block_4 output shape:  torch.Size([1, 512, 14, 14])
vgg_block_5 output shape:  torch.Size([1, 512, 7, 7])

2、torch.cat((p1, p2, p3, p4), dim=1) # 在通道维上连结输出

详见GoogLeNet一节。

torch.cat是将两个张量(tensor)拼接在一起,cat是concatnate的意思,即拼接,联系在一起。
使用torch.cat((A,B),dim)时,除拼接维数dim数值可不同外其余维数数值需相同,方能对齐。

C = torch.cat( (A,B),0 )  #按维数0拼接(竖着拼)

C = torch.cat( (A,B),1 )  #按维数1拼接(横着拼)

3、Global average Pooling

这个概念出自于 network in network ,主要是用来解决全连接的问题,其主要是是将最后一层的特征图进行整张图的一个均值池化,形成一个特征点,将这些特征点组成最后的特征向量进行softmax中进行计算。
参考:https://blog.csdn.net/losteng/article/details/51520555

假如,最后的一层的数据是10个66的特征图,global average pooling是将每一张特征图计算所有像素点的均值,输出一个数据值,这样10 个特征图就会输出10个数据点,将这些数据点组成一个110的向量的话,就成为一个特征向量,就可以送入到softmax的分类中计算了。
在这里插入图片描述
GAP的工作原理:
深度学习基础系列(十)| Global Average Pooling是否可以替代全连接层?
在这里插入图片描述
假设卷积层的最后输出是h × w × d 的三维特征图,具体大小为6 × 6 × 3,经过GAP转换后,变成了大小为 1 × 1 × 3 的输出值,也就是每一层 h × w 会被平均化成一个值。

net.add_module("global_avg_pool", d2l.GlobalAvgPool2d()) # GlobalAvgPool2d的输出: (Batch, 512, 1, 1)

4、Flatten layer

Convolution卷积层之后是无法直接连接Dense全连接层的,需要把Convolution层的数据压平(Flatten),然后就可以直接加Dense层了。
也就是把 (height,width,channel)的数据压缩成长度为 height × width × channel 的一维数组,然后再与 FC层连接,这之后就跟普通的神经网络无异了。
在这里插入图片描述
可以从图中看到,随着网络的深入,我们的图像(严格来说中间的那些不能叫图像了,但是为了方便,还是这样说吧)越来越小,但是channels却越来越大了。在图中的表示就是长方体面对我们的面积越来越小,但是长度却越来越长了。
举例

X = torch.rand((1, 512, 1, 1))
Flatnet = d2l.FlattenLayer()
Flatnet(X).size()

输出

torch.Size([1, 512])
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

irober

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值