美文网首页
Pytorch 自定义模型参数及更新

Pytorch 自定义模型参数及更新

作者: 廿怎么念 | 来源:发表于2020-12-30 16:07 被阅读0次

被这个问题困扰了很久,用nn.parameter()定义了参数,但该参数没有更新,.grad() 为none, is_leaf 为False, 其了个怪了。原来是在参数初始化的时候没有正确初始化,我好菜~~~~~。

先看正确的例子
import torch
import torch.nn as nn

class Mask(nn.Module):
    def __init__(self):
        super(Mask, self).__init__()
        self.weight = (torch.nn.Parameter(data=torch.Tensor(1, 1, 1, 1), requires_grad=True))

        self.weight.data.uniform_(-1, 1)
        print(self.weight.is_leaf)
    def forward(self, x):
        masked_wt = (self.weight.mul(1)).cuda()
        return masked_wt


class Model(nn.Module):
    def __init__(self):
        super(Model, self).__init__()
        self.Mask = Mask()

    def forward(self, x):
        x = Mask(x)
        return x


model = Model()

for name, param in model.named_parameters():
    print(name, param)

输出为

True
Mask.weight Parameter containing:
tensor([[[[0.7625]]]], requires_grad=True)
错误例子A如下, 在初始化的时候使用了.cuda,把参数加载到GPU
import torch
import torch.nn as nn

class Mask(nn.Module):
    def __init__(self):
        super(Mask, self).__init__()
        self.weight = (torch.nn.Parameter(data=torch.Tensor(1, 1, 1, 1), requires_grad=True)).cuda

        self.weight.data.uniform_(-1, 1)
        print(self.weight.is_leaf)
    def forward(self, x):
        masked_wt = (self.weight.mul(1)).cuda
        return masked_wt


class Model(nn.Module):
    def __init__(self):
        super(Model, self).__init__()
        self.Mask = Mask()

    def forward(self, x):
        x = Mask(x)
        return x


model = Model()

for name, param in model.named_parameters():
    print(name, param)
错误例子B:使用了view函数,改变了该参数
import torch
import torch.nn as nn

class Mask(nn.Module):
    def __init__(self):
        super(Mask, self).__init__()
        self.weight = (torch.nn.Parameter(data=torch.Tensor(1, 1, 1, 1), requires_grad=True)).view(-1, 1)

        self.weight.data.uniform_(-1, 1)
        print(self.weight.is_leaf)
    def forward(self, x):
        masked_wt = (self.weight.mul(1)).cuda
        return masked_wt


class Model(nn.Module):
    def __init__(self):
        super(Model, self).__init__()
        self.Mask = Mask()

    def forward(self, x):
        x = Mask(x)
        return x


model = Model()

for name, param in model.named_parameters():
    print(name, param)

以上两个例子均导致模型参数初始化错误,没有把改参数加到模型的parameter pool 里,而是把该参数当做一个intermediate variable,所以在更新之后,grad被清零了,变成了none.

相关文章

  • Pytorch 自定义模型参数及更新

    被这个问题困扰了很久,用nn.parameter()定义了参数,但该参数没有更新,.grad() 为none, i...

  • CV-字符识别模型

    Pytorch构建CNN模型 Pytorch中构建CNN模型只需要定义好模型的参数和正向传播就可以,Pytorch...

  • pytorch如何保存与加载训练模型

    保存网络结构及参数 只加载模型参数,网络结构从代码中创建 pytorch加载官方提供预训练模型的方法请参考博客

  • Pytorch: 模型保存和加载

    Pytorch 框架下,模型的保存和加载有两种方式,一种是只保存模型参数,一种是保存模型网络及参数,两种加载的方式...

  • pytorch finetune模型

    pytorch finetune模型 文章主要讲述如何在pytorch上读取以往训练的模型参数,在模型的名字已经变...

  • Pytorch框架学习(11)——优化器

    @[toc] 1. 什么是优化器 pytorch的优化器:管理并更新模型中可学习参数的值,使得模型输出更接近真实标...

  • pytorch 优化器

    pytorch优化器:管理并更新模型中可学习参数的值,使模型输出更接近标签。 梯度下降策略 导数:导数在指定坐标轴...

  • Pytorch学习之全连接识别MNIST数字

    Pytorch之全连接识别MNIST数字 导入库 设置超参数 数据预处理方法 数据集下载及获取 模型建立 确定损失...

  • Pytorch模型保存与加载,并在加载的模型基础上继续训练

    pytorch保存模型非常简单,主要有两种方法: 只保存参数;(官方推荐) 保存整个模型 (结构+参数)。由于保存...

  • Pytorch Tips

    保存、恢复模型参数参考:pytorch学习笔记(五):保存和加载模型 中断时保存参数 将该代码添加至save_mo...

网友评论

      本文标题:Pytorch 自定义模型参数及更新

      本文链接:https://www.haomeiwen.com/subject/xcphoktx.html