[菜鸟备忘录](pytorch官网教程笔记——60分钟闪电战)

@[TOC](pytorch官网教程笔记——A 60 MINUTE BLITZ 链接)

Autograd: Automatic Differentiation

笔记1:.norm() 的用法

x = torch.randn(3, requires_grad=True)
print(x)

y = x * 2
while y.data.norm() < 1000:
    y = y * 2

print(y)

y.data是指的tensor y的数据,.norm()是方法(method)。查找torch的原文档发现该方法有对应的函数,torch文档
函数定义如下:torch.norm(input, p=‘fro’, dim=None, keepdim=False, out=None, dtype=None)
p参数指的是计算哪一种类型的矩阵范数,p默认代表的是弗罗贝尼乌斯范数(Frobenius norm),计算公式如下:
在这里插入图片描述

笔记2:with torch.no_grad():

代码与结果如下

x = torch.randn(3, requires_grad=True)
print(x)
print(x.requires_grad)    # true
print((x ** 2).requires_grad)    # true

with torch.no_grad():
    print((x ** 2).requires_grad)     # flase
    y = x**2
    v = torch.tensor([0.1, 1.0, 0.0001], dtype=torch.float)
    print(y.requires_grad, '\n', y.grad_fn)      # False   None
    y.backward(v)
    print(x.grad)

程序在y.backward()处报错,RuntimeError: element 0 of tensors does not require grad and does not have a grad_fn。可以看到y不需要计算梯度,且y的grad_fn属性为空。
这个方法可以用来对requires_grad=True的tensor,做一些不希望计算梯度的计算。

NEURAL NETWORKS

笔记1:super()

super(子类,实例).方法

参考资料:用子类对象调用父类已被覆盖的方法
在初始化时,如果重写了__init__ 时,实例化子类,就不会调用父类已经定义的 init,如果重写了__init__ 时,要继承父类的构造方法,可以使用 super 关键字:

super(子类,self).__init__(参数1,参数2,....)

还有一种经典写法:

父类名称.__init__(self,参数1,参数2,...)

笔记2:nn.Conv2d()

参考链接:nn.Conv2d()
CLASS torch.nn.Conv2d(in_channels, out_channels, kernel_size, stride=1, padding=0, dilation=1, groups=1, bias=True, padding_mode=‘zeros’)
参数:stride:步幅; padding:填充; dilation:扩张; bias:偏差;
动态演示链接
卷积层输入输出:输入尺寸:(N,Cin,W,H),输出尺寸(N,Cout,W,H)
在这里插入图片描述
卷积核计算公式:
在这里插入图片描述
代码示例:

# With square kernels and equal stride
m = nn.Conv2d(16, 33, 3, stride=2)
# non-square kernels and unequal stride and with padding
m = nn.Conv2d(16, 33, (3, 5), stride=(2, 1), padding=(4, 2))
# non-square kernels and unequal stride and with padding and dilation
m = nn.Conv2d(16, 33, (3, 5), stride=(2, 1), padding=(4, 2), dilation=(3, 1))
input = torch.randn(20, 16, 50, 100)
output = m(input)

疑惑1:net = Net() print(net)

class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        ......

net = Net()
print(net)

结果:Net(
  (conv1): Conv2d(1, 6, kernel_size=(3, 3), stride=(1, 1))
.......
)

为什么print(net)能够打印出网络结构,是因为父类nn.moudle有什么特殊的定义吗?如果我想自己定义的类能够有类似的操作怎么办?

笔记3:max_pool2d()

print(out.size())
out = F.max_pool2d(out, 2)
print(out.size())

结果:torch.Size([1, 16, 13, 13])
torch.Size([1, 16, 6, 6])
可以看到图像尺寸经过最大池化层后,会向下舍弃掉多余的尺寸。

笔记4:

torch.nn only supports mini-batches. The entire torch.nn package only supports inputs that are a mini-batch of samples, and not a single sample.
For example, nn.Conv2d will take in a 4D Tensor of nSamples x nChannels x Height x Width.
If you have a single sample, just use input.unsqueeze(0) to add a fake batch dimension.
一定要注意维度,torch.nn使用的都是4个维度。

笔记5:检查网络结构和训练参数

查看网络结构

net = Net()
print(net)

查看训练参数——net.parameters()

params = list(net.parameters())
print(len(params))
print(params[0].size())

查看网络计算图:.grad_fn 和 .next_functions

loss.grad_fn.next_functions[0][0].next_functions[0][0]..........

教程的网络结构如下:
input -> conv2d -> relu -> maxpool2d -> conv2d -> relu -> maxpool2d
-> view -> linear -> relu -> linear -> relu -> linear
-> MSELoss
-> loss
相应计算图如下:
<MseLossBackward object at 0x000001F219853588>
((<AddmmBackward object at 0x000001F217BFFCF8>, 0),)
<AddmmBackward object at 0x000001F217BFFCF8>
((<AccumulateGrad object at 0x000001F218C73B38>, 0), (<ReluBackward0 object at 0x000001F21902BD30>, 0), (<TBackward object at 0x000001F21902BE48>, 0))
<ReluBackward0 object at 0x000001F21902BD30>
((<AddmmBackward object at 0x000001F217BFFCF8>, 0),)
<AddmmBackward object at 0x000001F217BFFCF8>
((<AccumulateGrad object at 0x000001F21902BD30>, 0), (<ReluBackward0 object at 0x000001F21902BE48>, 0), (<TBackward object at 0x000001F219853588>, 0))
<ReluBackward0 object at 0x000001F21902BE48>
((<AddmmBackward object at 0x000001F217BFFCF8>, 0),)
<AddmmBackward object at 0x000001F217BFFCF8>
((<AccumulateGrad object at 0x000001F21902BE48>, 0), (<ViewBackward object at 0x000001F218C73B38>, 0), (<TBackward object at 0x000001F219853588>, 0))
<ViewBackward object at 0x000001F218C73B38>
((<MaxPool2DWithIndicesBackward object at 0x000001F217BFFCF8>, 0),)
<MaxPool2DWithIndicesBackward object at 0x000001F217BFFCF8>
((<ReluBackward0 object at 0x000001F218C73B38>, 0),)
<ReluBackward0 object at 0x000001F218C73B38>
((<ThnnConv2DBackward object at 0x000001F217BFFCF8>, 0),)
<ThnnConv2DBackward object at 0x000001F217BFFCF8>
((<MaxPool2DWithIndicesBackward object at 0x000001F218C73B38>, 0), (<AccumulateGrad object at 0x000001F219446278>, 0), (<AccumulateGrad object at 0x000001F21902BE48>, 0))
<MaxPool2DWithIndicesBackward object at 0x000001F218C73B38>
((<ReluBackward0 object at 0x000001F217BFFCF8>, 0),)
<ReluBackward0 object at 0x000001F217BFFCF8>
((<ThnnConv2DBackward object at 0x000001F218C73B38>, 0),)
<ThnnConv2DBackward object at 0x000001F218C73B38>

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值