关于地平线开发板使用nhwc格式的前向传播输出格式的理解
1. 从数据维度角度理解NHWC输出
• 在深度学习中,模型的输出可以看作是一个多维的数据结构。对于图像相关的模型,当输出是NHWC格式时,“N”代表批次大小(batch size),即一次处理的图像数量;“H”是高度(height),“W”是宽度(width),这两个维度确定了图像的空间尺寸;“C”是通道数(channels),比如对于彩色图像,通道数可能是3(RGB)。
• 例如,一个模型输出的形状为[10, 28, 28, 3](假设是一个简单的图像分类模型),这意味着一次输出10张图像,每张图像的高度是28像素、宽度是28像素,且有3个通道(可能是RGB通道)。
2. 从计算过程角度理解
• 在模型计算过程中,某些层的计算方式会自然地导致输出为NHWC格式。以卷积层为例,如果输入是NHWC格式,在经过卷积运算后,输出的数据格式通常也会保持NHWC。这是因为卷积操作是在图像的高度和宽度方向上滑动卷积核进行计算的,输出的数据在空间维度(高度和宽度)上的排列顺序与输入类似,通道数可能会根据卷积核的数量等因素而改变,但整体格式依然是NHWC。
3. 从应用场景角度理解
当数据按照NHWC格式排列时,它能够有效地提高CPU缓存的效率,并且对于基于空间信息的操作非常友好。由于大多数图像处理任务都是按行优先的方式访问数据——即先遍历宽度再遍历高度——NHWC格式确保了连续访问的数据在内存中的位置也是连续的。这意味着当CPU读取一个像素时,它周围的像素也会一同加载到缓存中,从而减少了后续访问这些相邻像素时需要再次从主存读取的可能性,进而提高了缓存命中率。这种高效的内存访问模式不仅加快了卷积运算等前向传播的速度,也对依赖于图像空间坐标的后处理步骤有着直接的帮助。
3.1 对分类ID的Cache命中提高
• 当进行分类任务时,分类ID通常与图像的特征相关联。在读取图像特征以确定分类ID的过程中,如果数据是HWC布局,在访问特征数据时,由于其在内存中的连续性,更符合cache的读取模式。
• 例如,假设cache一次能读取连续的一段数据块。在HWC布局下,对于一个图像区域的特征数据(包括与分类ID相关的特征),它们在内存中更有可能被连续存储,从而更容易被一起读入cache。当需要再次访问这些与分类ID相关的数据进行比较或者其他操作时,就更有可能直接从cache中获取,提高了分类ID相关数据的cache命中率。
3.2 对特征解码的Cache命中提高
• 在特征解码过程中,需要读取图像的特征数据。以卷积神经网络为例,在对卷积层输出的特征图进行解码操作时,HWC布局能够使相邻像素的特征数据以及同一通道的特征数据在内存中连续存储。
• 当解码器按照一定的顺序(例如逐行扫描图像特征)读取数据时,这些连续的数据更有可能被预先加载到cache中。因为cache的工作原理是将最近访问过的数据及其附近的数据存储起来,以备后续访问。HWC布局下的数据存储方式正好符合这种特性,使得在特征解码过程中频繁访问的数据能够在cache中被找到的概率增加,从而提高了特征解码的cache命中率。