Как изменить Pytorch CNN для получения цветных изображений вместо черно-белых? - PullRequest
0 голосов
/ 13 декабря 2018

Этот код Я обнаружил, что имеет нейронную сеть, которая настроена на получение черно-белых изображений.(Это сиамская сеть, но эта часть не актуальна).Когда я изменяю его, чтобы взять мои изображения, а НЕ конвертировать их в черно-белое, я получаю ошибку, показанную ниже.
Я попытался изменить первый Conv2d, шестую строку, с 1 на 3

class SiameseNetwork(nn.Module):
    def __init__(self):
        super(SiameseNetwork, self).__init__()
        self.cnn1 = nn.Sequential(
            nn.ReflectionPad2d(1),
            # was nn.Conv2d(1, 4, kernel_size=3),
            nn.Conv2d(3, 4, kernel_size=3),
            nn.ReLU(inplace=True),
            nn.BatchNorm2d(4),

            nn.ReflectionPad2d(1),
            nn.Conv2d(4, 8, kernel_size=3),
            nn.ReLU(inplace=True),
            nn.BatchNorm2d(8),

            nn.ReflectionPad2d(1),
            nn.Conv2d(8, 8, kernel_size=3),
            nn.ReLU(inplace=True),
            nn.BatchNorm2d(8))

        self.fc1 = nn.Sequential(
            nn.Linear(8*300*300, 500),
            nn.ReLU(inplace=True),

            nn.Linear(500, 500),
            nn.ReLU(inplace=True),

            nn.Linear(500, 5))

    def forward_once(self, x):
        output = self.cnn1(x)
        output = output.view(output.size()[0], -1)
        output = self.fc1(output)
        return output

    def forward(self, input1, input2):
        output1 = self.forward_once(input1)
        output2 = self.forward_once(input2)
        return output1, output2

Моя ошибка, когда изображения НЕ конвертируются в черно-белые и остаются цветными.

RuntimeError: invalid argument 0: Sizes of tensors must match  
except in dimension 0. Got 3 and 1 in dimension 1 at  
/opt/conda/conda-bld/pytorch-nightly_1542963753679/work/aten/src/TH/generic/THTensorMoreMath.cpp:1319

Я проверил формы изображений как массивы (прямо перед тем, как они войдут в модель), как черно-белые и цветные ...

B & W

torch.Size([1, 1, 300, 300])

Цвет

torch.Size([1, 3, 300, 300])

Вот ссылка на Блокнот Jupyter со всем исходным кодом, с которым я работаю ... https://github.com/harveyslash/Facial-Similarity-with-Siamese-Networks-in-Pytorch/blob/master/Siamese-networks-medium.ipynb

РЕДАКТИРОВАТЬ: ОБНОВЛЕНИЕ: Мне показалось,решил эту проблему путем преобразования изображений в RBG в части кода SiameseNetworkDataset

img0 = img0.convert("L")

, измененной на

img0 = img0.convert("RGB")

Я только что закомментировал строку раньше и подумал, что это оставило ее вRGB, но это было что-то еще, что модель не поняла.Кроме того, необходимо было изменить OP.

nn.Conv2d(1, 4, kernel_size=3),

изменено на

nn.Conv2d(3, 4, kernel_size=3),

Если вы хотите ответить с объяснением того, что делает модель, которая прояснит этоЯ дам тебе зеленый чек.Не очень понимаю nn.Conv2d

1 Ответ

0 голосов
/ 14 декабря 2018

Ошибка, кажется, находится в полностью подключенной части ниже:

self.fc1 = nn.Sequential(
        nn.Linear(8*100*100, 500),
        nn.ReLU(inplace=True),

        nn.Linear(500, 500),
        nn.ReLU(inplace=True),

        nn.Linear(500, 5))

Кажется, что вывод cnn имеет форму [8,300,300], а не [8,100,100]

Чтобы решить это либоизмените входное изображение на [n_channel, 100,100] или измените размер входного размера fc-слоя на 8*300*300

...