본문 바로가기

데이터 사이언스/머신러닝

[NIPA AI 교육/응용] 06. 텐서플로우와 신경망

1. 텐서플로우란

  • 유연하고, 효율적이며, 확장성 있는 딥러닝 프레임워크
  • 대형 클러스터 컴퓨터부터 스마트폰까지 다양한 디바이스에서 동작 가능

 

2. 데이터 전처리하기

  • Tensorflow 딥러닝 모델은 Tensor 형태(다차원 배열;tf에서 사용하는 객체)의 데이터를 입력 받음
  • 데이터 -> Tensor 형태의 데이터로 변환 -> Tensorflow 딥러닝 모델로 변환
    # pandas를 사용하여 데이터 불러오기
    df = pd.read_csv('data.csv')
    feature = pd.drop(columns=['label'])
    label = df['label']
    
    # tensor 형태로 데이터 변환
    dataset = tf.data.Dataset.from_tensor_slices((feature.calues, label.values))​

2.1. Epoch, Batch

출처 : 2021 Nipa AI 딥러닝 시작하기 > 02 텐서플로우와 신경망

  • Epoch : 한 번의 epoch는 전체 데이터 셋에 대해 한 번 학습을 완료한 상태
  • Batch : 나눠진 데이터 셋으로, 보통 mini-batch라고 표현함
  • iteration :  epoch를 나누어서 실행하는 횟수를 의미함
    # tensor 형태로 데이터 변환
    dataset = tf.data.Dataset.from_tensor_slices((feature.values, label.values))
    
    # dataset의 batch 사이즈를 32로 설정
    dataset = dataset.batch(32)​

2.2. 데이터 전처리 - 실습 코드

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'])

"""
1. Sales 변수는 label 데이터로 Y에 저장하고 나머진 X에 저장합니다.
"""
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)

"""
2. 학습용 데이터를 tf.data.Dataset 형태로 변환합니다.
   from_tensor_slices 함수를 사용하여 변환하고 batch를 수행하게 합니다.
"""
train_ds = tf.data.Dataset.from_tensor_slices((train_X.values, train_Y.values))
train_ds = train_ds.shuffle(len(train_X)).batch(batch_size=5)

# 하나의 batch를 뽑아서 feature와 label로 분리합니다.
[(train_features_batch, label_batch)] = train_ds.take(1)

# batch 데이터를 출력합니다.
print('\nFB, TV, Newspaper batch 데이터:\n',train_features_batch)
print('Sales batch 데이터:',label_batch)

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

3.1. Keras

  • 텐서플로우의 패키지로 제공되는 고수준 API
  • 딥러닝 모델을 간단하고 빠르게 구현 가능
  • 모델 클래스 객체 생성
    tf.keras.models.Sequential()​
  • 모델의 각 Layer 구성
    tf.keras.layers.Dense(units, activation)​
    • units : 레이어 안의 Node 수
    • activation : 적용할 활성 함수 설정
  • 첫 번째 층인 input layer은 입력 형태에 대한 정보를 필요로 함 - input_shape / input_dim 인자 설정
  • 분류 모델에서는 마지막 레이어에 분류 데이터의 label 범주의 개수만큼 노드를 설정
  • 모델에 Layer 추가하기
    [model].add(tf.keras.layers.Dense(units, activation))​
    • units : 레이어 안의 Node의 수
    • activation : 적용할 activation 함수 설정
  • 모델 학습 방식을 설정하기 위한 함수
    [model].compile(optimizer, loss)​
    • optimizer : 모델 학습 최적화 방법
    • loss : 손실 함수 설정 / 회귀 모델에서는 MSE, 분류 모델에서는 Cross Entropy
  • 모델을 학습시키기 위한 함수
    [model].fit(x, y)​
    • x : 학습 데이터(feature)
    • y : 학습 데이터의 label
  • 모델을 평가하기 위한 메소드
    [model].evaluate(x, y)​
    • x : 테스트 데이터(feature)
    • y : 테스트 데이터의 label
  • 모델로 예측을 수행하기 위한 함수
    [model].predict(x)​
    • x : 예측하고자 하는 데이터

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

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개의 노드
])
model = tf.keras.models.Sequential()

model.add(tf.keras.layers.Dense(10, input_dim=2, activation='sigmoid')
model.add(tf.keras.layers.Dense(10, activation='sigmoid'))
model.add(tf.keras.layers.Dense(1, activation='sigmoid'))
# MSE를 loss로 설정, 최적화 방식은 SGD 사용
model.compile(loss='mean_sqared_error', optimizer='SGD')

# dataset에 저장된 데이터를 입력하고, epochs를 100으로 설정하고 학습
model.fit(dataset, epochs=100)

# 모델 평가 및 예측하기
model.evaluate(X_test, Y_test)
predicted_labels_test = model.predict(X_test)

3.3. 실습 코드

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
print(df)

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])))