나른한 코딩 생활

[23일차] ABC 부트캠프 패션 데이터 및 CNN 본문

ABC 부트캠프

[23일차] ABC 부트캠프 패션 데이터 및 CNN

GerHerMo 2024. 7. 27. 19:02

이전까지 배웠던 케라스를 또다른 예제들을 통해서 공부해보자

오늘은 총 4개의 예제를 풀어보도록 하겠다

 


XOR 데이터 학습 및 예측

# 데이터 준비하기
"""
XOR
0, 0 -> 0
0, 1 -> 1
1, 0 -> 1
1, 1 -> 0
"""
import tensorflow as tf
data = tf.constant([[0, 0], [0, 1], [1, 0], [1, 1]],dtype=tf.int32, name="[x1,x2]")
# uint 와 int의 차이점은 ?  u = unsigned 의 약자 / 기본적으로 사용하고 있는 int 는 signed
# 부호가 있냐 없냐의 차이이고, 이럴 경우 uint 는 양수값만을 취급
# 뒤의 숫자 8, 16, 32, 64 는 bit 수를 의미하며 단위의 크기를 결정
label = tf.constant([[0], [1], [1], [0]], dtype=tf.int32, name="y")
# 이렇게도 가능
other_data = tf.Variable([[0,0],[0,1],[1,0],[1,1]])

from tensorflow.keras import Sequential, Input
from tensorflow.keras.layers import Dense
model = Sequential([],name="MODEL")
model.add(Input(shape=(2,), dtype= tf.int32,name='INPUT'))
model.add(Dense(units=32,activation='relu',name='LAYER1'))
model.add(Dense(units=16,activation='relu',name='LAYER2'))
model.add(Dense(units=8,activation='relu',name='LAYER3'))
model.add(Dense(units=1,activation='sigmoid',name='OUTPUT'))
model.summary()
model.compile(loss='mse',optimizer='RMSProp')
# loss: 0.0055 loss: loss: 0.0054 loss: 0.0053 loss: 0.0052
model.fit(data,label,epochs=400)
#model.save('BEST_WEIGHTS.keras')

print(model.predict(data))
#ex) [[0.13784546] [0.98600066] [0.973925  ] [0.01885279]]

주석에 있는 값과 다른 값이 도출됨

 

결과창을 보면 해당 코드를 실행할때마다 학습되는 정도가 다르기 때문에 

손실률인 losspredict 값이 바뀌는 것을 볼 수 있다 


패션 아이템 학습 및 예측 -  test 값 확인

import tensorflow as tf
import matplotlib.pyplot as plt
import numpy as np
fashion_mnist = tf.keras.datasets.fashion_mnist
print(fashion_mnist)
(X_train,y_train), (X_test,y_test) = fashion_mnist.load_data()
print(X_train)
print(X_train.shape) #(60000, 28, 28)

print(y_train)
print(y_train.shape) # (60000,)

print(X_test)
print(X_test.shape) # (10000, 28, 28)

print(y_test)
print(y_test.shape) # (10000,)

class_names = ['T-shirt', 'Trousers', 'Pullover', 'Dress', 'Coat',
               'Sandal', 'Shirt', 'Sneaker', 'Bag', 'Ankle boot']
# Sneakers ? / Ankel boots ?
for i in range(25):
    plt.subplot(5,5,i+1)
    plt.grid(visible=False)
    plt.xticks(ticks=list())
    plt.yticks(ticks=[])
    plt.imshow(X_train[i],cmap=plt.cm.binary)
plt.show()
# 60000 개중 25개만 추출해서 확인
(X_train,X_test) = \
    (np.divide(X_train,255.0), np.divide(X_test,255.0)) # \ <= 줄바꿈 문자
print(X_train)

#모델 설정하기
from tensorflow.keras import Sequential, Input
model = tf.keras.models.Sequential([],name='MODEL')
model.add(tf.keras.layers.Flatten(input_shape=(28, 28),name='FLATTEN'))
model.add(tf.keras.layers.Dense(units=128, activation='relu',name='LAYER1'))
model.add(tf.keras.layers.Dense(units=64, activation='relu',name='LAYER2'))
model.add(tf.keras.layers.Dense(units=10, activation='softmax',name='OUTPUT'))

