Tensorflow 102 -7.1~13

2021. 1. 14. 17:15언어영역/Machine Learning

필터의 이해

  1. 필터셋은 3차원 형태로 된 가중치의 모음
  2. 필터셋 하나는 앞선 레이어의 결과인 "특징맵" 전체를 본다.
  3. 필터셋의 개수만큼 특징맵을 만든다.

1번 내용에서 중요한 점은 필터셋을 구성하는 각각의 필터가 3배열차원이다. 이는 우리가 코딩해야 하는 파일이 단지 흑백 이미지가 아니기 때문인데, 우리가 생각하는 2차원 이미지는 데이터는 사실 2차원에 RGB의 각 값을 포함한 3차원 데이터이기 때문. 이들을 걸러주는 필터 역시 자연스럽게 3차원이 된다. 그리고 이런 필터를 모은 필터셋(이하 필터로 통칭) 또한 3차원 데이터를 모았으므로 4배열차원의 데이터가 되는 것이다. 

MaxPooling2D

뭐 어쨌든 이런 식으로 데이터를 학습시키면 CNN을 무난히 학습할 수 있다. 그러나 한 가지 문제가 발생하니, 바로 연산량이 너무 많다는 것.

약 20만개의 데이터를 학습해야 한다.

이건 너무 쓸데없는 짓이다. 우리가 지금 분석하려는 사진 자체가 28*28픽셀의 흑백사진인데 여기에 20만을 태워? 철용씨도 용서하지 않을 게 분명하다. 그렇다면 이 문제가 무엇일까. 저기 있는 특징맵의 해상도가 너무 높다는 것이다. 그럼 해상도를 줄여야 겠다. 그렇다면 문제가 또 무엇일까. 해상도에서 중요한 부분만 추려야 한다는 것이다. 이를 해결하기 위해 국소부위에서 값이 가장 큰 부분만을 기록하는 MaxPooling이 등장했다. 이렇게 하면 24*24크기의 이미지를 12*12크기의 이미지로 변신시킬 수 있게 된다. 결과적으로

 

약 1만개도 안되는 계산 과정이 있다.

데이터의 특징은 살리면서도 쓸데없는 데이터의 개수를 줄여 연산속도가 20배 향상됐다.

LeNet 5

Lenet 5

그래서 르넷 5가 뭔데?! 강의를 들으면서 내내 이 생각만 했다. ㅋㅋㅋㅋ 세상에... 르넷5는 알고리즘의 이름으로 우리가 배운 32*32의 파일을 CNN을 통해 분석하는 과정 전체를 함의한다. 아래는 내가 따라한 코드들이다.

# 데이터를 준비합니다.
(독립, 종속),_ = tf.keras.datasets.cifar10.load_data()
print(독립.shape, 종속.shape)

종속 = pd.get_dummies(종속.reshape(50000))
print(독립.shape, 종속.shape)


#모델을 완성합니다. X = tf.keras.layers.Input(shape=[32, 32, 3])

H = tf.keras.layers.Conv2D(6, kernel_size=5, activation='swish')(X)
H = tf.keras.layers.MaxPool2D()(H)

H = tf.keras.layers.Conv2D(16, kernel_size=5, activation='swish')(H)
H = tf.keras.layers.MaxPool2D()(H)

H = tf.keras.layers.Flatten()(H)
H = tf.keras.layers.Dense(120, activation='swish')(H)
H = tf.keras.layers.Dense(84, activation='swish')(H)
Y = tf.keras.layers.Dense(10, activation='softmax')(H)

model = tf.keras.models.Model(X, Y)
model.compile(loss='categorical_crossentropy', metrics='accuracy')


model.fit(독립, 종속, epochs=15)


model.summary()

이외로도 Kernel Size라던지 Epochs 등을 바꿔가면서 시도를 해봤는데, Epochs가 많다고 해서 Accuracy 값이 높아지지 않는 걸 알 수 있었다. 역시 단순히 많이 시도하는 것 보단 다양한 데이터가 필요하겠구나... 싶었다. 뿐만 아니라 Kernel size가 줄어들면 당연하게도 처리 시간이나 데이터 개수는 많아지지만 Epochs로 높일 수 없던 Accuracy를 거의 0.7에 근접하게까지 올릴 수 있었다. 아직 연구자가 개입해서 최적의 Kernel size, Epoch를 찾을 필요가 있다고 느꼈다.