我有一个与此类似的问题:
有一个(n1, n2)
形式的输入向量,我想要一个f(n1, n2) = f(n2, n1)
的模型。我希望这个模型是线性的。例如,我想学习的2x2
矩阵。 2x2
矩阵有4个权重,训练将尝试学习这些权重。但是,收缩可以巧妙地减少问题。
f(nvec) = W*nvec
,即nvec=(n1, n2)
。
因此,假设X = [[0, 1],[1, 0]]
是一个2x2
矩阵,它会翻转矢量,然后是f(n2,n1) = W*X*(n1, n2) = f(n1, n2) = W (n1, n2)
。
基本上,等式意味着W*X = W
,或者如果是W = [[w1, w2], [w3, w4]]
,则等式意味着W = [[w1, w1], [w3, w3]]
,即矩阵只有2个自由参数。如何在pytorch中定义这样的模型?
谢谢。
答案 0 :(得分:1)
如果参数具有特殊的结构,并且不想使用默认图层存储的默认参数,则可以自己定义一个图层,并使用nn.Parameter
来存储参数。
例如,
class CustomLayer(nn.Module): # layer must be derived from nn.Module class
def __init__(self): # you can have arguments here...
super(CustomLayer, self).__init__()
self.params = nn.Parameter(data=torch.rand((2, 1), dtype=torch.float), requires_grad=True)
def forward(self, x):
w = self.params.repeat(1, 2) # create a 2x2 matrix from the two parameters
y = torch.bmm(x, w)
return y