본문 바로가기

[머신러닝 야학/2기] Tensorflow (python) 수업 정리

Tensorflow (python)

 

올해 1월 4일부터 15일까지 구글과 생활코딩이 함께 하는 머신러닝 야학에 참여해 텐서플로우 수업을 들었습니다. 수준에 맞게, 사용하는 언어에 맞게 여러 수업이 열린다는 점이 좋았고 텐서플로우 복습할 겸 들었던 건데 생각보다 많이 얻어간 수업이었습니다. 예를 들면 원래 activation 함수로 relu를 많이 썼는데, 이번 수업을 통해 처음으로 swish를 알게 되었습니다.

 

생활코딩도 이번에 처음 알게 되었는데, 이미 유명한 비영리 교육 프로젝트라고 하네요! 아무튼 머신러닝 야학에 대한 정보는 이 정도로 간단히 얘기하고 혹시 더 궁금하신 분들은 위의 머신러닝 야학 사이트나 아래 수업 링크에 자세히 나와있으니 참고하시면 될 것 같습니다. 강의는 무료로 진행되고 머신러닝 야학 2기는 끝났지만 강의는 언제든지 다시 들을 수 있습니다.

 

다음은 머신러닝 야학에서 텐서플로우 강의인 <Tensorflow (python)>을 학습하고 요약정리한 내용입니다. 강의 내용을 기반으로 요약하되, 보충 설명이 필요한 경우 <밑바닥부터 시작하는 딥러닝>이라는 책을 참고했습니다.

오리엔테이션


기계학습의 종류

그중에서도 이번 수업에서는 tensorflow로 분류 문제와 회귀 문제를 풀 예정입니다.

 

 • Neural Network(= 인공신경망)을 깊게 쌓은 것 → 딥러닝

 • 딥러닝 라이브러리: Tensorflow, Pytorch, Caffe2, theano 등

지도 학습의 빅픽쳐


지도 학습의 과정은 다음 4단계로 이루어집니다.

 

1. 과거의 데이터를 준비합니다.

원인(독립변수)과 결과(종속변수) 인식

2. 모델의 구조를 만듭니다.

3. 데이터로 모델을 학습(fit)합니다.

4. 모델을 이용합니다.

표를 다루는 도구 '판다스'


pandas 라이브러리를 이용해 표를 다루는 법을 배웁니다.

 

 • 파일 읽어오기: pd.read_csv('경로/파일명.csv')

 • 모양 확인하기: print(데이터.shape)

 • 칼럼 선택하기: 데이터[['칼럼명1', '칼럼명2', '칼럼명3']]

 • 칼럼 이름 출력하기: print(데이터.columns)

 • 맨 위 5개 관측치 출력하기: 데이터.head()

첫 번째 딥러닝 - 레모네이드 판매 예측


앞서 배운 지도 학습의 과정을 따라 레모네이드 판매를 예측해봅니다.

참고로 독립변수 하나로 이루어진 단순 회귀 문제입니다.

 

1. 과거의 데이터를 준비합니다.

레모네이드 = pd.read_csv('lemonade.csv')

독립 = 레모네이드[['온도']]

종속 = 레모네이드[['판매량']]

 

print(독립.shape, 종속.shape) # shape을 꼭 확인하여 아래 input과 output 맞춰주기!

 

2. 모델의 구조를 만듭니다.

X = tf.keras.layers.Input(shape=[1])

Y = tf.keras.layers.Dense(1)(X)

model = tf.keras.models.Model(X, Y)

model.compile(loss='mse')

 

3. 데이터로 모델을 학습(fit)합니다.

model.fit(독립, 종속, epochs=1000)

 

4. 모델을 이용합니다.

print("Predictions: ", model.predict([[15]]))

두 번째 딥러닝 - 보스턴 집값 예측


앞서 배운 지도 학습의 과정을 따라 보스턴 집값을 예측해봅니다.

참고로 독립변수 여러 개로 이루어진 다중 회귀 문제입니다.

 

1. 과거의 데이터를 준비합니다.

보스턴 = pd.read_csv('boston.csv')

독립 = 보스턴[['crim', 'zn', 'indus', 'chas', 'nox', 'rm', 'age', 'dis', 'rad', 'tax', 'ptratio', 'b', 'lstat']]

종속 = 보스턴[['medv']]

 

print(독립.shape, 종속.shape)

 

2. 모델의 구조를 만듭니다.

