pytorch模型定义
module 类别是torch.nn 提供的模型构造类,(nn.module)所有神经网络的基类,可以继承他来定义我们想要的模型。
pytorch模型定义应包括两个部分:初始化__init__;数据流向定义forward。
.基于nn.module 我们通过sequential,moduleList,ModuleDict三个方式来定义Pytorch模型
一:基础层搭建
class Mysequential(nn.module):
from collections import OrdereDict
def __init__(self,*args):
super(Mysequential,self).init__()
if len(args)==1 and isinstance(args[0],OrderedDict):
for key, module in args[0].items():
self.add_module(key,module)
else:
for idx, module in enumerate(args):
self.add_module(str(idx),module)
def forward(self,input):
for module in self.modules.values():
input=module(input)
return input
sequential 定义模型
import torch.nn as nn
net= nn.Sequential(
nn.Linear(784,256),
nn.Relu(),
nn.Linear(256,10),
)
print(net)
输出结果为
sequential(
(0):Linear(in_features=784, out_featres=256,bias=True)
(1):ReLU()
(2):Linear(in_features=256,out_features,bias=True)
)
使用orderedDict 则需要更具体声明`
nn.Sequential(collentions.OrderedDict([
{'fc1',nn.Linear(784,256)),
('relu1',nn.Relu()),
('fc2',nn.Linear(256,10))]))
2.Modulelist
net=nn.moduleList([nn.Linear(784,256),nn.Relu()])
net.append(nn.Linear(256,10))
3:ModuleDict
net=nn.moduleDict({
'linear':nn.Linear(784,256),
'act':nn.ReLu(),
})
net['output']=nn.Linear(256,10)
*通过这种方式进行添加
print(net['Linear'])
print(net.output)
4.三种方法比较:
sequential快速验证结果。,不用写__init__ forward
ModuleList and ModuleDict 在某个完全相同的层需要重复出现多次,一行顶多行。
二:模型快速搭建复杂网络
搭建模型块,用unet为例。
Unet模型快:
每个块内部两次卷积。
左侧模型快 maxpooling
右侧模型块上采样链接 up sampling
输出层的处理。
按以上,我们分别定义四个模型块
doubleconv, down, up, outconv
以down为例
class Down(nn.Module):
def __init__(self,in__channels,out_channels):
super().__init__()
self.maxpool_conv=nn.Sequential(
nn.maxpool2d(2),
doubleconv(in_channels,out_channels))
def forward(self,x):
return self.maxpook_conv(x)
组装:
class unet(nn.module):
def __init(self,n_channels,n_classes,biliear=false):
super(Unet,self).init__()
self.n_channels=n_channels
self.n_classes=n_classes
self.biliear=biliear
self.inc=DoubleConv(n_channels,64)
self.down1(Down(64,128)
self.down2=Down(128,128)
self.down3=Down(256,512)
self.down4=
self.up1=up(1024,512//factor,bilinear)
self.up2
self.up3
self.up4
self.outc=OutConv(64,n_classes)
def foward(self,x):
x1=self.inc(x)
x2=self.down1(x1)
x3=self.down2(x2)
x=self.up1(x5,x4)
x=self.up2(x,x3)
x=
x=self.up4(x,x1)
logits=self.outc(x)
return logits
三:修改模型层
import torchvision.models as models
net=models.resnet50()
print(net)
可以自己写classifier
然后net.fc=classifier
添加外部输出和额外输出有待补充
四:模型保存
有pkl,pt,pth三种格式
模型存储内容
torch.save(model,save_dir)
torch.save(model.state_dict,save_dir)
上面保存模型,下面保存权重。
保存有.cuda和.to(device)两种保存方式。
多卡训练需要toch.nn.dataParallel
os.environ[‘’]可以确定使用GPU的编号。
分情况讨论不同单卡保存加载和多卡保存加载的情况。