끄적이는 기록일지

[머신러닝] 06.텐서플로와 신경망_(2) 딥러닝 구현 본문

AI실무

[머신러닝] 06.텐서플로와 신경망_(2) 딥러닝 구현

시시나브로 2021. 10. 15. 23:18
728x90
 

[머신러닝] 06.텐서플로와 신경망_(1) 딥러닝 모델의 학습 방법

1. 딥러닝 모델 전 시간 다층 퍼셉트론까지 이야기했습니다. 모델 안에 은닉층이 많아진다면, 깊은 신경망이라는 의미의 Deep Learning이란 단어를 사용하였습니다. 2. 딥러닝 모델의 학습방법 Loss fu

kcy51156.tistory.com

이제 텐서플로우로 딥러닝을 구현해보도록 하겠습니다.

 

텐서플로우(Tensorflow)

- 유연하고, 효율적이며, 확장성있는 딥러닝 프레임워크

- 대형 클러스터 컴퓨터부터 스마트폰까지 다양한 디바이스에서 동작가능.

1. 딥러닝 모델 구현 순서

1) 데이터 처리하기

2) 딥러닝모델 구축하기

3) 모델 학습시키기

4) 평가 예측하기

2. 데이터 전 처리

1) Tensorflow딥러닝 모델은 일반 데이터에서 Tensor 형태의 데이터로 변환하여 입력받는다.

2) Tensor다차원 배열로서 tensorflow에서 사용하는 객체 (1차원 : vector 2차원 : matrix)

# # pandas를 사용하여 데이터 불러오기
df=pd.read_csv(‘data.csv’)
feature = df.drop(columns=[‘label’])
label=df[‘label’]
# tensor 형태로 데이터 변환 
dataset= tf.data.Dataset.from_tensor_slices((feature.values, label.values))

- Dataset API 사용하여 딥러닝 모델 Dataset 생성

3) 딥러닝사용하는 데이터는 추가적인 처리 작업이 필요 → Epoch, Batch

- Epoch : 번의 epoch전체 데이터셋에 대해 학습을 완료한 상태(묶음 단위)

- Batch : 나눠진 데이터(보통 mini-batch라고 표현)

- iterationepoch나누어서 실행하는 횟수를 의미

ex) 데이터가 1000, Batch size = 100

1 iteration = 100데이터에 대해서 학습

1 epoch = 1000/Batch size(100) = 10 iteration

# # tensor 형태로 데이터 변환
dataset= tf.data.Dataset.from_tensor_slices((feature.values, label.values))
# dataset의batch사이즈를 32로 설정
dataset= dataset.batch(32)

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

1) 텐서플로우의 패키지로 제공되는 고수준 API

2) 딥러닝모델을 간단하고 빠르게 구현 가능.

3) 딥러닝 모델 구축을 위한 Keras메소드

- 모델 클래스 객체 생성

tf.keras.models.Sequential()

- 모델의 각 레이어 구성

tf.keras.layers.Dense(units, activation)

• units : 레이어안의 Node의 수

• activation : 적용할 activation 함수 설정

- Input Layer의 입력 형태 지정하기

* input_shape/input_dim인자 설정하기(둘 중 하나는 사용)

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].add(tf.keras.layers.Dense(units, activation))

• units : 레이어 안의 Node의 수

• activation : 적용할 activation 함수 설정

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

- 모델 학습 방식을 설정하기 위한 함수

[model].compile(optimizer, loss)

optimizer : 모델 학습 최적화 방법

loss : 손실함수 설정

- 모델을 학습시키기 위한 함수

[model].fit(x,y)

x : 학습데이터

y : 학습데이터의 label

