pytorch 共享参数的示例
在很多神经网络中,往往会出现多个层共享一个权重的情况,pytorch可以快速地处理权重共享问题。
例子1:
classConvNet(nn.Module): def__init__(self): super(ConvNet,self).__init__() self.conv_weight=nn.Parameter(torch.randn(3,3,5,5)) defforward(self,x): x=nn.functional.conv2d(x,self.conv_weight,bias=None,stride=1,padding=2,dilation=1,groups=1) x=nn.functional.conv2d(x,self.conv_weight.transpose(2,3).contiguous(),bias=None,stride=1,padding=0,dilation=1, groups=1) returnx
上边这段程序定义了两个卷积层,这两个卷积层共享一个权重conv_weight,第一个卷积层的权重是conv_weight本身,第二个卷积层是conv_weight的转置。注意在gpu上运行时,transpose()后边必须加上.contiguous()使转置操作连续化,否则会报错。
例子2:
classLinearNet(nn.Module): def__init__(self): super(LinearNet,self).__init__() self.linear_weight=nn.Parameter(torch.randn(3,3)) defforward(self,x): x=nn.functional.linear(x,self.linear_weight) x=nn.functional.linear(x,self.linear_weight.t()) returnx
这个网络实现了一个双层感知器,权重同样是一个parameter的本身及其转置。
例子3:
classLinearNet2(nn.Module): def__init__(self): super(LinearNet2,self).__init__() self.w=nn.Parameter(torch.FloatTensor([[1.1,0,0],[0,1,0],[0,0,1]])) defforward(self,x): x=x.mm(self.w) x=x.mm(self.w.t()) returnx
这个方法直接用mm函数将x与w相乘,与上边的网络效果相同。
以上这篇pytorch共享参数的示例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。