Pytorch中nn.Parameter()参数的使用

这两天在学习怎么对网络的两个输出f1,f2,分别得到两个权重值w1,w2,然后做一个自适应的加权融合,得到最终的结果Q。在网上百度,发现了这个函数的使用nn.Parameter(),从而记录一下。
1、含义解读:
讲的很清楚,引用!
Parameter:参数。在做神经网络的训练时,其实就是训练一个模型,这个模型就是去学习一个函数,这个函数可以准确的学习到我们想要到的东西,比如正确的对物体进行分类。函数的输入就是模型的输入:一张图像,得到的模型输出就是一个预测值。我们平时的学习率,batch大小等都是一些常见的参数,在定义模型的结构(卷积、全连接层、池化等)时模型都可以学习到内含的这些参数。**但是当我们需要一些额外的参数时 ,希望它跟着模型一起训练更新,然后得到最终的值。就可以使用nn.Parameter()函数进行定义。**比如注意力机制中的权重、VisionTransformer中的class token和positional embedding等都会使用此函数。
2、主要做法:
有代码实例,讲的很浅显易懂!引用!
在网络的def init初始化函数中加入下面的代码

self.w= nn.Parameter(torch.ones(2))

因为我要得到两个权重,所以定义的时候输入torch.ones(2),生成两个初始化权重(1,1),然后在forward函数中写入:

 w1 = torch.exp(self.w[0]) / torch.sum(torch.exp(self.w))
 w2 = torch.exp(self.w[1]) / torch.sum(torch.exp(self.w))

这里的torch.exp是对权重做归一化处理,w1的权重就是w1除以w1和w2的和。

Q = w1*f1+w2*f2

网络在训练过程中就会自己学习这个超参数,自适应的学习到最终的两个权重值。或者可以不用自适应,自己设置好一个固定的权重,比如f1为0.6,f2为0.4,则Q=f1 * 0.6 + f2 * 0.4。这种就是要多做实验,看权重值设置为多少时会得到一个最优的结果。
其实看了一些文章,发现自适应权重在网络中的特征融合方面非常常用。将不同分支得到的特征做一个加权融合。
上面这种是超参数的学习,但是还可以自己定义,将分别得到的预测值与真值之间求一个损失或者说相似度,然后根据相似度的大小定义一个比例作为权值的大小。或者是最后直接加一个全连接层,它也是自适应学习的一个过程。

其他参考文章:
https://www.jianshu.com/p/d8b77cc02410

你可能感兴趣的:(科研记录,python,其他)