이것은 G. Huang, Z. Liu, K. Weinberger 및 L. van der Maaten의 용지에 설명 된대로 Densenet-BC 아키텍처의 Pytorch 구현입니다. 이 구현은 성장률이 12 인 100 층 Densenet-BC의 CIFAR-10+ 오류율 4.77을 얻습니다. 공식적 구현 및 기타 여러 타사 구현과의 링크는 Github의 Liuzhuang13/Densenet Repo에서 사용할 수 있습니다.

Densenet Paper 의이 표에서 보여 지듯이 CIFAR-10, CIFAR-100 및 SVHN에서 경쟁적인 최신 결과를 제공합니다.

Pytorch는 훌륭한 새로운 프레임 워크이며 다른 Pytorch 프로젝트와 통합 될 수 있도록 이런 종류의 재 구현을하는 것이 좋습니다.
흥미롭게도 이것을 구현하는 동안, 나는 그것을 수렴하는 데 많은 어려움이 있었고, 코드의 모든 부분을 평소보다 더 가깝게 보았습니다. 나는 모든 모델의 숨겨진 상태와 그라디언트를 공식 구현과 비교하여 내 코드가 올바른지 확인하고 CIFAR-10의 VGG 스타일 네트워크를 교육 코드와 함께 교육했습니다. 나는 이것을 일으키는 새로운 중요한 pytorch 버그 (현재 고정)를 발견 한 것으로 밝혀졌습니다.
이것이 어떻게 작동하지 않는지 와이 문서에서 확인한 것들에 대한 원래 메시지를 남겼습니다. 수렴으로 알려진 모델을 구현하는 데 문제가있을 때 다른 사람들이 내 개발 및 디버깅 전략을 볼 수 있어야한다고 생각합니다. 또한이 Pytorch 포럼 스레드를 시작했습니다. Pytorch 그라디언트를 Torch Gradients와 비교하는 내 스크립트와 Pytorch 그라디언트를 수치 적으로 확인하는 스크립트에 관심이있을 수도 있습니다.
내 수렴 문제는 CUDNN이 활성화 된 컨볼 루션과 함께 torch.cat 사용하는 것과 관련된 중요한 Pytorch 버그 때문입니다 (CUDA를 사용하는 경우 기본적으로). 이 버그로 인해 잘못된 구배가 발생 했으며이 버그에 대한 수정은 CUDNN을 비활성화하는 것입니다 (고정되어있어 더 이상 수행 할 필요가 없습니다). 이 오류를 찾지 못한 디버깅 전략에 대한 감독은 CUDNN을 비활성화한다고 생각하지 않았다는 것입니다. 지금까지 프레임 워크의 CUDNN 옵션은 버그가 없다고 가정했지만 이것이 항상 그런 것은 아니라는 것을 알게되었습니다. 완전히 연결된 층 대신 컨볼 루션이있는 수치 적으로 디버깅 된 torch.cat 가지고 있다면 무언가를 찾았을 수도 있습니다.
Adam 은이 PR에서이를 일으킨 Pytorch 버그를 수정했으며 Torch의 마스터 브랜치로 병합되었습니다. 이 저장소에서 Densenet 코드 사용에 관심이 있으시면 Pytorch 버전 에이 PR이 포함되어 있고 2017-02-10 이후에 다운로드되었는지 확인하십시오.
Adam Paszke의 GIST에서 복사 한 Make_graph.py로 만든 Compute Graph를 볼 수 있습니다. Adam은 Pytorch는 곧 컴퓨팅 그래프를 만드는 더 좋은 방법을 가질 것이라고 말합니다.
기본적으로,이 리포지토리는 데이터 증강이있는 CIFAR-10 데이터 세트에서 12의 성장률로 100 층 Densenet-BC를 훈련시킵니다. GPU 메모리 크기로 인해 이것은 내가 실행할 수있는 가장 큰 모델입니다. 이 논문은이 아키텍처에서 4.51의 최종 테스트 오류를보고하고 4.77의 최종 테스트 오류를 얻습니다.

나는 또한 Adam과 그물을 훈련 시키려고 시도했지만 합리적인 학습 속도 일정이있는 SGD에 비해 기본 하이퍼 파라미터와 함께 수렴하지 않았다는 것을 알았습니다.

나는 이것을 철저히 테스트하지 않았으며, 그것을 사용하고 수정하려는 경우 예상대로 작동하는지 확인해야합니다. 당신이 그것에 잘못된 것을 발견하면 알려주세요.
나는이 repo에 존재하는 다른 재 구현에서 볼 수없는 프로젝트에 몇 가지 기능을 포함하고 싶습니다. train.py 의 교육 코드는 argparse 사용하여 배치 크기와 다른 하이퍼 패람을 쉽게 변경할 수 있으며 모델이 교육을 받으면 인수에 의해 정의 된 작업 디렉토리의 CSV 파일에 진행됩니다. 그런 다음 별도의 스크립트 plot.py . 훈련 스크립트는 모든 시대 후 plot.py 호출하지만 전체 실험을 다시 실행하지 않고도 수치를 조정할 수 있도록 자체적으로 실행할 수 있습니다.
공식 공간 효율적인 토치 구현에서와 같이이 코드에서 메모리 활용을 개선 할 수있는 방법이 있다고 생각합니다. 또한 멀티 GPU 지원에 관심이 있습니다.
먼저 Pytorch를 설치하십시오 (이상적으로는 Anaconda3 분포). ./train.py는 모델을 생성하고 훈련을 시작하며 기본적으로 work/cifar10.base 인 args.save 에 진행 상황을 저장합니다. 훈련 스크립트는 모든 시대에 Plot.py를 호출하여 저장된 진행 상황에서 플롯을 생성합니다.
다음은이 모델을 사용하는 경우 인용 해야하는 Densenet 용지의 Bibtex 항목입니다.
@article{Huang2016Densely,
author = {Huang, Gao and Liu, Zhuang and Weinberger, Kilian Q.},
title = {Densely Connected Convolutional Networks},
journal = {arXiv preprint arXiv:1608.06993},
year = {2016}
}
이 구현을 사용하는 경우 다음 BibTex 또는 일반 텍스트 항목과 함께이 구현 및 코드 저장소를 인용하십시오. Bibtex 항목에는 url 라텍스 패키지가 필요합니다.
@misc{amos2017densenet,
title = {{A PyTorch Implementation of DenseNet}},
author = {Amos, Brandon and Kolter, J. Zico},
howpublished = {url{https://github.com/bamos/densenet.pytorch}},
note = {Accessed: [Insert date here]}
}
Brandon Amos, J. Zico Kolter
A PyTorch Implementation of DenseNet
https://github.com/bamos/densenet.pytorch.
Accessed: [Insert date here]
이 저장소는 Apache-Licensed입니다.