本篇内容介绍了“Pytorch多种模型构造方法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
之前的样例主要采用Sequential来进行,这里做一个全面和充分的小结,以前只是单纯的叠网络,看完这章节才知道原来可以用的手法这么多;
对于基础的网络搭建,主要用到的是Module类,Sequential类为主;
其中Module可以算是基类,而派生类为Sequential、ModuleList、ModuleDict类,各自有各自的特点;
Sequential类主要继承自Module类,是最简单的网络逐层累加方式;
例如最简单的叠加方式:
net=nn.Sequential( nn.Linear(784,256), nn.ReLU(), nn.Linear(256,10) )
使用这种方法的特点是:
1.简单,但是不能由较高灵活的定制化;
2.不用自定义forward前向传播函数,层与层之间的参数尺寸必须要匹配;
如下所示:
net=nn.ModuleList([nn.Linear(784,256),nn.ReLU()]) net.append(nn.Linear(256,10))
这种也和Sequential类似,进行列表化构造网络;
但是需要注意的是,需要定义Forward函数,只有Sequential类不需要自定义Forward函数;
ModuleDict类似于Sequential类的定义方式,并且可以通过字典方式进行索引查找;
net=nn.ModuleDict({ 'linear':nn.Linear(784,256), 'act':nn.ReLU() }) net['output']=nn.Linear(256,10)
但是和ModuleList类似,需要重新定义forward前向传播函数;
例如:
class FancyMLP(nn.Module): def __init__(self, **kwargs): super(FancyMLP, self).__init__(**kwargs) self.rand_weight = torch.rand((20, 20), requires_grad=False) # 不可训练参数(常数参数) self.linear = nn.Linear(20, 20) def forward(self, x): x = self.linear(x) # 使用创建的常数参数,以及nn.functional中的relu函数和mm函数 x = nn.functional.relu(torch.mm(x, self.rand_weight.data) + 1) # 复用全连接层。等价于两个全连接层共享参数 x = self.linear(x) # 控制流,这里我们需要调用item函数来返回标量进行比较 while x.norm().item() > 1: x /= 2 if x.norm().item() < 0.8: x *= 10 return x.sum()
这里值得注意的是,尽管只有一个Linear层,但是对于forward有了更多的操作空间;
forward函数相当于过了两个linear层,之后对其中的数据进行了处理;
所以对于Module可以有更多的操作空间,例如使用上述网络进行复杂网络定制;
例如,可以采用如下方法,进行多层Module嵌套,并且定义各自的forward函数;
class SelfMLP(nn.Module): def __init__(self,**kwargs): super(SelfMLP, self).__init__(**kwargs) self.ran_weight=torch.rand((20,20),requires_grad=False) self.linear=nn.Linear(20,20) def forward(self,x): x=self.linear(x) x=nn.functional.relu(torch.mm(x)) class NestMLP(nn.Module): def __init__(self,**kwargs): super(NestMLP, self).__init__(**kwargs) self.net=nn.Sequential(nn.Linear(40,30),nn.ReLU()) def forward(self,x): return self.net(x) net=nn.Sequential(NestMLP(),nn.Linear(30,20),SelfMLP())
“Pytorch多种模型构造方法”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注亿速云网站,小编将为大家输出更多高质量的实用文章!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。