Pytorch_RESNET_with_CIFAR10

CIFAR10에 RESNET모델 적용해보기

모두를 위한 딥러닝 - 파이토치 강의 참고

  • RESNET은 3X224X224를 기본 input으로 만들어졌다. 이 모델에 다른 크기를 가진 CIFAR10 이미지를 적용시키고자 한다.

  • BasicBlock과 Bottleneck class 부분은 그대로 유지하면 RESNET Class만 수정해서 사용하고자 한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class ResNet(nn.Module):
# CIFAR10 이미지 --> 32x32 크기의 이미지가 입력이므로 기본 resnet을 일부 수정해서 사용
def __init__(self, block, layers, num_classes=1000, zero_init_residual=False):
super(ResNet, self).__init__()
self.inplanes = 16
self.conv1 = nn.Conv2d(3, 16, kernel_size=3, stride=1, padding=1,
bias=False)
self.bn1 = nn.BatchNorm2d(16)
self.relu = nn.ReLU(inplace=True)

self.layer1 = self._make_layer(block, 16, layers[0], stride=1)
self.layer2 = self._make_layer(block, 32, layers[1], stride=1)
self.layer3 = self._make_layer(block, 64, layers[2], stride=2)
self.layer4 = self._make_layer(block, 128, layers[3], stride=2)

self.avgpool = nn.AdaptiveAvgPool2d((1, 1))
self.fc = nn.Linear(128 * block.expansion, num_classes)
.
.
.
  • 위와 같이 layer1~4에서 output의 채널수와 layer2의 strid를 2에서 1로 수정하였고 각 layer를 통과하기전의 max pooling을 삭제하였다.

  • 위와같이 수정했을 때 forward함수에서 각 layer를 통과한 output의 shape을 예상해 볼 수 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
class ResNet(nn.Module):
.
.
.
# 3x32x32 이미지를 input으로 넣었을 때, 각 layer를 통과한 후의 output shape
def forward(self, x):
x = self.conv1(x)
#x.shape =[1, 16, 32,32]
x = self.bn1(x)
x = self.relu(x)

x = self.layer1(x)
#x.shape =[1, 128, 32,32]
x = self.layer2(x)
#x.shape =[1, 256, 32,32]
x = self.layer3(x)
#x.shape =[1, 512, 16,16]
x = self.layer4(x)
#x.shape =[1, 1024, 8,8]

x = self.avgpool(x)
x = x.view(x.size(0), -1)
x = self.fc(x)

return x
  • 이후 bottleneck을 통한 resnet모델을 정의하고 학습시킬 수 있다. 이렇게 크기가 다른 이미지를 모델에 적용하고자 할 때 resnet class를 수정해서 사용할 수 있었다.

Full Code

Full Code

Comments

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×