将网络输出作为另一个网络参数
Having a network output as another network parameters
我有 y = Y(x;theta)
和 theta = M(t;omega)
,其中 x
和 t
是输入变量(从数据集中给出),theta
和 omega
可训练参数。我需要 theta
作为 omega
的函数。然后,我在 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
我认为这很简单,或者我没有正确得到您的查询。
x
、t
是你的输入变量。
现在让我们定义一个网络 M
,它将接受输入 t 和输出 theta
。
M = nn.Sequential(....) # declare network here
接下来,我们定义一个网络Y
。这在这里可能很棘手,因为您想使用 theta 作为参数。使用 nn
(参见 https://pytorch.org/docs/stable/nn.functional.html)中声明的模块的功能对应物可能更容易和直观。我将尝试举一个例子,假设 theta 是线性模块的参数。
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
我有 y = Y(x;theta)
和 theta = M(t;omega)
,其中 x
和 t
是输入变量(从数据集中给出),theta
和 omega
可训练参数。我需要 theta
作为 omega
的函数。然后,我在 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
我认为这很简单,或者我没有正确得到您的查询。
x
、t
是你的输入变量。
现在让我们定义一个网络 M
,它将接受输入 t 和输出 theta
。
M = nn.Sequential(....) # declare network here
接下来,我们定义一个网络Y
。这在这里可能很棘手,因为您想使用 theta 作为参数。使用 nn
(参见 https://pytorch.org/docs/stable/nn.functional.html)中声明的模块的功能对应物可能更容易和直观。我将尝试举一个例子,假设 theta 是线性模块的参数。
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