fbpx

패션물 분류를 위한 신경망

0
0
5 개월 ago
인공지능-패션-의류-분류

# 운동화나 셔츠, 신발, 옷 등의 사진을 인공지능 모델입니다.

# 1. 데이터 셋 생성하기

# tensorflow와 tf.keras를 임포트합니다import tensorflow as tffrom tensorflow import keras
# 헬퍼(helper) 라이브러리를 임포트합니다import numpy as npimport matplotlib.pyplot as plt
print(tf.__version__) # 2.2.0 출력됨

# 1.1 원본 데이터를 불러오거나 데이터를 생성한다.
# 10개의 카테고리와 70,000개의 흑백 이미지로 구성된 패션 MNIST 데이터셋

fashion_mnist = keras.datasets.fashion_mnist
(train_images, train_labels), (test_images, test_labels) = fashion_mnist.load_data()

결과값

# 네 개의 넘파이(NumPy) 배열이 반환됩니다. ※ numpy 는 2개 이상의 입력으로 딥러닝 뉴런 모델 구축에 용이합니다. 통상적으로 3개 이상일 경우 머신러닝을 딥러닝으로 말함

# 1.2 데이터로부터 훈련셋, 검증셋, 시험셋을 생성한다.
# 훈련세트 : train_images와 train_labels 배열
# 시험세트 : test_images와 test_labels 배열
# 이미지는 28×28 크기의 넘파이 배열이고 픽셀 값은 0과 255 사이입니다.
# 레이블(label)은 0에서 9까지의 정수 배열입니다.
# 이 값은 이미지에 있는 옷의 클래스(class)를 나타냅니다

class_names = [‘T-shirt/top’, ‘Trouser’, ‘Pullover’, ‘Dress’, ‘Coat’,               ‘Sandal’, ‘Shirt’, ‘Sneaker’, ‘Bag’, ‘Ankle boot’]

train_images.shape

결과값 : 훈련 세트에 60,000개의 이미지가 있다는 것을 보여줍니다. 각 이미지는 28×28 픽셀로 표현됩니다

len(train_labels)

훈련 세트에는 60,000개의 레이블이 있습니다

train_labels

각 레이블은 0과 9사이의 정수입니다

test_images.shape

테스트 세트에는 10,000개의 이미지가 있습니다. 이 이미지도 28×28 픽셀로 표현됩니다.

len(test_labels)

테스트 세트는 10,000개의 이미지에 대한 레이블을 가지고 있습니다

# 1.3 딥러닝 모델의 학습 및 평가를 할 수 있도록 포맷 변환을 한다.
# 딥러닝 모델의 학습 및 평가를 할 수 있도록 포맷 변환(전처리)을 한다

plt.figure()
plt.imshow(train_images[10])
plt.colorbar()
plt.grid(False)
plt.show()

11번째 이미지를 보여줍니다.

# 신경망 모델에 주입하기 전에 이 값의 범위를 0~1 사이로 조정하겠습니다. 이렇게 하려면 255로 나누어야 합니다. 훈련 세트와 테스트 세트를 동일한 방식으로 전처리하는 것이 중요합니다

train_images = train_images / 255.0
test_images = test_images / 255.0

# 훈련 세트에서 처음 25개 이미지와 그 아래 클래스 이름을 출력해 보죠. 데이터 포맷이 올바른지 확인하고 네트워크 구성과 훈련할 준비를 마칩니다.

plt.figure(figsize=(10,10))
for i in range(25):
plt.subplot(5,5,i+1)
plt.xticks([])
plt.yticks([])
plt.grid(False)
plt.imshow(train_images[i], cmap=plt.cm.binary)
plt.xlabel(class_names[train_labels[i]])
plt.show()

# 2. 모델 구성하기

# 2.1 시퀀스 모델을 생성한 뒤 필요한 레이어를 추가하며 구성

# 신경망의 기본 구성 요소는 층(layer)입니다. 층은 주입된 데이터에서 표현을 추출합니다. 아마도 문제를 해결하는데 더 의미있는 표현이 추출될 것입니다. 대부분 딥러닝은 간단한 층을 연결하여 구성됩니다. tf.keras.layers.Dense와 같은 층들의 가중치(parameter)는 훈련하는 동안 학습됩니다.

model = keras.Sequential([
keras.layers.Flatten(input_shape=(28, 28)),
keras.layers.Dense(128, activation=’relu’),
keras.layers.Dense(10, activation=’softmax’)
])

