작성
·
473
0
유튜브 영상을 보고 잘 하시는거 같아 인프런에 가입하여 열공을 하고있습니다.
궁금한 점이있어 문의 합니다.
CNN 모델에서 예제에서 2개의 CNN층과 1개의 FC 층을 추가하여 코드를 작성해보고 싶은데 어떻게 해야할까요?
답변 3
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
너무 너무 감사합니다.
말씀하신 앞뒤 크기 맞춘다..이 한마디로 코드가 보이네요..
다른 소스를 보면 nn.Conv2d(1, 6, 3) : 1은 흑백이미지라는 뜻이죠?