Наличие сетевого выхода в качестве других сетевых параметров - PullRequest
1 голос
/ 30 мая 2020

У меня есть 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

1 Ответ

2 голосов
/ 30 мая 2020

Думаю, это довольно просто, или я неправильно понял ваш запрос.

x, t - ваши входные переменные.

Теперь давайте определим сеть M, которая будет принимать вход t и выход theta.

M = nn.Sequential(....) # declare network here

Далее определяем сеть Y. Это может быть сложно, поскольку вы хотите использовать тэту в качестве параметров. Возможно, будет проще и интуитивно понятнее работать с функциональными аналогами модулей, заявленных в 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
...