cs [COURSERA] Deep Neural Networks with PyTorch by IBM 강의 리뷰 1 - 1
본문 바로가기
  • 매일 한걸음씩
  • 매일 한걸음씩
개발/Deep Neural Networks with PyTorch 리뷰

[COURSERA] Deep Neural Networks with PyTorch by IBM 강의 리뷰 1 - 1

by 시몬쯔 2020. 3. 24.
728x90
반응형

IBM에서 제공하는 강의입니다.

이 포스팅에서는 1.1부터 1.3까지의 강의를 다루었다. 밑에 굵은 글씨로 씌여진 주제이다.

 

★피드백은 언제나 환영입니다.★

 

주요개념

  • Tensors 1D
  • Two-Dimensional Tensors
  • Data Set
  • Differentiation in PyTorch

1주차에는 텐서 개념과 딥러닝 학습에 필요한 Data set불러오기 등 그리고 weight update에 필요한 differentiation 을 pytorch에서 하는 방법들을 배운다.

 

1.1 Tensors 1D

1

2

3

4

5

6

7

8

# These are the libraries will be used for this lab.

 

import torch 

import numpy as np 

import pandas as pd

 

import matplotlib.pyplot as plt

%matplotlib inline  

Colored by Color Scripter

cs

pytorch를 사용해야하니 torch를 import 그리고 numpy 배열을 이용하여 tensor로 바꿀 과정도 있어서 numpy를 np로 import 해준다. 그리고 pandas(Python Data Analysis Library)또한 pd로 import 하여준다. (이를 통해 csv파일등을 불러와 data로 이용할 수 있다.)

또, 파이썬에서 데이터를 차트나 plot으로 그려주는 라이브러리 matplotlib.pyplot도 import해준다.

 

1

2

3

4

5

6

7

# Convert a panda series to a tensor

 

pandas_series=pd.Series([0.120.310.1])

new_tensor=torch.from_numpy(pandas_series.values)

print("The new tensor from numpy array: ", new_tensor)

print("The dtype of new tensor: ", new_tensor.dtype)

print("The type of new tensor: ", new_tensor.type())

cs

pd.Series를 이용하여 series를 만들고 torch.from_numpy를 이용하여 pandas_series의 값들(numpy값들)로 부터 텐서를 만든다.

 

1

2

3

4

5

this_tensor=torch.tensor([0,1, 2,3]) 

 

print("the first item is given by",this_tensor[0].item(),"the first tensor value is given by ",this_tensor[0])

print("the second item is given by",this_tensor[1].item(),"the second tensor value is given by ",this_tensor[1])

print("the third  item is given by",this_tensor[2].item(),"the third tensor value is given by ",this_tensor[2])

cs

item()은 tensor의 값을 standard Python number로 뽑아낸다. one element에 대해서만 작동한다.

1

2

3

torch_to_list=this_tensor.tolist()

 

print('tensor:', this_tensor,"\nlist:",torch_to_list)

cs

 

.tolist()를 이용하여 tensor를 python list로 바꿀 수 있다.

그밖에도 .mean(), .std(), .max() 등의 tensor function을 이용하여 tensor의 평균, 표준편차, 최대값등의 값들을 알 수 있다.

1

2

3

4

#Calculate the mean for math_tensor

 

mean = math_tensor.mean()

print("The mean of math_tensor: ", mean)

cs

 또, MATLAB에서 자주 쓰는 값들을 생성해내는 함수인 linspace도 tensor를 만들어내는데에 쓸 수 있다.

1

2

3

4

# First try on using linspace to create tensor

 

len_5_tensor = torch.linspace(-2, 2, steps = 5)

print ("First Try on linspace", len_5_tensor)

cs

-2부터2까지 steps(5)개의 수를 가진 tensor를 생성한다.

steps를 지정안했더니 steps=100로 지정된다.

 

0부터 2*pi까지 sin함수를 그려보자.

