Pytorch作为一个深度学习库,卷积神经网络中所有的层结构都可以通过nn调用。
####巻积层
nn.Conv2d()就是Pytorch中的卷积模块,里面常用的参数有5个,分别是in_channels, outchannels, kernel_size, stride, padding,除此以外还有参数dilation, groups, bias.
####池化层
nn.MaxPool2d()表示网络中的最大值池化,其中的参数有kernel_size, stride, padding , return_indices, ceil_mode
~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)显示网络中定义了那些结构
####如何提取层结构
nn.Module几个重要属性
提取前两层:
new_model=nn.Sequential(*liat(model.children())[: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_()
以上操作对权重进行了初始化,这样可以任意使用新的初始化,甚至可以定义初始化方法并对权重进行初始化。