|
87 | 87 |
|
88 | 88 |
|
89 | 89 | ######################################################################
|
90 |
| -# Tensor 를 사용한 연산 |
| 90 | +# Tensor를 사용한 연산 |
91 | 91 | # ~~~~~~~~~~~~~~~~~~~~~~~
|
92 | 92 | #
|
93 | 93 | # tensor는 원하는 방식으로 연산할 수 있습니다.
|
|
106 | 106 | # 나중에 사용할 유용한 연산 중 하나는 결합(concatenation)입니다.
|
107 | 107 | #
|
108 | 108 |
|
109 |
| -# 기본적으로 첫 번째 축을 따라 결합됩니다 (행(row) 결합) |
| 109 | +# 기본적으로 첫 번째 축을 따라 결합됩니다. (행(row) 결합) |
110 | 110 | x_1 = torch.randn(2, 5)
|
111 | 111 | y_1 = torch.randn(3, 5)
|
112 | 112 | z_1 = torch.cat([x_1, y_1])
|
|
119 | 119 | z_2 = torch.cat([x_2, y_2], 1)
|
120 | 120 | print(z_2)
|
121 | 121 |
|
122 |
| -# tensor가 호환되지 않으면 torch가 불평할겁니다. 밑의 명령어를 주석 해제하여 에러를 출력해보세요 |
| 122 | +# tensor가 호환되지 않으면 torch가 불평할겁니다. 밑의 명령어를 주석 해제하여 에러를 출력해보세요. |
123 | 123 | # torch.cat([x_1, x_2])
|
124 | 124 |
|
125 | 125 | ######################################################################
|
|
135 | 135 | x = torch.randn(2, 3, 4)
|
136 | 136 | print(x)
|
137 | 137 | print(x.view(2, 12)) # 2열 12행으로 구조 바꾸기
|
138 |
| -# 위와 같습니다. 차원 중 하나가 -1인 경우 그 크기를 유추할 수 있습니다 |
| 138 | +# 위와 같습니다. 차원 중 하나가 -1인 경우 그 크기를 유추할 수 있습니다. |
139 | 139 | print(x.view(2, -1))
|
140 | 140 |
|
141 | 141 |
|
|
164 | 164 | # 추적합니다. 한번 봅시다.
|
165 | 165 | #
|
166 | 166 |
|
167 |
| -# Tensor factory 메소드는 ``requires_grad`` 플래그를 가지고 있습니다 |
| 167 | +# Tensor factory 메소드는 ``requires_grad`` 플래그를 가지고 있습니다. |
168 | 168 | x = torch.tensor([1., 2., 3], requires_grad=True)
|
169 | 169 |
|
170 | 170 | # requires_grad=True 를 사용해도 이전에 할 수 있었던 모든 연산을
|
171 |
| -# 여전히 수행할 수 있습니다 |
| 171 | +# 여전히 수행할 수 있습니다. |
172 | 172 | y = torch.tensor([4., 5., 6], requires_grad=True)
|
173 | 173 | z = x + y
|
174 | 174 | print(z)
|
|
239 | 239 |
|
240 | 240 | x = torch.randn(2, 2)
|
241 | 241 | y = torch.randn(2, 2)
|
242 |
| -# 사용자가 생성한 Tensor는 기본적으로 ``requires_grad=False`` 를 가집니다 |
| 242 | +# 사용자가 생성한 Tensor는 기본적으로 ``requires_grad=False`` 를 가집니다. |
243 | 243 | print(x.requires_grad, y.requires_grad)
|
244 | 244 | z = x + y
|
245 |
| -# 그래서 z를 통해 역전파를 할 수 없습니다 |
| 245 | +# 그래서 z를 통해 역전파를 할 수 없습니다. |
246 | 246 | print(z.grad_fn)
|
247 | 247 |
|
248 | 248 | # ``.requires_grad_( ... )`` 는 기존 텐서의 ``requires_grad``
|
249 | 249 | # 플래그를 제자리에서(in-place) 바꿉니다. 입력 플래그가 지정되지 않은 경우 기본값은 ``True`` 입니다.
|
250 | 250 | x = x.requires_grad_()
|
251 | 251 | y = y.requires_grad_()
|
252 |
| -# z는 위에서 본 것처럼 변화도를 계산하기에 충분한 정보가 포함되어 있습니다 |
| 252 | +# z는 위에서 본 것처럼 변화도를 계산하기에 충분한 정보가 포함되어 있습니다. |
253 | 253 | z = x + y
|
254 | 254 | print(z.grad_fn)
|
255 |
| -# 연산에 대한 입력이 ``requires_grad=True`` 인 경우 출력도 마찬가지입니다 |
| 255 | +# 연산에 대한 입력이 ``requires_grad=True`` 인 경우 출력도 마찬가지입니다. |
256 | 256 | print(z.requires_grad)
|
257 | 257 |
|
258 |
| -# 이제 z는 x와 y에 대한 계산 기록을 가지고 있습니다 |
| 258 | +# 이제 z는 x와 y에 대한 계산 기록을 가지고 있습니다. |
259 | 259 | # z의 값만 가져가고, 기록에서 **분리** 할 수 있을까요?
|
260 | 260 | new_z = z.detach()
|
261 | 261 |
|
|
265 | 265 | # 어떻게 그럴 수가 있을까요? ``z.detach()`` 는 ``z`` 와 동일한 저장공간을 사용하지만
|
266 | 266 | # 계산 기록은 없는 tensor를 반환합니다. 그 tensor는 자신이 어떻게 계산되었는지
|
267 | 267 | # 아무것도 알지 못합니다.
|
268 |
| -# 본질적으로는 Tensor를 과거 기록으로부터 떼어낸 겁니다 |
| 268 | +# 본질적으로는 tensor를 과거 기록으로부터 떼어낸 겁니다. |
269 | 269 |
|
270 | 270 | ###############################################################
|
271 | 271 | # 또한 코드 블록을 ``with torch.no_grad():`` 로 감싸
|
272 |
| -# ``.requires_grad=True`` 인 텐서의 기록을 추적하지 못하게끔 |
| 272 | +# ``.requires_grad=True`` 인 tensor의 기록을 추적하지 못하게끔 |
273 | 273 | # autograd를 멈출 수 있습니다.
|
274 | 274 | print(x.requires_grad)
|
275 | 275 | print((x ** 2).requires_grad)
|
|
0 commit comments