Eigen extract_image_patches返回张量维度及代码输出含义咨询
Eigen extract_image_patches 张量维度解析
问题描述
我正在使用Eigen的extract_image_patches函数,但对其返回的张量维度存在疑问,官方文档描述不够清晰:
文档指出输入张量维度顺序依布局而定,ColMajor下为:通道、行、列、时间/批次;RowMajor则相反。返回张量比输入多一个维度用于索引patch,ColMajor下该维度为第4维,RowMajor下为倒数第4维。
我理解列主序的4阶输入张量会返回5阶张量,但对后两个维度含义存疑:第4维是批次?第5维是patch索引?patch索引具体指什么?
我运行了以下代码:
Eigen::Tensor<double, 4> batch (2, 2, 10, 12); // column major order Eigen::Tensor<double, 5> patches = batch.extract_image_patches(3, 3, 1, 1, Eigen::PADDING_VALID); std::cout << patches.dimensions();
输出为[2, 3, 3, 20, 12],其中2是通道数、3是patch的行/列数正确,但20和12代表什么?批次数量又在哪里?
维度含义拆解
输入维度(ColMajor)
ColMajor布局下,4阶输入张量的维度顺序为:[通道数, 图像行数, 图像列数, 批次大小]。对应你代码中的batch(2, 2, 10, 12),各维度含义是:
- 2:图像通道数
- 2:单张图像的行数
- 10:单张图像的列数
- 12:批次内的样本总数
输出维度(ColMajor)
extract_image_patches返回的5阶张量,维度顺序为:[通道数, patch行数, patch列数, 单样本patch总数, 批次大小],对应你的输出[2, 3, 3, 20, 12]:
- 第0维(2):与输入通道数一致,每个patch保留原图像的所有通道信息
- 第1、2维(3, 3):你指定的patch尺寸(3行3列)
- 第3维(20):单张图像上提取出的有效patch总数,是原图像上所有合法patch位置的线性索引。在VALID填充模式下,该数值计算公式为:
(图像行数 - patch行数 + 1) * (图像列数 - patch列数 + 1)。这里你的输出得到20,推测可能是输入维度的行/列理解偏差,或实际代码中误用了SAME填充(SAME填充下该数值为图像行数 * 图像列数,恰好10*2=20) - 第4维(12):就是输入的批次大小,每个批次样本独立提取patch,输出中对应一个维度切片
patch索引的含义
patch索引是将原图像上的patch二维位置(行偏移、列偏移)线性化后的一维编号。比如原图像上某个patch的左上角坐标为(r, c),会被映射到唯一的索引值,方便直接通过一维索引访问对应patch。
内容的提问来源于stack exchange,提问作者user1311627
相关产品推荐
相关产品推荐

