AI
CNN(합성곱 신경망)
Phulasso
2021. 3. 31. 10:29
CNN은 Convolutional Neural Network의 약자로 주로 이미지 인식에 많이 사용된다. 이미지를 작은 특징에서 복잡한 특징으로 추상화하는 방식이다. 컬러 사진의 데이터는 3차원 형태로 들어오게 되는데, 사진 데이터를 픽셀값을 가진 2차원 행렬로 표현한다. 한 개의 픽셀은 RGB를 의미하는 3개의 색상값을 가지므로 1개의 픽셀은 3차원으로 구성된다.
CNN모델의 구조는 다음과 같다.
Convolution Layer에서 입력 데이터에 필터 적용후 활성화 함수를 반영하여 특징을 추출한다. Pooling Layer에서 Convolution Layer의 출력 데이터를 입력으로 받아서 크기를 줄이거나 특정 데이터를 강조하는 용도로 사용된다.
cnn으로 mnist 데이터셋을 학습시킨 코드는 다음과 같다.
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
31
32
33
34
35
36
37
38
39
|
from keras.datasets import mnist
from keras.utils import to_categorical
from keras import layers
from keras import models
(x_train, y_train), (x_test, y_test) = mnist.load_data()
# reshape : 배열 차원 변경
x_train = x_train.reshape((60000, 28, 28, 1))
x_train = x_train.astype('float32') / 255
x_test = x_test.reshape((10000, 28, 28, 1))
x_test = x_test.astype('float32') / 255
# 배열을 2진 배열로 바꿈
y_train = to_categorical(y_train)
y_test = to_categorical(y_test)
model = models.Sequential()
# Conv2D : 컨볼루션 레이어 종류중 하나, 첫번째 인자 : 필터 수, 두 번째 인자 : 커널 행열, 세번째 : 활성화 함수, 네번째 : 이미지 크기, 흑백사진(1)
# MaxPooling2D : 이미지 크기를 2,2로 줄임(과적합을 막기 위함)
model.add(layers.Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1)))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
# 2차원 행렬을 다시 1차원으로 바꿔주는 코드, 결과 출력을 위한 레이어
model.add(layers.Flatten())
model.add(layers.Dense(64, activation='relu'))
model.add(layers.Dense(10, activation='softmax'))
# 모델 컴파일, 학습
model.compile(optimizer='rmsprop', loss='categorical_crossentropy', metrics=['accuracy'])
model.fit(x_train, y_train, epochs=2, batch_size=64)
model.evaluate(x_test, y_test)
|
cs |