# 이 네트워크의 첫 번째 층인 tf.keras.layers.Flatten은 2차원 배열(28 x 28 픽셀)의 이미지 포맷을 28 * 28 = 784 픽셀의 1차원 배열로 변환합니다. 이 층은 이미지에 있는 픽셀의 행을 펼쳐서 일렬로 늘립니다. 이 층에는 학습되는 가중치가 없고 데이터를 변환하기만 합니다.

# 픽셀을 펼친 후에는 두 개의 tf.keras.layers.Dense 층이 연속되어 연결됩니다. 이 층을 밀집 연결(densely-connected) 또는 완전 연결(fully-connected) 층이라고 부릅니다. 첫 번째 Dense 층은 128개의 노드(또는 뉴런)를 가집니다. 두 번째 (마지막) 층은 10개의 노드의 소프트맥스(softmax) 층입니다. 이 층은 10개의 확률을 반환하고 반환된 값의 전체 합은 1입니다. 각 노드는 현재 이미지가 10개 클래스 중 하나에 속할 확률을 출력합니다.

# 3. 모델 학습과정 설정

# 3.1 학습하기 전, 학습에 대한 설정을 수행한다.
# 3.2 손실 함수 및 최적화 방법을 정의
# 3.3 케라스에서는 compile() 함수를 사용한다.

# 모델을 훈련하기 전에 필요한 몇 가지 설정이 모델 컴파일 단계에서 추가됩니다:

# 손실 함수(Loss function)-훈련 하는 동안 모델의 오차를 측정합니다. 모델의 학습이 올바른 방향으로 향하도록 이 함수를 최소화해야 합니다.
옵티마이저(Optimizer)-데이터와 손실 함수를 바탕으로 모델의 업데이트 방법을 결정합니다.
지표(Metrics)-훈련 단계와 테스트 단계를 모니터링하기 위해 사용합니다. 다음 예에서는 올바르게 분류된 이미지의 비율인 정확도를 사용합니다.

model.compile(optimizer=’adam’,
loss=’sparse_categorical_crossentropy’,
metrics=[‘accuracy’])

# 4. 모델 학습시키기 (모델 훈련)

# 훈련셋을 이용하여 구성한 모델로 학습시킨다.
# 케라스에서는 fit() 함수를 사용한다.

# 신경망 모델을 훈련하는 단계는 다음과 같습니다

# 1) 훈련 데이터를 모델에 주입합니다-이 예에서는 train_images와 train_labels 배열입니다.

# 2) 모델이 이미지와 레이블을 매핑하는 방법을 배웁니다.

# 3) 테스트 세트에 대한 모델의 예측을 만듭니다-이 예에서는 test_images 배열입니다. 이 예측이 test_labels 배열의 레이블과 맞는지 확인합니다.

# 훈련을 시작하기 위해 model.fit 메서드를 호출하면 모델이 훈련 데이터를 학습합니다:

model.fit(train_images, train_labels, epochs=5)

모델이 훈련되면서 손실과 정확도 지표가 출력됩니다. 이 모델은 훈련 세트에서 약 0.88(88%) 정도의 정확도를 달성합니다. 학습이 반복 될수록 정확도는 높아집니다.

# 5. 학습과정 살펴보기 (정확도 평가)

# 모델 학습시 훈련셋, 검증셋의 손실 및 정확도를 측정한다.
# 반복횟수에 따른 손실 및 정확도 추이를 보면서 학습상황 판단.

# 그다음 테스트 세트에서 모델의 성능을 비교합니다

test_loss, test_acc = model.evaluate(test_images, test_labels, verbose=2)

print(‘\n테스트 정확도:’, test_acc)

결과값

# 테스트 세트의 정확도가 훈련 세트의 정확도보다 조금 낮습니다. 훈련 세트의 정확도와 테스트 세트의 정확도 사이의 차이는 과대적합(overfitting) 때문입니다. 과대적합은 머신러닝 모델이 훈련 데이터보다 새로운 데이터에서 성능이 낮아지는 현상을 말합니다.

# 6. 모델 평가 ( 예측 만들기 )

# 훈련된 모델을 사용하여 이미지에 대한 예측을 만들 수 있습니다.

# 준비된 시험셋으로 학습한 모델을 평가한다.
# 케라스에서는 evaluate() 함수를 사용

predictions = model.predict(test_images)

