首页 > 解决方案 > 为什么我的 ONNX 模型从 PyTorch 转换后输入为 0?

问题描述

我希望使用此处的教程使用 ONNX 作为中间格式将 PyTorch 模型转换为 Tensorflow 。但是,转换后,当我运行

output =[node.name for node in model.graph.output]
input_all = [node.name for node in model.graph.input]
input_initializer =  [node.name for node in model.graph.initializer]
net_feed_input = list(set(input_all)  - set(input_initializer))

print('Inputs: ', net_feed_input)
print('Outputs: ', output)

它说输入为零。这是模型架构

class Model(nn.Module):
    def __init__(self):
        super().__init__()
        self.hidden_x1 = nn.Sequential(
            nn.Conv1d(in_channels=2, out_channels=8, kernel_size=7),
            nn.SELU(),
            nn.Conv1d(in_channels=8, out_channels=6, kernel_size=7),
            nn.SELU(),
            nn.Conv1d(in_channels=6, out_channels=4, kernel_size=5),
            nn.SELU(),
        )
        self.hidden_xfc = nn.Sequential(
            nn.Linear(256, 20),
            nn.SELU(),
            nn.Linear(20, 20),
            nn.SELU(),
        )
        self.hidden_x2 = nn.Sequential(
            nn.MaxPool1d(kernel_size=2),
            nn.Conv1d(in_channels=2, out_channels=4, kernel_size=5),
            nn.SELU(),
            nn.Conv1d(in_channels=4, out_channels=4, kernel_size=5),
            nn.SELU(),
            nn.Conv1d(in_channels=4, out_channels=4, kernel_size=5),
            nn.SELU(),
            nn.Conv1d(in_channels=4, out_channels=4, kernel_size=5),
            nn.SELU(),
            nn.Conv1d(in_channels=4, out_channels=4, kernel_size=5),
            nn.SELU(),
            nn.Conv1d(in_channels=4, out_channels=4, kernel_size=5),
            nn.SELU(),
            nn.AvgPool1d(kernel_size=2),
            nn.Conv1d(in_channels=4, out_channels=2, kernel_size=3),
            nn.SELU(),
            nn.AvgPool1d(kernel_size=2),
            nn.Conv1d(in_channels=2, out_channels=2, kernel_size=3),
            nn.SELU(),
            nn.AvgPool1d(kernel_size=2),
        )
        self.hidden_encoded_1 = nn.Flatten()
        self.hidden_embedding = nn.Sequential(
            nn.Linear(26, 16),
            nn.SELU(),
            nn.Linear(16, 8),
            nn.SELU(),
            nn.Linear(8, 4),
        )
        
    def forward(self, x, n=-1):
      x = torch.transpose(x, 1, 2)
      x = self.hidden_x1(x)
      xfc = torch.reshape(x, (n, 256))
      xfc = self.hidden_xfc(xfc)
      x = torch.reshape(x, (n, 2, 128))
      x = self.hidden_x2(x)
      encoded = self.hidden_encoded_1(x)
      encoded = torch.cat((encoded, xfc), 1)
      embedding = self.hidden_embedding(encoded)

      unscaled_param = embedding*torch.tensor(params_scaler.var_[0:4]**0.5).cuda() + torch.tensor(params_scaler.mean_[0:4]).cuda()
      return unscaled_param

我在做的时候传入这个随机输入torch.onnx.export(trained_model, dummy_input, "output/trained_model.onnx")

dummy_input = Variable(torch.randn(20,80,2))
dummy_input = dummy_input.type(torch.cuda.DoubleTensor)

在转换 ONNX 模型 TensorFlow 后,它还说输入也为零。有谁知道我可能做错了什么?

标签: tensorflowmachine-learningpytorchonnx

解决方案


推荐阅读