#!/usr/bin/env python # coding: utf-8 # # 밑바닥부터 시작하는 딥러닝 # # # Deep Learning from Scratch # # ## Github # # 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 # # 1 헬로 파이썬 # # 파이썬 사용법 간략히 소개. numpy, matplotlib # ## 1.1 파이썬이란? # # 간단하고 배우기 쉬운 프로그래밍 언어. 오픈소스. # # 영어와 유사한 문법. 불편한 컴파일 과정 없음. # # 데이터 과학 분야: 수치 계산과 통계 처리를 다루는 라이브러리. Numpy(넘파이), SciPy(사이파이) # # 딥러닝 프레임워크 API: TensorFlow(텐서플로), Caffe(카페), Chainer(체이너), Theano(테아노) # ## 1.2 파이썬 설치하기 # # PC에 설치시 주의할 점 # # ### 1.2.1 파이썬 버전 # # 이 책은 파이썬 3을 사용 # # ### 1.2.2 사용하는 외부 라이브러리 # # 딥러닝을 밑바닥부터 구현. 외부라이브러리는 최소한만 사용한다는 방침. # # 자주 사용할 외부 라이브러리: NumPy(넘파이), matplotlib # # NumPy(넘파이): 수치 계산용 라이브러리 # # matplotlib: 그래프를 그려주는 라이브러리 # # ### 1.2.3 아나콘다 배포판 # # 배포판: 사용자가 설치를 한번에 수행할 수 있도록 필요한 라이브러리 등을 하나로 정리해 둔 것. # # 아나콘다: 데이터 분석에 중점을 둔 배포판. NumPy(넘파이), matplotlib가 포함됨. # # https://www.continuum.io/downloads # ## 1.3 파이썬 인터프리터 # 파이썬 버전 확인 %%cmd # Windows python --version # In[1]: get_ipython().run_cell_magic('bash', '', '\n# Linux 또는 맥\n\npython --version\n') # python 을 입력하여 파이썬 인터프리터를 시작가능. # # '대화 모드': 개발자와 대화하듯 프로그래밍할 수 있음. # In[2]: 1 + 2 # ### 1.3.1 산술 연산 # In[3]: 1 - 2 # In[4]: 4 * 5 # In[5]: 7 / 5 # In[6]: 3 ** 2 *는 곱셈. /는 나눗셈. **는 거듭제곱을 의미. 파이썬 2에서는 정수끼리 계산한 결과는 정수. 파이썬 3에서는 정수를 나눈 결과(/)는 소수(부동소수점)가 됨. # In[7]: 7 // 5 # ### 1.3.2 자료형 # 자료형: 데이터의 성질. 정수, 소수, 문자열 등과 같은 형태가 있음. # # type() 함수로 특정 데이터의 자료형을 알 수 있음. # In[8]: type(10) # In[9]: type(2.718) # In[10]: type("Hello") # 자료형과 클래스(class)를 같은 의미로 사용하는 경우가 있음. # # "10은 int라는 클래스(자료형)다." # ### 1.3.3 변수 # 변수를 통해 계산하거나 다른값을 대입할 수 있음. # In[11]: x = 10 print(x) # In[12]: x = 100 print(x) # In[13]: y = 3.14 x * y # In[14]: type(x * y) # 파이썬은 동적언어로 분류. 변수의 자료형을 상황에 맞게 자동으로 결정. # # 정수(int) * 소수(float) = 소수(float) # ### 1.3.4 리스트 # 리스트(list) # In[15]: a = [1, 2, 3, 4, 5] # 리스트 생성 print(a) # 리스트의 내용 출력 # In[16]: len(a) # 리스트의 길이 출력 # In[17]: a[0] # 첫 원소에 접근 # In[18]: a[4] # 다섯 번째 원소에 접근 # In[19]: a[4] = 99 # 값 대입 print(a) # [] 안의 수를 인덱스(색인)라 하며 0부터 시작함. # # 슬라이싱(slicing): 부분 리스트에도 접근할 수 있음. # In[20]: a[0:2] # 인덱스 0부터 2까지 얻기(2번재는 포함하지 않는다!) # In[21]: a[1:] # 인덱스 1부터 끝까지 얻기 # In[22]: a[:3] # 처음부터 인덱스 3까지 얻기(3번째는 포함하지 않는다!) # In[23]: a[:-1] # 처음부터 마지막 원소의 1개 앞까지 얻기 # In[24]: a[:-2] # 처음부터 마지막 원소의 2개 앞까지 얻기 # a[0:2] 인덱스 0부터 1(2보다 하나 앞)까지의 원소를 꺼냄. # # 인덱스 번호 -1: 마지막 원소, -2: 끝에서 한 개 앞의 원소. # ### 1.3.5 딕셔너리 # 딕셔너리(dictionary): 키(key)와 값(value)을 한 쌍으로 저장. # In[25]: me = {'height':180} # 딕셔너리 생성 me['height'] # 원소에 접근 # In[26]: me['weight'] = 70 # 새 원소 추가 print(me) # ### 1.3.6 bool # 자료형 bool(불리언): True(참)와 False(거짓) 두 값 중 하나를 취함. # # bool에 사용할 수 있는 연산자: and, or, not # # 수치용 연산자: +, -, *, / 등. # In[27]: hungry = True # 배가 고프다. sleepy = False # 졸리지 않다. type(hungry) # In[28]: not hungry # In[29]: hungry and sleepy # 배가 고프다 그리고 졸리지 않다. # In[30]: hungry or sleepy # 배가 고프다 또는 졸리지 않다. # ### 1.3.7 if 문 # 조건에 따라 달리 처리하려면 if/else 문을 사용. # In[31]: hungry = True if hungry: print("I'm hungry") # In[32]: hungry = False if hungry: print("I'm hungry") # 들여쓰기는 공백 문자로 else: print("I'm not hungry") print("I'm sleepy") # 파이썬에서는 들여쓰기(공백 문자)가 중요한 의미를 지님 # # 들여쓰기는 지난조건(여기서는 if hungry:)이 충족될 때 실행되는 코드를 표현 # # 주의: 파이썬에서는 공백문자를 사용하는 쪽을 권장. 한 단계 더 들여 쓸 때마다 공백 4개씩 더 추가하는 것이 일반적. # ### 1.3.8 for 문 # 반복(루프) 처리에 사용. # In[33]: for i in [1,2,3]: # 리스트 등 데이터 집합의 각 원소에 차례로 접근 가능. print(i) # ### 1.3.9 함수 # 특정 기능을 수행하는 일련의 명령들을 묶어 하나의 함수로 정의 가능. # In[34]: def hello(): print("Hello World!") hello() # 함수는 인수를 취할 수 있음. + 연산자를 사용하여 문자열을 이어 붙일 수 있음. # In[35]: def hello(object): print("Hello " + object + "!") hello("cat") # 파이썬 인터프리터 종료: 리눅스 맥에서는 Ctrl+D, 윈도우즈에서는 Ctrl+Z # ## 1.4 파이썬 스크립트 파일 # 파이썬 프로그램을 파일로 저장. 그 파일을 함께 실행하는 방법이 있음. # ### 1.4.1 파일로 저장하기 # 텍스트 편집기를 열고 hungry.py 작성. #
# print("I'm hungry!")
# 
# python hungry.py를 통해 프로그램 실행 가능. #
# $ cd ~/deep-learning-from-scratch/ch01 # 디렉터리 이동
# $ python hungry.py
# I'm hungry!
# 
# ### 1.4.2 클래스 # 개발자가 직접 클래스를 정의하면 독자적인 자료형을 만들 수 있음. # # 클래스만의 전용 함수(메서드)와 속성을 정의 # #
# class 클래스이름:
#     def __init__(self, 인수, ...): # 생성자
#         ...
#     def 메서드이름1(self, 인수, ...): # 메서드 1
#         ...
#     def 메서드이름2(self, 인수, ...): # 메서드 2
#         ...
# 
# # \__init__ : 생성자(constructor). 클래스를 초기화하는 방법을 정의. 인스턴스가 만들어질 때 한 번만 불림. # # self : 자신(자신의 인스턴스)을 나타냄. 파이썬에서는 메서드의 첫 번째 인수로 self를 명시적으로 사용함. # In[36]: 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() # Man 클래스 정의. m이라는 Man 클래스의 인스턴스(객체)를 생성. # # 인스턴스 변수: 인스턴스별로 저장되는 변수. self 다음에 속성 이름을 써서 인스턴스 변수를 작성하거나 접근할 수 있음. # ## 1.5 넘파이 # numpy.array: 배열 클래스. 딥러닝 구현시 배열, 행렬 계산에 많이 사용. # # 추가 도움 교재 1(Chapter 7~13) : http://nbviewer.jupyter.org/github/jmportilla/Udemy-notes/tree/master/ # # 추가 도움 교재 2 : http://cs231n.github.io/python-numpy-tutorial # ### 1.5.1 넘파이 가져오기 # 외부 라이브러리. 포준 파이썬에는 포함되지 않는다는 뜻. # # 라이브러리를 읽기 위해 import 문을 사용. 직역하면 "numpy를 np라는 이름으로 가져와라" # In[37]: import numpy as np # ### 1.5.2 넘파이 배열 생성하기 # 배열을 만들 때 np.array() 메서드를 이용. # # 파이썬의 리스트를 인수로 받아 라이브러리가 제공하는 특수한 형태의 배열(numpy.ndarray)을 반환. # In[38]: x = np.array([1.0, 2.0, 3.0]) print(x) # In[39]: type(x) # ### 1.5.3 넘파이의 산술 연산 # In[40]: x = np.array([1.0, 2.0, 3.0]) y = np.array([2.0, 4.0, 6.0]) x + y # 원소별 덧셈 # In[41]: x - y # In[42]: x * y # 원소별 곱셈 # In[43]: x / y # 원소 수가 같다면 산술 연산은 각 원소에 대해 행해짐. # # element-wise(원소별) 곱셈(product) # # 넘파이 배열은 넘파이 배열 * 수치 하나(스칼라값)의 조합으로 된 산술 연산도 수행 가능. # # 브로드캐스트: 이 경우, 스칼라 값과의 계산이 넘파이 배열의 원소별로 한 번씩 수행. # In[44]: x = np.array([1.0, 2.0, 3.0]) x / 2.0 # ### 1.5.4 넘파이의 N차원 배열 # 다차원 배열도 작성할 수 있음. # In[45]: A = np.array([[1, 2], [3, 4]]) print(A) # In[46]: A.shape # In[47]: A.dtype # A는 2 X 2 행렬. 배열의 형상은 shape로, 원소의 자료형은 dtype로 알 수 있음. # # 행렬의 산술연산 # In[48]: B = np.array([[3, 0], [0, 6]]) A + B # In[49]: A * B # 브로드캐스트: 행렬과 스칼라 값의 산술연산도 가능. # In[50]: print(A) # In[51]: A * 10 # 형상이 같은 행렬끼리면 산술 연산도 대응하는 원소별로 계산. # # 수학에서 1차원 배열은 벡터(vector), 2차원 배열은 행렬(matrix), 백터와 행렬을 일반화한 것을 텐서(tensor)라 부름. # ### 1.5.5 브로드캐스트 # 브로드캐스트: 스칼라 값이 2 X 2 행렬로 확대된 후 연산이 이루어짐. # In[52]: from IPython.display import display, HTML broadcast = HTML("""
12
34
*
10
=
12
34
*
1010
1010
=
1020
3040
\
""" ) # 브로드캐스트 예시 display(broadcast) # In[53]: A = np.array([[1, 2], [3, 4]]) B = np.array([10, 20]) A * B # In[54]: broadcast = HTML("""
12
34
*
1020
=
12
34
*
1020
1020
=
1040
3080
\
""" ) # 브로드캐스트 예시2 display(broadcast) # ### 1.5.6 원소 접근 # 원소의 인덱스는 0부터 시작. # In[55]: X = np.array([[51, 55], [14, 19], [0, 4]]) print(X) # In[56]: X[0] # In[57]: X[0][1] # for문으로 각 원소 접근 # In[58]: for row in X: print(row) # 인덱스를 배열로 지정해 한 번에 여러 원소에 접근 가능 # In[59]: X = X.flatten() # X를 1차원 배열로 변환(평탄화) print(X) # In[60]: X[np.array([0,2,4])] # 인덱스가 0, 2, 4인 원소 얻기 # 응용하여 특정 조건을 만족하는 원소만 얻을 수 있음 # In[61]: X > 15 # In[62]: X[X>15] # X > 15 의 결과는 bool 배열 # # bool 배열을 사용해 배열 X에서 True에 해당하는 원소, 15보다 큰 원소만 꺼냄 # 파이썬에서는 빠른 성능이 요구될 경우 해당 부분을 C/C++로 구현하기도 함 # # 파이썬은 C/C++ 프로그램을 호출하는 중개자같은 역할을 함 # # 넘파이도 주된 처리는 C와 C++로 구현 # ## 1.6 matplotplib # matplotlib은 그래프 그리기를 위한 라이브러리. 그래프 그리기와 데이터 시각화를 쉽게 # ### 1.6.1 단순한 그래프 그리기 # matplotlib의 pyplot 모듈을 이용. # # sin함수 그리는 예 # In[63]: # jupyter notebook 내에 그래프 그림. get_ipython().run_line_magic('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로 그래프를 화면에 출력 # ### 1.6.2 pyplot의 기능 # cos 함수도 추가. pyplot의 다른 기능도 사용. # In[64]: 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() # ### 1.6.3 이미지 표시하기 # imshow(): pyplot의 이미지를 표시해주는 메서드 # In[65]: import matplotlib.pyplot as plt from matplotlib.image import imread img = imread('lena.png') # 이미지 읽어오기(적절한 경로를 설정하세요!) plt.imshow(img) plt.show() # ## 1.7 정리 # 처음 시작하는 파이썬(한빛미디어, 2015) # # 파이썬 라이브러리를 활용한 데이터 분석(한빛미디어, 2013) # # Scipy 강의노트(일어): http://www.turbare.net/transl/scipy-lecture-notes/index.html # 이번 장에서 배운 내용 # # 파이썬은 오픈소스. 간단하고 익히기 쉬운 프로그래밍 언어 # # 이 책은 파이썬 3 버전 사용. # # 외부 라이브러리: numpy(넘파이), matploylib # # 실행하는 방식: '인터프리터'와 '스크립트 파일' # # 함수와 클래스 같은 모듈로 구현을 정리가능. # # numpy(넘파이)는 다차원 배열을 다루는 편리한 메서드를 많이 제공. # * 출처 # 이미지 출처 1: https://www.cosy.sbg.ac.at/~pmeerw/Watermarking/lena.html