https://github.com/WegraLee/deep-learning-from-scratch
http://nbviewer.jupyter.org/github/SDRLurker/deep-learning/blob/master/%EB%AA%A9%EC%B0%A8.ipynb
파이썬 사용법 간략히 소개. numpy, matplotlib
간단하고 배우기 쉬운 프로그래밍 언어. 오픈소스.
영어와 유사한 문법. 불편한 컴파일 과정 없음.
데이터 과학 분야: 수치 계산과 통계 처리를 다루는 라이브러리. Numpy(넘파이), SciPy(사이파이)
딥러닝 프레임워크 API: TensorFlow(텐서플로), Caffe(카페), Chainer(체이너), Theano(테아노)
PC에 설치시 주의할 점
이 책은 파이썬 3을 사용
딥러닝을 밑바닥부터 구현. 외부라이브러리는 최소한만 사용한다는 방침.
자주 사용할 외부 라이브러리: NumPy(넘파이), matplotlib
NumPy(넘파이): 수치 계산용 라이브러리
matplotlib: 그래프를 그려주는 라이브러리
배포판: 사용자가 설치를 한번에 수행할 수 있도록 필요한 라이브러리 등을 하나로 정리해 둔 것.
아나콘다: 데이터 분석에 중점을 둔 배포판. NumPy(넘파이), matplotlib가 포함됨.
파이썬 버전 확인
%%bash
# Linux 또는 맥
python --version
Python 3.5.2 :: Anaconda 4.1.1 (x86_64)
python 을 입력하여 파이썬 인터프리터를 시작가능.
'대화 모드': 개발자와 대화하듯 프로그래밍할 수 있음.
1 + 2
3
1 - 2
-1
4 * 5
20
7 / 5
1.4
3 ** 2
9
7 // 5
1
type(10)
int
type(2.718)
float
type("Hello")
str
자료형과 클래스(class)를 같은 의미로 사용하는 경우가 있음.
<class 'int'> "10은 int라는 클래스(자료형)다."
변수를 통해 계산하거나 다른값을 대입할 수 있음.
x = 10
print(x)
10
x = 100
print(x)
100
y = 3.14
x * y
314.0
type(x * y)
float
파이썬은 동적언어로 분류. 변수의 자료형을 상황에 맞게 자동으로 결정.
정수(int) * 소수(float) = 소수(float)
리스트(list)
a = [1, 2, 3, 4, 5] # 리스트 생성
print(a) # 리스트의 내용 출력
[1, 2, 3, 4, 5]
len(a) # 리스트의 길이 출력
5
a[0] # 첫 원소에 접근
1
a[4] # 다섯 번째 원소에 접근
5
a[4] = 99 # 값 대입
print(a)
[1, 2, 3, 4, 99]
[] 안의 수를 인덱스(색인)라 하며 0부터 시작함.
슬라이싱(slicing): 부분 리스트에도 접근할 수 있음.
a[0:2] # 인덱스 0부터 2까지 얻기(2번재는 포함하지 않는다!)
[1, 2]
a[1:] # 인덱스 1부터 끝까지 얻기
[2, 3, 4, 99]
a[:3] # 처음부터 인덱스 3까지 얻기(3번째는 포함하지 않는다!)
[1, 2, 3]
a[:-1] # 처음부터 마지막 원소의 1개 앞까지 얻기
[1, 2, 3, 4]
a[:-2] # 처음부터 마지막 원소의 2개 앞까지 얻기
[1, 2, 3]
a[0:2] 인덱스 0부터 1(2보다 하나 앞)까지의 원소를 꺼냄.
인덱스 번호 -1: 마지막 원소, -2: 끝에서 한 개 앞의 원소.
딕셔너리(dictionary): 키(key)와 값(value)을 한 쌍으로 저장.
me = {'height':180} # 딕셔너리 생성
me['height'] # 원소에 접근
180
me['weight'] = 70 # 새 원소 추가
print(me)
{'weight': 70, 'height': 180}
자료형 bool(불리언): True(참)와 False(거짓) 두 값 중 하나를 취함.
bool에 사용할 수 있는 연산자: and, or, not
수치용 연산자: +, -, *, / 등.
hungry = True # 배가 고프다.
sleepy = False # 졸리지 않다.
type(hungry)
bool
not hungry
False
hungry and sleepy # 배가 고프다 그리고 졸리지 않다.
False
hungry or sleepy # 배가 고프다 또는 졸리지 않다.
True
조건에 따라 달리 처리하려면 if/else 문을 사용.
hungry = True
if hungry:
print("I'm hungry")
I'm hungry
hungry = False
if hungry:
print("I'm hungry") # 들여쓰기는 공백 문자로
else:
print("I'm not hungry")
print("I'm sleepy")
I'm not hungry I'm sleepy
파이썬에서는 들여쓰기(공백 문자)가 중요한 의미를 지님
들여쓰기는 지난조건(여기서는 if hungry:)이 충족될 때 실행되는 코드를 표현
주의: 파이썬에서는 공백문자를 사용하는 쪽을 권장. 한 단계 더 들여 쓸 때마다 공백 4개씩 더 추가하는 것이 일반적.
반복(루프) 처리에 사용.
for i in [1,2,3]: # 리스트 등 데이터 집합의 각 원소에 차례로 접근 가능.
print(i)
1 2 3
특정 기능을 수행하는 일련의 명령들을 묶어 하나의 함수로 정의 가능.
def hello():
print("Hello World!")
hello()
Hello World!
함수는 인수를 취할 수 있음. + 연산자를 사용하여 문자열을 이어 붙일 수 있음.
def hello(object):
print("Hello " + object + "!")
hello("cat")
Hello cat!
파이썬 인터프리터 종료: 리눅스 맥에서는 Ctrl+D, 윈도우즈에서는 Ctrl+Z
파이썬 프로그램을 파일로 저장. 그 파일을 함께 실행하는 방법이 있음.
텍스트 편집기를 열고 hungry.py 작성.
print("I'm hungry!")
python hungry.py를 통해 프로그램 실행 가능.
$ cd ~/deep-learning-from-scratch/ch01 # 디렉터리 이동 $ python hungry.py I'm hungry!
개발자가 직접 클래스를 정의하면 독자적인 자료형을 만들 수 있음.
클래스만의 전용 함수(메서드)와 속성을 정의
class 클래스이름: def __init__(self, 인수, ...): # 생성자 ... def 메서드이름1(self, 인수, ...): # 메서드 1 ... def 메서드이름2(self, 인수, ...): # 메서드 2 ...
__init__ : 생성자(constructor). 클래스를 초기화하는 방법을 정의. 인스턴스가 만들어질 때 한 번만 불림.
self : 자신(자신의 인스턴스)을 나타냄. 파이썬에서는 메서드의 첫 번째 인수로 self를 명시적으로 사용함.
class Man:
def __init__(self, name):
self.name = name
print("Initialized!")
def hello(self):
print("Hello " + self.name + "!")
def goodbye(self):
print("Good-bye " + self.name + "!")
m = Man("David")
m.hello()
m.goodbye()
Initialized! Hello David! Good-bye David!
Man 클래스 정의. m이라는 Man 클래스의 인스턴스(객체)를 생성.
인스턴스 변수: 인스턴스별로 저장되는 변수. self 다음에 속성 이름을 써서 인스턴스 변수를 작성하거나 접근할 수 있음.
numpy.array: 배열 클래스. 딥러닝 구현시 배열, 행렬 계산에 많이 사용.
추가 도움 교재 1(Chapter 7~13) : http://nbviewer.jupyter.org/github/jmportilla/Udemy-notes/tree/master/
추가 도움 교재 2 : http://cs231n.github.io/python-numpy-tutorial
외부 라이브러리. 포준 파이썬에는 포함되지 않는다는 뜻.
라이브러리를 읽기 위해 import 문을 사용. 직역하면 "numpy를 np라는 이름으로 가져와라"
import numpy as np
배열을 만들 때 np.array() 메서드를 이용.
파이썬의 리스트를 인수로 받아 라이브러리가 제공하는 특수한 형태의 배열(numpy.ndarray)을 반환.
x = np.array([1.0, 2.0, 3.0])
print(x)
[ 1. 2. 3.]
type(x)
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])
원소 수가 같다면 산술 연산은 각 원소에 대해 행해짐.
element-wise(원소별) 곱셈(product)
넘파이 배열은 넘파이 배열 * 수치 하나(스칼라값)의 조합으로 된 산술 연산도 수행 가능.
브로드캐스트: 이 경우, 스칼라 값과의 계산이 넘파이 배열의 원소별로 한 번씩 수행.
x = np.array([1.0, 2.0, 3.0])
x / 2.0
array([ 0.5, 1. , 1.5])
다차원 배열도 작성할 수 있음.
A = np.array([[1, 2], [3, 4]])
print(A)
[[1 2] [3 4]]
A.shape
(2, 2)
A.dtype
dtype('int64')
A는 2 X 2 행렬. 배열의 형상은 shape로, 원소의 자료형은 dtype로 알 수 있음.
행렬의 산술연산
B = np.array([[3, 0], [0, 6]])
A + B
array([[ 4, 2], [ 3, 10]])
A * B
array([[ 3, 0], [ 0, 24]])
브로드캐스트: 행렬과 스칼라 값의 산술연산도 가능.
print(A)
[[1 2] [3 4]]
A * 10
array([[10, 20], [30, 40]])
형상이 같은 행렬끼리면 산술 연산도 대응하는 원소별로 계산.
수학에서 1차원 배열은 벡터(vector), 2차원 배열은 행렬(matrix), 백터와 행렬을 일반화한 것을 텐서(tensor)라 부름.
브로드캐스트: 스칼라 값이 2 X 2 행렬로 확대된 후 연산이 이루어짐.
from IPython.display import display, HTML
broadcast = HTML("""
<div style="float: left; ">
<table><tr><td>1</td><td>2</td></tr><td>3</td><td>4</td></tr></table>
</div>
<div style="float: left;"> * </div>
<div style="float: left;"> <table><tr><td>10</td></tr></table> </div>
<div style="float: left;"> = </div>
<div style="float: left;">
<table><tr><td>1</td><td>2</td></tr><td>3</td><td>4</td></tr></table>
</div>
<div style="float: left;"> * </div>
<div style="float: left;">
<table><tr><td>10</td><td><font color="gray">10</font></td></tr><td><font color="gray">10</font></td><td><font color="gray">10</font></td></tr></table>
</div>
<div style="float: left;"> = </div>
<div>
<table><tr><td>10</td><td>20</td></tr><td>30</td><td>40</td></tr></table>\
</div>
"""
)
# 브로드캐스트 예시
display(broadcast)
1 | 2 | 3 | 4 |
10 |
1 | 2 | 3 | 4 |
10 | 10 | 10 | 10 |
10 | 20 | 30 | 40 |
A = np.array([[1, 2], [3, 4]])
B = np.array([10, 20])
A * B
array([[10, 40], [30, 80]])
broadcast = HTML("""
<div style="float: left; ">
<table><tr><td>1</td><td>2</td></tr><td>3</td><td>4</td></tr></table>
</div>
<div style="float: left;"> * </div>
<div style="float: left;"> <table><tr><td>10</td><td>20</td></tr></table> </div>
<div style="float: left;"> = </div>
<div style="float: left;">
<table><tr><td>1</td><td>2</td></tr><td>3</td><td>4</td></tr></table>
</div>
<div style="float: left;"> * </div>
<div style="float: left;">
<table><tr><td>10</td><td>20</font></td></tr><td><font color="gray">10</font></td><td><font color="gray">20</font></td></tr></table>
</div>
<div style="float: left;"> = </div>
<div>
<table><tr><td>10</td><td>40</td></tr><td>30</td><td>80</td></tr></table>\
</div>
"""
)
# 브로드캐스트 예시2
display(broadcast)
1 | 2 | 3 | 4 |
10 | 20 |
1 | 2 | 3 | 4 |
10 | 20 | 10 | 20 |
10 | 40 | 30 | 80 |
원소의 인덱스는 0부터 시작.
X = np.array([[51, 55], [14, 19], [0, 4]])
print(X)
[[51 55] [14 19] [ 0 4]]
X[0]
array([51, 55])
X[0][1]
55
for문으로 각 원소 접근
for row in X:
print(row)
[51 55] [14 19] [0 4]
인덱스를 배열로 지정해 한 번에 여러 원소에 접근 가능
X = X.flatten() # X를 1차원 배열로 변환(평탄화)
print(X)
[51 55 14 19 0 4]
X[np.array([0,2,4])] # 인덱스가 0, 2, 4인 원소 얻기
array([51, 14, 0])
응용하여 특정 조건을 만족하는 원소만 얻을 수 있음
X > 15
array([ True, True, False, True, False, False], dtype=bool)
X[X>15]
array([51, 55, 19])
X > 15 의 결과는 bool 배열
bool 배열을 사용해 배열 X에서 True에 해당하는 원소, 15보다 큰 원소만 꺼냄
파이썬에서는 빠른 성능이 요구될 경우 해당 부분을 C/C++로 구현하기도 함
파이썬은 C/C++ 프로그램을 호출하는 중개자같은 역할을 함
넘파이도 주된 처리는 C와 C++로 구현
matplotlib은 그래프 그리기를 위한 라이브러리. 그래프 그리기와 데이터 시각화를 쉽게
# jupyter notebook 내에 그래프 그림.
%matplotlib inline
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()
넘파이의 arange 메서드로 [0, 0.1, 0.2, ..., 5.8, 5.9] 데이터를 생성하여 x에 할당
x의 각 원소에 np.sin 함수를 적용하여 변수 y에 할당
x와 y를 인수로 plt.plot을 호출해 그래프를 그림
plt.show로 그래프를 화면에 출력
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()
imshow(): pyplot의 이미지를 표시해주는 메서드
import matplotlib.pyplot as plt
from matplotlib.image import imread
img = imread('lena.png') # 이미지 읽어오기(적절한 경로를 설정하세요!)
plt.imshow(img)
plt.show()
처음 시작하는 파이썬(한빛미디어, 2015)
파이썬 라이브러리를 활용한 데이터 분석(한빛미디어, 2013)
Scipy 강의노트(일어): http://www.turbare.net/transl/scipy-lecture-notes/index.html
이번 장에서 배운 내용
파이썬은 오픈소스. 간단하고 익히기 쉬운 프로그래밍 언어
이 책은 파이썬 3 버전 사용.
외부 라이브러리: numpy(넘파이), matploylib
실행하는 방식: '인터프리터'와 '스크립트 파일'
함수와 클래스 같은 모듈로 구현을 정리가능.
numpy(넘파이)는 다차원 배열을 다루는 편리한 메서드를 많이 제공.