model = tf.keras.Sequential([
tf.keras.layers.Dense(128,input_shape = (28,28), activation = "relu"),
tf.keras.layers.Dense(64, activation = "relu"),
tf.keras.layers.Flatten(),
tf.keras.layers.Dense(10, activation = 'softmax'),
])
지난 포스팅에서 구현한 모델은 28x28픽셀의 이미지를 한 줄의 576개 픽셀로 나열한 후 은닉층을 거쳐 나오는 구조의 모델이기 때문에 픽셀안 의류의 위치가 좀 바뀐다거나 뒤집어진 의류 같은경우 분류에 대한 오차가 매우 커질 수 있다는 문제점이 존재한다.
이를 해결하기 위해 convolution layer를 사용한다.
convolution layer를 사용하게 된다면 kernel를 통해 특정영역의 특징을 추출하여 이미지를 학습하게 된다.
model = tf.keras.Sequential([
# tf.keras.layers.Dense(128,input_shape = (28,28), activation = "relu"),
tf.keras.layers.Conv2D(32,(3,3),padding='same',activation = 'relu',input_shape = (28,28,1) ),
#(32개의 다른 feature, 커널 사이즈,패딩여부,활성화 함수, 하나의 입력데이터 shape)
tf.keras.layers.MaxPooling2D((2,2)),
tf.keras.layers.Flatten(),
tf.keras.layers.Dense(128, activation = "relu"),
tf.keras.layers.Dense(10, activation = 'softmax'),
])
컨볼루션 레이어를 만들때는 Conv2D라는 keras 함수를 사용하고 함수에서 사용되는 파라미터들은
32 --> 커널을 통해 만들 feature map의 개수
(3,3) -> 3x3크기의 커널 사이즈
padding -> 커널을 사용해 픽셀에서 특징을 추출하게 되면 이미지의 크기가 작아지게 되는데 이러한 상황을 방지하기 위해 테두리 부분에 픽셀을 추가하고 커널을 적용해 특징 추출을 하게 되면 원 이미지의 크기를 유지하며 특징추출을 할 수 있게 된다. (padding 종류도 zero padding, mirror padding 등 많다고 하는데 이건 다음에 알아보자..)
same으로 설정하면 padding하겠다는 뜻! (하기싫으면 vaild)
input_shape -> Conv2D는 4차원의 데이터가 입력으로 필요함 (총이미지 데이터 개수, 가로, 세로, 채널개수(gray_scale = 1, rgb_scale = 3)) 그리고 모델에는 이미지가 하나의 데이터씩 입력되기 때문에 (28,28,1) 형태로 input_shape 만들기
입력시킬 이미지 하나의 가로 세로 크기 trainX[1],trainX[2] 라고 바꾸는게 코드적인 관점에서 더 좋은 듯?
Maxpooling -> 위에서 언급한 이미지의 특징들이 특정위치로 몰려있을시 발생하는 오차를 위해 2x2사이즈의 커널에서 가장 큰 픽셀값을 대표로 가져오는 layer
trainX = trainX/255.0
testX = testX/255.0
trainX = trainX.reshape((trainX.shape[0],28,28,1))
testX = testX.reshape((testX.shape[0],28,28,1))
0~255의 픽셀값을 0~1사이의 픽셀값으로 스케일링하는 이유는
-32-bit float--> 16-bit float로 데이터 타입면에서 메모리 효율성 증대
-수치 안정성
-가중치 초기화의 용이성
등등의 이유로 모델의 성능을 높일 수 있음
4차원을 취급하는 Conv2D의 input_shape을 위해 numpy 라이브러리의 reshape 함수를 사용
model.summary()
model.compile(loss = 'sparse_categorical_crossentropy',optimizer='adam',metrics = ['accuracy'])
model.fit(trainX,trainY,validation_data = (testX,testY),epochs = 5)
score = model.evaluate(testX,testY)
print(score)
이후 모델을 학습하고 test데이터를 통해 성능을 출력해보면
92퍼센트의 정확도로 의류를 분류하는것을 확인할 수 있다.
모델 학습 할 때 컨볼루션 레이어를 하나 더 추가해서 성능을 높혀볼 수 있었고
epochs 학습할때 마다 validation_data = (testX,testY)를 통해 test데이터로 성능을 확인하며 모델 학습시에 과적합을 방지할 수 있다.
합성곱 신경망에 관련해서 커널이나 필터, stride등 다양한 개념에 대해 이미지로 그림그려가며 설명을 해보고 싶지만 아직 블로그 관리 초짜인 내가 할 수 있는 영역이 아닌거 같다..
좀더 익숙해지면 내가 이해한 방식대로 Convolutional Neutral Network CNN에 대해서 그림판이든 다양한 툴을 통해 설명해보도록 해야겠다.
'딥러닝 기초' 카테고리의 다른 글
학습한 모델 저장 및 불러오기 (0) | 2024.07.31 |
---|---|
개 고양이 구분 AI모델 만들기-2. Preprocess & modeling 전처리 및 모델링 (0) | 2024.07.10 |
개 고양이 구분 AI모델 만들기-1. Dataset load(kaggle) (0) | 2024.07.07 |
Mnist fashion 의류데이터 분류하기-2.모델 학습 (0) | 2024.07.03 |
Mnist fashion 의류데이터 분류하기-1.데이터 로드 및 설명 (0) | 2024.07.03 |