inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

추가 질문

1334

Kyung-il In

작성한 질문수 16

0

Sequential을 사용하여 추가 하는 방법말고 ,
첫번째로 알려주신 내용으로 저번 질문에 층 추가를 해봤습니다.
class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        self.conv1 = nn.Conv2d(365
        self.pool1 = nn.MaxPool2d(22
        self.conv2 = nn.Conv2d(6165)
        self.pool2 = nn.MaxPool2d(22
        self.conv3 = nn.Conv2d(16323)
        self.pool3 = nn.MaxPool2d(22
        self.conv4 = nn.Conv2d(32643
        self.pool4 = nn.MaxPool2d(22

        self.fc1 = nn.Linear(64 * 3 * 3120##### 추가 부분
        self.fc2 = nn.Linear(12064##### 추가 부분
        self.fc3 = nn.Linear(6410

    def forward(selfx):
        x = self.pool1(F.relu(self.conv1(x))) 
        x = self.pool2(F.relu(self.conv2(x))) 
        x = self.pool3(F.relu(self.conv3(x)))
        x = self.pool4(F.relu(self.conv4(x)))
        x = x.view(-164 * 3 * 3# 5x5 피쳐맵 16개를 일렬로 만든다.
        x = F.relu(self.fc1(x)) 
        x = F.relu(self.fc2(x)) 
        x = F.relu(self.fc3(x))
        x = self.fc4(x)

        return x

net = Net().to(device) # 모델 선언
이런 오류가 발생되는데요.. 제가 어딜 잘못 했는지를 모르겠네요 ^^;;;
---------------
RuntimeError: Calculated padded input size per channel: (1 x 1). Kernel size: (3 x 3). Kernel size can't be greater than actual input size
---------------
loss_ = [] # 그래프를 그리기 위한 loss 저장용 리스트 
n = len(trainloader) # 배치 개수

for epoch in range(10):  # 10번 학습을 진행한다.

    running_loss = 0.0
    for i, data in enumerate(trainloader, 0):

        inputs, labels = data[0].to(device), data[1].to(device) # 배치 데이터 
                
        optimizer.zero_grad()

        outputs = net(inputs) # 예측값 산출 
        loss = criterion(outputs, labels) # 손실함수 계산
        loss.backward() # 손실함수 기준으로 역전파 선언
        optimizer.step() # 가중치 최적화

        running_loss += loss.item()

    loss_.append(running_loss / n)    
    print('[%d] loss: %.3f' %(epoch + 1, running_loss / len(trainloader)))

print('Finished Training')

net = Net().to(device) # 모델 선언

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

답변 1

0

딥러닝호형

패딩 없이  conv와 maxpool을 반복적으로 사용했기 때문에 층을 거쳐갈 때마다 피쳐 사이즈가 줄어듭니다. 그런데 층을 과도하게 늘렸기 때문에 피쳐맵 사이즈가 3x3커널보다 작게 되어 작동을 안하게 된겁니다. 이미지가 작은데 층을 깊게 쌓고 싶다면 크게 두가지 방법이 있습니다.

1. 이미지 사이즈 늘리기

전처리에서 이미지 사이즈를 늘려주면 됩니다.

2. 패딩 사용하기

conv를 사용할 때 3x3필터에 stride=1일 경우 패딩 1장(padding=1)을  사용하면 사이즈가 줄어들지 않습니다.

예) nn.Conv2d(16, 32, 3, stride=1, padding=1)

3. 1x1 conv 사용하기

conv를 사용할 때 1x1필터에 stride=1일 경우 입력 크기와 출력 크기가 변하지 않습니다.

마지막으로 self.pool4에서 출력한 피쳐맵의 크기를 계산해서 64*3*3 부분들을 수정해주시면 됩니다.

이론편 참고하시면 패딩 설명하는 부분에서 이 현상을 말했을 겁니다!

0

Kyung-il In

상세한 답변감사합니다.
하지만 파이썬 코딩에 익숙하지 못해서 그런지,

동영상을 수십번 돌려봐도 어딜 어떻게 수정해야할지 잘 안되네요...

설명으로 어떤 부분이 오류인지는 알겠으나, 소스를 어떻게 수정해야할지는 막막하네요.

혹시 좀더 가이드 부탁드려도 될까요..

0

딥러닝호형

CIFAR10 사용 하셨다면 이미지 크기가 32이니까 피쳐맵의 크기가 conv1 지나면 (32-5)/1 + 1 =28 이 되고 pool1을 지나면 (28-2)/2 + 1 = 8이 되고 그 다음 conv2의 출력 피쳐맵의 크기는  (8-5)/1 + 1 = 4이고 이런 식으로 될 겁니다.

위에서 설명한 것을 forward 함수 내에 x 사이사이에 print(x.size()) 다 넣어서 크기를 확인해 보실 수 있습니다. 그러면 x의 크기가 어떤식으로 변하는지 볼 수 있는데 에러 나오는 바로 전 크기 확인해 보시면 필터 사이즈보다 x 사이즈가 작을겁니다. 

어떻게 수정해야 할 지는 답이 없습니다. 사용자가 선택해야 합니다.

이미지 사이즈 늘리고 싶으면 전처리 부분에서 transform.Resize(128) 이런 식으로 늘리면 되고

패딩을 주고 싶으면 nn.Conv2d 에 padding=1 이나 2 넣으시면 됩니다. 아니면 5x5 필터 사용한 것은 3x3이나 1x1로 바꿔주시면 피쳐맵 크기가 덜 작아지거나 유지 됩니다. 아니면 층 자체를 몇 개 빼셔도 되요.

말씀해 주신 부분을 제가 코딩을 해 버리면 수강자 분께 도움이 안됩니다..ㅠㅠ 일단 x 사이즈 print하시고 이 것 저 것 바꿨을 때 x 사이즈가 어떻게 되는지 감을 익혀 보세요!

0

Kyung-il In

상세한 답변 감사합니다.
제가 아래 공식을 모르고 있었네요. 

다시 한번 해보겠습니다. 감사합니다.

Output Size = (W - F + 2P) / S + 1

W: input_volume_size

F: kernel_size

P: padding_size

S: strides

nn.Conv2d(3, 32, 3, padding=1)

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

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