<jupyter_start><jupyter_text>Lec 02. Variable and Autograd Back propagation 을 위해 사용<jupyter_code>import torch
from torch.autograd import Variable
x = torch.Tensor([[1, 2], [3, 4]])
x
x.sum()<jupyter_output><empty_output><jupyter_text>Variable containing --> 변할 수 있는 값.<jupyter_code>y = Variable(x, requires_grad=True)   # requires_grad=True : gradient 계산
y
y.sum() 
y.max()
y.data  # --> 변하지 않는 값
z = 2*y + 1
z
print("z :", z)
print("y.requires_grad :", y.requires_grad)
print("z.requires_grad :", z.requires_grad)  # z는 y의 함수이므로 y가 변할 때 z도 함께 변한다.

print("")

print("y.grad :", y.grad) # 아직 변화된 적이 없기 때문에 None 출력됨.
print("z.grad :", z.grad)

print("")

print("y.grad_fn :", y.grad_fn)
print("z.grad_fn :", z.grad_fn)  # z = 2*y + 1 이라는 function을 가지고 있기 때문.
out = z.sum()
out
print("y.requires_grad :", y.requires_grad)
print("z.requires_grad :", z.requires_grad)
print("out.requires_grad :", out.requires_grad)

print("")

print("y.grad :", y.grad)
print("z.grad :", z.grad)
print("out.grad :", out.grad)

print("")

print("y.grad_fn :", y.grad_fn)
print("z.grad_fn :", z.grad_fn)
print("out.grad_fn :", out.grad_fn)
# By default, gradients are only retained for leaf variables. --> 첫번째 선언한 variables만 유지됨.
# non-leaf variables gradients are not retained. 
# This was done by design, to save memory.

# non-leaf variables을 보기 위해서 새로운 변수 및 함수 선언.
zGrad = torch.zeros(2,2)

def extract(z):
    global zGrad
    zGrad = z
    
z.register_hook(extract) # 이 순간의 값을 저장
# out으로부터 back propagation을 시작한다.... !!!
out.backward()
print("y.requires_grad :", y.requires_grad)
print("z.requires_grad :", z.requires_grad)
print("out.requires_grad :", out.requires_grad)

print("")

print("y.grad :", y.grad)      # y가 1 증가하면 grad는 2 증가. out.backward() 통한 역전파 값.
print("z.grad :", z.grad)      # non-leaf variables 이라서 표시 안됨.
print("out.grad :", out.grad)

print("")

print("y.grad_fn :", y.grad_fn)
print("z.grad_fn :", z.grad_fn)
print("out.grad_fn :", out.grad_fn)

print("")

print(zGrad)
out.data<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.17509920634920634, 'fraction_numerical': 0.006944444444444444, 'mean_word_length': 4.280104712041885, 'pattern_counts': {'":': 0, '<': 9, '<?xml version=': 0, '>': 12, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '2', 'dir': 'jupyter-structured-clean-dedup', 'id': '565532', 'license': 'MIT', 'n_tokens_mistral': 940, 'n_tokens_neox': 984, 'n_words': 198, 'path': 'F_Camp/c02_Variable_and_Autograd.ipynb', 'repo_name': 'woosa7/pytorch', 'size': '2016'}