TensorFlow Keras实现中设置通道维度优先的优势及内核运算逻辑
核心概念澄清
首先纠正你的理解偏差:你对channels first格式的维度解读是错误的,两种格式存储的图像内容完全一致,不存在修改原图像结构的问题。
- channels last格式
[rows, cols, channels] = [2,4,3]:3个通道,每个通道对应2行4列数据,这个理解是正确的。 - channels first格式
[channels, rows, cols] = [3,2,4]:依然是3个通道,每个通道对应2行4列数据,只是把通道维度从最后一位移到了第一位,仅调整了数据的存储顺序,语义没有任何变化。
通道优先格式的优势
将通道维度放在首位主要是为了适配深度学习框架和硬件的性能优化需求:
- 早年的Theano、PyTorch等框架默认采用channels first格式,这种内存排布更契合早期CUDA卷积核的运算逻辑,连续存储的通道数据可以更好地利用GPU缓存,大幅降低内存访问开销,提升卷积运算的速度。
- 部分特定硬件加速器(比如部分FPGA推理设备)对通道优先的格式做了专门优化,推理时采用这种格式可以获得更高的吞吐率。
卷积核的运算逻辑
卷积运算的逻辑和维度顺序无关,框架会根据你指定的data_format参数自动适配维度读取规则:
不管是通道优先还是通道最后,2D卷积的卷积核只会在**空间维度(行、列)**上滑动,每个滑动位置都会同时读取所有通道的对应像素值,和卷积核参数做乘加运算得到输出值。
以你给出的代码和模型摘要为例:
输入shape为(None, 1, 30, 52),符合channels first格式,对应为「批量大小、通道数、行数、列数」:
- 你指定的卷积核大小为
(5, 1),对应在行维度上感受野为5,列维度上感受野为1 - 无特殊指定时默认无padding、步长为1,因此行维度输出尺寸为
30 - 5 + 1 = 26,列维度尺寸不变为52 - 输出通道数指定为64,因此最终输出shape为
(None, 64, 26, 52),和你给出的模型摘要完全吻合,运算逻辑和通道最后格式没有任何差异。
内容的提问来源于stack exchange,提问作者Ahmad
相关产品推荐
相关产品推荐

