当前位置: 首页 > 知识库问答 >
问题:

pytorch - 如何在PyTorch中实现模型参数的动态缩放并对缩放系数计算梯度?

漆雕嘉平
2024-05-07

我希望将模型A的参数乘以一个标量lambda得到模型B(即模型B的架构和模型A的一样但每个参数都是模型A的lambda倍),现在我希望将一个tensor输入模型B,并对输出进行反向传播,然后优化参数lambda。但梯度无法反传到lambda上。具体代码如下

import torchimport torch.nn as nnclass MyBaseModel(nn.Module):    def __init__(self):        super(MyBaseModel, self).__init__()        self.linear1 = nn.Linear(3, 8)        self.act1 = nn.ReLU()        self.linear2 = nn.Linear(8, 4)        self.act2 = nn.Sigmoid()        self.linear3 = nn.Linear(4, 5)    def forward(self, x):        return self.linear3(self.act2(self.linear2(self.act1(self.linear1(x)))))class WeightedSumModel(nn.Module):    def __init__(self):        super(WeightedSumModel, self).__init__()        self.lambda_ = nn.Parameter(torch.tensor(2.0))        self.a = MyBaseModel()        self.b = MyBaseModel()    def forward(self, x):        for para_b, para_a in zip(self.a.parameters(), self.b.parameters()):            para_b.data = para_a.data * self.lambda_        return self.b(x).sum()input_tensor = torch.ones((2, 3))weighted_sum_model = WeightedSumModel()output_tensor = weighted_sum_model(input_tensor)output_tensor.backward()print(weighted_sum_model.lambda_.grad)

输出为None,现在我希望有代码能实现相同的功能并能成功计算lambda的梯度。

用tensorboard可视化计算图发现weighted_sum_model的参数中只有b出现在了计算图上,a和lambda_都没有出现在计算图中。

共有1个答案

谢弘阔
2024-05-07
import torchimport torch.nn as nnclass MyBaseModel(nn.Module):    def __init__(self):        super(MyBaseModel, self).__init__()        self.linear1 = nn.Linear(3, 8)        self.act1 = nn.ReLU()        self.linear2 = nn.Linear(8, 4)        self.act2 = nn.Sigmoid()        self.linear3 = nn.Linear(4, 5)    def forward(self, x):        return self.linear3(self.act2(self.linear2(self.act1(self.linear1(x)))))class WeightedSumModel(nn.Module):    def __init__(self):        super(WeightedSumModel, self).__init__()        self.lambda_ = nn.Parameter(torch.tensor(2.0))        self.a = MyBaseModel()            def forward(self, x):        x = x        for layer in self.a.children():            if isinstance(layer, nn.Linear):                weight = layer.weight * self.lambda_                bias = layer.bias * self.lambda_ if layer.bias is not None else None                x = torch.nn.functional.linear(x, weight, bias)            elif isinstance(layer, nn.ReLU) or isinstance(layer, nn.Sigmoid):                x = layer(x)        return xinput_tensor = torch.ones((2, 3))weighted_sum_model = WeightedSumModel()output_tensor = weighted_sum_model(input_tensor)output_tensor.sum().backward()print(weighted_sum_model.lambda_.grad)  # 应该不再是None
 类似资料:
  • 本文向大家介绍pytorch 求网络模型参数实例,包括了pytorch 求网络模型参数实例的使用技巧和注意事项,需要的朋友参考一下 用pytorch训练一个神经网络时,我们通常会很关心模型的参数总量。下面分别介绍来两种方法求模型参数 一 .求得每一层的模型参数,然后自然的可以计算出总的参数。 1.先初始化一个网络模型model 比如我这里是 model=cliqueNet(里面是些初始化的参数)

  • 问题内容: 我需要实现变焦为包含在。我已经通过覆盖方法和调用来成功进行缩放。 这是不正常:对的和的规模如预期,但一定会得到的和这样的寄存器在预分频的位置。我能做什么?感谢您的阅读。 问题答案: 显示了如何使用明确的转化方法扩展鼠标坐标:,,和。)。

  • 本文向大家介绍pytorch如何冻结某层参数的实现,包括了pytorch如何冻结某层参数的实现的使用技巧和注意事项,需要的朋友参考一下 在迁移学习finetune时我们通常需要冻结前几层的参数不参与训练,在Pytorch中的实现如下: 假如我们想要冻结linear1层,需要做如下操作:  最后我们需要将需要优化的参数传入优化器,不需要传入的参数过滤掉,所以要用到filter()函数。 其它的博客中

  • 到目前为止,我的代码如下所示: 我有一个JLabel,它显示正常的图片。我实现了一个鼠标侦听器,用于移动鼠标。每次鼠标在图片中移动时,我都希望发生一点缩放。 我试着在网上查,但我找不到一个解决办法。 如果我解释得不够好,请问,我不是专业人士:D 非常感谢帮助!

  • 我如何设置以及我必须进行哪些操作才能达到所需的结果?如果有可能的话,也就是不需要分离实部和虚部,缩放实部,重新组合成一个新的复数向量。

  • 问题内容: 我正在学习如何制作动态壁纸,但是我有一个困境,我敢肯定所有刚开始的人也都有。 分辨率屏幕的尺寸太多了,如何仅用一套代码就所有版本的代码进行缩放?我知道它已经完成了,因为我在很多APK中都看到了APK中的图像,并对其进行了缩放。 如果只是一幅图像,不需要任何简单的定位,但是我的问题是我必须重新调整背景图像的大小以适合所有设备,那么我的动画也适合该背景上某个x和y位置图像就位,因此看起来好

  • 缩放画布时,有什么方法可以阻止这种模糊吗?我想这和GPU插值有关。但我这里需要的是一个像素完美的“像素化”变焦。只需使用最近的“真实”相邻像素的颜色。 我在这里看到了解决方案,但在这两个解决方案中,有一个建议工作(#1/#4),#4肯定是CPU扩展,而#1我猜也是。 这种缩放需要快速——我希望能够支持多达20-25层(可能是StackPane中的画布,但我对其他想法持开放态度,只要它们不融化中央处

  • 问题内容: 我已经看过这个问题,但是它似乎并没有真正回答我的问题。我有一个图像文件,它可以是任何分辨率。我需要以特定分辨率将该图像加载到对象中(例如,对于本示例来说为800x800)。我知道Image类可以用来将图像缩放到新的大小,但是后来我不知道如何将其恢复为。是否有一种简单的方法可以将缓冲图像缩放到特定大小? NOTE II不想按特定的比例缩放图像,我想拍摄一张图像并制成特定的尺寸。 问题答案