Pytorch卷积模块

Pytorch作为一个深度学习库,卷积神经网络中所有的层结构都可以通过nn调用。
####巻积层
nn.Conv2d()就是Pytorch中的卷积模块,里面常用的参数有5个,分别是in_channels, outchannels, kernel_size, stride, padding,除此以外还有参数dilation, groups, bias.

  • in_channels和out_channels是输入和输出数据体的深度
  • kernel_sizez是滤波器的大小,可以使用一个数字表示方形,或者用两个数字分别表示高和宽.
  • stride表示滑动的步长
  • padding=0表示四周不进行0填充,=1表示进行1个像素点的填充
  • bias是一个布尔值,默认bias=True,表示使用偏置;
  • groups表示输出数据体深度上和输入数据体深度上的联系,默认=1,也就是所有的输出和输入都是相关联的,如果=2,这表示输入的深度被分割成两份,输出的深度也被分割成两份,他们之间分别对应,所以要求输出和输入都必须被groups整除
  • dilation表示卷积对于输入数据体的空间间隔,默认为1

####池化层
nn.MaxPool2d()表示网络中的最大值池化,其中的参数有kernel_size, stride, padding , return_indices, ceil_mode

  • kernel_size,stride,padding,dilation和巻积层中的参数含义相同
  • return_indices表示是否返回最大值所处的下标,默认return_indices=False
  • ceil_mode表示使用一些方格代替层结构,默认ceil_mode=False
  • nn.AvgPool2d()表示使用均值池化,里边参数大致相同,但是多一个count_include_pad,这个参数表示在计算均值的时候是否包含零填充,默认是True
~python
class SimpleCNN(nn.Module):
    def __init__(self):
        super(SimpleCNN,self).__init__()  #b,3,32,32
        layer1 = nn.Sequential()
        layer1.add_module('conv1',nn.Conv2d(3,32,3,1,padding=1))#b,32,32,32
        layer1.add_module('relu1',nn.ReLU(Ture))
        layer1.add_module('pool1',nn.MaxPool2d(2,2)) #b,32,16,16
        self.layer1 = layer1
        
        layer2 = nn.Sequential()
        layer2.add_module('conv2',nn.Conv2d(32,64,3,1,padding=1))#b,64,16,16
        layer2.add_module('relu2',nn.ReLU(Ture))
        layer2.add_module('pool2',nn.MaxPool2d(2,2)) #b,64,8,8
        self.layer2=layer2
        
        layer3 = nn.Sequential()
        layer3.add_module('conv3',nn.Conv2d(64,128,3,1,padding=1))#b,128,8,8
        layer1.add_module('relu1',nn.ReLU(Ture))
        layer1.add_module('pool1',nn.MaxPool2d(2,2)) #b,128,4,4
        self.layer3 = layer3

        layer4=nn.Sequential()
        layer4.add_module('fc1',nn.Linear(2048,512))
        layer4.add_module('fc_relu1',nn.ReLU(True))
        layer4.add_module('fc2',nn.Linear(512,64))
        layer4.add_module('fc_relu2',nn.ReLU(True))
        layer4.add_module('fc3',nn.Linear(64,10))
        self.layer4 = layer4
    def forward(self,x):
        conv1 = self.layer1(x)
        conv2 = self.layer2(conv1)
        conv3 = self.layer3(conv2)
        fc_input = conv3.view(conv3.size(0),-1)
        fc_out = self.layer4(fc_input)
        return fc_out
    model = SimpleCNN()

作者强烈建议在建立巻积层和池化层时通过参数计算一下输出的数据体大小,然后在代码旁边写出注释,这样在定义复杂网络的时候不会出事
同时在return处添加中间层的输出结果,可以方便的得到网络的中间层输出
使用print(model)显示网络中定义了那些结构
Pytorch卷积模块_第1张图片

####如何提取层结构
nn.Module几个重要属性

  • children(),返回下一级模块的迭代器,不会返回内部的东西
  • modules(),返回所有模块的迭代器,能够访问到最内层
  • names_children()和names_modules()不仅会返回迭代器还会返回网络层的名字

提取前两层:

new_model=nn.Sequential(*liat(model.children())[:2])

Pytorch卷积模块_第2张图片
提取模型中所有的巻积层:

for layer in model.named_modules():
    if isinstance(layer[1],nn.Conv2d):
        conv_moedl.add_module(layer[0],layer[1])

####如何提取参数及自定义初始化
nn.Module中有两个特别重要的关于参数的属性,分别是named_parameters()和parameters().named_parameters()是给出网络层的名字和参数的迭代器,parameters()会给出一个网络的全部参数的迭代器

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

去除data属性进行处理

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

以上操作对权重进行了初始化,这样可以任意使用新的初始化,甚至可以定义初始化方法并对权重进行初始化。

你可能感兴趣的:(读书笔记,论文集推荐)