티스토리 뷰

[딥러닝 express]의 연습문제 8장 풀이입니다. (개인적인 풀이기에 오답이 있을 수 있습니다!)

 

 

 

 

 

 

11. 이번 장에는 패션 아이템을 신층 신경망으로 분류하는 프로그램이 있다. 패션 아이템을 기본 MLP로 분류하는 프로그램을 작성하고 심층 신경망과 비교하여 보자 성능이 얼마나 높아지는가?

 

import tensorflow as tf
from tensorflow import keras

# 입력데이터
fashion_mnist = keras.datasets.fashion_mnist
(train_images, train_labels), (test_images, test_labels) = fashion_mnist.load_data()

# 데이터 정규화
train_images = train_images / 255.0
test_images = test_images / 255.0

# 데이터 평탄화
train_images = train_images.reshape((60000, 784))
test_images = test_images.reshape((10000, 784))

# 원핫 엔코딩
train_labels = tf.keras.utils.to_categorical(train_labels)
test_labels = tf.keras.utils.to_categorical(test_labels)

# DNN

# 모델 생성
model = tf.keras.models.Sequential()
model.add(tf.keras.layers.Dense(512, activation='relu', input_shape=(784,)))
model.add(tf.keras.layers.Dense(128, activation='relu'))
model.add(tf.keras.layers.Dense(10, activation='softmax'))   # 출력층에 소프트 맥스 활성화 함수 사용


# 손실함수로 교차 엔트로피 사용
model.compile(optimizer='rmsprop',
              loss='categorical_crossentropy',
              metrics=['accuracy'])

# 모델 학습
model.fit(train_images, train_labels, epochs=5, batch_size = 128)

# 데스트
test_loss_d, test_acc_d = model.evaluate(test_images, test_labels)


# MLP

# 모델 생성
model = tf.keras.models.Sequential()
model.add(tf.keras.layers.Dense(512, activation='relu', input_shape=(784,)))
model.add(tf.keras.layers.Dense(10, activation='sigmoid'))


model.compile(optimizer='adam',
              loss='mse',
              metrics=['accuracy'])

# 모델 학습
model.fit(train_images, train_labels, epochs=5, batch_size = 128)

# 데스트
test_loss_m, test_acc_m = model.evaluate(test_images, test_labels)

print('DNN 정확도:', test_acc_d)
print('MLP 정확도:', test_acc_m)

 

...
Epoch 3/5
469/469 [==============================] - 1s 3ms/step - loss: 0.0189 - accuracy: 0.8751
Epoch 4/5
469/469 [==============================] - 1s 2ms/step - loss: 0.0175 - accuracy: 0.8858
Epoch 5/5
469/469 [==============================] - 1s 2ms/step - loss: 0.0167 - accuracy: 0.8910
313/313 [==============================] - 0s 1ms/step - loss: 0.0197 - accuracy: 0.8695

DNN 정확도: 0.8799999952316284
MLP 정확도: 0.8694999814033508

 

동일한 훈련데이터로 5 에포크씩 학습하고 테스트를 진행한 결과 DNN의 정확도가 0.001~0.01 정도 높은 것을 확인할 수 있었습니다.

 

 

 

 

 

 

 

12. 사이킷런에서 기본으로 제공하는 데이터 중에 붓꽃 데이터 세트가 있다. 이 데이터 세트는 세가지 붓꽃 종류 (lris setosa, lris virginica, lris versicolor)의 150개 샘플로 구성된다. 각 샘플에서 꽃받침 길이와 너비, 꽃잎의 길이와 너비의 4가지 특징이 측정되었다. 이 4가지 특징의 조합을 기반으로 로날드 피셔는 종을 서로 구별하는 선형 판별 모델을 개발했다. 우리는 알려진 붓꽃들을 대상으로 학습시킨 후에, 미지의 붓꽃에 대한 꽃받침 크기와 꽃잎 크기를 입력하여서 이것이 어떤 붓꽃인지를 예측할 것이다. 케라스로 구현된 심층 신경망으로 이것을 시도해보자. MLP에 비해서 얼마나 성능이 높아지는가?

 

# DNN
from sklearn import datasets
from sklearn.model_selection import train_test_split
import tensorflow as tf

classes = {0:'setosa', 1:'versicolor', 2:'virginica'}

# 붗꽃데이터 가져오기
iris = datasets.load_iris()

# 입력데이터
X = iris.data
y = iris.target

