티스토리 뷰

아래 예제는 다음과 같이 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()

 

참고자료

https://everyday-deeplearning.tistory.com/entry/%ED%8C%8C%EC%9D%B4%EC%8D%AC%EC%9C%BC%EB%A1%9C-%EB%94%A5%EB%9F%AC%EB%8B%9D%ED%95%98%EA%B8%B0-CNNConvolution-Neural-Network-Part2-%EA%B5%AC%ED%98%84%ED%95%98%EA%B8%B0

 

파이썬으로 딥러닝하기| 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
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/03   »
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
글 보관함