Deep learning 如果在推理过程中是单输入,那么如何使用Pytork实现暹罗网络?

Deep learning 如果在推理过程中是单输入,那么如何使用Pytork实现暹罗网络?,deep-learning,computer-vision,pytorch,conv-neural-network,siamese-network,Deep Learning,Computer Vision,Pytorch,Conv Neural Network,Siamese Network,我正在尝试用Pytorch训练一个CNN模型,这样对于不同类型的输入,输出的行为会有所不同。(即,如果输入图像是人类,则输出模式A,但如果输入是其他动物,则输出模式B) 经过一些在线搜索,似乎暹罗网络与此有关。因此,我有以下两个问题: (1) 暹罗网络真的是培养这样一个榜样的好方法吗 (2) 从实现的角度来看,我应该如何在pytorch中实现代码 class SiameseNetwork(nn.Module): def __init__(self): super(SiameseNetwo

我正在尝试用Pytorch训练一个CNN模型,这样对于不同类型的输入,输出的行为会有所不同。(即,如果输入图像是人类,则输出模式A,但如果输入是其他动物,则输出模式B)

经过一些在线搜索,似乎暹罗网络与此有关。因此,我有以下两个问题:

(1) 暹罗网络真的是培养这样一个榜样的好方法吗

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


是否有人可以提供一些指导,说明如何修改代码以使其成为单输入?

您可以在推理过程中调用一次
forward\u
:这将接受单输入并返回单输出。请注意,一次显式调用
forward\u
将不会调用您在模块的前向/后向调用中可能拥有的任何挂钩

或者,您可以将模块的
转发
功能进行一次
转发
操作,并使您的培训功能执行模型的双重调用(这更有意义:暹罗网络是一种培训方法,而不是网络架构的一部分)