본문 바로가기
#05.코딩애플/+01.딥러닝

[코딩애플] CNN

by 돌비오 2023. 4. 17.
728x90
CNN

 

이미지는 여러개의 픽셀로 이루어져 있고,

픽셀은 숫자 정보로 표현할 수 있다.

 

흑백사진은 한 픽셀이 0(흑) ~ 255(백) 중 한개의 숫자로 되어 있고,

컬러사진은 한 픽셀에 (R , G, B) 3개의 숫자로 되어 있다.

 

fashion_mnist 이미지 한개의 데이터 (이런게 60000장 있음)

 

 

 

 

 

※ 이미지데이터를 flatten 하는 것의 문제점

 

 

 

 

 

 

※ 해결책: CNN

feature extraction

 

 

 

 

 

 

 

※ 단순 CNN 의 문제 : feature의 위치

 

 

 

 

※ 해결책

 

 

 

CNN 의 일반적인 구성

 

 

 

 

 

 

실전 CODE
import tensorflow as tf
import numpy as np


# trainX 는 이미지(숫자 데이터) 모음. (60000,28,28)
# trainY 는 이미지들이 각각 어떤 그룹에 속해있는지 나와있는 라벨 숫자데이터.
(trainX, trainY), (testX, testY) = tf.keras.datasets.fashion_mnist.load_data()


# 255로 나누는 이유. 이미지데이터는 0~255 사이 숫자데이터인데 255로 나누면 0~1 사이로 바뀜.
# 그렇게 압축하면 처리시간 빨라지고 결과 좋게 나올수 있어서 하는 것.
trainX = trainX / 255.0   
testX = testX / 255.0      


# conv에 4차원 데이터가 필요하기 때문에 reshape
trainX = trainX.reshape( (trainX.shape[0] , 28, 28, 1) )
testX  = testX.reshape( (testX.shape[0] , 28, 28, 1) )


class_names = [ 티셔츠,드레스 등 ]


model = tf.keras.Sequential([
# 컨벌루셔널 레이어를 통해서 32개의 다른 피쳐가 강화된 복사이미지를 만들고, 커널사이즈는 (3,3)
#  (3,3) 커널로 피쳐 강화된 복사본 만들면 크기가 작아지겠지? padding은 다시 사이즈 늘려주는 것.  
# relu함수 쓰는 이유 => 이미지데이터는 음수가 없기 때문에. 음수를 0으로 변경
# 첫번째 레이어는 input_shape 지정해줘야 한다.

# input_shape 는 데이터 하나의 shape.
    tf.keras.layesrs.Conv2D(32, (3,3), padding="same", activation='relu', input_shape=(28,28,1) ),

# 데이터를 가운데로 모아주는 polling !
# (2,2) 는 풀링 사이즈

    tf.keras.layesrs.MaxPooling( (2,2) ),

# 결국 마지막으로는 차원을 낮춰서 결과를 출력해야하므로 Flatten
    tf.keras.layesrs.Flatten(),
    tf.keras.layesrs.Dense(128, activation='relu'),     
    tf.keras.layesrs.Dense(128, activation='softmax'),
])

model.summary()

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


# validation_data = (testX, testY)  => epoch 1회 끝날때마다 채점하는 방법
model.fit(trainX, trainY, validation_data = (testX, testY), epochs=5)


# 학습 후 모델평가하기
score = model.evaluate( testX, testY)
print(score)
728x90