728x90
CNN
이미지는 여러개의 픽셀로 이루어져 있고,
픽셀은 숫자 정보로 표현할 수 있다.
흑백사진은 한 픽셀이 0(흑) ~ 255(백) 중 한개의 숫자로 되어 있고,
컬러사진은 한 픽셀에 (R , G, B) 3개의 숫자로 되어 있다.

※ 이미지데이터를 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
'#05.코딩애플 > +01.딥러닝' 카테고리의 다른 글
| [코딩애플] 모델 저장하기 (0) | 2023.04.24 |
|---|---|
| [코딩애플] 개 vs 고양이 이미지 분류하기 (0) | 2023.04.22 |
| [코딩애플] 개 vs 고양이 데이터 분류하기 (0) | 2023.04.19 |
| [코딩애플] 딥러닝이란? (0) | 2023.04.01 |