a = torch.tensor([2., 3.], requires_grad=True)
b = torch.tensor([6., 4.], requires_grad=True)
Q = 3*a**3 - b**2
external_grad = torch.tensor([1., 1.]) #
Q.backward(gradient=external_grad)
print(a.grad) # a에 대한 편미분값
print(b.grad) # b에 대한 편미분값
>>> tensor([36., 81.])
>>> tensor([-12., -8.])
import torch
x_train = torch.tensor([i for i in range(11)], requires_grad = True, dtype = torch.float32).view(-1, 1)
y_train = torch.tensor([i * 2 for i in range(11)], requires_grad = True, dtype = torch.float32).view(-1, 1)
inputDim = 1
outputDim = 1
learningRate = 0.01
epochs = 10
model = nn.Linear(inputDim, outputDim)
##### For GPU #####
if torch.cuda.is_available():
model.cuda()
## Loss, optimizer
criterion = torch.nn.MSELoss() # MSE
optimizer = torch.optim.SGD(model.parameters(), lr=learningRate) # torch.optim.SGD(대상이 되는 파라미터, lr)
## Parameter 업데이트 과정
for epoch in range(epochs):
if torch.cuda.is_available():
inputs = x_train.cuda()
labels = y_train.cuda()
else:
inputs = x_train
labels = y_train
# 이전 그레디언트 값이 지금의 학습에 영향을 주지 않게 하기 위해 초기화를 시켜줌
optimizer.zero_grad()
# 예측값
outputs = model(inputs)
# 예측값/실제값의 Loss
loss = criterion(outputs, labels)
print(loss)
# 그레디언트 구하기(미분)
loss.backward()
# 파라미터 업데이트
optimizer.step()
print('epoch {}, loss {}'.format(epoch, loss.item()))
>>>