【问题标题】:Is there any way that can convert a data format of .pb file from NCHW into NHWC?有什么方法可以将 .pb 文件的数据格式从 NCHW 转换为 NHWC?
【发布时间】:2020-05-19 18:22:54
【问题描述】:

我有一个基于数据格式N(batch) x C(channel) x H(height) x W(width) 在 Pytorch 中训练的 CNN 模型。我将预训练模型保存为 model.pth。之后,我使用现有函数从 model.pth -> model.onnx 转换了预训练模型:

torch.onnx.export(model, dummy_input, "model.onnx")

然后,我通过下面的模块转换了这个 model.onnx -> model.pb

import onnx
from onnx_tf.backend import prepare 

model_onnx = onnx.load('model.onnx')
tf_rep = prepare(model_onnx)
tf_rep.export_graph('model.pb')

问题是:我想在 CPU 设备上使用这个 model.pb,它需要 NHWC 数据格式。但是,我的模型是基于 NCHW 数据格式的。有没有什么方法可以把这个model.pb的数据格式从NCHW转换成NHWC?

【问题讨论】:

标签: python-3.x tensorflow pytorch conv-neural-network pre-trained-model


【解决方案1】:

简短的回答,你处境艰难。

答案很长,虽然很难,但可能。使您的问题变得困难的是您的图表已经过训练。在创建训练图时转换 NCHW->NHWC 效率低,但更容易。查看类似的答案herehere

现在回答您的问题,您必须使用自定义卷积运算符重载 conv2D 运算符。这是一个开始使用的伪代码。

   tensor Conv2D(X, W, B) {
     int perm[] = {0, 3, 1, 2};
     X = transposeTensor(X, perm);
     W = transposeTensor(W, perm);
     Y = Conv2D_orig(X, W, B, ...) ;
     perm = {0, 2, 3, 1};
     return transposeTensor(Y, perm);
   }

【讨论】:

    【解决方案2】:

    你可以只转置输入张量吗?例如input.transpose(1,2).transpose(2,3)?

    >>> torch.randn( (3,3,3,3), names=['n','c','h','w']).transpose(1,2).transpose(2,3).names
    ('n', 'h', 'w', 'c')
    

    【讨论】:

    • 您好,您是指在 Pytorch 培训之前?感谢您的回答,任何建议都有帮助!
    • 是的...在任何输入上,无论是训练数据还是评估数据。任何尺寸不兼容的输入。
    • 在这种情况下,torch.nn 不是只使用通道优先作为数据格式,即 NCHW 吗?如果我错了,请纠正我。谢谢。
    • 是的,没错。您的输入数据可以转换,但我不确定您要运行什么模型。您可以在此处关注最后支持频道的工作:github.com/pytorch/pytorch/issues/28619
    • 我正在使用定制模型。我将尝试关注您提到的 github 问题。感谢您再次提供帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-23
    • 1970-01-01
    • 2016-10-07
    • 1970-01-01
    • 1970-01-01
    • 2020-05-01
    • 1970-01-01
    相关资源
    最近更新 更多