Torch로 Vector를 n번 샘플링 하기
Background
Random Distribution으로부터 vector를 n번 샘플링하는 코드에 대한 고민.
1.
다음과 같은 두 변수가 있다: mu, var.
두 변수는 [bs, 256] 차원을 가진다. (bs=batch size)
2.
이 두 변수로부터 Random Distribution을 만들고, 이로부터 벡터를 추출한다.
def reparameterize(self, mu, logvar):
std = torch.exp(0.5 * logvar)
eps = torch.randn_like(std)
return eps.mul(std) + mu
Python
복사
mu.shape # torch.Size([bs, 256])
var.shape # torch.Size([bs, 256])
z = reparameterize(mu, var)
z.shape # torch.Size([bs, 256])
Python
복사
이때, 우리가 원하는 것은 n개의 벡터를 샘플링하여 [bs, n, 256] 차원을 가지는 벡터를 만드는 것이다.
Solution
z = [reparameterize(mu, var) for i in range(0, n)] #len(z) = n
z = torch.stack(z, dim=1)
z.shape # torch.Size([bs, n, 256])
Python
복사
간단하게 성공하긴 했는데, 세련되지 못하다는 느낌이 든다.
torch.multinomial 처럼 하는 방법이 없을까?
function에 대하여 샘플링 하여 dim방향으로 n번 stack하는 방법이 있을 것 같은데.