model.summary()
model.compile(optimizer='adam',loss='sparse_categorical_crossentropy',
              metrics=['accuracy']) # 0~9 까지 나오니깐 sparse_categorical 사용
#model.fit(X_train,y_train,epochs=100)
#model.save('2024-07-24.keras')
#model.evaluate(X_test,y_test,verbose=2)
model2 = tf.keras.models.load_model('2024-07-24.keras')
y_predict = model2.predict(X_test)
print(f'y_predict[0] : {np.round(y_predict[0])}')
print(f'y_test[0] : {y_test[0]}')
print(f'y_predict[1] : {np.round(y_predict[1])}')
print(f'y_test[1] : {y_test[1]}')
print(f'y_predict[10] : {np.round(y_predict[10])}')
print(f'y_test[10] : {y_test[10]}')

X_train의 인덱스 0~24까지의 25개 아이템을 출력한 plt.imshow

 

fashion_mnist 안에는 총 7만개의 데이터가 존재하며 6만개를 train 데이터 (훈련) 1만개를 test 데이터 (예측) 로 분류한다

OUTPUT을 포함하여 LAYER1, LAYER2 로 3번 학습

마지막에는 출력이 10개 이므로 활성화 함수를 softmax 로 설정한다

model.summary() , y_predict[0], [1], [10] 에 대한 예측값 확인

 

출력창을 확인해보면 y_predict[0]는 원 핫 인코딩으로 되어 있어서 10번째 중 마지막 1이 채워져 있어서

이미지를 통해 교차확인을 해보면  y_test[0] : 9 와 일치하는것을 알 수 있다

아래의 y_predict[1]y_predict[10] 또한 학습이 잘 되었다


패션 아이템 학습 및 예측 -  LAYER 늘리기, range로 데이터 뽑기

초반부는 위 코드와 동일하다

import tensorflow as tf
import matplotlib.pyplot as plt
import numpy as np
fashion_mnist = tf.keras.datasets.fashion_mnist
print(fashion_mnist)
(X_train,y_train), (X_test,y_test) = fashion_mnist.load_data()
print(X_train)
print(X_train.shape) #(60000, 28, 28)

print(y_train)
print(y_train.shape) # (60000,)

print(X_test)
print(X_test.shape) # (10000, 28, 28)

print(y_test)
print(y_test.shape) # (10000,)

class_names = ['T-shirt', 'Trousers', 'Pullover', 'Dress', 'Coat',
               'Sandal', 'Shirt', 'Sneaker', 'Bag', 'Ankle boot']
# Sneakers ? / Ankel boots ?
for i in range(25):
    plt.subplot(5,5,i+1)
    plt.grid(visible=False)
    plt.xticks(ticks=list())
    plt.yticks(ticks=[])
    plt.imshow(X_train[i],cmap=plt.cm.binary)
plt.show()
# 60000 개중 25개만 추출해서 확인
(X_train,X_test) = \
    (np.divide(X_train,255.0), np.divide(X_test,255.0)) # \ <= 줄바꿈 문자
print(X_train)
# 여기까진 위쪽 코드와 동일하다

 

아래 코드도 유사하나 이번에는 LAYER3 까지 포함하여 4번의 Dense를 거친다

이후 그렇게 학습된 model 을 저장하여 10개까지의 데이터가 학습되었는지 확인해본다

from tensorflow.keras import Sequential, Input
model = tf.keras.Sequential([
    tf.keras.layers.Flatten(input_shape=(28,28),name='INPUT'),
    tf.keras.layers.Dense(units=128, activation='relu',name='LAYER1'),
    tf.keras.layers.Dense(units=64, activation='relu',name='LAYER2'),
    tf.keras.layers.Dense(units=16, activation='relu',name='LAYER3'),
    tf.keras.layers.Dense(units=10, activation='softmax',name='OUTPUT')
],name='MODEL')
print(model.summary())
model.compile(optimizer='adam',loss='sparse_categorical_crossentropy')
# model.fit(x=X_train,y=y_train, epochs=100)
# model.save('2024-07-24-1.keras')
model2 = tf.keras.models.load_model('2024-07-24-1.keras')
y_predict = model2.predict(X_test)

