【问题标题】:How to change a Pytorch CNN to take color images instead of black and white?如何更改 Pytorch CNN 以拍摄彩色图像而不是黑白图像?
【发布时间】:2018-12-13 20:56:08
【问题描述】:

This code 我发现有一个神经网络可以拍摄黑白图像。 (这是一个连体网络,但那部分不相关)。当我将其更改为拍摄我的图像而不是将它们转换为黑白时,我收到如下所示的错误。
我尝试将第一个 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

我将图像的形状作为数组(在它们进入模型之前)检查为黑白与彩色......

黑白

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

彩色

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

这是我正在使用的整个原始代码的 Jupyter Notebook 的链接...https://github.com/harveyslash/Facial-Similarity-with-Siamese-Networks-in-Pytorch/blob/master/Siamese-networks-medium.ipynb

编辑:更新:我似乎已经通过在代码的 SiameseNetworkDataset 部分将图像转换为 RBG 来解决它

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

【问题讨论】:

    标签: python image conv-neural-network pytorch


    【解决方案1】:

    错误似乎在下面的全连接部分:

    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 的输出是 shape[8,300,300] 而不是 [8,100,100]

    要解决此问题,请将输入图像更改为[n_channel, 100,100] 或将 fc 层的输入大小的大小更改为8*300*300

    【讨论】:

    • 对不起,8*100*100 在代码中,但我在代码中将其更改为 8*300*300。我只是从原始代码中复制而不是我更改的修改代码,因此模型不会丢弃图像质量。它实际上是最后一行,nn.Linear(500, 5)) 我刚刚更改为 (500,7),现在它训练 RGB 而不是黑白图像。如果你想编辑你的答案来解释它是如何工作的,我会给你一个绿色的检查,也许链接到一个解释。我仍然不完全理解或知道输入需求是否在其他地方发生了变化。
    • 你是想说如果最后一层是 (500,5) 它不工作并且 (500,7) 它工作?该代码(至少您显示的内容,forward 或 forward_once)适用于 (500,5) 和 (500,7)
    • 是的,但现在我明白这正是我认为正在发生的事情。 (500, 5) 到 (500,7),但现在我想我只是通过发送一个黑白图像。那不是解决方案。你得到了整个笔记本并注释掉了 img0 = img0.convert("L") 并通过网络发送了彩色图像?经过几天的尝试,我无法通过它放置彩色图像。我确定这是一个“渠道”问题 - 如果我只知道如何更改它/它在哪里。
    • 我不确定您在寻找什么。我可以看到笔记本,但想不出它为什么不起作用?可能有多种失败原因。我不知道您传递了哪些确切的输入,您使用了哪些损失。据我了解,您的模型运行良好。那么你在哪里得到错误?哪个块或哪一行代码?
    • 你想不出它为什么不能工作 - 这是我阻止笔记本将图像转换为我在上一条评论中显示的黑白图像的时候。这发生在以 'class SiameseNetworkDataset(Dataset): 开头的第 4 个单元格中:就像我说它需要 1 个通道(灰色)但现在我给它 3 个通道(红色、蓝色、绿色)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-25
    相关资源
    最近更新 更多