PyTorch:参数矩阵双维度扩展及特定参数张量重复变换(支持autograd)
问题1:如何在PyTorch中将parameter matrix沿两个维度重复,得到更大的矩阵?
你可以直接用PyTorch内置的torch.Tensor.repeat()方法,它支持对指定维度重复任意次数,并且完全兼容autograd,梯度可以正常反向传播到原参数张量。
举个例子,假设你有一个2×2的参数矩阵,想要沿行重复2次、列重复3次,得到4×6的矩阵:
import torch # 定义参数矩阵 param = torch.nn.Parameter(torch.randn(2, 2)) # 沿行维度(第0维)重复2次,列维度(第1维)重复3次 expanded_matrix = param.repeat(2, 3)
repeat()的参数是每个维度的重复次数,顺序对应张量的维度顺序(对于2D张量就是行、列)。这个操作不会破坏计算图,原参数的梯度会正确回传。
问题2:将2D parameter tensor按A A B B;A A B B;C C D D;C C D D的形式变换,最简语法是什么?
假设你的原参数张量是2×2的结构:[[A, B], [C, D]],要得到目标的4×4矩阵,有两种简洁的可微分实现方式:
方法1:使用repeat_interleave
repeat_interleave会对指定维度的每个元素单独重复,刚好匹配我们的需求:
import torch param = torch.nn.Parameter(torch.tensor([[1., 2.], [3., 4.]])) # A=1, B=2, C=3, D=4 # 先对行维度(dim=0)每个行重复2次,再对列维度(dim=1)每个元素重复2次 transformed = param.repeat_interleave(2, dim=0).repeat_interleave(2, dim=1)
方法2:两次使用repeat
先重复行维度,再重复列维度,结果和上面一致:
# 先沿行重复2次(得到4×2的张量),再沿列重复2次(得到4×4的目标张量) transformed = param.repeat(2, 1).repeat(1, 2)
这两种方法都是PyTorch的内置可微分操作,完全支持autograd,梯度可以从变换后的张量反向传播到原参数张量,不会有任何问题。
内容的提问来源于stack exchange,提问作者zfz
相关产品推荐
相关产品推荐

