티스토리 뷰
아래 예제는 다음과 같이 CNN 모델을 구성하였다.
Convolution Network Class 생성자
def __init__(self, input_dim=(1, 28, 28),
conv_param={'filter_num':30, 'filter_size':5, 'pad':0, 'stride':1},
hidden_size=100, output_size=10, weight_init_std=0.01):
filter_num = conv_param['filter_num']
filter_size = conv_param['filter_size']
filter_pad = conv_param['pad']
filter_stride = conv_param['stride']
input_size = input_dim[1]
conv_output_size = (input_size - filter_size + 2*filter_pad) / filter_stride + 1
pool_output_size = int(filter_num * (conv_output_size/2) * (conv_output_size/2))
# 가중치 초기화
self.params = {}
self.params['W1'] = weight_init_std * \
np.random.randn(filter_num, input_dim[0], filter_size, filter_size)
self.params['b1'] = np.zeros(filter_num)
self.params['W2'] = weight_init_std * \
np.random.randn(pool_output_size, hidden_size)
self.params['b2'] = np.zeros(hidden_size)
self.params['W3'] = weight_init_std * \
np.random.randn(hidden_size, output_size)
self.params['b3'] = np.zeros(output_size)
# 계층 생성
self.layers = OrderedDict()
self.layers['Conv1'] = Convolution(self.params['W1'], self.params['b1'],
conv_param['stride'], conv_param['pad'])
self.layers['Relu1'] = Relu()
self.layers['Pool1'] = Pooling(pool_h=2, pool_w=2, stride=2)
self.layers['Affine1'] = Affine(self.params['W2'], self.params['b2'])
self.layers['Relu2'] = Relu()
self.layers['Affine2'] = Affine(self.params['W3'], self.params['b3'])
self.last_layer = SoftmaxWithLoss()
1. 변수 저장
class를 객체로 만들때 전달하는 인자를 받아온다.
__init__(self, input_dim=(1, 28, 28), conv_param={'filter_num':30, 'filter_size':5, 'pad':0, 'stride':1}, hidden_size=100, output_size=10, weight_init_std=0.01):
필터의 개수, 필터의 사이즈, 적용시킬 패딩 사이즈, 스트라이드를 얼마로 할지, 인풋으로 들어오는 이미지의 크기를 받아 저장한다.
filter_num = conv_param['filter_num']
filter_size = conv_param['filter_size']
filter_pad = conv_param['pad']
filter_stride = conv_param['stride']
input_size = input_dim[1]
2. feature map 크기 계산
합성곱 연산이나 풀링 후의 feature map의 크기를 계산
한다.
pooling 은 2*2 필터를 적용한 것 같다. 필터의 개수 * OH/2 * OW/2
conv_output_size = (input_size - filter_size + 2*filter_pad) / filter_stride + 1
pool_output_size = int(filter_num * (conv_output_size/2) * (conv_output_size/2))
3. 가중치 초기화
dictionary 타입의 params 변수를 만들어 weight와 bias를 설정한다.
Layer 1: Convolution Layer를 거친다. 28 * 28 * 1 => 30개의 5 * 5 * 1 필터를 거친다 30개의 24 * 24 * 1 Matrix가 나온다.
Pooling Layer를 거쳐 30개의 12 * 12 * 1의 matrix가 나오고 FCN을 하기 위해 1차원 배열로 정리하면 pool_output_size = 4320
이 된다.
Layer 2: 4320 * 1 을 4320 * 100(hidden size)를 내적하여 100 * 1 matrix 를 만든다.
Layer 3: 100 * 1 matrix에 1 * 10(output size)를 내적하여 10 * 1 matrix로 output 을 판단한다.
# 가중치 초기화
self.params = {}
self.params['W1'] = weight_init_std * \
np.random.randn(filter_num, input_dim[0], filter_size, filter_size)
self.params['b1'] = np.zeros(filter_num)
self.params['W2'] = weight_init_std * \
np.random.randn(pool_output_size, hidden_size)
self.params['b2'] = np.zeros(hidden_size)
self.params['W3'] = weight_init_std * \
np.random.randn(hidden_size, output_size)
self.params['b3'] = np.zeros(output_size)
4. 계층 생성
Layer를 만들어준다. OrederDict 클래스를 사용하여 데이터의 순서를 보장한다. 파이썬 3.6부터는 기본 dict 타입도 데이터의 순서를 보장해준다고 한다.
Conv1: 앞서 설정했던 가중치 W1, 편향 b1, stride = 1, pad = 0으로 합성곱 연산을 실행한다.
Relu1: activation function으로 Relu 함수를 사용한다. Relu = max(0, x)
Pool1: pooling height = 2, pooling width = 2, stride = 2로 subsampling 한다.
Affine1: 앞서 설정했던 가중치 W2, 편향 b2로 행렬곱 연산을 실행한다.
Relu2: 행렬곱 연산된 결과를 activation funtion relu를 사용하여 연산한다.
Affine2: Relu 연산된 결과를 앞서 설정했던 가중치 W3, 편향 b3으로 행렬곱 연산을 실행한다.
마지막으로 softmax 함수를 적용하여 output을 구한다.
activation function으로는 relu, sigmoid, softmax등 있다.
# 계층 생성
self.layers = OrderedDict()
self.layers['Conv1'] = Convolution(self.params['W1'], self.params['b1'],
conv_param['stride'], conv_param['pad'])
self.layers['Relu1'] = Relu()
self.layers['Pool1'] = Pooling(pool_h=2, pool_w=2, stride=2)
self.layers['Affine1'] = Affine(self.params['W2'], self.params['b2'])
self.layers['Relu2'] = Relu()
self.layers['Affine2'] = Affine(self.params['W3'], self.params['b3'])
self.last_layer = SoftmaxWithLoss()
참고자료
파이썬으로 딥러닝하기| CNN(Convolution Neural Network) Part2. 구현하기(FULL CODE)
안녕하세요~ 2018년 올해도 벌써 약 3달 남지 않았네요~ 컴퓨터가 2018이라는 필기체 숫자를 인식하려면 어떻게 해야할까요? 딥러닝을 공부한다면 꼭 해야하는 코스죠? 가장 많은 사랑받고 있는 MNI
everyday-deeplearning.tistory.com
https://happy-obok.tistory.com/55
활성화 함수(Activation fucntion)란? (역할/ 개념 / 종류 / 비교 / Sigmoid / tanh /ReLU/ 구현 )
활성화 함수에 대해서 공부한 내용을 요약한 글입니다. 활성화 함수의 역할, 종류(Sigmoid. tanh, ReLU)를 공부하고 파이썬으로 구현, 시각화 했습니다. 활성화 함수 입력 신호의 총합을 출력 신호로
happy-obok.tistory.com
'📦 개발 > AI' 카테고리의 다른 글
[CNN] Simple Convolution Network function (1) | 2023.01.31 |
---|---|
[CNN] 용어 정리 (0) | 2023.01.26 |