0

我正在尝试使用 Pytorch 训练一个 CNN 模型,以便输出对于不同类型的输入表现不同。(即如果输入图像是人,则输出模式A,但如果输入是其他动物,则输出模式B)。

经过一番网上搜索,似乎连体网与此有关。所以我有以下两个问题:

(1)Siamese network真的是训练这样一个模型的好方法吗?

(2)从实现的角度来看,pytorch中的代码应该如何实现呢?

class SiameseNetwork(nn.Module):
def __init__(self):
    super(SiameseNetwork, self).__init__()
    self.cnn1 = nn.Sequential(
        nn.ReflectionPad2d(1),
        nn.Conv2d(1, 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*100*100, 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

目前,我正在尝试一些我在网上找到的现有实现,比如上面的类定义。它可以工作,但是这个模型总是有两个输入和两个输出。我同意它便于训练,但理想情况下,在推理过程中应该只有一个输入和一个(两个也可以)输出。

有人可以就如何修改代码以使其成为单一输入提供一些指导吗?

4

1 回答 1

1

您可以forward_once在推理期间调用:这需要一个输入并返回一个输出。请注意,显式调用forward_once不会调用您在模块的前向/后向调用中可能拥有的任何钩子。

或者,您可以制作forward_once模块的forward函数,并让您的训练函数执行模型的双重调用(这更有意义:连体网络是一种训练方法,而不是网络架构的一部分)。

于 2020-04-30T07:03:46.967 回答