。゚(*´□`)゚。

코딩의 즐거움과 도전, 그리고 일상의 소소한 순간들이 어우러진 블로그

[네이버클라우드] 클라우드 기반의 개발자 과정 7기/AI

[4-2] Conv2D, MaxPooling, Dropout, Flatten, pyplot

quarrrter 2023. 5. 11. 19:20

[fashion_mnist]

##from keras.layers import Dense, Flatten, Conv2D, MaxPooling2D, Dropout


import numpy as np
from keras.models import Sequential
from keras.layers import Dense, Flatten, Conv2D, MaxPooling2D, Dropout
from keras.datasets import fashion_mnist

#1. 데이터
(x_train, y_train), (x_test, y_test) = fashion_mnist.load_data()
x_train, x_test = x_train/255.0, x_test/255.0

# print(x_train.shape, y_train.shape) #(60000, 28, 28) (60000,)
# print(x_test.shape, y_test.shape)   #(10000, 28, 28) (10000,)

# reshape
x_train = x_train.reshape(60000,28,28,1)
x_test = x_test.reshape(10000,28,28,1)

fashion_mnist.load_data() 함수는 데이터를 x,y train, test로 나누는 함수

x_train, x_test = x_train/255.0, x_test/255.0

mnist는 흑백이미지로 0~255 까지의 값을 가지는 각각의 이미지 픽셀값으로 이루어진 데이터임

(x= 28x28 크기의 흑백 이미지, y=항목이름)

따라서 255로 나눠서 0~1사이의 값으로 만드는 정규화 과정이 필요함

 

#2. 모델 구성
model = Sequential()
model.add(Conv2D(filters=32, kernel_size=(3,3), 
                 input_shape=(28,28,1), activation='relu'))  #activation='relu'추가 
model.add(MaxPooling2D(2,2)) 
model.add(Conv2D(64, (3,3), activation='relu'))
model.add(MaxPooling2D(2,2))
model.add(Dropout(0.2)) #퍼센트로 
model.add(Flatten())
model.add(Dense(256, activation='relu'))
model.add(Dense(128, activation='relu'))
model.add(Dense(10, activation='softmax'))

[레이어의 종류]

 

Conv2D는 2D 컨볼루션을 수행하는 Keras 레이어 중 하나입니다. 각각의 파라미터 역할은 다음과 같습니다.

 

filters: 필터의 개수를 정합니다. 필터는 입력 이미지에서 특징을 추출하기 위해 사용됩니다. 이 값이 크면 더 많은 특징을 추출할 수 있습니다.
kernel_size: 필터의 크기를 정합니다. 필터의 크기가 작으면 이미지에서 작은 특징을 잘 추출할 수 있습니다. 하지만 필터의 크기가 클 경우 더 많은 공간 정보를 캡처 할 수 있습니다.
input_shape: 입력 이미지의 크기와 채널 수를 정의합니다. 이 경우 28x28 크기의 흑백 이미지가 입력으로 들어옵니다. 컬러 이미지의 경우에는 (width, height, 3)과 같이 정의됩니다.
activation: 활성화 함수를 설정합니다. 일반적으로 Relu 함수가 사용됩니다. Relu 함수는 입력값이 양수일 경우에만 값을 통과시키고, 음수일 경우에는 0을 반환합니다. 이를 통해 모델이 비선형성을 학습할 수 있습니다.

 

MaxPooling은 입력 이미지를 2x2 윈도우로 잘라서 각 윈도우에서 가장 큰 값을 뽑아내는 방식으로 동작합니다. 이렇게 함으로써 이미지의 크기를 줄이면서 중요한 정보를 유지할 수 있습니다. 2x2 윈도우를 사용하면 출력을 2배로 다운 샘플링할 수 있습니다.

Dropout 레이어는 과적합을 방지하기 위해 랜덤으로 일부 뉴런을 제거하는 데 사용됩니다. Dropout(0.2)는 20%의 뉴런을 무작위로 제거합니다.

Flatten 레이어는 입력(다차원 배열)을 1차원 배열로 평탄화합니다. 이전에 추가한 컨볼루션 레이어들은 3차원의 출력을 반환하지만, Dense 레이어는 1차원의 입력을 필요로 합니다. Flatten 레이어를 추가하여 3차원 특징 맵을 1차원 벡터로 변환합니다.

바보샛기 지피티
Flatten 레이어는 4차원의 특징 맵을 1차원 벡터로 평탄화합니다. 제가 이전에 잘못 설명해 드려서 죄송합니다. 감사합니다.

 

===

네, 죄송합니다. Conv2D에서 다루는 데이터는 4차원 데이터입니다. 3차원은 이미지의 shape (높이, 너비, 채널)이지만, 4차원에서는 여러 개의 이미지를 한 번에 처리할 수 있기 때문에 추가적으로 배치 크기(batch size)가 있습니다. 즉, Conv2D에서 다루는 데이터의 shape는 (배치 크기, 높이, 너비, 채널)입니다. Flatten은 이러한 4차원 데이터를 2차원으로 바꿔줍니다.

 

model.summary()
Model: "sequential"
_________________________________________________________________
 Layer (type)                Output Shape              Param #
=================================================================
 conv2d (Conv2D)             (None, 26, 26, 32)        320

 conv2d_1 (Conv2D)           (None, 24, 24, 64)        18496

 flatten (Flatten)           (None, 36864)             0

 dense (Dense)               (None, 256)               9437440

 dense_1 (Dense)             (None, 128)               32896

 dense_2 (Dense)             (None, 10)                1290

=================================================================
Total params: 9,490,442
Trainable params: 9,490,442
Non-trainable params: 0

 

 

Model: "sequential"
_________________________________________________________________
 Layer (type)                Output Shape              Param #
=================================================================
 conv2d (Conv2D)             (None, 26, 26, 32)        320

 conv2d_1 (Conv2D)           (None, 24, 24, 64)        18496

 flatten (Flatten)           (None, 36864)             0

 dense (Dense)               (None, 256)               9437440

 dense_1 (Dense)             (None, 128)               32896

 dense_2 (Dense)             (None, 10)                1290

=================================================================
Total params: 9,490,442
Trainable params: 9,490,442
Non-trainable params: 0

 

 

[pyplot으로 이미지 보기]

import matplotlib.pyplot as plt
plt.imshow(x_train[0], 'gray')  #gray 안 넣으면 컬러로 나옴 
plt.show()

x_train은 28x28 크기의 흑백 이미지가 6만장 들어있는 배열

y_train은 x_train에 해당하는 이미지가 어떤 항목(예: 신발, 셔츠, 바지 등)인지를 나타내는 레이블(label)

 

디용 ~ ㅋㅋ