https://www.youtube.com/watch?v=6TGyI4XjlCk&t=1153s 

대부분 해당 영상에서 가져왔습니다.

 

 

컨볼루션 신경망이란 (Convolution Neural Network,  CNN) 

 

- 완전 연결 네트워크의 문제로 부터 시작

  ~ 매개변수의 폭발적인 증가

  ~ 공간 추론의 부족 (픽셀 사이 근접성 개념이 소실되는 문제)

 

- 합성곱 계층은 입력이미지가 커져도 매개변수 개수에 영향을 주지않음

 

- 어떤 이미지에도 차원 수와 상관없이 적용 가능

 

[이미지 출처]  https://medium.com/@pechyonkin/key-deep-learning-architectures-lenet-5-6fc3c59e6f4

 

 

2. 컨볼루션 연산

 

- 필터연산 

  ~ 입력데이터에 필터를 통해 연산을 진행

  ~ 필터에 대응하는 원소끼리 곱하고, 합을 구함

  ~ 연산이 완료된 결과를 feature 맵이라고 함

 

- 필터(filter)
  ~ 커널(kernel)이라고도 칭함

  ~ 필터의 사이즈는 "거의 항상 홀수"
       * 짝수이면 패딩이 비대칭이 되어버림

       * 왼쪽, 오른쪽을 다르게 주어야함

       * 중심위치가 존재, 즉 구별된 하나의 픽셀(중심 픽셀)이 존재

 ~ 필터의 학습 파라미터 개수는 입력 데이터의 크기와 상관없이 일정
 ~ 따라서, 과적합을 방지할 수 있음

 

[출처] https://towardsdatascience.com/intuitively-understanding-convolutions-for-deep-learning-1f6f42faee1

  ~ 일반적으로 합성곱 연산을 한 후 사이즈는

        (n - f + 1) * (n - f + 1)

         * n은 입력데이터의 크기, f는 필터의 크기  (정사각 일 떄)

         * 위의 경우 (5-3+1) = 3

 

- 패딩

  ~ 입력 데이터의 주변을 특정값으로 채우는 기법(주로 0으로 채움)

  ~ 전 이미지와 크기를 같이 하기위함

 

[출처] https://towardsdatascience.com/intuitively-understanding-convolutions-for-deep-learning-1f6f42faee1

  ~ TF에서 padding='valid'  시 패딩x padding='same' 시 입력값과 출력값의 크기를 같게

     (padding_size = (filter_size-1)/2, stride=1)

 

 

- 스트라이드

  ~ 필터를 적용하는 간격을 의미

  ~ 커지면 출력 데이터가 작아짐(과적합x)

     

- TF

conv = Conv2D(filters=N, kernel_size=(k,k), strides=5,
              padding='valid', activation='relu')

k*k size의 필터를 N개 적용하는 층, padding은 없고 strides 는 5

 

 

- 풀링 (Pooling)

  ~맥스풀링 (Max Pooling)

    * 가장 많이 사용

    * 일반적으로 strides=2, kernel_size=2 를 통해 특징맵을 절반으로 줄임

    * 물체의 주요한 특징을 학습할 수 있더록

  ~ 평균풀링(Avg Pooling)

     * 필터 내의 평균을 구하는과정

     * 일반적으로 strides=2, kernel_size=2 를 통해 특징맵을 절반으로 줄임

     * 과거에 많이 사용 요즘에는 거의 사용 x

 

 

- LeNet

최초의 cnn모델 위에서 배운 풀링을 활용하여 구현

 

원 모델은 activation 으로 sigmoid를 사용했으나 예제에서는 relu활용

from tensorflow.keras import Model
from tensorflow.keras.layers import Conv2D, MaxPooling2D, Flatten, Dense
from tensorflow.keras.datasets import mnist

import numpy as np


class LeNet5(Model):
  def __init__(self, num_classes):
    super(LeNet5, self).__init__()
    self.conv1 = Conv2D(6, kernel_size=(5,5), padding='same', activation='relu')
    self.conv2 = Conv2D(16, kernel_size=(5,5), activation='relu')
    self.max_pool = MaxPooling2D(pool_size=(2,2))
    self.flatten = Flatten()
    self.dense1 = Dense(120, activation='relu')
    self.dense2 = Dense(84, activation='relu')
    self.dense3 = Dense(10, activation='softmax')
  
  def call(self, input_data):
    x = self.max_pool(self.conv1(input_data))
    x = self.max_pool(self.conv2(x))
    x = self.flatten(x)
    x = self.dense3(self.dense2(self.dense1(x)))

    return x
    
model.compile(optimizer='sgd',
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])
  
callbacks = [tf.keras.callbacks.EarlyStopping(patience=3, monitor='val_loss'),
             tf.keras.callbacks.TensorBoard(log_dir='./logs', histogram_freq=1)]
             
             
model.fit(x_train, y_train,
          batch_size=batch_size,
          epochs=epochs,
          validation_data=(x_test,y_test),
          callbacks=callbacks)
          
%load_ext tensorboard         
%tensorboard --logdir logs

mnist에서의 결과

'TF' 카테고리의 다른 글

[TF] 딥러닝 학습기술  (0) 2022.04.12
[TF] 모델의 저장, callbacks  (0) 2022.04.11
[TF] 모델 컴파일 및 학습 mnist  (0) 2022.04.11
[TF] Layer, Model, 모델구성  (0) 2022.04.11

+ Recent posts