인프런 커뮤니티 질문&답변

김유진님의 프로필 이미지

작성한 질문수

[파이토치] 실전 인공지능으로 이어지는 딥러닝 - 기초부터 논문 구현까지

숫자 생성 - 오토인코더(Autoencoder)

nn.Linear(1024, 10) 관련 질문드립니다.

해결된 질문

23.12.13 10:22 작성

·

147

0

안녕하세요! 수업중 궁금한 부분이 있어 문의 드립니다.

 

        self.encoder = nn.Sequential(
                        nn.Conv2d(1, k, 3, stride=2), # 흑백 이미지로 체널이 1개, 나머지는 임의로 설정
                        nn.ReLU(),
                        nn.Conv2d(k, 2*k, 3, stride=2),
                        nn.ReLU(),
                        nn.Conv2d(2*k, 4*k, 3, stride=1),
                        nn.ReLU(),
                        Flatten(),
                        nn.Linear(1024, 10),
                        nn.ReLU()

 

  1. nn.Linear(1024, 10) 이 부분에서, MNIST의 경우 미리 계산하면 1024가 나온다고 말씀 주셨는데요, 어떻게 계산해야 하는건지 알 수 있을까요?

 

  1. 또한, 이 수치를 코드 작성자가 꼭 계산해서 넣어줘야 하는지도 궁금합니다! 크기(1024)를 코드로 출력해서 확인해 보는 방법이나, 저 부분에 1024 크기가 계산되어 들어가도록 코드를 작성할 수도 있을까요?

답변 1

0

딥러닝호형님의 프로필 이미지
딥러닝호형
지식공유자

2023. 12. 13. 14:43

안녕하세요.

좋은 질문입니다 :)

  1. 우리가 각 conv 레이어 당 출력 피쳐맵의 크기를 계산할 수 있기 때문에 쭉 계산해보시면 1024라는 값을 얻으실 수 있습니다. 그런데 당연히 하나하나 계산하실 필요는 없고 코딩하실 때에서 마지막 linear를 지우시고 size를 출력해보시면 1024를 얻게 되고 그 숫자를 linear에 넣어주시면 됩니다.

 

  1. conv레이어 마지막에서 나온 피쳐맵을 펴서 fc로 보내는 세팅에서는 그 값을 작성자가 미리 정해주셔야 합니다. 추가로 데이터 전처리에서 resize를 적용하여 동일한 이미지 크기가 처리 되도록 한다면 한 번 세팅한 값은 이미지 크기에 따라 바뀌지 않기 때문에 그대로 사용하실 수 있구요. 또 다른 방법으로는 flatten 대신 global average pooling을 사용하는 방법이 있습니다. gap는 각 채널당 평균값을 계산하는 방법이라서 이 문제에 경우 이미지 크기에 관계없이 항상 4*k(마지막 conv레이어의 채널 수)의 노드 값을 얻으실 수 있습니다.

     


    감사합니다.