• 카테고리

    질문 & 답변
  • 세부 분야

    딥러닝 · 머신러닝

  • 해결 여부

    미해결

CNN 모델을 조금 수정하고 싶은데 어떻게 해야하나요?

21.04.20 17:33 작성 조회수 365

0

유튜브 영상을 보고 잘 하시는거 같아 인프런에 가입하여 열공을 하고있습니다.

궁금한 점이있어 문의 합니다.

CNN 모델에서 예제에서 2개의 CNN층과 1개의 FC 층을 추가하여 코드를 작성해보고 싶은데 어떻게 해야할까요? 

답변 3

·

답변을 작성해보세요.

1

앞 뒤 크기만 맞추면 됩니다. 전 conv가 6으로 나오니까 다음 conv를 6으로 시작해 준 것입니다. 나머지도 마찬가지입니다. 원하시는 크기 넣고 패딩도 넣어보고 stride도 바꿔보고 마음대로 하시면 되요! 인공 신경망의 장점이자 단점이죠 😅 이런 방식으로 다양한 실험을 해서 최적 모델을 만들어 가시면 됩니다. (물론 AutoML을 이용할 수도 있지만요.)

너무 너무 감사합니다.
말씀하신 앞뒤 크기 맞춘다..이 한마디로 코드가 보이네요..
다른 소스를 보면 nn.Conv2d(1, 6, 3) : 1은 흑백이미지라는 뜻이죠?

맞습니다 :)

1

class Net(nn.Module):

    def __init__(self):

        super(Net, self).__init__()

        

        self.feature_extraction = nn.Sequential(nn.Conv2d(3, 6, 5), 

                                                nn.ReLU(),

                                                nn.MaxPool2d(2, 2), 

                                                nn.Conv2d(6, 16, 5), 

                                                nn.ReLU(), ##### 추가 부분

                                                nn.Conv2d(16, 32, 3), ##### 추가 부분

                                                nn.ReLU(), ##### 추가 부분

                                                nn.Conv2d(32, 64, 3), ##### 추가 부분

                                                nn.ReLU(),

                                                nn.MaxPool2d(2, 2))

        

        self.classifier = nn.Sequential(nn.Linear(64 * 3 * 3, 120), ##### 수정 부분

                                        nn.ReLU(),

                                        nn.Linear(120, 64), ##### 추가 부분

                                        nn.ReLU(), ##### 추가 부분

                                        nn.Linear(64, 10))

                                        

    def forward(self, x):

        x = self.feature_extraction(x)

       #print(x.size()) # <-------------------------- 크기 확인용

        x = x.view(-1, 64 * 3 * 3) ##### 수정 부분

       x = self.classifier(x)

        return x

예를 들어서 nn.Conv2d(6, 16, 5) 뒤에 conv를 하나 더 넣고 싶으면 아웃풋 크기가 16이므로 입력크기가 16인  nn.Conv2d(16, 아웃풋 채널 사이즈, 커널사이즈)로 만들어 주셔야합니다. 동일한 원리로 하나 더 추가 하시면 되구요.

conv를 여러 개 추가 했을 때 마지막 컨볼루션 층의 피쳐맵 사이즈가 변경 될 수 있습니다. 위 식에서는 최종 피쳐맵 크기가 (배치사이즈, 64 , 3 , 3)가 나옵니다. 따라서 view 부분과 linear 입력 부분의 크기를 64 * 3 * 3으로 바꿔주셔야 합니다! 크기 계산이 어려우시면  self.feature_extraction(x)에서 나오는 크기를 출력해 본 다음 그 것을 바탕으로 크기를 수정해 주시면 되요 :) "크기 확인용"이라고 적힌거 비활성화 해서 확인 해보시면 되요!

nn.Linear도 동일한 원리로 입출력 크기 맞춰서 중간에 넣어주시면 되요!

열공하세요!! 도움이 되셨다면 좋아요 눌러주세요😀😀😀

열공 하세요 :)

빠른 답변 너무 고맙습니다.
동영상을 여러번 돌려봤는데요. 이해가 잘 안되는 부분이 있습니다.

영상에서 말씀하신거 와 같이

첫번째 nn.Conv2d(3, 6, 5) 
3채널의 이미지라 무조건 앞은 3이고 사용자가 임의로 정하는 6과 필터크기 5*5     

 의미는 알겠습니다.

그런데 다음에 나오는

  nn.Conv2d(6, 16, 5)

nn.Conv2d(32, 64, 3)

nn.Sequential(nn.Linear(64 * 3 * 3, 120)

은 어떻게 나온 숫자인지? 잘 모르겠어요 ㅡ.ㅠ

 self.feature_extraction = nn.Sequential(nn.Conv2d(3, 6, 5), 

                                                nn.ReLU(),

                                                nn.MaxPool2d(2, 2), 

                                                nn.Conv2d(6, 16, 5), 

                                                nn.ReLU(), ##### 추가 부분

                                                nn.Conv2d(16, 32, 3), ##### 추가 부분

                                                nn.ReLU(), ##### 추가 부분

                                                nn.Conv2d(32, 64, 3), ##### 추가 부분

                                                nn.ReLU(),

                                                nn.MaxPool2d(2, 2))

        

        self.classifier = nn.Sequential(nn.Linear(64 * 3 * 3, 120), ##### 수정 부분

                                        nn.ReLU(),

                                        nn.Linear(120, 64), ##### 추가 부분

                                        nn.ReLU(), ##### 추가 부분

                                        nn.Linear(64, 10))

                                        

0

어제 알려주신 문제에서 FC층을 하나 더 추가 해봤는데 잘 했는지 모르겠네요 ^^; 
체크 부탁드려도 될까요?

        self.feature_extraction = nn.Sequential(nn.Conv2d(3, 6, 5), 

                                                nn.ReLU(),

                                                nn.MaxPool2d(2, 2), 

                                                nn.Conv2d(6, 16, 5),

                                                nn.ReLU(), ##### 추가 부분

                                                nn.Conv2d(16, 32, 3), ##### 추가 부분

                                                nn.ReLU(), ##### 추가 부분

                                                nn.Conv2d(32, 64, 3), ##### 추가 부분

                                                nn.ReLU(),                                                

                                                nn.MaxPool2d(2, 2))

        

        self.classifier = nn.Sequential(nn.Linear(64 * 3 * 3, 240),

                                        nn.ReLU(),

                                        nn.Linear(240, 120),

                                        nn.ReLU(),

                                        nn.Linear(120, 64), ##### 추가 부분

                                        nn.ReLU(), ##### 추가 부분

                                        nn.Linear(64, 10))

                                                                                

                                        

    def forward(self, x):

        x = self.feature_extraction(x)

        #print(x.size()) # <-------------------------- 크기 확인용  8, 64, 3, 3])

        x = x.view(-1, 64 * 3 * 3) ##### 수정 부분

        x = self.classifier(x)

        return x