pytorch 如果形状完全不同,如何连接两个不同模型的输出?

m1m5dgzv  于 2023-10-20  发布在  其他
关注(0)|答案(2)|浏览(95)

我在pytorch中有两个预训练的模型,它们使用不同类型的输入数据。我使用这两个函数进行特征提取,并希望在最后将它们的输出连接起来,并将它们放入LSTM中。
我有以下输出:
型号A [batch size, num of features, num of frames]
型号B [batch size, num of features, num of frames, height, width]
我如何连接它们,以便我可以将连接的向量放入LSTM并训练它。我不知道如何做,使我的连接向量仍然“有意义”,不丢失任何信息。

pxq42qpu

pxq42qpu1#

您可以调整第二个模型的输出向量,使新的要素数为num of features x height x width
假设两个向量具有相同的批量大小和相同的帧数:首先,对两个输出向量重新排序,使顺序为[batch size, num of frames, num of features, ...]
然后,在最后一个维度上连接:

output1 = torch.randn(10, 5, 20)
output2 = torch.randn(10, 7, 20, 100, 200)
output1 = output1.permute(0, 2, 1) 
output2 = output2.permute(0, 2, 1, 3, 4)
output = torch.concatenate([output1, output2], dim=2)

现在,输出Tensor具有来自两个输出向量的所有特征,每个帧编号每个批次示例,这通常是有意义的

ycggw6v2

ycggw6v22#

@Yakov Dan的回答是正确的,这里是另一种方法:

  • ModelAModelB的输出整形为具有相同的帧数,

模型A形状[批量大小,特征数量,帧数量]和
模型B具有形状[批量大小,特征数,帧数,高度,宽度]。

  • 重塑模型B,使其具有与模型A相同的帧数。
  • 沿高度和宽度标注沿着展平模型A和模型B的输出。这将把输出从5维Tensor转换为3维Tensor,其中每个帧表示为单个向量。
  • 沿特征尺寸沿着连接模型A和模型B的展平输出。这将产生形状为[batch size, num of features_A + num of features_B, num of frames]的Tensor。
output_modelA = torch.randn(batch_size, num_features_A, num_frames)
output_modelB = torch.randn(batch_size, num_features_B, num_frames, height, width)

# Reshape ModelB to have the same number of frames as ModelA
output_modelB = output_modelB.view(batch_size, num_features_B, num_frames, -1)

# Flatten the outputs of ModelA and ModelB
output_modelA = output_modelA.view(batch_size, num_features_A, -1)
output_modelB = output_modelB.view(batch_size, num_features_B, -1)

# Concatenate the flattened outputs along the feature dimension
concatenated_output = torch.cat((output_modelA, output_modelB), dim=1)

# Define the LSTM module

# Pass the concatenated tensor into the LSTM

相关问题