Pytorch: Ruído de Gumbel

Criado em 30 jan. 2017  ·  3Comentários  ·  Fonte: pytorch/pytorch

Oi,

Eu tenho tentado adicionar ruído Gumbel como aqui , mas sem sucesso.
Parece que vários módulos ainda estão faltando (por exemplo, funções básicas de variáveis ​​como nn.Uniform()), ou estou errado? Como você implementaria em pytorch, por exemplo, as seguintes linhas:

``` -- Cria módulo de amostra de ruído ε
local noiseModule = nn.Sequential()
no iseModule:add (nn.Uniform(0, 1)) -- Amostra de U(0, 1)
-- Transforma amostra uniforme em amostra Gumbel
no iseModule:add (nn.AddConstant(1e-9, true)) -- Melhora a estabilidade numérica
não iseModule: add (nn.Log())
não iseModule:add (nn.MulConstant(-1, true))
no iseModule:add (nn.AddConstant(1e-9, true)) -- Melhora a estabilidade numérica
não iseModule: add (nn.Log())
não iseModule:add (nn.MulConstant(-1, true))

-- Cria amostrador q(z) = G(z) = softmax((log(π) + ε)/τ) (truque de reparametrização)
amostrador local = nn.Sequential()
amostrador localInternal = nn.ConcatTable()
amostra rInternal:add (nn.Identity()) -- Log de probabilidades de log não normalizado (π)
sample rInternal:add (noiseModule) -- Cria ruído ε
amostrador:adicionar (amostradorInternal)
amostrador:adicionar (nn.CAdTable())
self.temperature = nn.MulConstant(1 / self.tau, true) -- Temperatura τ para softmax
amostrador: adicionar (self.temperature)
sampler:add (nn.View(-1, self.k)) -- Redimensiona para trabalhar sobre k
amostrador:adicionar (nn.SoftMax())
sampler:add (nn.View(-1, self.N * self.k)) -- Redimensionar de volta
```

Comentários muito úteis

Aqui está. Muito mais legível e sem módulos necessários:

import torch.nn.functional as F
from torch.autograd import Variable

def sampler(input, tau, temperature):
    noise = torch.rand(input.size())
    noise.add_(1e-9).log_().neg_()
    noise.add_(1e-9).log_().neg_()
    noise = Variable(noise)
    x = (input + noise) / tau + temperature
    x = F.softmax(x.view(input.size(0), -1))
    return x.view_as(input)

Estamos usando o GitHub apenas para relatórios de bugs, se você tiver dúvidas, poste em nossos fóruns .

Todos 3 comentários

Aqui está. Muito mais legível e sem módulos necessários:

import torch.nn.functional as F
from torch.autograd import Variable

def sampler(input, tau, temperature):
    noise = torch.rand(input.size())
    noise.add_(1e-9).log_().neg_()
    noise.add_(1e-9).log_().neg_()
    noise = Variable(noise)
    x = (input + noise) / tau + temperature
    x = F.softmax(x.view(input.size(0), -1))
    return x.view_as(input)

Estamos usando o GitHub apenas para relatórios de bugs, se você tiver dúvidas, poste em nossos fóruns .

Obrigado pela pronta resposta!, e com certeza, escreverei no fórum da próxima vez.

Obrigado pela resposta!

Esta página foi útil?
0 / 5 - 0 avaliações