我有y = Y(x;theta)
和theta = M(t;omega)
,其中x
和t
是输入变量(从数据集中给定),以及theta
和omega
可训练参数。我需要有作为omega
的功能theta
。然后,我在y
上有一个损失函数,需要通过M
反向传播梯度直到Y
。如何在pytorch中创建这样的结构?
目前,我的网络构建如下(sizes
是一个整数列表,定义为sizes = [input_size, hidden1_size, hidden2_size, ..., output_size]
)
import torch
import torch.nn as nn
import torch.nn.functional as F
class M(nn.Module):
def __init__(self, sizes):
super(Y, self).__init__()
self.layers = nn.ModuleList()
for i in range(0, len(sizes) - 1):
self.layers.append(nn.Linear(sizes[i], sizes[i+1]))
def forward(self, x):
for l in self.layers[:-1]:
x = F.relu(l(x))
x = self.layers[-1](x)
return x
发布于 2020-05-30 01:05:44
我认为这很简单,或者我没有正确理解你的问题。
x
和t
是您的输入变量。
现在,让我们定义一个将接受输入t和输出theta
的网络M
。
M = nn.Sequential(....) # declare network here
接下来,我们定义一个网络Y
。这在这里可能很棘手,因为你想使用theta作为参数。使用在nn
(请参阅https://pytorch.org/docs/stable/nn.functional.html)中声明的模块的功能副本可能会更容易、更直观。我将试着给出一个例子,假设θ是线性模块的参数。
class Y(nn.Module):
def __init__(self):
# declare any modules here
def forward(self, theta, x):
return nn.functional.linear(input=x, weight=theta, bias=None)
总的前向传球应该是
def forward(t, x, M, Y):
theta = M(t)
output = Y(theta, x)
return output
https://stackoverflow.com/questions/62095638
复制