@[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>