컨볼 루션 신경망을 구현하려고하는데 왜 im2col 연산을 사용하는 것이 더 효율적인지 이해하지 못합니다. 기본적으로 별도의 열에 필터로 곱할 입력을 저장합니다. 하지만 im2col을 처음 수행하는 대신 회선을 직접 계산하는 데 루프를 사용하면 안됩니까?길쌈 그물에서 im2col 연산을보다 효율적으로 사용하는 방법은 무엇입니까?
답변
글쎄, 당신은 GPU 시간의 알렉스 인터넷에서 올바른 방법으로 거의 95 %를 생각하고 CPU 시간의 89 %는 길쌈 레이어와 완전히 연결 레이어에 소요된다.
컨볼 루션 레이어와 완전 연결 레이어는 GEneral 매트릭스 - 매트릭스 곱셈을 나타내는 GEMM을 사용하여 구현됩니다.
기본적으로 GEMM에서는 행렬 곱셈에 의해 컨볼 루션 출력을 얻을 수있는 방식으로 데이터를 배열하는
im2col()
이라는 함수를 사용하여 컨볼 루션을 행렬 곱셈으로 변환합니다.이제는 요소 별 컨볼 루션을 직접 수행하는 대신 질문을 할 수 있습니다. 다른 방법으로 데이터를 배열하고 GEMM을 사용하기 위해 단계를 추가하는 이유는 무엇입니까?
과학 프로그래머는 대형 매트릭스 - 매트릭스 곱셈을 수행하기 위해 수십 년 동안 코드를 최적화했으며, 매우 규칙적인 메모리 액세스 패턴의 이점은 다른 손실보다 뛰어나다. 엔비디아는 CUBLAS 라이브러리의 GEMM의 API를 가지고, 인텔 MKL은 또한
는 CUDA는에 elementwise의 회선을하고 상상 자체 GEMM의 API가, 메모리는 성능이 아주 나쁜 것 너무 불규칙 것 액세스합니다.
차례로
Im2col()
은 메모리 액세스가 규칙적인 방식으로 데이터를 정렬합니다.Im2col()
기능은 많은 데이터 중복을 추가하지만 Gemm을 사용하면 성능 이점이이 데이터 중복보다 중요합니다.이것은 Neural Nets에서
Im2col()
연산을 사용하는 이유입니다. https://petewarden.com/2015/04/20/why-gemm-is-at-the-heart-of-deep-learning/
이 링크는 Im2col()
가 GEMM의 데이터를 정렬하는 방법을 설명