Keras - 텐서플로우의 패키지로 제공되는 고수준API 딥러닝 모델을 간단하고 빠르게 구현 가능
케라스를 사용하지 않고도 할 수 있지만, 처음 배우는 사용자에게는 매우 어려우므로 케라스를 활용해서 구현하는 법부터 학습
모델 클래스 객체 생성
tf.keras.models.Sequential()
-> 딥러닝 객체를 만들 것이다. 선언, 하나의 도화지를 까는 것과 비슷
모델의 각 Layer 구성
tf.keras.layers.Dense(units, activation)
첫번째 즉, Input Layer는 입력 형태에 대한 정보를 필요로 함
input_shape / input_dim 인자 설정하기
둘 중의 하나만 사용하면 됨
(1) 모델 생성할 때 한꺼번에 레이어 생성
model = tf.keras.models.Sequential([
tf.keras.layers.Dense(10, input_dim=2, activation='sigmoid'), # 2개의 입력 변수, 10개의 노드
tf.keras.layers.Dense(10, activation='sigmoid'), # 10개의 노드
tf.keras.layers.Dense(1, activation='sigmoid'), # 1개의 노드, 마지막 층에 노드 하나로 결과값 나옴.
#(입력이 두 개, 출력이 하나, 히든 층 2개)
])
모든 가중치가 알아서 입력된다.
(2) 빈 모델을 먼저 만들어두고 레이어를 추가
모델에 Layer 추가하기
[model].add(tf.keras.layers.Dense(units, activation))
model = tf.keras.models.Sequential()
model.add(tf.keras.layers.Dense(10, input_dim=2, activation='sigmoid'))
# ...
모델의 특징에 따라 다양하게 설정
tensor 형태의 dataset을 넣어줘도 되고, x, y로 나눠서 넣어줘도 된다.
# MSE를 loss로 설정, 최적화 방식은 SGD 사용
model.compile(loss='mean_squared_error', optimizier='SGD')
# dataset에 저장된 데이터를 입력하고, epochs를 100으로 설정하고 학습
model.fit(dataset, epochs=100)
# 100개만큼 학습을 수행한다
# batch가 설정돼있다면 한번의 에포크에서 배치만큼 돌아가게 됨
# 모델 평가 및 예측하기
model.evaluate(X_test, Y_test)
predicted_labels,test = model.predict(X_test)
이번 실습에서는 텐서플로우와 케라스(Keras)를 활용하여 신경망 모델을 구현해보겠습니다.
케라스는 텐서플로우 내의 신경망 모델 설계와 훈련을 위한 API 입니다. 케라스는 연속적으로(Sequential) 레이어(Layer)들을 쌓아가며 모델을 생성하고, 사이킷런과 같이 한 줄의 코드로 간단하게 학습 방법 설정, 학습, 평가를 진행할 수 있습니다.
텐서플로우와 케라스를 이용해 신경망 모델을 만들기 위한 함수/메서드
모델 설정
tf.keras.models.Sequential()
: 연속적으로 층을 쌓아 만드는 Sequential 모델을 위한 함수
Dense 레이어
tf.keras.layers.Dense(units)
: 신경망 모델의 레이어를 구성하는데 필요한 keras 함수
units: 레이어 안의 노드 수
예를 들어, 5개의 변수에 따른 label 을 예측하는 회귀 분석 신경망을 구현하고 싶다면 아래와 같이 구현할 수 있습니다.
tf.keras.models.Sequential([
tf.keras.layers.Dense(10, input_shape=(5,)),
tf.keras.layers.Dense(1)
])
input_shape 인자에는 (입력하는 변수의 개수, )로 입력합니다. 또한 회귀 분석이기에 마지막 레이어의 유닛 수는 1개로 설정합니다.
input_dim인자를 사용하면 아래와 같이 표현할 수 있습니다.
tf.keras.models.Sequential([
tf.keras.layers.Dense(10, input_dim=5),
tf.keras.layers.Dense(1)
])
지시사항
tf.keras.models.Sequential()
을 활용하여 신경망 모델을 생성합니다.
자유롭게 layers를 쌓고 마지막 layers는 노드 수를 1개로 설정합니다.
import tensorflow as tf
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'
np.random.seed(100)
tf.random.set_seed(100)
# 데이터를 DataFrame 형태로 불러 옵니다.
df = pd.read_csv("data/Advertising.csv")
# DataFrame 데이터 샘플 5개를 출력합니다.
print('원본 데이터 샘플 :')
print(df.head(),'\n')
# 의미없는 변수는 삭제합니다.
df = df.drop(columns=['Unnamed: 0'])
X = df.drop(columns=['Sales'])
Y = df['Sales']
# 학습용 테스트용 데이터로 분리합니다.
train_X, test_X, train_Y, test_Y = train_test_split(X, Y, test_size=0.3)
# Dataset 형태로 변환합니다.
train_ds = tf.data.Dataset.from_tensor_slices((train_X.values, train_Y))
train_ds = train_ds.shuffle(len(train_X)).batch(batch_size=5)
"""
1. tf.keras.models.Sequential()를 활용하여 신경망 모델을 생성합니다.
자유롭게 layers를 쌓고 마지막 layers는 노드 수를 1개로 설정합니다.
"""
model = tf.keras.models.Sequential([
tf.keras.layers.Dense(5, input_dim=3),
tf.keras.layers.Dense(5),
tf.keras.layers.Dense(1)
])
print(model.summary())
이번 실습에서는 텐서플로우와 케라스(Keras)를 활용하여 신경망 모델을 학습해보겠습니다.
텐서플로우와 케라스를 이용해 신경망 모델을 학습하기 위한 함수/메서드
학습 방법 설정
model.compile(loss='mean_squared_error', optimizer='adam')
complie() 메서드는 모델을 어떻게 학습할 지에 대해서 설정합니다. loss는 회귀에서는 일반적으로 MSE인 ‘mean_squared_error’, 분류에서는 ‘sparse_categorical_crossentropy’ 를 주로 사용합니다.
학습 수행
model.fit(X, epochs=100, verbose=2)
X 데이터를 에포크를 100번으로 하여 학습합니다. verbose 인자는 학습 시, 화면에 출력되는 형태를 설정합니다. (0: 표기 없음, 1: 진행 바, 2: 에포크당 한 줄 출력)
지시사항
Dataset으로 변환된 학습용 데이터를 바탕으로 모델의 학습을 수행합니다.
import tensorflow as tf
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'
np.random.seed(100)
tf.random.set_seed(100)
# 데이터를 DataFrame 형태로 불러 옵니다.
df = pd.read_csv("data/Advertising.csv")
# DataFrame 데이터 샘플 5개를 출력합니다.
print('원본 데이터 샘플 :')
print(df.head(),'\n')
# 의미없는 변수는 삭제합니다.
df = df.drop(columns=['Unnamed: 0'])
X = df.drop(columns=['Sales'])
Y = df['Sales']
# 학습용 테스트용 데이터로 분리합니다.
train_X, test_X, train_Y, test_Y = train_test_split(X, Y, test_size=0.3)
# Dataset 형태로 변환합니다.
train_ds = tf.data.Dataset.from_tensor_slices((train_X.values, train_Y))
train_ds = train_ds.shuffle(len(train_X)).batch(batch_size=5)
# keras를 활용하여 신경망 모델을 생성합니다.
model = tf.keras.models.Sequential([
tf.keras.layers.Dense(10, input_shape=(3,)),
tf.keras.layers.Dense(1)
])
"""
1. 학습용 데이터를 바탕으로 모델의 학습을 수행합니다.
step1. compile 메서드를 사용하여 최적화 모델 설정합니다.
loss는 mean_squared_error, optimizer는 adam으로 설정합니다.
step2. fit 메서드를 사용하여 Dataset으로 변환된 학습용 데이터를 학습합니다.
epochs는 100으로 설정합니다.
"""
model.compile(loss='mean_squared_error', optimizer='adam')
history = model.fit(train_ds, epochs=100, verbose=2)
텐서플로우를 이용해 신경망 모델을 평가 및 예측을 위한 함수/메서드
평가 방법
model.evaluate(X, Y)
evaluate() 메서드는 학습된 모델을 바탕으로 입력한 feature 데이터 X와 label Y의 loss 값과 metrics 값을 출력합니다. 이번 실습에서는 metrics 를 compile에서 설정하지 않았지만, 분류에서는 일반적으로 accuracy를 사용하여 evaluate 사용 시, 2개의 아웃풋을 리턴합니다.
예측 방법
model.predict(X)
X 데이터의 예측 label 값을 출력합니다.
지시사항
evaluate 메서드를 사용하여 테스트용 데이터의 loss 값을 계산하고 loss에 저장합니다.
predict 메서드를 사용하여 테스트용 데이터의 예측값을 계산하고 predictions에 저장합니다.
import tensorflow as tf
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'
np.random.seed(100)
tf.random.set_seed(100)
# 데이터를 DataFrame 형태로 불러 옵니다.
df = pd.read_csv("data/Advertising.csv")
# DataFrame 데이터 샘플 5개를 출력합니다.
print('원본 데이터 샘플 :')
print(df.head(),'\n')
# 의미없는 변수는 삭제합니다.
df = df.drop(columns=['Unnamed: 0'])
X = df.drop(columns=['Sales'])
Y = df['Sales']
# 학습용 테스트용 데이터로 분리합니다.
train_X, test_X, train_Y, test_Y = train_test_split(X, Y, test_size=0.3)
# Dataset 형태로 변환합니다.
train_ds = tf.data.Dataset.from_tensor_slices((train_X.values, train_Y))
train_ds = train_ds.shuffle(len(train_X)).batch(batch_size=5)
# keras를 활용하여 신경망 모델을 생성합니다.
model = tf.keras.models.Sequential([
tf.keras.layers.Dense(10, input_shape=(3,)),
tf.keras.layers.Dense(1)
])
# 학습용 데이터를 바탕으로 모델의 학습을 수행합니다.
model.compile(loss='mean_squared_error', optimizer='adam')
history = model.fit(train_ds, epochs=100, verbose=2)
"""
1. evaluate 메서드를 사용하여 테스트용 데이터의 loss 값을 계산합니다.
"""
loss = model.evaluate(None, None, verbose=0)
"""
2. predict 메서드를 사용하여 테스트용 데이터의 예측값을 계산합니다.
"""
predictions = model.predict(None)
# 결과를 출력합니다.
print("테스트 데이터의 Loss 값: ", loss)
for i in range(5):
print("%d 번째 테스트 데이터의 실제값: %f" % (i, test_Y.iloc[i]))
print("%d 번째 테스트 데이터의 예측값: %f" % (i, predictions[i][0]))
배치는 학습할 때만 사용.
evalute 메서드는 텐서플로우로 변환된 데이터셋이 아닌 X, Y값을 별도로 넣어주어야함
이번 실습에서는 Iris 데이터가 주어졌을 때 붓꽃의 종류를 분류하는 신경망 모델을 구현합니다. Iris 데이터는 아래와 같이 꽃받침 길이, 꽃받침 넓이, 꽃잎 길이, 꽃잎 넓이 네 가지 변수와 세 종류의 붓꽃 클래스로 구성되어 있습니다.
분류를 위한 텐서플로우 신경망 모델 함수/메서드
모델 구현 (5개의 범주를 갖는 label 예시)
model = tf.keras.models.Sequential([ tf.keras.layers.Dense(10, input_dim=4), tf.keras.layers.Dense(5, activation='softmax') ])
분류 모델에서는 마지막 레이어에 분류 데이터의 label 범주의 개수만큼 노드를 설정합니다. 추가로 activation 인자로 ‘softmax’ 를 설정합니다.
학습 방법
model.compile(loss='sparse_categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
분류에서는 일반적으로 loss를 ‘sparse_categorical_crossentropy’으로 사용합니다. metrics 인자는 에포크마다 계산되는 평가 지표를 의미합니다. 정확도를 의미하는 ‘accuracy’ 를 입력하면 에포크마다 accuracy를 계산하여 출력합니다.
지시사항
keras를 활용하여 신경망 모델을 생성합니다. 3가지 범주를 갖는 label 데이터를 분류하기 위해서 마지막 레이어 노드를 아래와 같이 설정합니다.
import tensorflow as tf
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.datasets import load_iris
import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'
np.random.seed(100)
tf.random.set_seed(100)
# sklearn에 저장된 데이터를 불러 옵니다.
X, Y = load_iris(return_X_y = True)
# DataFrame으로 변환
df = pd.DataFrame(X, columns=['꽃받침 길이','꽃받침 넓이', '꽃잎 길이', '꽃잎 넓이'])
df['클래스'] = Y
X = df.drop(columns=['클래스'])
Y = df['클래스']
# 학습용 평가용 데이터로 분리합니다
train_X, test_X, train_Y, test_Y = train_test_split(X, Y, test_size=0.2, random_state = 42)
# Dataset 형태로 변환합니다.
train_ds = tf.data.Dataset.from_tensor_slices((train_X.values, train_Y))
train_ds = train_ds.shuffle(len(train_X)).batch(batch_size=5)
"""
1. keras를 활용하여 신경망 모델을 생성합니다.
3가지 범주를 갖는 label 데이터를 분류하기 위해서 마지막 레이어 노드를 아래와 같이 설정합니다.
"""
model = tf.keras.models.Sequential([
tf.keras.layers.Dense(10, input_dim=4),
tf.keras.layers.Dense(3, activation='softmax')
])
# 학습용 데이터를 바탕으로 모델의 학습을 수행합니다.
model.compile(loss='sparse_categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
history = model.fit(train_ds, epochs=100, verbose=2)
# 테스트용 데이터를 바탕으로 학습된 모델을 평가합니다.
loss, acc = model.evaluate(test_X, test_Y)
# 테스트용 데이터의 예측값을 구합니다.
predictions = model.predict(test_X)
# 결과를 출력합니다.
print("테스트 데이터의 Accuracy 값: ", acc)
for i in range(5):
print("%d 번째 테스트 데이터의 실제값: %d" % (i, test_Y.iloc[i]))
print("%d 번째 테스트 데이터의 예측값: %d" % (i, np.argmax(predictions[i])))