parameter即为参数。
通常,我们的参数都是一些常见的结构(卷积、全连接等)里面的计算参数,而当我们网络有其他的设计时,会需要额外的参数,同样跟着整个网络的训练进行学习更新,最后得到最优的值。nn.Parameter()则适用于这个应用场景。
首先可以把这个函数理解为类型转换函数,将一个不可训练的类型Tensor转换成可以训练的类型parameter并将这个parameter绑定到这个module里面(net.parameter()中就有这个绑定的parameter,所以在参数优化的时候可以进行优化的),所以经过类型转换这个self.v变成了模型的一部分,成为了模型中根据训练可以改动的参数了。使用这个函数的目的也是想让某些变量在学习的过程中不断的修改其值以达到最优化。
在Vision Transformer中:
self.cls_token = nn.Parameter(torch.zeros(1, 1, embed_dim))
self.pos_embed = nn.Parameter(torch.zeros(1, num_patches + self.num_tokens, embed_dim))
torch.zero():用0矩阵进行初始化
在VIT中,positional embedding和class token是两个需要随着网络训练学习的参数,但它们又不属于FC、MLP、MSA等运算的参数,在这时,就可以用nn.Parameter()来将这个随机初始化的Tensor注册为可学习的参数Parameter。
这就可以确定nn.Parameter()添加的参数确实是被添加到了Parameters列表中,会被送入优化器中随训练一起学习更新。
from torch.optim import Adam
opt = Adam(net_vit.parameters(), learning_rate=0.001)