오늘부터 딥러닝에 대해 공부를 시작했습니다.
선형회귀를 Neural Network관점에서 이해를 해보았습니다. 변수 하나하나를 노드라고 지칭하고 서로 연결된 선을 연결 혹은 엣지라고 부릅니다. 인풋노드(InputNode)는 입력층(InputLayer)이라고도 하며 하나의 변수에 들어가는 노드들을 의미하고 함수는 Input()를 사용합니다. 반대로 아웃풋노드(OutputNode)는 출력층(OutpuLayer)이라고도 하며 함수는 Dense()를 사용합니다.
▶선형회귀의 딥러닝 방법
#먼저 keras가 앞에 사용됬을 경우를 대비해 초기화 해줍니다.
keras.backend.clear_session()
#초기화가 끝나면 모델을 선언합니다.
model = keras.models.Sequential()
#모델 블록을 쌓아줍니다.
model.add(keras.layers.Input(shape = (1,)))
model.add(keras.layers.Dense(1)
#모델 컴파일을 진행합니다.
model.compile(loss='mse', optimizer='adam')
해당 딥러닝에서의 x의 변수의 수는 1개이고 y의 변수의 수는 1개라서 모델 블록을 쌓아줄 때 전부 매개변수 값으로 1만 주었습니다. 선형회귀이기 때문에 평가지표로는 mse를 사용해서 loss='mse'
의 옵션 값을 주었습니다. optimizer='adam'
은 오류를 경사하강법으로 줄여나가기 위해 사용한 옵션입니다.
딥러닝의 준비가 끝나면 모델을 학습시킵니다.
#학습하기
model.fit(x, y, epochs=10, verbose=1)
원래는 x_train, y_train값이 들어가야하지만 분리를 안해주어 원본 그대로를 넣었습니다. epochs = 10
의 옵션은 몇 번 학습을 반복하는지에 대해 정해주는 옵션으로 반복횟수가 많을 수록 좋은 학습성과를 보여줍니다.
결과를 확인하면 verbose=1
은 학습과정을 보여주는 옵션이고 loss값이 낮을수록 좋은 것이라고 판단하면 됩니다.
로지스터 회귀는 분류 모델이므로 시그모이드 함수를 사용하여 0과 1사이의 값으로 바꾸어 주어야합니다. 선형회귀와의 차이는 아웃풋레이어를 쌓는 부분인 Dense()
의 옵션으로 activation=sigmoid
가 추가 되었습니다.
▶로지스터 회귀 딥러닝 방법
# 이미 잇는 keras청소하기
keras.backend.clear_session()
# model에 순차적으로 레이어를 쌓는 Sequential모델이라고 선언
model = keras.models.Sequential()
# model에 인풋, 아웃풋 레이어 쌓기
model.add( keras.layers.Input(shape=(1,)) )
model.add( keras.layers.Dense(1, activation='sigmoid') )
# 모델 컴파일
model.compile(loss='binary_crossentropy', metrics['accuracy'], optimizer='adam')
분류모델은 회귀모델과 다르게 일단 model에 outputlayer를 쌓을 때도 activation='sigmoid'
옵션을 추가해줘서 0~1사이 값으로 만들어줍니다. 또 모델 컴파일에서는 loss='binary_crossentropy'
을 사용하는데 그러면 해당 지표를 해석하기 힘들어서 metrics['accuracy']
를 추가해줘서 보조지표로 accuracy
지표를 사용합니다.
※loss값이 낮을수록 좋습니다.
배운 딥러닝에 대해서 이제 진짜 데이터를 가지고 실습을 진행하겠습니다.
▶먼저 필요 패키지를 호출합니다.
import tensorflow as tf
from tensorflow import keras
import numpy as np
import pandas as pd
데이터를 가져오는 법은 생략하겠습니다. 데이터를 가져온 후에 keras를 세팅합니다.
▶keras사용
#keras초기화
keras.backend.clear_session()
#모델선언
model = keras.models.Sequential()
#블록쌓기
model.add(keras.layers.Input(shape=(13,)))
model.add(keras.layers.Dense(1))
#모델컴파일
model.compile(loss='mse', optimizer='adam')
항상 블록을 쌓을 때는 변수가 몇 개인지 고려해야합니다. 다음으로는 학습을 진행합니다.
▶모델 학습하기
model.fit(x, y, epochs=10, verbose=1)
학습이 끝나면 결과를 비교해줍니다.
▶결과 비교
print(y[:10])
print(model.predict(x)[:10])
분류 모델의 Logistic Regression에 대한 딥러닝 실습을 진행하겠습니다.
▶keras 사용
#keras초기화
keras.backend.clear_session()
#모델선언
model = keras.models.Sequential()
#블록 쌓기
model.add(keras.layers.Input(shape=(30,)))
model.add(keras.layers.Dense(1, activation='sigmoid'))
#모델컴파일
model.compile(loss='binary_crossentropy', metrics=['accuracy'], optimizer='adam')
항상 분류와 회귀에 대해서 생각하면 모델링을 진행해야합니다. 다음으로는 마찬가지로 모델학습을 진행하겠습니다.
▶모델 학습하기
model.fit(x,y, epochs=10, verbose=1)
▶결과 확인
print(y[10:20])
print(model.predict(x)[10:20])
원-핫 인코딩에 대해 잘 알아야합니다. 딥러닝에서의 원-핫 인코딩 방법은 아래와 같습니다.
# One-Hot Encoding
from tensorflow.keras.utils import to_categorical
y = to_categorical(y, 3)
다중분류에서는 activation='softmax'
를 사용해주어야합니다. 그럼 아래의 분류실습 예제를 진행하겠습니다.
▶원-핫 인코딩을 진행합니다.
먼저 타겟 값이 여러개(3개이상)의 경우 아웃풋에 대해서 가장 확률이 높은 클레스를 고르는 것이 다중 분류이므로 타겟 값에 대해서 원-핫 인코딩을 진행합니다.
# One-Hot Encoding
from tensorflow.keras.utils import to_categorical
y = to_categorical(y, 3)
해당 실습에서는 타겟 값의 클레스가 3개 이므로 y = to_categorical(y, 3)
을 진행해주었습니다.
▶Sequential API로 모델링
#필요패키지 가져오기
import tensorflow as tf
from tensorflow import keras
#keras 초기화
keras.backend.clear_session()
#모델선언
model = keras.models.Sequential()
#블록쌓기
model.add(keras.layers.Input(shape=(4,)))
model.add(keras.layers.Dense(3, activation = 'softmax'))
#모델컴파일
model.compile(loss='categorical_crossentropy', metrics=['accuracy', 'Recall'], optimizer='adam')
#summary()
model.summary()
위의 코드를 자세히 살펴보자면 분류모델이지만 activation='softmax'
를 사용해준 것을 볼 수 있는데 다중분류 딥러닝에서는 softmax
를 사용해줍니다. 또한 loss='categorical_crossentropy'
에서 보시다시피 loss
의 옵션값도 이중분류 딥러닝과는 다른 옵션값을 사용한다는 것을 알 수 있습니다.
위의 코드에서는 .summary()
를 사용했는데 해당 함수는 모델 구성에 대해서 알려주는 함수입니다.
다음으로는 똑같이 모델 학습과 결과를 확인해보겠습니다.
▶학습과 결과 확인하기
#학습하기
model.fit(x,y, epochs=10, verbose=1)
#결과확인
print(y[:10])
print(model.predict(x)[:10])
오늘부터 딥러닝에 대해 공부를 시작했는데 생소한 단어와 수학적 지식을 요구해서 많이 당황했습니다. 빠르게 적응하여 모든 내용을 흡수할 수 있도록 하겠습니다.
※공부하고 있어 다소 틀린점이 있을 수 있습니다. 언제든지 말해주시면 수정하도록 하겠습니다.
※용어에 대해 조금 공부 더 해서 수정하겠습니다.