inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

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

521

Kyung-il In

작성한 질문수 16

0

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

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

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

딥러닝 머신러닝 배워볼래요? pytorch python 인공신경망

답변 3

1

딥러닝호형

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

0

Kyung-il In

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

0

딥러닝호형

맞습니다 :)

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도 동일한 원리로 입출력 크기 맞춰서 중간에 넣어주시면 되요!

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

열공 하세요 :)

0

Kyung-il In

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

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

첫번째 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

Kyung-il In

어제 알려주신 문제에서 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

수업자료 제공 부탁드립니다.

0

93

2

코드가 어디에 있는지 모르겠습니다.

0

93

2

논문 구현

0

183

2

overfitting이 나는 이유가 궁금합니다.

1

169

2

분류 성능이 잘 안 나오는 이유

0

217

1

AutoEncoder 차원 질문

1

250

2

사전 학습 모델에서의 layer 변경에 대한 질문

1

217

1

7강 폴더 만들

0

259

1

4-3강 cross-validation에서의 best model 선정 기준

0

446

1

regression 문제에 대한 결과 시각화

0

213

1

Loss function 관련하여 질문드립니다.

0

953

1

early stopping 코드 문의

0

325

1

예측 그래프

0

353

1

데이터 불균형

1

364

1

8강 전이 학습 질문

0

395

2

data의 gpu처리 질문

0

240

1

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

0

286

1

학습과 평가시 Loss 함수가 다른 이유

0

249

1

전처리 관련해서 질문 있습니다.

0

224

1

데이터 엔지니어의 역량을 기르려면 어떻게 해야할까요?

0

932

2

역전파 내용 중 미분 관련 질문 드립니다

1

278

1

8강 전이학습에서 kernel size 관련 질문 드립니다.

1

952

1

이미지분류-합성곱신경망(CNN) 피쳐맵 질문입니다.

1

581

1

14강 데이터 불균형 RandomRotation

1

479

1