# 훈련, 테스트 데이터(80:20)로 분할한다.
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state = 1)


# 모델 생성
model = tf.keras.models.Sequential()
model.add(tf.keras.layers.Dense(32, input_shape = (4,), activation = 'relu')) 
model.add(tf.keras.layers.Dense(32, activation='relu'))
model.add(tf.keras.layers.Dense(10, activation='softmax'))   # 출력층에 소프트 맥스 활성화 함수 사용


# 손실함수로 교차 엔트로피 사용
model.compile(optimizer='rmsprop',
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])

# 모델 학습
model.fit(X_train, y_train, epochs = 10, batch_size = 1)

# 테스트
test_loss_d, test_acc_d = model.evaluate(X_test, y_test)



# MLP
# 원핫 엔코딩
y_train = tf.keras.utils.to_categorical(y_train) 
y_test = tf.keras.utils.to_categorical(y_test) 

# 모델 생성
model = tf.keras.models.Sequential() 

# 레이어 추가
model.add(tf.keras.layers.Dense(32, input_shape = (4,), activation = 'relu')) 
model.add(tf.keras.layers.Dense(3, activation='sigmoid')) 

# 컴파일
model.compile(optimizer='rmsprop',
                loss='mse',
                metrics=['accuracy'])

# 학습
model.fit(X_train, y_train, epochs = 10, batch_size = 1)

# 테스트 데이터에 대해 테스트
test_loss_m, test_acc_m = model.evaluate(X_test, y_test)


print('DNN 정확도:', test_acc_d)
print('MLP 정확도:', test_acc_m)

 

...
120/120 [==============================] - 0s 517us/step - loss: 0.1010 - accuracy: 0.8417
Epoch 8/10
120/120 [==============================] - 0s 517us/step - loss: 0.0978 - accuracy: 0.7750
Epoch 9/10
120/120 [==============================] - 0s 534us/step - loss: 0.0950 - accuracy: 0.7917
Epoch 10/10
120/120 [==============================] - 0s 501us/step - loss: 0.0912 - accuracy: 0.8667
1/1 [==============================] - 0s 77ms/step - loss: 0.1109 - accuracy: 0.6000

DNN 정확도: 0.9333333373069763
MLP 정확도: 0.6000000238418579

 

 

동일한 훈련데이터로 10 에포크씩 학습하고 테스트를 진행한 결과 DNN의 정확도가 MLP보다 0.3~0.4정도 높은것을 확인할 수 있었습니다.

 

 

 

 

 

 

 

 

 

13. https://archive.ics.uci.edu/ml/datasets/Wine+Quality에 완인 품질 데이터 세투거 있다. 이 데이터 세트 Wine Quality Dataset는 각 와인의 화학적 측정을 고려하여 화이트 와인의 품질을 예측한다. 이것은 다중 클래스 분류 문제이지만 회귀 문제로도 구성될 수 있다. 여기서는 다중 클래스 분류 문제로 접근해보자. 11개의 입력 특성과 하나의 출력 변수(Qulaity : 0부터 10 사이의 값)가 있으며 4,898개의 샘플이 있다. 심층 신경망을 구성하여서 와인을 분류해 보자. 

 

 

UCI Machine Learning Repository: Data Set

I'm sorry, the dataset "Wine Quality에" does not appear to exist. Supported By:  In Collaboration With: About  ||  Citation Policy  ||  Donation Policy  ||  Contact  ||  CML

archive.ics.uci.edu

 

 

먼저 위 사이트에 방문하여 화이트 와인의 데이터 세트 winequality-white.csv를 다운받아 코드와 같은 폴더에 적재하였습니다.

 

 

import pandas as pd
import tensorflow as tf
from sklearn.model_selection import train_test_split

# 같은 폴더내에 csv파일 읽어오기
dataset = pd.read_csv('winequality-white.csv', sep=';')

# 입력데이터
X = dataset.drop('quality', axis = 1)
y = dataset['quality']



# 훈련, 테스트 데이터(80:20)로 분할한다.
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state = 1)


# 케라스 모델을 생성한다. 
model = tf.keras.models.Sequential()
model.add(tf.keras.layers.Dense(512, activation='relu', input_shape=(11,)))
model.add(tf.keras.layers.Dense(128, activation='relu'))
model.add(tf.keras.layers.Dense(10, activation='softmax'))


# 손실함수로 교차 엔트로피 사용
model.compile(optimizer='rmsprop',
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])

