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
相关产品推荐
相关产品推荐

