Repository navigation
Expand file tree
/
Copy path2-1.py
More file actions
90 lines (73 loc) · 2.87 KB
/
Copy path2-1.py
File metadata and controls
90 lines (73 loc) · 2.87 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
import torch
x = torch.tensor([1.],requires_grad=True)#디폴트가 False float여야해서 1.
print(x)#True로 바꾸면 프린트 할때 보임
x = torch.tensor([1.])
print(x)
print(x.requires_grad)#requires_grad의 True False를 알려줌
x.requires_grad = True#이렇게 바꿀 수도 있음
x = torch.tensor([1.],requires_grad=True)
y = x**2
print(y)# PowBackward0(제곱을 수행함)이 붙어있음
print(x.grad)#미분 하기 전이기에 None이 들어있음
y.backward()#requires_grad가 True인 변수에 대해서 미분 해줘잉 함수
print(x.grad)#x에 대한 y의 미분에 x의 값 1을 대입한 값인 2가 들어가 있음
x = torch.tensor([1.],requires_grad=True)
y = x**2
print(y)#Power 제곱이라는 뜻 PowBackward0이 옆에 붙어있음
y.retain_grad()#이러면 y.grad도 볼 수 있음
z = 3*y
print(z)#MulBackward0이 붙어있음
#가장 마지막 연산이 옆에 붙음
z.backward()
print(x.grad)#chain rule로 알아냄
print(y.grad)#원래 중간 grad는 안됨 requires_grad가 True로 되어있지 않기에 하지만 retain_grad()를 해주면 가능
x = torch.tensor([1.],requires_grad=True)
a = x**2
b = a+1
print(b)#AddBackward0이 붙어있음
c = b**2
c.backward()
print(x.grad)
x = torch.tensor([1.],requires_grad=True)
y = torch.tensor([1.],requires_grad=True)
z = 2*x**2 + y**2 # AddBackward0
print(z)
z.backward()
print(x.grad)
print(y.grad)
x = torch.tensor([1.],requires_grad=True)
y = torch.tensor([1.],requires_grad=True)
z = y*x**2
z.backward()
print(x.grad)
print(y.grad)
x = torch.tensor([1., 2., 3.],requires_grad=True)
z = torch.sum(x**2)# x1**2 + x2**2 + x3**2
y.backward()
print(y)
print(x.grad)#각각 편미분 하고 대입해서 2,4,6이 나오게 됨
x = torch.tensor([1.],requires_grad=True)
x.retain_grad=False
# transfer learning할때 필요
y = x**2
print(y)#텐서만 나오고 requires_grad는 나오지 않음
#y.backward() 실행 하면 오류
x = torch.tensor([2.],requires_grad=True)
x2 = x.detach()#detach는 requires_grad만 False인 똑같은 텐서를 만드는 것
y = x**2
z = y.detach()#중간에 requires_grad를 False로 만들 수 없기에 detach를 사용
w = y+z#x**2+1과 같음
w.backward()
print(x.grad)
#torch.no_grad()
x = torch.tensor([1.],requires_grad=True)
#chain rule에서는 계속 grad_fn를 update 해야 하기에 grad_fn을 계산 안하고 싶을때 no_grad를 사용
#테스트 때는 grad update를 하지 않기에 사용함
with torch.no_grad():
y = x**2
print(x.requires_grad)#이렇게 했다고 해서 requires_grad가 False가 되는 건 아님
print(y)#with 안에선 grad_fn이 안붙음
print(x.requires_grad)
y.backward()#오류가 뜸 with 안에서한 계산은 tracking하지 못하기에 with안에서 y = x**2 한걸 얘는 모름 그래서 아무 연산이 수행 되지 않았기에 에러!
y = x**2
print(y)#이제 바깥에서 했으니까 grad_fn을 가짐 이제 backward 가능