아무리 읽어도 비선형 회귀에 대해서 전혀 감이 잡히지 않습니다.
클래스를 만들때 비선형 함수인 렐루나 시그모이드를 쓰면된다고 하는거 같은데 간단한 비선형데이터 조차 답에 근접하지.않아요. 어디가 잘못된걸까요?
import torch
import torch.nn as nn
import torch.optim as optim
x1=torch.randint(0,10, size=(300,1))
x2=torch.randint(0,10, size=(300,1))
x=torch.cat([x1, x2], dim=1)
y=x1*x2
x=float()
y=float()
class TEST(nn.Module):
def init(self):
self.ll=nn.Linear(2 , 8)
self.ll2=nn.Linear(8 , 4)
self.ll3=nn.Linear(4 , 1)
self.ru=nn.ReLU()
def forward(self, x):
x=self.ll(x)
x=self.ru(x)
x=self.ll2(x)
x=self.ru(x)
x=self.ll3(x)
return x
model=TEST()
optimizer=optim.SGD(model.parameters(), lr=0.0001)
lossf = nn.MSELoss()
epochs=50000
for e in range(epochs+1):
out = model(x)
optimizer.zero_grad()
loss = lossf(out, y)
loss.backward()
optimizer.step()
with torch.no_grad():
xx1=torch.randint(0,10, size=(300,1))
xx2=torch.randint(0,10, size=(300,1))
xx=torch.cat([xx1, xx2], dim=1)
yy=xx1*xx2
xx=float()
yy=float()
for i, val in enumerate(xx):
out=model(val)
print(‘val ={},{},{}’.format(val, float(yy[i]), float(out)))
여기까지가 제소스입니다
모바일로 적어서 오타가 잇을수 잇으니 양해보탁드릴께요
epochs를 변경하고 lr을 변경하고
relu를 시그모이드 tanh로 변경하고 리니어를 추가해도 원하는 답에 근접하지 않네요 ㅠㅠ
어떤것니 잘못된가요?
답에 근접하게 하려면 클래스를 어떻게 설계해야되나요?