Matlab convn函数3阶张量valid模式运算原理及首元素计算演示
拆解MATLAB
convn 3阶张量'valid'模式下第一个输出元素的计算 我来帮你一步步理清这个3D卷积的计算过程——你已经提前把滤波器w旋转180度,这步太关键了,因为MATLAB默认的convn其实是做互相关运算,要实现数学定义上的卷积,必须先对滤波器做全维度翻转(也就是你说的180度旋转)。
先明确维度与符号定义
我们先给输入张量i和翻转后的滤波器w'的元素做个标记,方便后续计算:
- 输入
i:尺寸3×3×2,两个通道的元素可以表示为:
通道1(i(:,:,1)):
通道2(i₁₁₁ i₁₂₁ i₁₃₁ i₂₁₁ i₂₂₁ i₂₃₁ i₃₁₁ i₃₂₁ i₃₃₁i(:,:,2)):i₁₁₂ i₁₂₂ i₁₃₂ i₂₁₂ i₂₂₂ i₂₃₂ i₃₁₂ i₃₂₂ i₃₃₂ - 原滤波器
w:尺寸2×2×2,旋转180度(全维度翻转)后得到w',翻转规则是每个维度都做镜像翻转——比如原w(1,1,1)会移动到w'(2,2,2),w(1,1,2)移动到w'(2,2,1),以此类推,对应关系如下:w'(1,1,1) = w(2,2,2) w'(1,1,2) = w(2,2,1) w'(1,2,1) = w(2,1,2) w'(1,2,2) = w(2,1,1) w'(2,1,1) = w(1,2,2) w'(2,1,2) = w(1,2,1) w'(2,2,1) = w(1,1,2) w'(2,2,2) = w(1,1,1)
'valid'模式下第一个输出元素的计算逻辑
在'valid'模式下,卷积窗口只能完全落在输入张量内部,第一个输出元素out(1,1)对应的是输入中最左上角的、刚好能容纳滤波器的子张量——也就是i(1:2, 1:2, 1:2)这个2×2×2的子块,和翻转后的滤波器w'做逐元素相乘后求和(点积运算)。
具体计算式展开
把翻转后的滤波器和输入子张量的对应元素相乘再累加,得到第一个输出元素:
out(1,1) = w'(1,1,1)*i(1,1,1) + w'(1,1,2)*i(1,1,2) + w'(1,2,1)*i(1,2,1) + w'(1,2,2)*i(1,2,2) + w'(2,1,1)*i(2,1,1) + w'(2,1,2)*i(2,1,2) + w'(2,2,1)*i(2,2,1) + w'(2,2,2)*i(2,2,2)
替换成原滤波器w的元素后,式子变成:
out(1,1) = w(2,2,2)*i(1,1,1) + w(2,2,1)*i(1,1,2) + w(2,1,2)*i(1,2,1) + w(2,1,1)*i(1,2,2) + w(1,2,2)*i(2,1,1) + w(1,2,1)*i(2,1,2) + w(1,1,2)*i(2,2,1) + w(1,1,1)*i(2,2,2)
举个数值例子验证
假设我们给输入和滤波器赋值:
% 输入张量i i = cat(3, [1 2 3; 4 5 6; 7 8 9], [10 11 12; 13 14 15; 16 17 18]); % 原滤波器w w = cat(3, [1 0; 0 1], [0 1; 1 0]);
先手动计算out(1,1):
代入数值到上面的式子,得到:
out(1,1) = 0*1 + 1*10 + 1*2 + 0*11 + 1*4 + 0*13 + 0*5 + 1*14 = 30
再用MATLAB代码验证:
% 对滤波器做3D全维度翻转(180度旋转) w_flipped = flip(flip(flip(w, 1), 2), 3); % 执行valid模式卷积 out = convn(i, w_flipped, 'valid'); % 输出第一个元素 disp(out(1,1)); % 结果为30,和手动计算一致
内容的提问来源于stack exchange,提问作者abdelaziz botalb
相关产品推荐
相关产品推荐