1

2

3

4

# Construct the tensor within 0 to 360 degree

 

pi_tensor = torch.linspace(0, 2*np.pi, 100)

sin_result = torch.sin(pi_tensor)

cs

1

2

3

# Plot sin_result

 

plt.plot(pi_tensor.numpy(), sin_result.numpy())

cs

여기서 주의해야할 점은 "You must cast the tensor to a numpy array before plotting it."

위에 코드에서 보이듯이 .numpy()를 이용하여 tensor를 numpy로 바꿔준후 plotting을 해야한다.

 

그밖에 torch에서 곱셈을 할 때는 element-wise하게 한다는 것이다.

 

 

 

1.2 Two-Dimensional Tensors 

 

Pandas Dataframe을 tensor로 바꿔보자.

1

2

3

4

5

6

7

8

9

10

11

12

# Try to convert the Panda Dataframe to tensor

 

df = pd.DataFrame({'a':[11,21,31],'b':[12,22,312]})

 

print("Pandas Dataframe to numpy: ", df.values)

print("Type BEFORE converting: ", df.values.dtype)

 

print("================================================")

 

new_tensor = torch.from_numpy(df.values)

print("Tensor AFTER converting: ", new_tensor)

print("Type AFTER converting: ", new_tensor.dtype)

cs

 

df.values를 이용해서 값들을 뽑아내면 2차원 numpy array가 나온다.

df.values를 이용해서 값들을 뽑아내면 2차원 numpy array가 나온다.

그다음 torch.from_numpy(df.values)를 하면 tensor가 나오게 된다.

 

slicing과정은 python 일반 2d array와 별반 다르지 않으므로 skip.

 

1

2

3

4

5

6

# Calculate [[1, 0], [0, 1]] * [[2, 1], [1, 2]]

 

X = torch.tensor([[1, 0], [0, 1]])

Y = torch.tensor([[2, 1], [1, 2]]) 

X_times_Y = X * Y

print("The result of X * Y: ", X_times_Y)

cs

 

그냥 *를 이용하여 곱하게 되면 element-wise product로 나오게 되고 일반적으로 아는 Matrix Multiplication을 하려면,

torch.mm()를 쓰면 된다.

 

1

2

3

4

5

6

# Calculate [[0, 1, 1], [1, 0, 1]] * [[1, 1], [1, 1], [-1, 1]]

 

A = torch.tensor([[0, 1, 1], [1, 0, 1]])

B = torch.tensor([[1, 1], [1, 1], [-1, 1]])

A_times_B = torch.mm(A,B)

print("The result of A * B: ", A_times_B)

cs

1.3 Derivatives in PyTorch

 

준비를 위해

1

2

3

4

5

# These are the libraries will be useing for this lab.

 

import torch 

import matplotlib.pylab as plt

 

Colored by Color Scripter

cs

 

torch를 import 하고 matplotlib.pylab를 plt로 import 한다. 

여기서 위해서 import했던 pyplotpylab 의 차이를 알고 싶어 더 조사해보았다.

(출처 : Matplitlib 홈페이지)

pylab combines pyplot with numpy into a single namespace. This is convenient for interactive work, but for programming it is recommended that the namespaces be kept separate, e.g.:

 

Matplitlib.pylab = Numpy + Matplitlib.pyplot이다. 그래서 pylab을 import 하면 따로 numpy를 import할 필요가 없다. 하지만 numpy와 pyplot을 한 namespace에 import 시켜서 혼란을 가져올 수 있다. 그러므로 위와 같이 numpy, pyplot 따로 import 하는 것이 권장된다.

 

그다음은 Derivative다! 예를 들어 CNN에서는 gradient를 이용하여 descent방법으로 weight update를 진행하기 때문에 어떤 연산으로 나왔는지에 대한 정보를 담고 있는 gradient에 대한 정보를 가지고 있어야 한다. 여기서 나오는 방법이 requires_grad = True이다.

 

