텐서플로우로 딥러닝 구현하기 - 모델 구현

·2021년 12월 12일
0

NIPA AI 교육

목록 보기
21/31

1. 딥러닝 모델 구축하기 : 고수준 API활용

Keras - 텐서플로우의 패키지로 제공되는 고수준API 딥러닝 모델을 간단하고 빠르게 구현 가능

케라스를 사용하지 않고도 할 수 있지만, 처음 배우는 사용자에게는 매우 어려우므로 케라스를 활용해서 구현하는 법부터 학습

2. 딥러닝 모델 구축을 위한 Keras 메소드

모델 클래스 객체 생성
tf.keras.models.Sequential()
-> 딥러닝 객체를 만들 것이다. 선언, 하나의 도화지를 까는 것과 비슷

모델의 각 Layer 구성
tf.keras.layers.Dense(units, activation)

  • units: 레이어 안의 Node의 수
  • activation: 적용할 activation 함수 설정

3. Input Layer의 입력 형태 지정하기

첫번째 즉, Input Layer는 입력 형태에 대한 정보를 필요로 함
input_shape / input_dim 인자 설정하기
둘 중의 하나만 사용하면 됨

4. 모델 구축하기 코드 예시

(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'))
# ...

5. 딥러닝 모델 학습시키기

  1. 모델 학습 방식을 설정하기 위한 함수
    [model].compile(optimizer, loss)
  • optimizer : 모델 학습 최적화 방법 GD(경사하강법 Gradient), SGD, momentum, Adam 등 다양한 방식 존재 (각자의 장단점 있음)
  • loss : 손실 함수 설정
    회귀모델: MSE 등이 자주 쓰임
    분류: Cross Entropy 등이 자주 쓰임

모델의 특징에 따라 다양하게 설정

  1. 모델을 학습시키기 위한 함수
    [model].fit(x,y)
  • x: 학습 데이터 (feature 데이터)
  • y: 학습 데이터의 label

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가 설정돼있다면 한번의 에포크에서 배치만큼 돌아가게 됨

6. 평가 및 예측하기

  1. 모델을 평가하기 위한 메소드
    [model].evaluate(x, y)
  • x: 테스트 데이터(feature)
  • y: 테스트 데이터의 label
  1. 모델로 예측을 수행하기 위한 함수
    [model].predict(x)
# 모델 평가 및 예측하기
model.evaluate(X_test, Y_test)
predicted_labels,test = model.predict(X_test)

7. 실습. 텐서플로우를 활용하여 신경망 구현하기 - 모델 구현

이번 실습에서는 텐서플로우와 케라스(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())

8. 실습. 텐서플로우를 활용하여 신경망 구현하기 - 모델 학습

이번 실습에서는 텐서플로우와 케라스(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으로 변환된 학습용 데이터를 바탕으로 모델의 학습을 수행합니다.

  • compile 메서드를 사용하여 최적화 모델을 설정합니다. loss는 ‘mean_squared_error’, optimizer는 ‘adam’으로 설정합니다.
  • fit 메서드를 사용하여 학습용 데이터를 학습합니다. epochs는 100으로 설정합니다.
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)

9. 실습. 텐서플로우를 활용하여 신경망 구현하기 - 모델 평가 및 예측

텐서플로우를 이용해 신경망 모델을 평가 및 예측을 위한 함수/메서드

평가 방법
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값을 별도로 넣어주어야함

10. 실습. 신경망 모델로 분류하기

이번 실습에서는 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 데이터를 분류하기 위해서 마지막 레이어 노드를 아래와 같이 설정합니다.

  • 노드의 수는 3개
  • activation은 ‘softmax’로 설정합니다.
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])))
profile
백엔드 개발자. 공동의 목표를 함께 이해한 상태에서 솔직하게 소통하며 일하는 게 가장 즐겁고 효율적이라고 믿는 사람.

0개의 댓글