tensorflow: (data_format) NHWC、NCHW 区别与转换

区别

NHWC

[batch, in_height, in_width, in_channels]

NCHW

[batch, in_channels, in_height, in_width]

转换

NHWC –> NCHW:

import tensorflow as tf

x = tf.reshape(tf.range(24), [1, 3, 4, 2])
out = tf.transpose(x, [0, 3, 1, 2])

print x.shape
print out.shape
(1, 3, 4, 2)
(1, 2, 3, 4)

NCHW –> NHWC:

import tensorflow as tf

x = tf.reshape(tf.range(24), [1, 2, 3, 4])
out = tf.transpose(x, [0, 2, 3, 1])

print x.shape
print out.shape
(1, 2, 3, 4)
(1, 3, 4, 2)


### 关于 `AssertionError` 和张量形状不匹配问题 当遇到 `AssertionError` 并提示输入张量 `(64, 3, 32, 32)` 的格式预期的 HWC 不匹配时,这通常是因为模型或框架期望的数据布局其实际接收到的不同。以下是可能的原因以及解决方案: #### 数据维度顺序差异 常见的图像数据表示有两种主要形式:HWC(高度、宽度、通道)和 CHW(通道、高度、宽度)。许多深度学习框架(如 PyTorch)默认使用 CHW 格式作为输入,而其他库(如 OpenCV 或 TensorFlow 默认情况下可能会返回 HWC 格式的数组)。如果未正确转换,则可能导致断言误。 对于给定的张量尺寸 `(64, 3, 32, 32)`,它实际上遵循的是 NCHW 布局[^1],其中: - **N**: 批次大小 (batch size),这里是 64。 - **C**: 图像的通道数 (channels),这里是 RGB 彩色图片对应的 3。 - **H**: 高度 (height),这里为 32。 - **W**: 宽度 (width),同样也是 32。 然而,如果你尝试将其传递到一个期待 HWC 输入结构的地方就会引发冲突。 #### 解决方案一:调整数据排列方式 可以利用 NumPy 提供的功能来改变轴的位置从而完成必要的变换操作。下面展示如何通过 `.transpose()` 方法实现从 NHWCNCHW 转换的一个例子: ```python import numpy as np # Assuming data is initially in NHWC format with shape (64, 32, 32, 3) data_nhwc = np.random.rand(64, 32, 32, 3) # Convert to NCHW by permuting axes data_nchw = data_nhwc.transpose((0, 3, 1, 2)) # Shape becomes (64, 3, 32, 32) ``` 上述代码片段展示了怎样把原始 NHWC 类型的数据重新组织成适合某些神经网络层使用的 NCHW 格式[^2]。 #### 解决方案二:验证并修正配置参数 另一种可能性在于训练脚本或者推理过程中设置不当引起的误解;比如加载预处理阶段忘记指定正确的颜色空间或是误用了不同的读图函数等都会造成最终送入模型前后的形态不符现象发生。因此建议仔细检查整个流水线中的每一步骤是否有潜在隐患存在。 另外值得注意的一点是,在定义自定义 Dataset 子类的时候也要特别留意getitem()方法里边是如何构建样本元组(sample tuple)的具体细节部分[^3]: ```python def __getitem__(self, index): img_path = self.imgs[index] image = Image.open(img_path).convert('RGB') # Ensure images are loaded as RGB if self.transform is not None: image = self.transform(image) # Apply transformations including ToTensor() label = ... # Load corresponding label here. return image, label ``` 在这个特定场景下,确保所有的图像都被转化为标准的三原色模式(RGB), 同时应用任何额外所需的转换步骤诸如缩放(resizing)、裁剪(cropping)或者是标准化(normalization)[^4]. ### 总结 综上所述,要解决此类 AssertionError 误的关键在于理解当前工作流所采用的确切存储约定,并采取适当措施使两者保持一致。无论是手动重塑还是修改初始化逻辑都可以有效缓解这一状况的发生几率.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值