본문 바로가기

딥러닝 학습

8장 이미지 분류 - 합성곱 신경망 (1)

반응형

8-1 합성곱(Convolution) 연산

- 합성곱 이해하기

 

- 합성곱 구현하기

1. 넘파이 배열 정의하고 배열 하나 선택해 뒤집기

import numpy as np
w = np.array([2, 1, 5, 3])
x = np.array([2, 8, 3, 7, 1, 2, 0, 4, 5])

w_r = np.flip(w)
print(w_r)


##출력: [3 5 1 2]

 

2. 넘파이의 점 곱으로 합성곱 수행하기

for i in range(6):
  print(np.dot(x[i:i+4], w_r))
  
 
##출력: 
63
48
49
28
21
20

 

3. 싸이파이로 합성곱 수행하기

from scipy.signal import convolve
convolve(x, w, mode='valid')


##출력: array([63, 48, 49, 28, 21, 20])

 

- 교차 상관

대부분의 딥러닝 패키지들은 합성곱 신경망을 만들 때 교차 상관을 사용

교차 상관은 합성곱과 동일한 방법으로 연산이 진행되지만 '미끄러지는 배열을 뒤집지 않음'

 

from scipy.signal import correlate
correlate(x, w, mode='valid')

##출력: array([48, 57, 24, 25, 16, 39])

 

- 합성곱 신경망에서 교차 상관을 사용하는 이유

모든 모델은 훈련하기 전 가중치 배열의 요소들을 무작위로 초기화하기에 가중치인 '미끄러지는 배열'이 뒤집어져 있는지 여부가 중요하지 않음

 

- 패딩과 스트라이드

패딩(padding) : 원본 배열의 양 끝에 빈 원소를 추가하는 것 -> 합성곱 신경망에서는 대부분 세임 패딩을 사용

스트라이드(stride) : 미끄러지는 배열의 간격을 조절한 것

 

- 벨리드 패딩(Valid padding)

원본 배열의 원소가 합성곱 연산에 참여하는 정도가 서로 다름

mode 매개변수에 'valid'를 지정한 것

벨리드 패딩의 결과로 얻는 배열의 크기는 원본 배열보다 항상 작음

 

- 풀 패딩(Full padding)

원본 배열의 모든 요소가 동일하게 연산에 참여하는 패딩 방식

원본 배열의 양 끈테 가상의 원소를 추가하는 제로 패딩(Zero padding)이 필요

correlate(x, w, mode='full')


##출력: array([ 6, 34, 51, 48, 57, 24, 25, 16, 39, 29, 13, 10])

 

- 세임 패딩(Same padding)

출력 배열의 길이를 원본 배열의 길이와 동일하게 만든 것

출력 배열의 길이가 원본 배열의 길이와 같이지도록 원본 배열에 제로 패딩 추가

correlate(x, w, mode='same')


##출력: array([34, 51, 48, 57, 24, 25, 16, 39, 29])

- 스트라이드(stride)

미끄러지는 배열의 간격

미끄러지는 간격을 조정

합성곱 신경망을 만들 때는 보통 스트라이드를 1로 지정

 

 

 

 

※ 해당 내용은 <Do it! 딥러닝 입문>의 내용을 토대로 학습하며 정리한 내용입니다.

반응형