pytorch官网 Tutorials > Deep Learning with PyTorch: A 60 Minute Blitz > Neural Networks部分,关于Define the network代码
1. maxpooled为什么写在forward()方法中而不是Net类构造函数里?
分析
:池化层也可以写在构造函数中。
2. 如图,输入图像转化为数据后size为32×32,其中Conv2d参数为(1, 6, kernel_size=(3, 3), stride=(1, 1)),padding 默认为0,根据计算卷积后的size应为30×30,为什么是28×28??
猜测
:此处卷积核的size应该为5*5,代码部分与示例图采用的数据不同。
3.torch.tensor.view(*shape)
方法中参数的含义,类似numpy的reshape()
view(-1, a, ...)
:官方文档解释为:the size -1 is inferred from other dimensions, -1的大小是由其他维度推断来的。可以理解为-1是未知的某个整数,根据reshape前后数据不变以及其他维度的size,计算-1所在维度的size。
t = torch.rand(4,4) # t的size为[4,4]
b = t.view(-1, 2) # 4*4/2=8 b的size为[8,2]
a = torch.ones(4,4,6) # a的size为[4,4,6]
b = a.view(-1, 3, 2) # 4*4*6=96,96/3/2=16. b 的size为[16,3,2]
c = torch.randn(8,2) # c.size() [8,2]
c = c.view(1,-1) # c.size() [1,16]
4. 创建optimizer对象
optimizer = optim.SDG(model.parameters(), lr=0.01, momentum=0.9)
创建SGD优化器对网络中的所有参数均设置0.01的学习率,0.09的动量。SGD的arguments如下图:
Optimizer也支持对每一个参数设置options(除params之外的arguments,如lr, momentum)。在这种情况下,第一个argargument为迭代器,通常是字典列表,而字典的键名就是优化器的arguments。
字典样例:期望卷积层conv1的参数学习率为1e-5,那么在迭代器中添加{'params': model.conv1.parameters(), 'lr': 1e-5}
就相当于将“关键字实参”变成键值对的形式。
optimizer = optim.SGD([
{'params': model.base.parameters()},
{'params': model.classifier.parameters(),'lr':1e-3}
],lr=1e-2, momentum=0.9)
当然,仍然可以传递关键字实参,作为没有重写options的parameters的默认值。上例中model.base层参数将使用默认的学习率1e-2,model.classifier层参数的学习率为1e-3,所有参数的动量均为0.9
注意
- torch.nn仅支持mini-batch输入,不支持单个样本的输入。所以input第一维总是batchsize
- 接收输入时,直接
output = net(input)
即可,无需output = net.forward(input)。因为在nn.module的源码__call__方法中调用了forward()方法,而net(input)
等价于net.__call__(input)
。至于__call__方法的更多作用即用法见参考1。
optimizer.step()
功能是执行一个优化步骤(比如参数更新)。因为优化方法不同,代码实现也有差异,所以在基类Optimizer中没有具体实现,由每个优化器子类(SGD,Adam,LBFGS等)重写step方法。