unfold(展开)是深度学习框架中常见的数据操作。与我们熟悉的卷积类似,unfold也是使用一个特定大小的窗口和步长自左至右、自上至下滑动,不同的是,卷积是滑动后与核求乘积(所以取名为卷积),而unfold滑动后不求乘积,是将窗口内的数据展开。
例如:
有一个如下内容的张量:[[[[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12], [13, 14, 15, 16]]]],其数据阵列为:
使用(2*2)的核,步长为2,在上述的数据阵列内滑动,得到了四个窗口数据:
将每一个滑动窗口的数据展平为一维数据,得到:
即:[[[1, 2, 5, 6], [3, 4, 7, 8], [9, 10, 13, 14], [11, 12, 15, 16]]]
三维数据(如彩色图像)的情况
对于彩色图像这样的三维数据,unfold操作会对每个通道分别进行上述的二维展开操作。通道维度保持不变,只是每个通道的数据都按照窗口大小和步长展开并重新排列。例如,一个 RGB 图像,在对其进行unfold操作时,红色通道、绿色通道和蓝色通道的数据都会被独立地按照定义的窗口和步长展开,然后将这些展开后的通道数据按照原来的通道顺序组合在一起,形成新的张量。
应用场景
unfold 操作的常见应用场景包括:
• 卷积层:将卷积操作转换为矩阵乘法,提高计算效率。
• 池化层:在池化操作中,将输入数据转换为适合进行最大值或平均值计算的形式。
• 自定义层:在自定义的神经网络层中,用于实现特定的局部操作。