KoreanFoodie's Study

딥러닝 튜토리얼 1강, 넘파이(Numpy) 다루기 - 밑바닥부터 시작하는 딥러닝 본문

Deep Learning/밑바닥부터 시작하는 딥러닝 1

딥러닝 튜토리얼 1강, 넘파이(Numpy) 다루기 - 밑바닥부터 시작하는 딥러닝

GoldGiver 2019. 11. 3. 22:14

해당 포스팅은 한빛 미디어에서 출판한 '밑바닥부터 시작하는 딥러닝'이라는 교재의 내용을 따라가며 딥러닝 튜토리얼을 진행하고 있습니다. 관련 자료는 여기에서 찾거나 다운로드 받으실 수 있습니다.


개발 환경 갖추기

먼저, 파이썬을 설치해주자. 파이썬을 이용해 실습을 하는 과정에서, 여러 라이브러리가 필요하게 되는데, 아나콘다를 설치하면 실습에 필요한 대부분의 라이브러리가 같이 설치되어 매우 간편하다. 아래 링크에 들어가서

https://www.anaconda.com/distribution/#download-section

Python 3.7 version

이라고 적힌 곳에, 사양에 맞게 64비트 혹은 32비트를 내려받아 설치를 진행하면 된다. 이미 파이썬이 설치되어 있다면, 설치된 파이썬에 맞게 64비트, 32비트를 선택해 주자.

아나콘다를 실행한 후, VS Code로 들어가 코딩을 시작하면 된다!


넘파이 다루기

기본적인 파이썬 문법은 알고 있다고 가정하고(리스트, 딕셔너리, 함수, 클래스 정도의 개념만 알면 충분하다), 넘파이를 다루는 부분으로 바로 넘어가 보겠다.


넘파이란?

넘파이는 행렬계산을 매우 쉽게 할 수 있도록 도와주는 라이브러리이다. 예시를 통해 파이썬이 행렬 계산을 어떻게 처리하는지 알아보자.

  • 넘파이 가져오기
import numpy as np

다른 라이브러리를 가져오듯, import키워드를 통해 가져오면 된다. 이때, 모듈을 참고할 이름은 np로 정했다.

  • 넘파이 배열 생성

넘파이 배열을 만들 때는 np.array() 메서드를 사용한다.

x = np.array([1.0, 2.0, 3.0])
print(x) # result : [1. 2. 3.]
type(x) # result : <class 'numpy.ndarray'>
  • 넘파이의 산술 연산
x = np.array([1.0, 2.0, 3.0])
y = np.array([2.0, 4.0, 6.0])
x + y     # array([3., 6., 9.])
x - y     # array([-1., -2., -3.])
x * y     # array([2., 8., 18.])
x / y     # array([0.5, 0.5, 0.5])

여기서, 넘파이 배열끼리 산술연산을 수행할 때는 각 원소에 대하여 행해진다.

즉, 원소 수가 다르면 오류가 발생하므로, 원소 수를 잘 맞추어 주어야 한다!

  • 상수값과 넘파이 연산
x = np.array([1.0, 2.0, 3.0])
x / 2.0        # array([0.5, 1.0, 1.5])

상수값(스칼라 값)과 넘파이 배열과 연산을 하면, 각 배열의 원소 별로 연산이 이루어진다. 이를 브로드캐스트 라고 한다.

  • 넘파이의 N차원 배열
A = np.array([[1, 2], [3, 4]})
print(A) 
# result :
# [[1 2]
#  [3 4]]
A.shape        # (2, 2) 2x2 사이즈 행렬이다!
A.dtype        # dtype('int64')

shape은 배열의 차원수를, dtype은 배열 원소의 데이터 타입을 리턴한다.

A = np.array([[1, 2], [3, 4]})
B = np.array([[3, 0], [0, 6]})
A + B    # array([[ 4, 2],
        #         [ 3, 10]])
A * B    # array([[ 3, 0],
        #         [ 0, 24]])
A * 10    # array([[ 10, 20],
        #         [ 30, 40]])

형상이 같은 행렬끼리면 행렬의 산술 연산도 대응하는 원소별로 계산된다. 마찬가지로, 스칼라 값과 행렬값의 연산(브로드캐스트)도 가능하다.

A = np.array([[1, 2], [3, 4]})
B = np.array([10, 20])
A * B    # array([[ 10, 40],
        #         [ 30, 80]])

위의 A * B의 경우, 넘파이의 브로드캐스트 기능은 똑똑하게도 각 배열의 원소에 맞게 연산을 진행해 준다는 것을 확인해 볼 수 있다.

  • 원소 접근
A = np.array([[1, 2], [3, 4]})
A[0]        # [1, 2] -> 0행
A[0][1]        # 2    -> (0, 1) 위치의 원소
A = A.flatten()    # A를 1차원 배열로 변환(평탄화)
print(A)        # [1, 2, 3, 4]
A[np.array([0, 2])]    # 인덱스가 0, 2인 원소 얻기
print(A)        # array([1, 3])

이 기법을 응용하면 특정 조건을 만족하는 원소만 얻을 수 있다! 예시를 보자.

# A는 flatten() 작업을 통해 array([1, 2, 3, 4])가 되었습니다.
X = A > 2     # A는 array([False, False, True, True], dtype=bool) 이 된다
A[A>2]        # A는 array([3,  4]) 이 된다.

matplotlib

matplotlib는 그래프를 그려주는 라이브러리로, 그래프 그리기와 데이터 시각화를 쉽게 만들어 준다.

  • 단순한 그래프 그리기

그래프를 그리려면 matplotlib의 pyplot모듈을 사용한다. sin()함수를 한 번 그려보자.

import numpy as np
import matplotlib.pyplot as plt

# 데이터 준비
x = np.arange(0, 6, 0.1) # 0에서 6까지 0.1간격으로 생성
y = np.sin(x)

# 그래프 그리기
plt.plot(x, y)
plt.show()

다음과 같은 이미지가 그려진다!

  • pyplot의 기능

추가로, cos() 함수도 그려보자. 그리고, 제목과 각 축의 이름(레이블) 표시 등, pyplot의 다른 기능도 사용해 보자.

import numpy as np
import matplotlib.pyplot as plt

# 데이터 준비
x = np.arange(0, 6, 0.1) # 0에서 6까지 0.1간격으로 생성
y1 = np.sin(x) 
y2 = np.cos(x)

# 그래프 그리기
plt.plot(x, y1, label="sin")
plt.plot(x, y2, linestyle="--",label="cos") # cos함수는 점선으로 그리기
plt.xlabel("x") # x축 이름
plt.ylabel("y") # y축 이름
plt.title('sin & cos') # 제목
plt.legend() # 레이블 값이 적절한 위치(보통 그래프 그림 귀퉁이)에 표시되게 된다.
plt.show()

  • 이미지 표시하기

pyplot에는 이미지를 표시해주는 메서드인 imshow()도 준비되어 있다. 이미지를 읽어들일 때는 matplotlib.image 모듈의 imread() 메서드를 이용한다.

import matplotlib.pyplot as plt
from matplotlib.image import imread

img = imread('piano.png')

plt.imshow(img)
plt.show()

앞의 코드에서는 piano.png가 현재 작업 디렉터리에 있다고 가정한 것입니다. 실제 출력을 원하는 파일이 다른 위치에 있을 경우, 정확한 경로를 입력해 주어야 한다.

Comments