siamese network如果推理时是单输入,怎么用Pytorch实现?
How is Siamese network realized with Pytorch if it is single input during inference?
我正在尝试使用 Pytorch 训练一个 CNN 模型,以便针对不同类型的输入输出不同的行为。 (即如果输入图像是人,它输出模式 A,但如果输入是其他动物,它输出模式 B)。
网上查了下好像连体网跟这个有关。所以我有以下2个问题:
(1)Siamese网络真的是训练这样一个模型的好方法吗?
(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
目前,我正在尝试一些我在网上找到的现有实现,如上面的 class 定义。它有效,但此模型始终有两个输入和两个输出。我同意这样方便训练,但理想情况下,在推理时应该只有一个输入和一个(两个也可以)输出。
有人可以提供一些关于如何修改代码以使其成为单一输入的指导吗?
您可以在推理期间调用 forward_once
:这需要一个输入和 returns 一个输出。请注意,显式调用 forward_once
不会调用您在 forward/backward 调用模块时可能拥有的任何挂钩。
或者,您可以使 forward_once
模块的 forward
函数,并使训练函数执行模型的双重调用(这更有意义:Siamese 网络是 training 方法,而不是网络架构的一部分)。
我正在尝试使用 Pytorch 训练一个 CNN 模型,以便针对不同类型的输入输出不同的行为。 (即如果输入图像是人,它输出模式 A,但如果输入是其他动物,它输出模式 B)。
网上查了下好像连体网跟这个有关。所以我有以下2个问题:
(1)Siamese网络真的是训练这样一个模型的好方法吗?
(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
目前,我正在尝试一些我在网上找到的现有实现,如上面的 class 定义。它有效,但此模型始终有两个输入和两个输出。我同意这样方便训练,但理想情况下,在推理时应该只有一个输入和一个(两个也可以)输出。
有人可以提供一些关于如何修改代码以使其成为单一输入的指导吗?
您可以在推理期间调用 forward_once
:这需要一个输入和 returns 一个输出。请注意,显式调用 forward_once
不会调用您在 forward/backward 调用模块时可能拥有的任何挂钩。
或者,您可以使 forward_once
模块的 forward
函数,并使训练函数执行模型的双重调用(这更有意义:Siamese 网络是 training 方法,而不是网络架构的一部分)。