https://www.youtube.com/watch?v=6TGyI4XjlCk&t=1153s
대부분 해당 영상에서 가져왔습니다.
컨볼루션 신경망이란 (Convolution Neural Network, CNN)
- 완전 연결 네트워크의 문제로 부터 시작
~ 매개변수의 폭발적인 증가
~ 공간 추론의 부족 (픽셀 사이 근접성 개념이 소실되는 문제)
- 합성곱 계층은 입력이미지가 커져도 매개변수 개수에 영향을 주지않음
- 어떤 이미지에도 차원 수와 상관없이 적용 가능

2. 컨볼루션 연산
- 필터연산
~ 입력데이터에 필터를 통해 연산을 진행
~ 필터에 대응하는 원소끼리 곱하고, 합을 구함
~ 연산이 완료된 결과를 feature 맵이라고 함
- 필터(filter)
~ 커널(kernel)이라고도 칭함
~ 필터의 사이즈는 "거의 항상 홀수"
* 짝수이면 패딩이 비대칭이 되어버림
* 왼쪽, 오른쪽을 다르게 주어야함
* 중심위치가 존재, 즉 구별된 하나의 픽셀(중심 픽셀)이 존재
~ 필터의 학습 파라미터 개수는 입력 데이터의 크기와 상관없이 일정
~ 따라서, 과적합을 방지할 수 있음

~ 일반적으로 합성곱 연산을 한 후 사이즈는
(n - f + 1) * (n - f + 1)
* n은 입력데이터의 크기, f는 필터의 크기 (정사각 일 떄)
* 위의 경우 (5-3+1) = 3
- 패딩
~ 입력 데이터의 주변을 특정값으로 채우는 기법(주로 0으로 채움)
~ 전 이미지와 크기를 같이 하기위함

~ 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 |