pytorch 一个模型的多个分支
pytorch multiple branches of a model
你好,我正在尝试使用 pytorch 制作这个模型。
每个输入由20张大小为28 X 28的图像组成,也就是图像中的C1~Cp。
每个图像都进入相同结构的 CNN,但它们的输出最终会连接起来。
我目前正在努力为每个相应的 CNN 模型提供多个输入。
第一个框中的每个模型都具有三个卷积层,作为代码看起来像这样,但我不太确定如何将 20 个不同的输入放入具有相同结构的不同模型以最终连接起来。
self.features = nn.Sequential(
nn.Conv2d(1,10, kernel_size = 3, padding = 1),
nn.ReLU(),
nn.Conv2d(10, 14, kernel_size=3, padding=1),
nn.ReLU(),
nn.Conv2d(14, 18, kernel_size=3, padding=1),
nn.ReLU(),
nn.Flatten(),
nn.Linear(28*28*18, 256)
)
我试过将输入列表作为转发函数的输入,但它以错误告终,无法通过。
如果有任何不清楚的地方,我很乐意进一步解释。
简单地定义forward
为以张量列表作为输入,然后用相应的CNN处理每个输入(在示例片段中,CNN共享相同的结构但不共享参数,这就是我假设你需要。你需要根据你的规格填写圆点...
。
class MyModel(torch.nn.Module):
def __init__(self, ...):
...
self.cnns = torch.nn.ModuleList([torch.nn.Sequential(...) for _ in range(20)])
def forward(xs: list[Tensor]):
return torch.cat([cnn(x) for x, cnn in zip(xs, self.cnns)], dim=...)
假设每条路径都有自己的权重,这可能可以通过分组卷积来完成,尽管预融合 Linear
会造成一些麻烦。
P = 20
self.features = nn.Sequential(
nn.Conv2d(1*P,10*P, kernel_size = 3, padding = 1, groups = P ),
nn.ReLU(),
nn.Conv2d(10*P, 14*P, kernel_size=3, padding=1, groups = P),
nn.ReLU(),
nn.Conv2d(14*P, 18*P, kernel_size=3, padding=1, groups = P),
nn.ReLU(),
nn.Conv2d(18*P, 256*P, kernel_size=28, groups = P), # not shure about this one
nn.Flatten(),
nn.Linear(256*P, 1024 )
)
你好,我正在尝试使用 pytorch 制作这个模型。
每个输入由20张大小为28 X 28的图像组成,也就是图像中的C1~Cp。 每个图像都进入相同结构的 CNN,但它们的输出最终会连接起来。
我目前正在努力为每个相应的 CNN 模型提供多个输入。 第一个框中的每个模型都具有三个卷积层,作为代码看起来像这样,但我不太确定如何将 20 个不同的输入放入具有相同结构的不同模型以最终连接起来。
self.features = nn.Sequential(
nn.Conv2d(1,10, kernel_size = 3, padding = 1),
nn.ReLU(),
nn.Conv2d(10, 14, kernel_size=3, padding=1),
nn.ReLU(),
nn.Conv2d(14, 18, kernel_size=3, padding=1),
nn.ReLU(),
nn.Flatten(),
nn.Linear(28*28*18, 256)
)
我试过将输入列表作为转发函数的输入,但它以错误告终,无法通过。 如果有任何不清楚的地方,我很乐意进一步解释。
简单地定义forward
为以张量列表作为输入,然后用相应的CNN处理每个输入(在示例片段中,CNN共享相同的结构但不共享参数,这就是我假设你需要。你需要根据你的规格填写圆点...
。
class MyModel(torch.nn.Module):
def __init__(self, ...):
...
self.cnns = torch.nn.ModuleList([torch.nn.Sequential(...) for _ in range(20)])
def forward(xs: list[Tensor]):
return torch.cat([cnn(x) for x, cnn in zip(xs, self.cnns)], dim=...)
假设每条路径都有自己的权重,这可能可以通过分组卷积来完成,尽管预融合 Linear
会造成一些麻烦。
P = 20
self.features = nn.Sequential(
nn.Conv2d(1*P,10*P, kernel_size = 3, padding = 1, groups = P ),
nn.ReLU(),
nn.Conv2d(10*P, 14*P, kernel_size=3, padding=1, groups = P),
nn.ReLU(),
nn.Conv2d(14*P, 18*P, kernel_size=3, padding=1, groups = P),
nn.ReLU(),
nn.Conv2d(18*P, 256*P, kernel_size=28, groups = P), # not shure about this one
nn.Flatten(),
nn.Linear(256*P, 1024 )
)