CNN 모델을 조금 수정하고 싶은데 어떻게 해야하나요?
521
작성한 질문수 16
유튜브 영상을 보고 잘 하시는거 같아 인프런에 가입하여 열공을 하고있습니다.
궁금한 점이있어 문의 합니다.
CNN 모델에서 예제에서 2개의 CNN층과 1개의 FC 층을 추가하여 코드를 작성해보고 싶은데 어떻게 해야할까요?
답변 3
1
앞 뒤 크기만 맞추면 됩니다. 전 conv가 6으로 나오니까 다음 conv를 6으로 시작해 준 것입니다. 나머지도 마찬가지입니다. 원하시는 크기 넣고 패딩도 넣어보고 stride도 바꿔보고 마음대로 하시면 되요! 인공 신경망의 장점이자 단점이죠 😅 이런 방식으로 다양한 실험을 해서 최적 모델을 만들어 가시면 됩니다. (물론 AutoML을 이용할 수도 있지만요.)
0
너무 너무 감사합니다.
말씀하신 앞뒤 크기 맞춘다..이 한마디로 코드가 보이네요..
다른 소스를 보면 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도 동일한 원리로 입출력 크기 맞춰서 중간에 넣어주시면 되요!
열공하세요!! 도움이 되셨다면 좋아요 눌러주세요😀😀😀
열공 하세요 :)
0
빠른 답변 너무 고맙습니다.
동영상을 여러번 돌려봤는데요. 이해가 잘 안되는 부분이 있습니다.
영상에서 말씀하신거 와 같이
첫번째 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
수업자료 제공 부탁드립니다.
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





