首先可以把这个函数理解为类型转换函数,将一个不可训练的类型Tensor转换成可以训练的类型parameter并将这个parameter绑定到这个module里面(net.parameter()中就有这个绑定的parameter,所以在参数优化的时候可以进行优化的),所以经过类型转换这个self.v变成了模型的一部分,成为了模型中根据训练可以改动的参数了。使用这个函数的目的也是想让某些变量在学习的过程中不断的修改其值以达到最优化。
出现这个函数的地方
![7c74d7d855781657bd7c0f53c7cd4f79.png](https://i-blog.csdnimg.cn/blog_migrate/e3d04616939387932db8389033398282.jpeg)
![afa58b57c82a29e991e2e28a6b99f09b.png](https://i-blog.csdnimg.cn/blog_migrate/0adbf1dcf212814e6c3b06f40ebb6cf9.jpeg)
在concat注意力机制中,权值V是不断学习的所以要是parameter类型。
通过做下面的实验发现,linear里面的weight和bias就是parameter类型,且不能够使用tensor类型替换,还有linear里面的weight甚至可能通过指定一个不同于初始化时候的形状进行模型的更改。
![c03f4ed593da6fc799eca62658092cd4.png](https://i-blog.csdnimg.cn/blog_migrate/f274b26288c0b4daf083dc9ad975a64f.jpeg)
![68f13f124da77fb36c88e30b80f38837.png](https://i-blog.csdnimg.cn/blog_migrate/82560dc0c591ef4ecefd89b8b345e07c.jpeg)
与torch.tensor([1,2,3],requires_grad=True)的区别,这个只是将参数变成可训练的,并没有绑定在module的parameter列表中。