# MSE를 loss로 설정, 최적화 방식은 SGD사용
model.compile(loss='mean_squared_error’, optimizer=‘SGD’)

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

- 모델을 평가하기 위한 메소드

[model].evaluate(x, y)

x : 테스트 데이터

y : 테스트 데이터의 label

- 모델로 예측을 수행하기 위한 함수

[model].predict(x)

x : 예측하고자 하는 데이터

# MSE를 loss로 설정, 최적화방식은 SGD사용
model.compile(loss='mean_squared_error’, optimizer=‘SGD’)
# dataset에 저장된 데이터를 입력하고, epochs를 100으로 설정하고 학습
model.fit(dataset, epochs=100)
#모델평가 및 예측하기
model.evaluate(X_test,Y_test)predicted_labels_test= model.predict(X_test)

4. 실습

여러분은 마케터로서 광고 비용에 따른 수익률을 신경망을 통해서 예측하고자 합니다.
아래와 같이 FB, TV, Newspaper 광고에 대한 비용 대비 Sales 데이터가 주어진다면 우선 데이터 전 처리를 수행하여 텐서플로우 딥러닝 모델에 필요한 학습용 데이터를 만들어 봅시다.

Advertising2.csv
0.00MB

텐서플로우를 활용하여 신경망 구현하기 - 데이터 전 처리


1. pandas DataFrame df에서 Sales 변수는 label 데이터로 Y에 저장하고 나머진 X에 저장합니다.

2. 학습용 데이터 train_X, train_Y를 tf.data.Dataset 형태로 변환합니다.
   from_tensor_slices 함수를 사용하여 변환합니다.

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("Advertising2.csv")

# DataFrame 데이터 샘플 5개를 출력합니다.
print('원본 데이터 샘플 :')
print(df.head(),'\n')

# 의미없는 변수는 삭제합니다.
df = df.drop(columns=['Unnamed: 0'])

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



>>> 원본 데이터 샘플 :
   Unnamed: 0     FB    TV  Newspaper  Sales
0           1  230.1  37.8       69.2   22.1
1           2   44.5  39.3       45.1   10.4
2           3   17.2  45.9       69.3    9.3
3           4  151.5  41.3       58.5   18.5
4           5  180.8  10.8       58.4   12.9 


FB, TV, Newspaper batch 데이터:
 tf.Tensor(
[[296.4  36.3 100.9]
 [228.   37.7  32. ]
 [  5.4  29.9   9.4]
 [ 57.5  32.8  23.5]
 [240.1   7.3   8.7]], shape=(5, 3), dtype=float64)
Sales batch 데이터: tf.Tensor([23.8 21.5  5.3 11.8 13.2], shape=(5,), dtype=float64)

모델 구현, 학습

1. Dataset으로 변환된 학습용 데이터를 바탕으로 모델의 학습을 수행합니다.
* compile 메서드를 사용하여 최적화 모델을 설정합니다. loss는 ‘mean_squared_error’, optimizer는 ‘adam’으로 설정합니다.
* fit 메서드를 사용하여 학습용 데이터를 학습합니다. epochs는 100으로 설정합니다.

모델 평가, 예측

3. evaluate 메서드를 사용하여 테스트용 데이터의 loss 값을 계산하고 loss에 저장합니다.
4. 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("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')
# verbose 인자는 학습 시, 화면에 출력되는 형태를 설정합니다. (0: 표기 없음, 1: 진행 바, 2: 에포크당 한 줄 출력)
history = model.fit(train_ds, epochs=100, verbose=2)
print('\n')

"""
3. evaluate 메서드를 사용하여 테스트용 데이터의 loss 값을 계산합니다.
"""
loss = model.evaluate(test_X, test_Y, verbose=0)

"""
4. predict 메서드를 사용하여 테스트용 데이터의 예측값을 계산합니다.(lable값)
"""
predictions = model.predict(test_X)

# 결과를 출력합니다.
print("테스트 데이터의 Loss 값: ", loss)
for i in range(5):
    print("%d 번째 테스트 데이터의 실제값: %f" % (i, test_Y.iloc[i]))
    print("%d 번째 테스트 데이터의 예측값: %f" % (i, predictions[i][0]))
    


>>> 원본 데이터 샘플 :
   Unnamed: 0     FB    TV  Newspaper  Sales
0           1  230.1  37.8       69.2   22.1
1           2   44.5  39.3       45.1   10.4
2           3   17.2  45.9       69.3    9.3
3           4  151.5  41.3       58.5   18.5
4           5  180.8  10.8       58.4   12.9 

Epoch 1/10
28/28 - 0s - loss: 1639.5788
Epoch 2/10
28/28 - 0s - loss: 281.0369
Epoch 3/10
28/28 - 0s - loss: 139.9947
...
Epoch 100/100
28/28 - 0s - loss: 3.9819

테스트 데이터의 Loss 값:  3.6781873226165773
0 번째 테스트 데이터의 실제값: 6.600000
0 번째 테스트 데이터의 예측값: 10.392957
1 번째 테스트 데이터의 실제값: 20.700000
1 번째 테스트 데이터의 예측값: 19.001699
2 번째 테스트 데이터의 실제값: 17.200000
2 번째 테스트 데이터의 예측값: 16.554482
3 번째 테스트 데이터의 실제값: 19.400000
3 번째 테스트 데이터의 예측값: 18.733145
4 번째 테스트 데이터의 실제값: 21.800000
4 번째 테스트 데이터의 예측값: 20.184616

- loss값이 3.9819까지 내려간 걸 볼 수 있습니다.

 

신경망 모델로 분류하기

이번 실습에서는 Iris 데이터가 주어졌을 때 붓꽃의 종류를 분류하는 신경망 모델을 구현합니다. Iris 데이터는 아래와 같이 꽃받침 길이, 꽃받침 넓이, 꽃잎 길이, 꽃잎 넓이 네 가지 변수와 세 종류의 붓꽃 클래스로 구성되어 있습니다.


1. 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("\n테스트 데이터의 Accuracy 값: ", acc)
for i in range(5):
    print("%d 번째 테스트 데이터의 실제값: %d" % (i, test_Y.iloc[i]))
    print("%d 번째 테스트 데이터의 예측값: %d" % (i, np.argmax(predictions[i])))
    
    

>>> Epoch 1/100
24/24 - 0s - loss: 1.7421 - accuracy: 0.3750
Epoch 2/100
24/24 - 0s - loss: 1.3935 - accuracy: 0.5500
Epoch 3/100
24/24 - 0s - loss: 1.2528 - accuracy: 0.4833
...
Epoch 100/100
24/24 - 0s - loss: 0.1091 - accuracy: 0.9750

30/30 [==============================] - 0s 456us/sample - loss: 0.1161 - accuracy: 1.0000
테스트 데이터의 Accuracy 값:  1.0
0 번째 테스트 데이터의 실제값: 1
0 번째 테스트 데이터의 예측값: 1
1 번째 테스트 데이터의 실제값: 0
1 번째 테스트 데이터의 예측값: 0
2 번째 테스트 데이터의 실제값: 2
2 번째 테스트 데이터의 예측값: 2
3 번째 테스트 데이터의 실제값: 1
3 번째 테스트 데이터의 예측값: 1
4 번째 테스트 데이터의 실제값: 1
4 번째 테스트 데이터의 예측값: 1
728x90
Comments