将Pytorch模型移植到Tensorflow时,输入形状中的通道维度索引

将Pytorch模型移植到Tensorflow时,输入形状中的通道维度索引,tensorflow,pytorch,onnx,Tensorflow,Pytorch,Onnx,在通过ONNX将PyTorch模型转换为TensorFlow时,我遇到的一个主要问题是速度慢,这似乎与输入形状有关,尽管我能够通过这两个框架获得精确的输出 PyTorch输入形状为B、C、H、W,Tensorflow输入形状为B、H、W、C,其中B、C、H、W分别代表批次大小、通道、高度和宽度。从技术上讲,在使用Tensorflow时,我使用两个调用np.swapaxes,轻松解决了输入形状问题: # Single image, no batch size here yet image = np

在通过ONNX将PyTorch模型转换为TensorFlow时,我遇到的一个主要问题是速度慢,这似乎与输入形状有关,尽管我能够通过这两个框架获得精确的输出

PyTorch输入形状为
B、C、H、W
,Tensorflow输入形状为
B、H、W、C
,其中
B、C、H、W分别代表批次大小、通道、高度和宽度。从技术上讲,在使用Tensorflow时,我使用两个调用
np.swapaxes
,轻松解决了输入形状问题:

# Single image, no batch size here yet
image = np.swapaxes(image, 0, 2)   # Swapping C and H dimensions - result: C,W,H
image = np.swapaxes(image, 1, 2)   # Swapping H and W dimensions - result: C,H,W (like Pytorch)
慢度问题似乎与PyTorch与Tensorflow中卷积运算的实现方式不同有关。PyTorch预期通道优先,Tensorflow预期通道最后

因此,当我使用Netron可视化模型时,ONNX模型看起来抽象且有意义(第一张图),而Tensorflow
.pb
格式的模型看起来像一团乱麻(第二张图)。

注:这个问题似乎已经引起了的作者的关注,它支持将源自Pytorch的
C,H,W
顺序更改为
H,W,C
的实验特性

你知道如何克服这个限制吗?还有其他更抽象地将PyTorch模型导出到Tensorflow的选项吗

ONNX(来自PyTorch)-您可以看到直流和剩余块:

Tensorflow(从ONNX模型导入)-几乎没有什么像是一系列预定义的操作:


直觉上,输入形状不应该是问题的关键。你能提供关于你的代码(pytorch和tensorflow)的更多细节吗?@zhf061我认为输入形状可能是个问题,因为如果tensorflow需要
H,W,C
,那么它的卷积层可能会相应地实现。当使用我使用ONNX移植的原始Pytorch模型处理Tensorflow时(它仍然期望Pytorch的形状为
C,H,W
),我需要首先重塑输入以符合网络/Pytorch的原始要求。这就是为什么我认为ONNX不能真正使用Tensorflow的高级卷积层API,因此它使用了一些未优化的操作系列,而不是因为不熟悉ONNX。我找到了两个链接,希望它们能给你一个线索。@zhf061,谢谢。问题似乎与Tensorflow图未冻结有关。当前无法确定从ONNX导入模型时如何执行此操作