서론

이 장은 MobileNetV2 모델의 코드를 리뷰한다.

목차

  1. _make_divisible()
  2. MobileNetV2
  3. Conclusion

_make_divisible()

위 함수는 주어진 숫자를 특정 수로 나눌 수 있는 가장 가까운 수로 바꾸는 역할을 합니다. 이 함수는 모델의 계층에서 채널 수가 특정 값(예를 들어 8)의 배수가 되도록 하는데 사용된다.

Untitled

먼저 아래코드에 대해서 설명해보겠다

Untitled

int(v + divisor / 2)에서 vdivisor/2 를 더해주는 이유는 v//divisor를 해줄 때 v의 소수점 자리수가 0.5보다 큰 경우에 대해서 반올림을 해주기 위해서다.

예를 들어, int(3.7)3을 반환한다. 이렇게 단순히 버림을 하면 반올림 효과를 얻을 수 없다.

하지만 divisor/2를 더한 뒤 int() 함수를 적용하면 반올림 효과를 얻을 수 있다.

divisor/2를 더하면 소수 부분이 0.5 이상일 때, 몫이 1증가하게 됩니다. 즉, 이는 실수를 가장 가까운 정수로 반올림하는 효과를 가져온다.

좀 더 자세히 설명하면 v5.6이고 divisor2라면 v + divisor/25.6 + 2/2 = 6.6이 됩니다. 여기에 int() 함수를 적용하면 6을 얻는다. 이후 6 //divisor를 하고 * divisor를 하면 최종적으로 5.6은 2의 배수와 가장 가까운 6을 얻게 된다.

만약 divisor/2를 더하지 않고 int(v)를 사용했다면 결과는 5가 될 것이고 이후 5 //divisor * divisor를 하게되면 4를 얻게된다. 따라서 v + divisor/2를 사용함으로써 divisor의 배수에 가까운 수를 구하는 반올림 효과를 얻을 수 있다.

이렇게 하는 이유는 하드웨어 최적화를 위해서이다.

다음 분석해볼 코드는 아래와 같다.

if new_v < 0.9 * v:
        new_v += divisor
    return new_v