사이토고키의 <밑바닥부터 시작하는 딥러닝>을 공부하고 정리해보았습니다.
저번 포스팅에서 합성곱 신경망에서 배치 처리와 풀링 계층에 대해서 알아보았습니다.
이번에는 합성곱/풀링 계층을 구현하는 것에 대해 공부하겠습니다.
im2col로 데이터 전개하기
합성곱 연산을 곧이곧대로 구현하려면 for문을 겹겹이 써야합니다.
넘파이에 for 문을 사용하면 성능이 떨어진다는 단점이 있습니다. (넘파이에서는 원소에 접근할 때 for문을 사용하지 않는 것이 바람직 합니다)
for 문 대신에 이용할 수 있는 im2col이라는 편의 함수에 대해 알아보겠습니다.
im2col은 입력 데이터를 필터링(가중치 계산)하기 좋게 전개하는 함수입니다.
그림과 같이 3차원 입력 데이터에 im2col을 적용하면 2차원 행렬로 바뀝니다.
(정확히는 배치 안의 데이터 수까지 포함한 4차원 데이터를 2차원으로 변환합니다.)
im2col은 필터링 하기 좋게 입력 데이터를 전개합니다.
구체적으로는 아래 그림과 같이 입력데이터에서 필터를 적용하는 영역(3차원 블록)을 한 줄로 늘어 놓습니다.
이 전개를 필터를 적용하는 모든 영역에서 수행하는 것이 im2col입니다.
그림에서는 보기에 좋게끔 스트라이드를 크게 잡아 필터의 적용 영역이 겹치지 않도록 했지만,
실제 상황에서는 영역이 겹치는 경우가 대부분입니다.
필터 적용 영역이 겹치게 되면 im2col로 전개한 후의 원소 수가 원래 블록의 원소 수보다 많아집니다.
그래서 im2col을 사용해 구현하면 메모리를 더 많이 소비하는 단점이 있습니다.
하지마 컴퓨터는 큰 행렬을 묶어서 계산하는 데 탁월합니다.
예를 들어 행렬 계산 라이브러리 등은 행렬 계산에 고도로 최적화되어 큰 행렬의 곱셈을 빠르게 계산할 수 있습니다.
im2col은 'image to column' 즉 이미지에서 행렬로라는 뜻입니다.
딥러닝 프레임워크는 im2col이라는 이름의 함수를 만들어 합성곱 계층을 구현할 때 이용하고 있습니다.
im2col로 입력 데이터를 전개한 다음에는 합성곱 계층의 필터(가중치)를 1열로 전개하고, 두 행렬의 곱을 계산하면 됩니다.
이는 완전연결 계층의 Affine 계층에서 한 것과 거의 같습니다.
필터를 세로로 1열로 전개하고, im2col이 전개한 데이터와 행렬 곱을 계산합니다.
마지막으로 출력 데이터를 변형합니다.
위 그림과 같이 im2col 방식으로 출력한 결과는 2차원 행렬입니다.
CNN은 데이터를 4차원 배열로 저장하므로 2차원인 출력 데이터를 4차원으로 변형합니다.
이상이 합성곱 계층의 구현 흐름입니다.
'수학 > 딥러닝 이론' 카테고리의 다른 글
[딥러닝] 합성곱 신경망(CNN) - 풀링 계층 구현하기 (0) | 2020.10.05 |
---|---|
[딥러닝] 합성곱 신경망(CNN) - 합성곱 계층 구현하기 (0) | 2020.10.05 |
[딥러닝] 합성곱 신경망(CNN) - 배치 처리와 풀링 계층 (0) | 2020.10.04 |
[딥러닝] 합성곱 신경망(CNN) - 3차원 데이터의 합성곱 연산 - 가중치와 편향 (0) | 2020.10.04 |
[딥러닝] 합성곱 신경망(CNN) - 합성곱 연산에서의 패딩과 스트라이드 (0) | 2020.10.04 |