이 책의 목표
- '합성곱 산경망(CNN, Convolution Neural Network)' 구조 이해
- CNN을 이용한 필기 문자(숫자) 분류 처리 원리 파악 및 코드 작성
텐서플로 공식 웹 사이트 튜토리얼 중 'Deep MNIST for Exports' 기반의 내용
1장 목표
- 딥러닝과 텐서플로의 개요 소개
- 텐서플로 코드 실행 환경 준비
- 텐서플로의 기본적인 코드 작성법 설명
딥러닝
머신러닝
데이터의 모델화
ex) 특정 도시의 올해 1년간 월별 평균 기온으로 내년 월별 평균 기온 예측
파라미터의 값이 구체적으로 결정되면 얻어진 식으로 내년 이후 평균 기온 예측 가능
미지의 데이터에 대한 예측 정밀도를 향상하기 위해 최적의 모델(예측용 식)을 발견하는 것이 머신러닝을 활용하는 데이터 과학자의 능력 발휘 부분
=========================================
🎈머신 러닝 모델의 3단계🎈
주어진 데이터를 기반으로 미지의 데이터를 예측하는 식 생각
식에 포함된 파라미터의 좋고 나쁨을 판단하는 오차 함수 준비
오차함수를 최소화할 수 있도록 파라미터 값 결정
==========================================
ex) 특정 바이러스에 감염되었는지 판정하기
검사결과는 (, )로 주어짐 -> 두가지 수치를 기반으로 바이러스 감염 확률 를 구해야 함
직선을 기준으로 오른쪽 위 영역은 감염되었을 확률이 높다.
직선 -
이 형식의 장점
1. 이 경계가 됨
2. 경계에서 멀어질수록 값이 무한대를 향해 증가, 감소하는 성질을 나타냄
==> 머신러닝 모델의 3단계 중 1단계
여기서 위의 모델은 주어진 데이터를 직선으로 분류했지만 보다 복잡한 데이터 배치는 곡선 또는 더욱 복잡한 수식으로 분류해야 한다.
현재 머신러닝은 데이터의 모델(1단계의 식)은 사람이 생각해 내야하므로 가능한 한 유연성이 높은 수식을 생각해 내려는 노력 중의 하나가 [신경망] 이다.
신경망
딥러닝의 등장 배경
딥러닝
딥러닝의 예시
1. 최초의 입력이 이미지 데이터일 경우
딥러닝의 이면에는 최적의 네트위크를 구성해 가는 시행착오가 숨겨져 있다.
아무리 잘 만들어진 모델이라도 실제로 계산할 수 없다면 활용할 수 없기 때문에 각각의 네트워크에 대해 효율적으로 파라미터를 최적화하는 알고리즘 연구가 필요하다.
텐서플로는 경사 하강법을 사용해 오차함수의 파라미터 값을 결정한다.
경사 하강법
변수의 개수가 늘어나도 같은 방식을 사용하는데 이것이 매우 복잡해지기 때문에 이 부분을 자동화하는 것이 딥러닝에서 텐서플로의 역할이다.
텐서플로의 특징
1. 복잡한 신경망에 대해 편미분을 계산하고 기울기 벡터를 결정하며, 혹은 결정한 기울기 벡터를 이용해 경사 하강법으로 파라미터를 최적화하는 식의 알고리즘이 사전에 마련되어 있다.
2. 합성곱 필터나 풀링 계층에 해당하는 함수가 미리 준비되어 있다.
이 책에서는 CentOS 7을 사용해 주피터를 사용하고 있지만 이 글에서는 Google Colab을 사용한다.
Colab의 장점
1. 머신러닝 과정에서 필요한 메모리와 GPU를 구글에서 제공하는 무료 자원으로 사용 가능하다.
2. 기본적으로 Tensorflow, Pytorch등이 설치되어 있어 환경 세팅의 번거로움이 없다.
하지만 파이썬만 실행 가능하다.
!git clone https://github.com/Jpub/TensorflowDeeplearning jupyter_tfbook
from google.colab import drive
drive.mount('/content/drive')
!mv jupyter_tfbook/ ./drive/MyDrive/
텐서플로에서는 계산에 사용하는 데이터를 모두 다차원 배열로 표현
실제 텐서플로 코드로 표현해보자.
위 책의 텐서플로는 버전1이며 현재 코랩에서는 텐서플로 버전2를 사용하기 때문에
import tensorflow.compat.v1 as tf
tf.disable_v2_behavior()
코드를 추가해야 한다.
import tensorflow.compat.v1 as tf
tf.disable_v2_behavior()
import numpy as np
import matplotlib.pyplot as plt
x = tf.placeholder(tf.float32, [None, 5])
w = tf.Variable(tf.zeros([5,1]))
y = tf.matmul(x, w) #matmul은 행렬을 곱하는 함수
t = tf.placeholder(tf.float32, [None, 1]) #실제 관측된 기온
loss = tf.reduce_sum(tf.square(y-t)) #오차 함수
train_step = tf.train.AdamOptimizer().minimize(loss)
#adam optimizer을 사용해 학습률을 자동으로 조절
#.minimize(loss)는 loss를 오차 함수로 해서 이를 최소화하도록 명령
sess = tf.Session()
sess.run(tf.initialize_all_variables()) #텐서플로 v2에선 세션 필요 없음
train_t = np.array([5.2, 5.7, 8.6, 14.9, 18.2, 20.4,
25.5, 26.4, 22.8, 17.5, 11.1, 6.6]) #실제 관측된 데이터
train_t = train_t.reshape([12,1])
train_x = np.zeros([12, 5])
for row, month in enumerate(range(1, 13)):
for col, n in enumerate(range(0, 5)):
train_x[row][col] = month**n
#경사 하강법으로 파라미터 최적화
#앞의 train_step 트레이닝 알고리즘을 통해 Variable에 해당하는 변수보정 10만회 반복
#feed_dict옵션 : Placeholder에 구체적인 값 설정
i = 0
for _ in range(100000):
i += 1
sess.run(train_step, feed_dict={x:train_x, t:train_t})
if i % 10000 == 0:
loss_val = sess.run(loss, feed_dict={x:train_x, t:train_t})
print ('Step: %d, Loss: %f' % (i, loss_val))
#앞에 나온 결과를 이용해 예측 기온을 계산
w_val = sess.run(w)
def predict(x):
result = 0.0
for n in range(0, 5):
result += w_val[n][0] * x**n
return result
#함수를 그래프로 나타냄
fig = plt.figure()
subplot = fig.add_subplot(1,1,1)
subplot.set_xlim(1,12)
subplot.scatter(range(1,13), train_t)
linex = np.linspace(1,12,100)
liney = predict(linex)
subplot.plot(linex, liney)