[Anaconda+python] 의상 분류기 만들어서 훈련시키고 테스트하기2(컨볼루션 신경망)

코딩/python|2020. 2. 5. 02:26

지난 시간에 인공신경망을 이용해서 의상을 분류할 수 있는 딥러닝 모델을 만들어봤습니다.

=> https://bskyvision.com/696

 

이 모델은 티셔츠, 코트, 가방, 앵클부츠 등 10개의 의상을 분류할 수 있었습니다. 오늘은 동일한 fashion mnist 데이터베이스를 이용해서 컨볼루션 신경망(convolutional neural network, CNN)을 훈련시켜보겠습니다. CNN은 컴퓨터비전의 사실상 모든 분야의 성능을 획기적으로 개선시킨 알고리즘입니다. 최근의 웬만한 컴퓨터비전 모델은 CNN을 기반으로 해서 만들어졌다고 해도 과언이 아닐 정도죠. 

 

오늘은 바로 전체 코드를 보여드리고 중요부분을 설명하는 식으로 글을 전개해가겠습니다. 지난 시간과 전반적인 코드는 매우 유사합니다.  

 

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
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import datasets, layers, models
 
fashion_mnist = datasets.fashion_mnist # fashion_mnist = keras.datasets.fashion_mnist
(train_images, train_labels), (test_images, test_labels) = fashion_mnist.load_data()
 
train_images = train_images.reshape((6000028281))
test_images = test_images.reshape((1000028281))
 
train_images = train_images/255.0
test_images = test_images/255.0
 
model = models.Sequential()
model.add(layers.Conv2D(32, (33), activation='relu', input_shape=(28281)))
model.add(layers.MaxPooling2D((22)))
model.add(layers.Conv2D(64, (33), activation='relu'))
model.add(layers.MaxPooling2D((22)))
model.add(layers.Conv2D(64, (33), activation='relu'))
model.add(layers.Flatten())
model.add(layers.Dense(64, activation='relu'))
model.add(layers.Dense(10, activation='softmax'))
 
model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])
 
model.fit(train_images, train_labels, epochs=10)
 
test_loss, test_acc = model.evaluate(test_images, test_labels)
 
print('Test accuracy:', test_acc)
cs

 

이 코드를 실행하면 다음과 같은 결과가 출력됩니다. 

 

테스트 정확도가 0.9121이 나왔네요. 지난번에 인공신경망을 이용해서 모델을 만든 것(0.8817)보다 좀 더 좋은 성능을 보입니다. 물론 두 모델 모두 충분히 정교하게 파라미터를 조정하지 않았기 때문에 어떤 것이 fashion mnist에서 더 좋은 성능을 보인다고 단정지을 순 없습니다.^^ 

 

자, 그럼 가장 중요한 부분인 CNN의 구조를 설정한 부분의 코드를 살펴보겠습니다. 

 

 

이 부분을 보시면 오늘 만든 CNN 모델의 구조를 알 수 있습니다. 3개의 컨볼루션 층과 2개의 fully connected(FC) 층으로 구성되어 있음을 알 수 있습니다. 10개의 클래스로 분류하는 모델이기 때문에 마지막 FC층은 10개의 뉴런으로 구성되어 있고, 활성화함수로 softmax 함수를 사용함을 알 수 있습니다. 

 

나머지 부분에 대한 설명은 지난번 포스팅에서 한줄, 한줄 다뤘기 때문에 여기에선 생략하도록 하겠습니다. 항상 질문과 지적은 환영입니다. 최대한 빠르게 답변드리도록 노력하고 있으니 댓글 남겨주세요.^^ 

 

 

<참고자료>