여기서는 테스트 세트에 있는 각 이미지의 레이블을 예측했습니다. 첫 번째 예측을 확인해 보죠

predictions[0]

결과값

이 예측은 10개의 숫자 배열로 나타납니다. 이 값은 10개의 옷 품목에 상응하는 모델의 신뢰도(confidence)를 나타냅니다. 가장 높은 신뢰도를 가진 레이블을 찾아보죠

np.argmax(predictions[0])

모델은 이 이미지가 앵클 부츠(class_name[9])라고 가장 확신하고 있습니다

# 이 값이 맞는지 테스트 레이블을 확인해 보죠

test_labels[0]

결과값

# 10개 클래스에 대한 예측을 모두 그래프로 표현해 보겠습니다

def plot_image(i, predictions_array, true_label, img):
predictions_array, true_label, img = predictions_array[i], true_label[i], img[i]
plt.grid(False)
plt.xticks([])
plt.yticks([])

plt.imshow(img, cmap=plt.cm.binary)

predicted_label = np.argmax(predictions_array)
if predicted_label == true_label:
color = ‘blue’
else:
color = ‘red’

plt.xlabel(“{} {:2.0f}% ({})”.format(class_names[predicted_label],
100*np.max(predictions_array),
class_names[true_label]),
color=color)

def plot_value_array(i, predictions_array, true_label):
predictions_array, true_label = predictions_array[i], true_label[i]
plt.grid(False)
plt.xticks([])
plt.yticks([])
thisplot = plt.bar(range(10), predictions_array, color=”#777777″)
plt.ylim([0, 1])
predicted_label = np.argmax(predictions_array)

thisplot[predicted_label].set_color(‘red’)
thisplot[true_label].set_color(‘blue’)

# 0번째 원소의 이미지, 예측, 신뢰도 점수 배열을 확인해 보겠습니다.

i = 0
plt.figure(figsize=(6,3))
plt.subplot(1,2,1)
plot_image(i, predictions, test_labels, test_images)
plt.subplot(1,2,2)
plot_value_array(i, predictions, test_labels)
plt.show()

0번째 원소의 이미지 결과값

i = 12
plt.figure(figsize=(6,3))
plt.subplot(1,2,1)
plot_image(i, predictions, test_labels, test_images)
plt.subplot(1,2,2)
plot_value_array(i, predictions, test_labels)
plt.show()

올바르게 예측된 레이블은 파란색이고 잘못 예측된 레이블은 빨강색입니다
숫자는 예측 레이블의 신뢰도 퍼센트(100점 만점)입니다.

# 처음 X 개의 테스트 이미지와 예측 레이블, 진짜 레이블을 출력합니다

# 올바른 예측은 파랑색으로 잘못된 예측은 빨강색으로 나타냅니다

num_rows = 5
num_cols = 3
num_images = num_rowsnum_cols plt.figure(figsize=(22num_cols, 2num_rows))
for i in range(num_images):
plt.subplot(num_rows, 2num_cols, 2i+1)
plot_image(i, predictions, test_labels, test_images)
plt.subplot(num_rows, 2num_cols, 2i+2)
plot_value_array(i, predictions, test_labels)
plt.show()

# 7. 모델 사용하기 (예측하기)

# 임의의 입력으로 모델의 출력을 얻는다.
# 케라스에서는 predict() 함수를 사용한다.

# 마지막으로 훈련된 모델을 사용하여 한 이미지에 대한 예측을 만듭니다.

# 테스트 세트에서 이미지 하나를 선택합니다

img = test_images[0]

print(img.shape)

결과값

# tf.keras 모델은 한 번에 샘플의 묶음 또는 배치(batch)로 예측을 만드는데 최적화되어 있습니다. 하나의 이미지를 사용할 때에도 2차원 배열로 만들어야 합니다

# 이미지 하나만 사용할 때도 배치에 추가합니다

img = (np.expand_dims(img,0))

print(img.shape)

# 이제 이 이미지의 예측을 만듭니다

predictions_single = model.predict(img)

print(predictions_single)

결과값

plot_value_array(0, predictions_single, test_labels)
_ = plt.xticks(range(10), class_names, rotation=45)

결과값

# model.predict는 2차원 넘파이 배열을 반환하므로 첫 번째 이미지의 예측을 선택합니다

np.argmax(predictions_single[0])

결과값

이전과 마찬가지로 모델의 예측은 레이블 9입니다.

댓글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다