[파이토치 첫걸음] #1 선형 회귀와 심층 신경망

최건호 선생님의 파이토치 첫걸음이란 책으로 파이토치의 사용법을 익히려고 한다.

선형회귀

파이토치에서 텐서 사용

torch.tensor 함수는 인수로 data, dtype, device, requires_grad 등을 받는다. data에는 배열, dtype에는 자료형이 들어간다.
자료형은 다음과 같다.

device는 이 텐서를 어느 기기에 올릴 것인지를 정하고, requires_grad는 이 텐서에 대한 기울기를 저장할지의 여부를 정한다.

import torch
x = torch.Tensor(data=[2.0,3.0], requires_grad=True)
y = x**2
z = 2*y+3

target = torch.tensor(3.0,4.0)
loss = torch.sum(torch.abs(z - target))
loss.backward()

print(x.grad, y.grad, z.grad)
# tensor([8., 12.]) None None

선형회귀분석 모델 만들기

import torch
import torch.nn as nn # 신경망 모델들
import torch.optim as optim # 경사하강법 알고리즘
import torch.nn.init as init # 텐서에 초기값을 주기 위해 필요한 함수들

num_data = 1000 # 사용할 데이터수
num_epoch = 500 # 경사하강법 반복 횟수

# 1000,1 모양의 텐서를 -10, 10 사이 숫자들로
x = init.uniform_(torch.Tensor(num_data,1),-10,10)
# 평균이 1이고 표준편차가 1인 노이즈
noise = init.normal_(torch.FloatTensor(num_data,1),std=1)
y = 2*x+3 # -17에서 23사이 숫자들
y_noise = 2*(x+noise)+3 # 현실성을 반영하기 위해 노이즈를 추가
model = nn.Linear(1,1) # 1개의 특성을 가진 인풋과 1개의 특성을 가진 아웃풋
loss_func = nn.L1Loss() # L1손실
optimizer = optim.SGD(model.parameters(), lr=0.01) # 파라미터 변수와, 학습률

label = y_noise
for i in range(num_epoch):
	optimizer.zero_grad() # 기울기 초기화
    output = model(x)
    
    loss = loss_func(output, label)
    loss.backward() # w,b에 대한 기울기 계산
    optimizer.step() # w = w - 계산값
    
    if i % 10 == 0:
    	print(loss.data)

인공 신경망

인공신경망 구현해보기

import torch
import torch.nn as nn # 신경망 모델들
import torch.optim as optim # 경사하강법 알고리즘
import torch.nn.init as init # 텐서에 초기값을 주기 위해 필요한 함수들

num_data = 1000 # 사용할 데이터수
num_epoch = 10000 # 경사하강법 반복 횟수

# 1000,1 모양의 텐서를 -15, 15 사이 숫자들로
x = init.uniform_(torch.Tensor(num_data,1),-15,15)
# 평균이 1이고 표준편차가 1인 노이즈
noise = init.normal_(torch.FloatTensor(num_data,1),std=1)
y = (x**2)+3
y_noise = y + noise # 현실성을 반영하기 위해 노이즈를 추가
# sequential로 묶어서 쓰기
model = nn.Sequential(
		nn.Linear(1,6)
        nn.ReLU(),
        nn.Linear(6,10)
        nn.ReLU(),
        nn.Linear(10,6)
        nn.ReLU(),
        nn.Linear(6,1),
        )
loss_func = nn.L1Loss()
optimizer = optim.SGD(model.parameters(), lr=0.0002)

loss_array=[]
for i in range(num_epoch):
	optimizer.zero_grad()
    output = model(x)
    loss = loss_func(output, y_noise)
    loss.backward()
    optimizer.step()
    
    loss_array.append(loss)

좋은 웹페이지 즐겨찾기