import time
for i in range(10):
    print(f'y_predict[{i}] : {np.round(y_predict[i])}')
    print(f'y_test[{i}] : {y_test[i]}')
    time.sleep(2)

model.summary() 에서 새로운 LAYER3 층이 생겨난걸 볼 수 있다
range(10) 으로 설정했기때문에 predict 10개 값을 가져온다


패션 아이템 학습 및 예측 - CNN

컨볼루션(Convolution Neural Network: CNN) : 신경망에서는 하 위 레이어의 노드들과 상위 레이어의 노드들이 부분적으로만 연결되어 있다

 

지금까지 했던 작업을 CNN 작업으로 해보도록 하겠다

import tensorflow as tf
import matplotlib.pyplot as plt
import numpy as np
fashion_mnist = tf.keras.datasets.fashion_mnist
print(fashion_mnist)
(X_train,y_train), (X_test,y_test) = fashion_mnist.load_data()
print(X_train.shape) #(60000, 28, 28)
print(y_train.shape) # (60000,)
print(X_test.shape) # (10000, 28, 28)
print(y_test.shape) # (10000,)

# 이미지 뽑아오기
X_train_CNN = X_train.reshape((-1,28,28,1)) / 255.0 
X_test_CNN = X_test.reshape((-1,28,28,1)) / 255.0

model_CNN = tf.keras.Sequential([
    tf.keras.layers.Conv2D(filters=32, kernel_size=(3,3),padding='same', # 커널 사이즈는 보통 3,3 을 사용
                           activation='relu',input_shape=(28,28,1)), # padding = 'same' : 크기를 줄이지 않음
    tf.keras.layers.MaxPooling2D(pool_size = (2,2),strides=2), # 풀 사이즈는 보통 2,2 를 사용 pdf 269
    tf.keras.layers.Conv2D(filters=64, kernel_size=(3,3), padding = 'same',
                           activation='relu'),
    tf.keras.layers.MaxPooling2D(pool_size = (2,2),strides=2),
    tf.keras.layers.Conv2D(filters = 32, kernel_size=(3,3),padding='same',activation='relu'),
    tf.keras.layers.MaxPooling2D(pool_size = (2,2),strides=2), # Convolution Network // Conv2D, MaxPooling2D 는 보통 쌍으로 움직인다
    tf.keras.layers.Flatten(), #  fully connected
    tf.keras.layers.Dense(units=128, activation='relu',name='LAYER1'),
    tf.keras.layers.Dense(units=64, activation='relu',name='LAYER2'),
    tf.keras.layers.Dense(units=16, activation='relu',name='LAYER3'),
    tf.keras.layers.Dense(units=10, activation='softmax',name='OUTPUT')
],name='CNN')
model_CNN.summary()
model_CNN.compile(optimizer='adam' ,loss='sparse_categorical_crossentropy',metrics=['accuracy'])
# model_CNN.fit(X_train_CNN,y_train,epochs=200)
# model_CNN.save('2024-07-24-CNN.keras')
model2 = tf.keras.models.load_model('2024-07-24-CNN.keras')
y_predict = model2.predict(X_test_CNN)

import time
for i in range(20):
    print(f'y_predict[{i}] : {np.round(y_predict[i])}')
    print(f'y_test[{i}] : {y_test[i]}')
    print('-'*30)
    time.sleep(2)

위에서 봤던 LAYER1,2,3 OUTPUT을 제외하고도 Conv2D, MaxPooling2D 층이 들어가있는것을 볼 수 있다
20까지 뽑은 데이터 중에서는 전부 정답을 맞춘 모습