clovaai / rexnet

Official Pytorch implementation of ReXNet (Rank eXpansion Network) with pretrained models
MIT License
453 stars 62 forks source link

rexnetv1을 공부하고 구현하면서 몇가지 의문점이 생겨 문의드립니다. #33

Closed gellston closed 2 years ago

gellston commented 2 years ago

안녕하십니까

연구 하시느라 고생이 많으십니다. 최근에 rexnetV1 구현을 직접 손으로 구현해보면서 공부를하고 있는 직장인입니다. 손으로 코드를 구현하다가 몇가지 의문이 생겨서 조심스럽게 문의드립니다.

  1. stem_channel 또한 width_multi에 영향을 받도록 설계를 하신건가요?

image

제가 이해한 바로는 width_multi가 1.0이하 일때 영향을 받고 1.0 이상일때는 32로 고정되도록 의도했다고 이해했습니다. 그런데 width_multi를 나누시는 이유가 이해가 되지 않습니다. 아니면 다른 이유가 있으신지요?

  1. 왜 nn.Dropout2d가 아니라 nn.Dropout인가?

image

이 또한 제가 이해한 바로는 nn.Dropout이 연결되는 시점이 flattern되지 않은 BxCxHxW feature맵 형태의 시점인걸로 보입니다. 그런데 사용자가 원하는 클래스 n개의 갯수로 컨볼루션이 될 것이고 드랍아웃이 될것인데 그러면 채널 갯수만큼 드랍아웃이 되어야 할것으로 보입니다. nn.Dropout이라면 채널 갯수만큼 드랍아웃이 되지 않고 의도되지 않는 동작을 할 것으로 보이는데 문제가 되지 않나요? (nn.Dropout은 BxK인 flatten인 형태일때 k가 p의 비율만큼 드랍아웃되는 것이 아닌가요?)
혹시 제가 잘못 이해하고있거나 다른 의도가 있으시다면 좀 조언 부탁드립니다.

답변 기다리겠습니다 좋은 논문 만들어 주셔서 감사합니다.

dyhan0920 commented 2 years ago

저희 연구에 관심 가져주셔서 감사드립니다.

  1. /width_mult는 뒤쪽 에서 width_mult를 곱해서 stem dimension을 유지하기 위함이고 (뒤쪽 코드 참고), width_mult가 1보다 작을때 stem이 작아지는것을 막기위해서입니다. 이해하신것과 반대로 거의 모든 MobileNetV2-based lightweight 모델들 (e.g., MNasNet, MobiletNetV3, EfficientNet 등등)은 stem의 dimension이 width_mult>1일때 비례해서 커집니다.

  2. 바로 앞쪽에 AvgPool2d이 4d tensor를 BxCx1x1 로 aggregation해서 nn.Dropout은 2d tensor에서 수행하는것과 마찬가지입니다.

gellston commented 2 years ago

이해했습니다. 답변 주셔서 감사합니다.!