温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Pytorch多种模型构造方法

发布时间:2021-07-10 14:51:29 来源:亿速云 阅读:194 作者:chen 栏目:大数据

本篇内容介绍了“Pytorch多种模型构造方法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

之前的样例主要采用Sequential来进行,这里做一个全面和充分的小结,以前只是单纯的叠网络,看完这章节才知道原来可以用的手法这么多;

对于基础的网络搭建,主要用到的是Module类,Sequential类为主;

其中Module可以算是基类,而派生类为Sequential、ModuleList、ModuleDict类,各自有各自的特点;

Sequential类:

Sequential类主要继承自Module类,是最简单的网络逐层累加方式;

例如最简单的叠加方式:

net=nn.Sequential(
    nn.Linear(784,256),
    nn.ReLU(),
    nn.Linear(256,10)
)

使用这种方法的特点是:

1.简单,但是不能由较高灵活的定制化;

2.不用自定义forward前向传播函数,层与层之间的参数尺寸必须要匹配;

ModuleList类:

如下所示:

net=nn.ModuleList([nn.Linear(784,256),nn.ReLU()])
net.append(nn.Linear(256,10))

Pytorch多种模型构造方法

这种也和Sequential类似,进行列表化构造网络;

但是需要注意的是,需要定义Forward函数,只有Sequential类不需要自定义Forward函数;

ModuleDict类:

ModuleDict类似于Sequential类的定义方式,并且可以通过字典方式进行索引查找;

net=nn.ModuleDict({
    'linear':nn.Linear(784,256),
    'act':nn.ReLU()
})

net['output']=nn.Linear(256,10)

但是和ModuleList类似,需要重新定义forward前向传播函数;

使用多种Module进行复杂网络构建:

例如:

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多种模型构造方法”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注亿速云网站,小编将为大家输出更多高质量的实用文章!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI