You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

TensorFlow中类卷积Reshape实现:[3,3,256]转[4,2,2,256]

解决方案:用tf.image.extract_patches实现类卷积式Reshape

当然有完美的实现方式!你要的这种“类卷积Reshape”本质就是从3x3的特征图上提取所有2x2的滑动窗口patch,并且保留原始数值,TensorFlow的tf.image.extract_patches函数专门干这个事儿,完全符合你的需求。

核心思路

3x3的特征图用2x2窗口、步长1滑动(无填充),刚好能得到(3-2+1)×(3-2+1)=4个独立的2x2 patch,把这些patch整理成[4,2,2,256]的形状就搞定了。

具体代码实现

import tensorflow as tf

# 模拟你的输入张量:形状[3,3,256]
input_tensor = tf.random.normal(shape=(3, 3, 256))

# 第一步:给输入加一个batch维度,因为extract_patches需要4D输入[batch, H, W, C]
input_4d = tf.expand_dims(input_tensor, axis=0)  # 形状变为[1,3,3,256]

# 第二步:提取2x2滑动窗口patch
patches = tf.image.extract_patches(
    images=input_4d,
    sizes=[1, 2, 2, 1],  # 窗口大小:仅在H、W维度用2x2窗口
    strides=[1, 1, 1, 1],  # 滑动步长:H、W维度步长设为1
    rates=[1, 1, 1, 1],  # 膨胀率,无需膨胀时设为1
    padding='VALID'  # 无填充,只提取完全包含在特征图内的窗口
)
# 此时patches的形状是[1,2,2, 2*2*256] = [1,2,2,1024]
# 最后一维是把每个2x2 patch的像素按行展开后的结果

# 第三步:Reshape成目标形状[4,2,2,256]
output_tensor = tf.reshape(patches, shape=(-1, 2, 2, 256))
# 这里-1会自动计算为1*2*2=4,最终形状就是[4,2,2,256]

关键说明

  • 这个操作完全不会修改原始数值,每个2x2 patch都是从原特征图上直接截取的滑动窗口区域,和卷积操作的窗口采样逻辑完全一致。
  • 如果你的输入本身是带batch维度的(比如形状[B,3,3,256]),只需要把最后一步的reshape改成(-1,2,2,256),最终会得到形状[B×4,2,2,256]的输出,同样符合类卷积的逻辑。

内容的提问来源于stack exchange,提问作者Marcello

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 08:27:13