>

다음은 단일 회선을 수행하고 형태를 출력하기 위해 작성한 코드입니다.

http://cs231n.github.io/convolutional-networks/출력 크기를 계산하려면 :

You can convince yourself that the correct formula for calculating how many neurons “fit” is given by (W−F+2P)/S+1

출력 크기 계산 공식은 다음과 같이 구현되었습니다

def output_size(w , f , stride , padding) : 
        return (((w - f) + (2 * padding)) / stride) + 1

문제는 output_size 입니다  컨볼 루션 결과가 1350 인 2690.5의 크기를 계산합니다.

%reset -f
import torch
import torch.nn.functional as F
import numpy as np
from PIL import Image
import torch.nn as nn
import torchvision
import torchvision.transforms as transforms
from pylab import plt
plt.style.use('seaborn')
%matplotlib inline
width = 60
height = 30
kernel_size_param = 5
stride_param = 2
padding_param = 2
img = Image.new('RGB', (width, height), color = 'red')
in_channels = 3
out_channels = 3
class ConvNet(nn.Module):
    def __init__(self):
        super(ConvNet, self).__init__()
        self.layer1 = nn.Sequential(
            nn.Conv2d(in_channels, 
                      out_channels, 
                      kernel_size=kernel_size_param, 
                      stride=stride_param, 
                      padding=padding_param))
    def forward(self, x):
        out = self.layer1(x)
        return out
# w : input volume size
# f : receptive field size of the Conv Layer neurons
# output_size computes spatial size of output volume - spatial dimensions are (width, height)
def output_size(w , f , stride , padding) : 
    return (((w - f) + (2 * padding)) / stride) + 1
w = width * height * in_channels
f = kernel_size_param * kernel_size_param
print('output size :' , output_size(w , f , stride_param , padding_param))
model = ConvNet()
criterion = nn.CrossEntropyLoss()
optimizer = torch.optim.Adam(model.parameters(), lr=.001)
img_a = np.array(img)
img_pt = torch.tensor(img_a).float()
result = model(img_pt.view(3, width , height).unsqueeze_(0))
an = result.view(30 , 15 , out_channels).data.numpy()
# print(result.shape)
# print(an.shape)
# print(np.amin(an.flatten('F')))
print(30 * 15 * out_channels)

output_size를 올바르게 구현 했습니까? 이 모델을 수정하여 Conv2d 의 결과를 수정하는 방법   output_size 의 결과와 같은 모양  ?


  • 답변 # 1

    문제는 입력 이미지가 정사각형이 아니기 때문에 width 에 수식을 적용해야한다는 것입니다  그리고 heigth  입력 이미지의. 또한 당신은 nb_channels 를 사용해서는 안됩니다  출력에서 원하는 채널 수를 명시 적으로 정의하기 때문에 공식에서 그런 다음 f=kernel_size 를 사용하십시오.   f=kernel_size*kernel_size 가 아니라  공식에 설명 된대로

    w = width 
    h = height
    f = kernel_size_param
    output_w =  int(output_size(w , f , stride_param , padding_param))
    output_h =  int(output_size(h , f , stride_param , padding_param))
    print("Output_size", [out_channels, output_w, output_h]) #--> [1, 3, 30 ,15]
    
    

    그리고 출력 크기 :

    print("Output size", result.shape)  #--> [1, 3, 30 ,15] 
    
    

    수식 출처 : http://cs231n.github.io/convolutional-networks/

관련 자료

  • 이전 if statement - Bash의 "if"조건에있는 "cd"는 "if"이후에 현재 디렉토리를 변경하지 않습니다
  • 다음 ruby - 레일 - 바이너리 모드에서 env를 여는 방법은 무엇입니까?