X = tf.keras.layers.Input(shape=[13])

Y = tf.keras.layers.Dense(1)(X)

model = tf.keras.models.Model(X , Y)

model.compile(loss='mse')

 

3. 데이터로 모델을 학습(fit)합니다.

model.fit(독립, 종속, epochs=1000)

 

4. 모델을 이용합니다.

print("Predictions: ", model.predict(독립[0:5]))

학습의 실제


딥러닝 워크북을 통해 실제로 매개변수를 갱신해나가는 과정을 체험해봅니다.

이처럼 loss를 낮추기 위해 그에 맞는 매개변수를 찾아가는 것을 최적화(optimization)라고 합니다.

참고로 딥러닝 워크북에서 체험한 최적화는 확률적 경사 하강법(stochastic gradient descent)입니다.

세 번째 딥러닝 - 아이리스 품종 분류


앞서 배운 지도 학습의 과정을 따라 아이리스 품종을 분류해봅니다.

참고로 종속변수가 3개이므로 다중 클래스 분류입니다.

 

종속변수가

 • 양적 데이터 → 회귀(regression)

 • 범주형 데이터 → 분류(classification)

 

1. 과거의 데이터를 준비합니다.

아이리스 = pd.read_csv('iris.csv')

아이리스 = pd.get_dummies(아이리스)

 

독립 = 아이리스[['꽃잎길이', '꽃잎폭', '꽃받침길이', '꽃받침폭']]

종속 = 아이리스[['품종_setosa', '품종_versicolor', '품종_virginica']]

 

print(독립.shape, 종속.shape)

 

2. 모델의 구조를 만듭니다.

X = tf.keras.layers.Input(shape=[4])

Y = tf.keras.layers.Dense(3activation='softmax')(X)

model = tf.keras.models.Model(X, Y)

model.compile(loss='categorical_crossentropy', metrics='accuracy')

 

3. 데이터로 모델을 학습(fit)합니다.

model.fit(독립, 종속, epochs=1000)

 

4. 모델을 이용합니다.

print("Predictions: ", model.predict(독립[:5]))

 

 • 원핫인코딩(onehot-encoding)

: 범주형 데이터를 1과 0의 데이터로 바꿔주는 과정

Tip) 딥러닝 모델을 사용하기 위해서는 "모든" 범주형 변수를 원핫인코딩해줘야 함

 

 • sigmoidsoftmax의 차이

    - sigmoid는 이진 클래스 분류 시 사용

    - softmax는 다중 클래스 분류 시 사용

 • 활성화 함수(activation function)

회귀의 경우 활성화 함수는 Identity, 즉 항등 함수이고 분류의 경우 sigmoid/softmax

네 번째 딥러닝 - 신경망의 완성:히든 레이어


앞서 배운 딥러닝은 입력층과 출력층으로만 이루어졌다면, 이번에는 은닉층도 쌓아봅니다. 

 

 • 은닉층(hidden layer)

X = tf.keras.layers.Input(shape=[13])

H = tf.keras.layers.Dense(10, activation='swish')(X)

Y = tf.keras.layers.Dense(1)(H)

model = tf.keras.models.Model(X , Y)

model.compile(loss='mse')

Tip) swish는 최근에 발표된 성능 좋은 활성화 함수이므로, 앞으로 이거 쓰면 됨!

부록 1: 데이터를 위한 팁


데이터 전처리를 위한 팁을 배웁니다.

 

 • 변수(칼럼) 타입 확인: 데이터.dtypes

 • 변수를 범주형으로 변경: 데이터['칼럼명'].astype('category')

 • 변수를 수치형으로 변경

    - 데이터['칼럼명'].astype('int')

    - 데이터['칼럼명'].astype('float')

 • NA값 처리

    - NA 개수 체크: 데이터.isna().sum()

    - NA 값 채우기: 데이터['칼럼명'].fillna(특정숫자)

부록 2: 모델을 위한 팁


은닉층과 활성화 함수 사이에 BachNormalization를 넣는 팁을 배웁니다.

 

 • 사용할 레이어

    - tf.keras.layers.BatchNormalization()

    - tf.keras.layers.Activation('swish')

      Tip) tf.keras.layers.Dense(특정숫자, activation='swish')(앞 레이어)에서 activation='swish'와 같으나 배치놂

              사용 시 Dense와 Activation 사이에 넣는 것이 효과가 좋음!