[1] https://www.tensorflow.org/tutorials/images/cnn, tensorflow, "합성곱 신경망"

  1. 2020.09.23 19:51 댓글주소  수정/삭제  댓글쓰기

    비밀댓글입니다

    • BlogIcon b스카이비전 2020.09.23 20:39 신고 댓글주소  수정/삭제

      댓글 감사합니다^^ 보아하니 훈련시킬때 배치 사이즈를 32로 설정해주신것 같은데요?? 그래서 60000개의 데이터셋이 60000/32=1875개의 배치로 나눠져서 훈련에 사용된 것으로 보입니다.^^

    • BlogIcon b스카이비전 2020.09.23 20:41 신고 댓글주소  수정/삭제

      https://bskyvision.com/803 배치에 관해선 이 글을 참고해주세요^^

    • 2020.09.24 09:25 댓글주소  수정/삭제

      비밀댓글입니다

    • BlogIcon b스카이비전 2020.09.24 09:30 신고 댓글주소  수정/삭제

      저도 그게 의문이긴한데, 패키지 버전에 따라 디폴트 세팅이 혹시 다르게 되어있을지도 모르겠네요^^;

    • BlogIcon b스카이비전 2020.09.24 10:11 신고 댓글주소  수정/삭제

      https://keras.rstudio.com/reference/fit.html 이 글을 참고해보니 배치 사이즈 디폴트 세팅이 32로 되어 있네요. 그리고 저도 다시 코드를 돌려보니 배치 사이즈가 32로 되어있네요 ㅎㅎ 전성진님과 보여지는 형태만 조금 다른 것 같고 실제 이뤄지는 것은 동일한 것 같습니다.

  2. 나그에 2020.10.07 16:12 댓글주소  수정/삭제  댓글쓰기

    안녕하세요. 글 잘 보고 있습니다.
    합성곱하고 폴링층은 더 추가할 수 없을까요?
    저 같은 경우 폴링 하나, 합성곱 하나를 추가하려 하니까 에러가 나네요. TT

    • BlogIcon b스카이비전 2020.10.07 16:33 신고 댓글주소  수정/삭제

      더 추가할수있습니다^^ 어떻게 추가하셨는지 한번 코드를 보여주시겠어요??

    • BlogIcon 나그에 2020.10.07 22:18 댓글주소  수정/삭제

      import tensorflow as tf
      from tensorflow.keras import datasets, models
      from tensorflow.keras.layers import Flatten, Dense, Dropout, Conv2D, MaxPool2D
      from tensorflow.keras.utils import plot_model
      print(tf.__version__)

      cifar10 = datasets.cifar10
      (train_x, train_y),(test_x, test_y)=cifar10.load_data()

      mport matplotlib.pyplot as plt
      for col1 in range(9):
      plt.subplot(3,3,col1+1)
      plt.imshow(train_x[col1])
      plt.show()


      train_x, test_x = train_x / 255.0, test_x / 255.0

      model3 = models.Sequential([

      Conv2D(input_shape=(32,32,3), kernel_size=(3,3),filters=128, activation="relu"),
      MaxPool2D(),
      Conv2D(kernel_size=(3,3), filters=256,activation="relu"),
      MaxPool2D(),
      Conv2D(kernel_size=(3,3), filters=512,activation="relu"),

      -------------
      여기에
      MaxPool2D(),
      Conv2D(kernel_size=(3,3), filters=512,activation="relu"),
      하면 에러가 나는군요 TT
      -------------

      Flatten(),
      Dense(512, activation='relu'),
      Dropout(0.2),
      Dense(10, activation='softmax')
      ])
      model3.summary()
      plot_model(model3, to_file="model3_cifar10.png", show_shapes=True)


      model3.compile(optimizer='adam',loss='sparse_categorical_crossentropy', metrics=['accuracy'])
      hist3 = model3.fit(train_x, train_y, epochs=25,batch_size=256, validation_split=0.25)
      plt.plot(hist3.history['accuracy'],'b-')
      plt.plot(hist3.history['val_accuracy'],'r--')
      plt.legend(['train','test'],loc='upper left')
      plt.ylim([0.3,1.0])
      plt.xlabel('Epoch')
      plt.ylabel('Accuracy')
      plt.show()
      sc3 = model3.evaluate(test_x, test_y)
      print("accuracy : ", sc3[1], " loss : ", sc3[0])

    • BlogIcon b스카이비전 2020.10.07 22:50 신고 댓글주소  수정/삭제

      보아하니 max pooling을 한번 더 하면 특성맵이 너무 작아지기 때문에 문제가 발생하는 것 같습니다.

    • BlogIcon 나그에 2020.10.07 23:02 댓글주소  수정/삭제

      원인을 몰라서 답답했는데 감사합니다.^^

    • BlogIcon b스카이비전 2020.10.07 23:27 신고 댓글주소  수정/삭제

      질문 남겨주셔서 감사합니다.^^