chullhwan-song/Reading-Paper

ShuffleNet: An Extremely Efficient Convolutional Neural Network for Mobile Devices

Opened this issue · 2 comments

https://arxiv.org/abs/1707.01083
MobileNet과 성능, 계산량이 비슷함

https://www.youtube.com/watch?v=pNuBdj53Hbc&feature=share 먼저 논문과 이 동영상을 보고 정리한것임 > 하도 논문이 많이 나오는 관계로, 다 읽을수 없으니 이런 좋은 refer가 있음 참고하여 정리하려고 함.

이전 연구

  • 일반적인 3x3 Convolution
    image
    • x3 convolution은 vgg에서 처음 소개 이후 inception에서 적극적으로 차용하기 시작함.
  • inception (v2, v3)
    • 1x1 > 3x3 진행
      • 1x1 은 채널방향으로 학습시키는 형태(의미)를 가짐
    • 이는 depthwise separable conv에 영향
  • depth-wise separable convolution > mobilenet
    image
    • 채널각각에 대해 conv를 했다는 의미 > 한채널은 3x3 -> 1x1 로 변경
  • alexnet ?
    • 자세히 보면 convolution이 이상함.
      image
      • 2개의 pass
        • 채널도 나뉘어서 봄 또 중간에 cross(빨깐색), fc에서도 cross
        • 이처럼 전체 채널을 보지않고 일부만 보는 convolution 형태를 shufflnet에서는 Grouped Convolution이라고 불림
        • 이는 GPU 성능때문에 어쩔수 없이 한 상황. but 여기서 예기치 않게 현재 alexnet를 한 gpu내에서 테스트해보면, 논문과 같은 성능이 나오지 않음. 즉, 성능때문에 gpu를 두개쓴 케이스로 인해 성능이 좋아졌다고 봄.
        • shufflenet은 이 아이디어를 적극적으로 채용
          • 1x1 conv사용하는데 일부채널만 채용하겠다는 의미
          • 실제로 alexnet 는 2gpu만에서 성능이 좋음 > 4gpu는 낮음. (??)

shufflenet

  • depth-wise separable convolution
  • 채널을 shuffling 하여 일부만 채용
  • 하지만 최종단에서는 대부분 채널을 사용함.
  • 위에서 소개되었던 Grouped Convolution
    image
    • feature map를 두개로 나뉘어 convolution을 시도
    • 이전 resnext 에서도 채널을 나뉘어 conv 를 시도
      image
      • group 32개 즉, 1 conv은 4채널 기준으로
      • 위의 3개는 같은 연산임.
  • shuffling
    image
    • a) 처럼 한쪽채널만 보는것은 문제가 있어보임
    • 그래서 b)처럼 shuffle > 단순 랜덤 셔플이 아니라, 모든 채널에서 섞이도록~하고 concat한다.
    • tf 소스
      image
      • [-1, h, w, 그룹갯수, 그룹으로 나눈 채널개수]
      • [그룹갯수, 그룹으로 나눈 채널개수] 순서를 바꿈 > [그룹으로 나눈 채널개수, 그룹갯수]
      • 다시 원래대로 [-1, h, w, c]크기로 reshape하면 shuffling
      • 근데 나도 신기함..(제대로 이해가 좀 안감 python의 힘ㅠ > 난 이런게 힘듬.ㅠ)
  • shuffling unit을 만듬
    image
    • c)와 같이 concat하는 이유는, feature map를 반으로 줄이는 방법은 보통 filter사이즈를 두배로 키우면 됨, 하지만, 단순히 왼쪽에서 반 오른쪽에서 반오는 형태로하여 feature map를 반으로 줄일수 있음.
  • complexity
    image