nn.transformer 작동 이게 맞나요?

random으로 일단 해보는데 matplot으로 그래프를 보니 이상하게 나오더군요. tgt에 맞추어 나오려면 어떻게 해야 하는 걸까요? 아님 제가 잘못 이해하는 건지…
positional_encoding이나 tgt_mask등은 뺏습니다. 딱히 필요할 것 같지가 않아서요.

import torch
import torch.nn as nn
import matplotlib.pyplot as plt

class Net(nn.Module):
  def __init__(self):
    super().__init__()
    self.embedding = nn.Embedding(20, 30)
    self.transformer = nn.Transformer(30, 5,dropout = 0)
  def forward(self, src, tgt):
    tgt_mask=self.transformer.generate_square_subsequent_mask(tgt.shape[1])
    src =  self.embedding(src)
    src=src.permute(1,0,2)
    tgt = tgt.permute(1,0,2)
    out = self.transformer(src, tgt, tgt_mask=tgt_mask)
    out = out.permute(1,0, 2)
    return out



class Net(nn.Module):
  def __init__(self):
    super().__init__()
    self.embedding = nn.Embedding(20, 30)
    self.transformer = nn.Transformer(30, 5,dropout = 0)
  def forward(self, src, tgt):
    tgt_mask=self.transformer.generate_square_subsequent_mask(tgt.shape[1])
    src =  self.embedding(src)
    src=src.permute(1,0,2)
    tgt = tgt.permute(1,0,2)
    out = self.transformer(src, tgt, tgt_mask=tgt_mask)
    out = out.permute(1,0, 2)
    return out

critic = nn.L1Loss()
model = Net()
optim = torch.optim.Adam(model.parameters())


src = torch.randint(1, 20, (10, 30))
tgt = torch.rand((10, 20, 30))
tgt_input = torch.cat((torch.zeros((10, 1, 30)), tgt[:, :-1, :]), 1)

model.train()
for _ in range(1500):
  optim.zero_grad()
  out=model(src, tgt_input)
  loss=critic(out, tgt)
  
  loss.backward()
  optim.step()

  fig, (ax0, ax1)=plt.subplots(2, 1)
  ax0.pcolor(out[0].detach().numpy())
  ax1.pcolor(tgt[0].detach().numpy())
  plt.show()

설명해주실때… 코딩으로 보여주셨으면 합니다. ㅜㅜ. 제가 그냥 취미로 배우는거라… 전문가가 아니예요.

아 그리고 그래프는 이렇게 나옵니다.
image
결과값이 선처럼 나오더라고요.

단순하게 동작을 확인하기 위해서면 문제가 없는 것 같습니다.
그림을 그린 지점의 문제가 아닐까 하는데요
올려 주신 코드의 이터레이션 종료 후에 그린 결과입니다.
image

감사합니다. 동작 확인 되었습니다. learning time 문제였군요.
그런데 한가지 질문이 더 생겼습니다.

import torch
import torch.nn as nn
import matplotlib.pyplot as plt
class Net(nn.Module):
  def __init__(self):
    super().__init__()
    self.embedding = nn.Embedding(1000, 128)  #수정
    self.transformer = nn.Transformer(128, 8,dropout = 0) #수정
  def forward(self, src, tgt):
    tgt_mask=self.transformer.generate_square_subsequent_mask(tgt.shape[1])
    src =  self.embedding(src)
    src=src.permute(1,0,2)
    tgt = tgt.permute(1,0,2)
    out = self.transformer(src, tgt, tgt_mask=tgt_mask)
    out = out.permute(1,0, 2)
    return out

critic = nn.L1Loss()
model = Net()
optim = torch.optim.Adam(model.parameters())


src = torch.randint(1, 999, (50, 100)) #수정
tgt = torch.rand((50, 200, 128)) #수정
tgt_input = torch.cat((torch.zeros((50, 1, 128)), tgt[:, :-1, :]), 1)  #수정
epoch = 0
model.train()
while True:  #계속 돌리기 위해 수정
  optim.zero_grad()
  out=model(src, tgt_input)
  loss=critic(out, tgt)
  
  loss.backward()
  optim.step()
  if epoch%1000 == 0:
    plt.close('all')
    fig, (ax0, ax1)=plt.subplots(2, 1)
    ax0.pcolor(out[0].detach().numpy())
    ax1.pcolor(tgt[0].detach().numpy())
    plt.savefig(f'savefig_default{epoch}.png')
    plt.pause(1)

  epoch +=1

#수정이라고 한곳을 수정했습니다. 학습데이터의 크기를 키운 것인데요.
다음과 같이 할때 학습이 진행되다 위에서 말한데로 선으로 돌아가고 다시 학습되었다가를 반복되고 학습이 완료될 기미가 보이지 않더군요.
어떠한 이유 때문이고 해결할 방법이 있을까요?

위 코드를 그래로 쓰진 않고 cuda를 사용하도록 코드를 손보긴 했습니다.('to(‘cuda’)넣기 방법으로요.)

해결방법을 찾은 것 같습니다. learning rate를… 낮추면 되는거 같더군요. 감사합니다.

2개의 좋아요