RuntimeError: ожидаемый шаг будет одним целочисленным значением - PullRequest
0 голосов
/ 25 сентября 2018

Я новичок в Pytorch, извините за основной вопрос.Модель дает мне ошибку несоответствия размеров, как решить эту проблему?Может быть, больше, чем одна проблема в этом.Любая помощь будет оценена.Спасибо

class PR(nn.Module):
        def __init__(self):
            super(PR, self).__init__()
            self.conv1     = nn.Conv2d(3,6,kernel_size=5)
            self.conv2     = nn.Conv2d(6,1,kernel_size=2)
            self.dens1     = nn.Linear(300, 256)
            self.dens2     = nn.Linear(256, 256)
            self.dens3     = nn.Linear(512, 24)
            self.drop      = nn.Dropout()

        def forward(self, x):
            out = self.conv1(x)
            out = self.conv2(x)
            out = self.dens1(x)
            out = self.dens2(x)
            out = self.dens3(x)
            return out

model = PR()
input = torch.rand(28,28,3)
output = model(input)

Ответы [ 2 ]

0 голосов
/ 25 сентября 2018

Пожалуйста, ознакомьтесь с исправленным кодом.Я пронумеровал строки, где я делал исправления, и описал их ниже.

class PR(torch.nn.Module):
    def __init__(self):
        super(PR, self).__init__()
        self.conv1     = torch.nn.Conv2d(3,6, kernel_size=5) # (2a) in 3x28x28 out 6x24x24
        self.conv2     = torch.nn.Conv2d(6,1, kernel_size=2) # (2b) in 6x24x24 out 1x23x23 (6)
        self.dens1     = torch.nn.Linear(529, 256) # (3a)
        self.dens2     = torch.nn.Linear(256, 256)
        self.dens3     = torch.nn.Linear(256, 24) # (4)
        self.drop      = torch.nn.Dropout()

    def forward(self, x):
        out = self.conv1(x) 
        out = self.conv2(out) # (5)

        out = out.view(-1, 529) # (3b)

        out = self.dens1(out)
        out = self.dens2(out)
        out = self.dens3(out)
        return out

model = PR()
ins = torch.rand(1, 3, 28, 28) # (1)
output = model(ins)
  1. Прежде всего, Pytorch обрабатывает тензоры изображений (вы выполняете 2-мерную свертку, поэтому я предполагаю, что это ввод изображений) следующим образом:[batch_size x image_depth x height width]
  2. Важно понимать, как работает свертка с ядром, отступами и шагом.В вашем случае kernel_size равен 5, и у вас нет заполнения (и шага 1).Это означает, что размеры карты объектов уменьшаются (как показано на рисунке).В вашем случае первый конв.Слой принимает тензор 3x28x28 и создает тензор 6x24x24, второй - 6x24x24 из 1x23x23.Я нахожу очень полезным иметь комментарии с тензорными измерениями входных и выходных рядом с определенными слоями конв (см. Код выше)

No padding, stride 1 2-d conv - https://github.com/vdumoulin/conv_arithmetic

Здесь вам нужно «сгладить» тензор [batch_size x глубина x высота x ширина] до [batch_size x полностью подключенный вход].Это можно сделать с помощью tenor.view ().

Неправильный ввод для линейного слоя

Каждая операция в прямом проходе занималавходное значение x, вместо этого я думаю, что вы можете передать результаты каждого слоя следующему

Хотя этот код теперь можно запустить, это не значит, что он имеет смысл.Самая важная вещь (я бы сказал, для нейронных сетей) - это функции активацииОни отсутствуют полностью.

Для начала работы с нейронными сетями в pytorch я очень рекомендую отличные уроки по pytorch: https://pytorch.org/tutorials/ (я бы начал с 60-минутного блиц-урока)

Надеюсь, это поможет!

0 голосов
/ 25 сентября 2018

Есть несколько проблем с вашим кодом.Я рассмотрел и исправил его ниже:

class PR(nn.Module):
        def __init__(self):
            super(PR, self).__init__()
            self.conv1     = nn.Conv2d(3, 6, kernel_size=5)
            self.conv2     = nn.Conv2d(6, 1, kernel_size=2)
            # 300 does not match the shape of the previous layer's output,
            # for the specified input, the output of conv2 is [1, 1, 23, 23]
            # this output should be flattened before feeding it to the dense layers
            # the shape then becomes [1, 529], which should match the input shape of dens1
            # self.dens1     = nn.Linear(300, 256)
            self.dens1     = nn.Linear(529, 256)
            self.dens2     = nn.Linear(256, 256)
            # The input should match the output of the previous layer, which is 256
            # self.dens3     = nn.Linear(512, 24)
            self.dens3     = nn.Linear(256, 24)
            self.drop      = nn.Dropout()

        def forward(self, x):
            # The output of each layer should be fed to the next layer
            x = self.conv1(x)
            x = self.conv2(x)
            # The output should be flattened before feeding it to the dense layers
            x = x.view(x.size(0), -1)
            x = self.dens1(x)
            x = self.dens2(x)
            x = self.dens3(x)
            return x

model = PR()
# The input shape should be (N,Cin,H,W)
# where N is the batch size, Cin is input channels, H and W are height and width respectively
# so the input should be torch.rand(1,3,28,28)
# input = torch.rand(28,28,3)
input = torch.rand(1, 3, 28, 28)
output = model(input)

Дайте мне знать, если у вас есть какие-либо дополнительные вопросы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...