1

2

3

4

5

# Create a tensor x

 

x = torch.tensor(2.0, requires_grad = True)

 

print("The tensor x: ", x)

cs

1

2

3

4

# Create a tensor y according to y = x^2

 

y = x ** 2

print("The result of y = x^2: ", y)

cs

x를 제곱해서 나온 y를 출력해보니 grad_fn = <PowBackward0> 즉, y는 x의 power로 나왔다는 정보를 담고있다.

 

1

2

3

4

5

# Take the derivative. Try to print out the derivative at the value x = 2

y.backward()

print("The dervative at x = 2: ", x.grad)

cs

y.backward()를 이용해서 y를 x에 대해 미분한 값을 구해보면 x=2일 때 4가 나온다!

x와 y에 대한 여러 정보를 출력해보았다. 여기서 is_leaf라는 개념이 이해가 안가서 한가지 더 실험을 해보았다.

 

y.backward() 후에 z.backward()를 하면 안되나 보다.

y.backward()를 지우고 다시 z.backward()를 해보자.

 

z = y+2 = x**2+2 이므로 z를 x에 대해 미분하면 2*x가 나온다. 따라서 x=2일 때, z의 gradient는 4 ! 처음에는 z를 x에 대해 미분한 것이므로 print를 z.grad를 해야지 왜 x.grad를 하는지 이해가 안됐는데, 처음 시조(?) 에 grad가 저장되나보다. 그래서 y.backward()하고 z.backward()를 하면 안되는 것 같다. 둘 다 x에 관해 하니까...

 그리고 .is_leaf()는 내가 위에서 말한 시조냐 아니냐를 따지는 듯 하다.

 

Partial Derivatives도 같은 맥락이다.

 

u,v에 관한 함수 f를 만든다.
u로 편미분한 값 f
v로 편미분한 값 f

 

torch.linspace를 이용하여 여러 값을 만들어 gradient를 추적해보자!

torch.linspace를 이용하여 10개의 값을 가진 tensor x를 만들고,

각 값에 제곱을 한 tensor Y를 만든다. 출력해보면, grad_fn = <PowBackward0>으로 x를 power해서 만든 값임을 나타낸다. 또 x를 제곱한 후 다 더한 값 y를 만든다. 출력해보면 SumBackward0으로 다 sum해서 나온 값이라는 것을 알려준다. 그러고보니 여러 연산을 통해 변수를 만들면 가장 나중 것이 grad_fn에 저장된다는 것을 알 수 있다.

 

위에서 말했듯이 plt.plot시에는 .numpy()를 이용하여 numpy array로 바꿔준 뒤 진행해야 한다. 여기서 나온 detach는

https://tutorials.pytorch.kr/beginner/blitz/autograd_tutorial.html   

 

Autograd: 자동 미분 — PyTorch Tutorials 1.4.0 documentation

Note Click here to download the full example code Autograd: 자동 미분 PyTorch의 모든 신경망의 중심에는 autograd 패키지가 있습니다. 먼저 이것을 가볍게 살펴본 뒤, 첫번째 신경망을 학습시켜보겠습니다. autograd 패키지는 Tensor의 모든 연산에 대해 자동 미분을 제공합니다. 이는 실행-기반-정의(define-by-run) 프레임워크로, 이는 코드를 어떻게 작성하여 실행하느냐에 따라 역전파

tutorials.pytorch.kr

여기에 잘 나와있다. 쉽게 말해서 gradient의 추적을 따돌리기 위한 것이라고 할 수 있다.

하지만 정확히 개념이 안잡혀서 후에 한번 더 봐야겠다.

 

위의 그래프에서 x**2와 2*x의 그래프를 확인할 수 있다.

 

CNN의 대표적인 nonlinear함수인 ReLU함수 또한 그려볼 수 있다.

 

728x90
반응형

댓글