将网络输出作为另一个网络参数

Having a network output as another network parameters

我有 y = Y(x;theta)theta = M(t;omega),其中 xt 是输入变量(从数据集中给出),thetaomega 可训练参数。我需要 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

我认为这很简单,或者我没有正确得到您的查询。

xt是你的输入变量。

现在让我们定义一个网络 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