# 모델 학습
model.fit(X_train, y_train, epochs = 200, batch_size = 32)

# 테스트
test_loss, test_acc = model.evaluate(X_test, y_test)

print(dataset['quality'].unique())
print('테스트 정확도:', test_acc)

 

...
Epoch 198/200
108/108 [==============================] - 0s 877us/step - loss: 1.0542 - accuracy: 0.5478
Epoch 199/200
108/108 [==============================] - 0s 877us/step - loss: 1.0572 - accuracy: 0.5435
Epoch 200/200
108/108 [==============================] - 0s 904us/step - loss: 1.0590 - accuracy: 0.5385
46/46 [==============================] - 0s 630us/step - loss: 1.2700 - accuracy: 0.5041

[6 5 7 8 4 3 9]
테스트 정확도: 0.5040816068649292

 

배치 사이즈를 32로 200 에포크 학습시킨 결과 ~0.5 정도의 비교적 낮은 정확도를 보여주었습니다. 에포크를 늘려 더 학습해도 테스트 데이터에 대한 정확도은 올라가지 않고, 훈련데이터에 대한 정확도만 높아져 과적합이 발생하는 것을 확인할 수 있었습니다. 

 

 

 

 

 

 

 

 

14. 다양한 종류의 밀에서 추출한 종자의 측정값을 기준으로 종 예측을 하는 프로그램을 작성해보자. 이것은 2가지의 클래스가 있는 이진 분류 문제이다. Wheat Seeds Dataset(https://archive.ics.uci.edu/ml/datasets/seeds)을 사용한다. 7개의 입력 특성과 1개의 출력 변수가 있고 210개의 샘플이 있다.

 

 

UCI Machine Learning Repository: seeds Data Set

seeds Data Set Download: Data Folder, Data Set Description Abstract: Measurements of geometrical properties of kernels belonging to three different varieties of wheat. A soft X-ray technique and GRAINS package were used to construct all seven, real-valued

archive.ics.uci.edu

 

 

먼저 위 사이트에 방문하여 데이터 세트 seeds_dataset.txt를 다운받아 코드와 같은 폴더에 적재하였습니다.

 

 

import pandas as pd
import tensorflow as tf
from sklearn.model_selection import train_test_split

# 데이터 적재
dataset = pd.read_csv('seeds_dataset.txt', sep='\s+|\t', header = None)

# 입력데이터
X = dataset.drop(7, axis = 1)
y = dataset[7]

print(dataset[7].unique())

# 훈련, 테스트 데이터(80:20)로 분할한다.
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state = 1)

# 케라스 모델을 생성한다. 
model = tf.keras.models.Sequential()
model.add(tf.keras.layers.Dense(32, activation='relu', input_shape=(7,)))
model.add(tf.keras.layers.Dense(32, activation='relu'))
model.add(tf.keras.layers.Dense(4, activation='softmax'))


# 손실함수로 교차 엔트로피 사용
model.compile(optimizer='rmsprop',
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])

# 모델 학습
model.fit(X_train, y_train, epochs = 100, batch_size = 32)

# 테스트
test_loss, test_acc = model.evaluate(X_test, y_test)

print(dataset[7].unique())
print('테스트 정확도:', test_acc)

 

...
Epoch 97/100
5/5 [==============================] - 0s 977us/step - loss: 0.2304 - accuracy: 0.8980
Epoch 98/100
5/5 [==============================] - 0s 733us/step - loss: 0.2270 - accuracy: 0.9048
Epoch 99/100
5/5 [==============================] - 0s 977us/step - loss: 0.2315 - accuracy: 0.8912
Epoch 100/100
5/5 [==============================] - 0s 733us/step - loss: 0.2289 - accuracy: 0.9116
2/2 [==============================] - 0s 2ms/step - loss: 0.2834 - accuracy: 0.8889

[1 2 3]
테스트 정확도: 0.8888888955116272

 

데이터가 0~2가 아닌 1~3으로 들어있어 출력층의 4유닛으로 모델을 구축해 다중 분류를 진행하였습니다. (데이터 전처리가 더 비효율적이라고 판단, 0으로 분류되는 결과는 없다) 배치사이즈는 32로 100 에포크 학습한 결과 테스트 데이터에 대해 평균적으로 0.80~0.93 정확도가 출력되었습니다. 

 



감사합니다.

 


공부한 내용을 복습/기록하기 위해 작성한 글이므로 내용에 오류가 있을 수 있습니다.

댓글
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Total
Today
Yesterday