'밑바닥부터 시작하는 딥러닝' 카테고리에는 사이토 고키의 '밑바닥부터 시작하는 딥러닝' 책을 정리하도록 하겠다.
1.1 파이썬이란?
● 파이썬
파이썬은 간단하고 배우기 쉬운 프로그래밍 언어로, 오픈 소스여서 무료로 이용 가능하고 영어와 유사한 문법으로 비교적 익숙하며 컴파일 과정이 없어서 편리하다. 읽기 쉽고 성능도 뛰어나고 데이터가 많거나 빠른 응답이 필요할 경우에도 적합하다. 기계학습과 데이터 과학 분야에서 널리 쓰이고, 넘파이(Numpy)와 사이파이(Scipy)와 자주 함께 쓰인다. 카페(Caffe), 텐서플로(Tensorflow), 체이너(Chainer), 테아노(Theano) 등의 유명 딥러닝 프레임워크에서 파이썬용 API를 제공한다.
● 자주 사용하는 외부 라이브러리
이 책은 밑바닥부터 딥러닝을 구현하는 것을 목표로 하기 때문에 최소의 외부 라이브러리를 사용하고, 그 중 가장 자주 사용하는 것은 아래의 numpy, matplotlib이다.
▶ 넘파이(Numpy)
수치 계산용 라이브러리. 고도의 수학 알고리즘과 배열(행렬)을 조작하기 위한 편리한 메서드가 많이 준비되어 있어서, 딥러닝을 효율적으로 구현하기 좋다.
▶ Matplotlib
그래프를 그려주는 라이브러리. 실험 결과를 시각화하거나 딥러닝 실행 과정의 중간 데이터를 시각적으로 확인할 수 있다.
1.3 파이썬 인터프리터
파이썬 설치 과정은 생략하겠다. 설치에 도움이 되는 설명을 주자면, 아나콘다(Anaconda)라는 배포판을 사용하는 것이 좋은데, 배포판이란 사용자가 설치를 한 번에 수행할 수 있도록 필요한 라이브러리 등을 하나로 정리해둔 것으로, 그 중 아나콘다는 데이터 분석에 중점을 두었다.
설치한 파이썬 버전을 확인하려면 터미널(윈도우에서는 명령 프롬프트)에서 python --version을 입력해서 확인 가능하다. Python 3.x.x라 표시되면 파이썬 3이 잘 설치된 것이고 이어서 python이라고 입력하면 파이썬 인터프리터를 시작할 수 있다. 파이썬 인터프리터는 대화 모드로, 개발자와 파이썬이 대화하듯 프로그래밍할 수 있다. 파이썬 인터프리터를 종료하려면 리눅스나 맥에서는 ctrl+D, 윈도우에서는 ctrl +z + enter 키를 누르면 된다.
● 산술 연산
*는 곱셈, /는 나눗셈, **는 거듭제곱으로 연산 가능하다. 파이썬에서 정수끼리 계산한 결과는 정수이고, 정수를 나눈 결과는 부동소수점 실수가 된다.
● 자료형
자료형(data type)은 데이터의 성질을 나타내는 것으로, 정수, 실수, 문자열 등이 있겠다. type() 함수로 특정 데이터의 자료형을 알아볼 수 있고, 자료형과 클래스(class)라는 말을 같은 의미로 사용한다.
● 변수
알파벳과 숫자를 사용하여 변수(variable)을 정의할 수 있고, 이 변수를 사용하여 계산하거나 변수에 다른 값을 대입할 수 있다.
파이썬은 동적 프로그래밍 언어로, 변수의 자료형을 상황에 맞게 자동으로 결정해준다. 자동 형변환도 수행해서 정수와 실수를 곱한 결과가 실수가 된다. #는 주석의 시작을 알리는 문자로, # 이후의 문자는 모두 무시한다.
● 리스트
리스트(List)는 여러 데이터를 정리할 수 있게 도와준다.
원소에 접근할 때는 a[0]의 형식으로 가능한데, [] 안의 수를 인덱스(색인)이라고 하며 인덱스는 0부터 시작한다.
파이썬 인덱스에는 슬라이싱(slicing)이 있어서 범위를 지정해 원하는 부분 리스트를 얻을 수 있다.
-1은 마지막 원소, -2는 끝에서 한 개 앞의 원소에 해당한다.
● 딕셔너리
위에서 설명한 리스트는 0부터 시작하는 인덱스 순으로 값을 저장하는데, 딕셔너리(dictionary)는 키(key)와 값(value)를 한 쌍으로 저장한다. 이름 그대로 영한사전처럼 단어와 그 의미를 짝지어 저장하는 형태이다.
● bool
bool이라는 자료형은 불 또는 불리언이라고 읽으며, True(참)과 False(거짓)라는 두 값 중 하나를 취한다.
and, or, not 연산자를 사용할 수 있다.
● if문
조건에 따라서 달리 처리하려면 if / else문을 사용할 수 있다.
위와 같이 if 다음에 나온 것이 true이면 바로 아래의 코드를 실행하고, false라면 그 아래의 else로 빼놓은 코드가 실행된다. 여기서 또한 주목해야할 점은 공백 문자가 블록으로 코드를 구분해주는 역할을 한다는 점이다.
공백 대신 탭(tab) 문자를 써도 되지만 파이썬에서는 4개의 공백을 쓰는 것을 권장한다.
● for문
for문은 반복(루프) 처리하는 데 사용된다.
위의 예에서는 [1, 2, 3]의 리스트 안의 원소를 차례대로 출력하게 되고, 리스트 등 데이터 집합의 각 원소에 차례로 접근 가능하다.
● for문
함수(function)으로 특정 기능을 수행하는 일련의 명령들을 묶을 수 있다.
함수는 인수를 취할 수 있고, + 연산자로 문자열을 이어붙일 수 있다.
1.4 파이썬 스크립트 파일
위에서 설명한 파이썬 인터프리터는 대화식으로 간단한 실험을 하기에는 편리하지만 긴 작업을 할 때는 파이썬 프로그램을 파일로 저장하고 그 파일을 (함께) 실행하는 방법이 있다.
● 파일로 저장
파이썬 스크립트 파일을 생성하는 과정을 보겠다.
위와 같은 내용을 담은 hungry.py 파일을 생성한 뒤 터미널에서 해당 파일을 저장한 디렉토리로 이동한 뒤
python hungry.py로 python 명령을 실행한다.
● 파일로 저장
위에서 독자적인 자료형으로 데이터를 지정했듯이 이번에는 클래스로 독자적인 자료형을 만드는 것을 알아보도록 하겠다. 클래스에는 그 클래스만의 전용 함수(메서드)와 속성을 정의하는 것도 가능하다.
클래스에 있는 __init__이라는 메서드는 클래스를 초기화하는 방법을 정의하는데, 이 초기화용 메서드를
생성자(constructor)이라고 하고, 클래스의 인스턴스가 만들어질 때 한 번만 불린다.
파이썬에서는 메서드의 첫 번째 인수로 자신(자신의 인스턴스)을 나타내는 self를 명시적으로 쓰는 것이 특징이다.
Man이라는 클래스를 만든 뒤 m이라는 인스턴스(객체)를 생성한다. Man의 생성자(초기화 메서드)는 name이라는 인수를 받고, 그 인수로 인스턴스 변수인 self.name을 초기화한다. 인스턴스 변수는 인스턴스별로 저장되는 변수로, self.name처럼 self 다음에 속성 이름을 써서 인스턴스 변수를 작성하거나 접근할 수 있다.
1.4 파이썬 스크립트 파일
● 넘파이 가져오기
넘파이의 배열 클래스인 numpy.array에는 배열이나 행렬 연산을 할 수 있는 편리한 메서드가 많이 준비되어 있어서 딥러닝을 구현할 때 이용할 수 있다.
numpy는 외부 라이브러리이기 때문에 위와 같이 가져오고, 위의 문장의 뜻은 numpy를 np라는 이름을 가져오라는 것이다.
● 넘파이 배열 생성하기
넘파이 배열을 만들기 위해서는 np.arrary() 메서드를 사용할 수 있는데, np.array()는 파이썬의 리스트를 인수로 받아 넘파이 라이브러리가 제공하는 특수한 형태의 배열(numpy.ndarray)를 반환한다.
● 넘파이의 산술 연산
위와 같이 넘파이 배열로 산술 연산을 수행할 수 있고, 여기에서 보듯이 배열 x와 y의 원소 수가 같아야지 가능한데, 원소별(element-wise) 연산을 하기 때문이다.
넘파이 배열은 이렇게 원소별 계산뿐 아니라 넘파이 배열과 수치 하나(스칼라값)의 조합으로 된 산술 연산도 수행 가능하다. 이 때 스칼라값과의 계산이 넘파이 배열의 원소별로 한 번씩 수행되고 이것을 브로드캐스트라고 한다.
● 넘파이의 N차원 배열
넘파이는 1줄로 늘어선 배열인 1차원 배열뿐만 아니라 다차원 배열도 작성할 수 있다. 2차원 배열의 예는 위와 같다. shape으로는 행렬의 형상을 알 수 있고, dtype으로는 행렬에 담긴 원소의 자료형을 알 수 있다.
형상이 같은 행렬끼리면 행렬의 산술 연산도 대응하는 원소별로 계산되고, 행렬과 스칼라값의 산술 연산도 가능하다. 이 때는 배열과 마찬가지로 브로드캐스트가 된다.
1차원 배열은 벡터(vector), 2차원 배열은 행렬(matrix), 벡터와 행렬을 일반화한 것을 텐서(tensor)라고 한다.
● 브로드캐스트
넘파이에서는 형상이 다른 배열끼리도 계산할 수 있는데, 스칼라값이 더 큰 행렬로 확대된 후 연산이 이뤄지는 게 그 예에 속한다.
그 뿐만 아니라 위와 같이 행렬끼리에도 브로드캐스트가 적용이 될 수 있다.
● 원소 접근
원소에 접근하려면 위와 같이 하면 된다.
for문으로도 각 원소에 접근할 수 있다.
인덱스를 배열로 지정해 한 번에 여러 원소에 접근할 수도 있다.
넘파이 배열에 부등호 연산자를 사용한 결과는 bool 배열이다. 여기에서는 이 bool 배열을 사용해 배열 X에서 True에 해당하는 원소, 즉 값이 15보다 큰 원소만 꺼낸다.
1.4 파이썬 스크립트 파일
● 단순한 그래프 그리기
matplotlib은 그래프를 그려주는 라이브러리로, 딥러닝에서 그래프 그리기와 데이터 시각화에 쓰인다.
위의 코드에서는 numpy의 arange 메서드로 [0, 0.1, 0.2, ..., 5.8, 5.9]라는 데이터를 생성하여 변수 x에 할당하고, x의 각 원소에 넘파이의 sin 함수인 np.sin()을 적용하여 변수 y에 할당한다.
그 후 x와 y를 plt.plot() 메서드를 호출하여 그래프를 그리고 plt.show() 함수로 그래프를 화면에 출력한다.
● pyplot의 기능
위에서 그린 sin 함수에 더해서 cos 함수도 그리고 제목과 각 축의 이름(레이블) 표시 등 pyplot에는 다양한 기능들이 있다.
● pyplot의 기능
pyplot에는 이미지를 표시해주는 메서드인 imshow()가 있다. matplotlib.image 모듈의 imread() 메서드로 이미지를 읽어들일 수 있다.
다음 시간에는 퍼셉트론에 대해서 알아보도록 하겠다