如何定义仅部分可训练的 PyTorch 张量

问题描述 投票:0回答:1

我正在尝试构建一个自定义模型来在 PyTorch 中进行训练,长话短说,我需要构建一个张量,将除矩形下对角线块之外的所有元素设置为零,至关重要的是,优化过程应该只涉及以下元素这个子对角线块,使所有零保持不变。为此,我定义了一个自定义 pytorch 网络,并使用

nn.Parameter

定义了我的矩形块
class My_Network(nn.Module):
    def __init__(self , vertical_dim , horizontal_dim):
        super().__init__()
        self.total_dim = vertical_dim + horizontal_dim
        self.subdiagonal_block = nn.Parameter(torch.rand(vertical_dim , horizontal_dim))

这样,如果我错了,请纠正我,PyTorch应该用随机值初始化这个张量的值,并且应该将它们注册为训练期间要优化的模型的参数。但现在我陷入困境,我想告诉 PyTorch 构建一个方阵张量,其维度等于

self.total_dim
,除了次对角线块之外都是零,正如我在计算中所说的那样,我将定义在前向方法中,pytorch 应该只训练次对角线块。

我可以根据需要添加零张量,而无需将其设置为模型参数,如下所示(如果我没有记错的话):

class My_Network(nn.Module):
    def __init__(self , vertical_dim , horizontal_dim):
        super().__init__()
        self.total_dim = vertical_dim + horizontal_dim
        self.subdiagonal_block = nn.Parameter(torch.rand(vertical_dim , horizontal_dim))
        self.total_zero_tensor = torch.zeros(self.total_dim, self.total_dim)

但是现在我如何告诉 PyTorch 将我的次对角线块插入这个零矩阵的左下角?我需要为我的计算定义这个矩阵(我需要执行矩阵乘法),但这比仅将小下对角块视为一组要训练的参数更重要。

python machine-learning matrix pytorch tensor
1个回答
0
投票

我认为你可以创建一个布尔掩码张量,它是 1 和 0 的对角线,其中 1(或

True
)代表你想要保留/训练的值,然后执行类似
x = torch.where(mask, x, zeros)

的操作

或者,如果您不想修改非训练部分的值,请将它们放入单独的常量非参数张量中,然后

x = torch.where(mask, x, constant_values)

只要

zeros
constant_values
是非参数,它就会通过 torch.where 反向传播到 x 但不应该修改非参数部分。

© www.soinside.com 2019 - 2024. All rights reserved.