首页 > 解决方案 > 寻找一种干净的方法来将额外的零通道添加到具有未知批量大小的 NxNxC 张量?

问题描述

所以目前我有这个代码,它将一个张量填充BxNxNxC到一个BxNxNx(C+P)张量,其中 B 是批量大小,C 是通道数,P 是我要添加的填充通道数:

A = <some BxNxNxC tensor>

P = <some calculation>
padding_tensor = keras.layers.UpSampling3D(size=[1, 1, P])(tf.zeros_like(A)[:, :, :, 0:1])

# This is the BxNxNx(C+P) tensor
concat = keras.layers.Concatenate(axis=3)([A, padding_tensor])

我这样做的原因是因为我无法直接创建padding_tensor正确大小的 a,因为似乎不可能获得批量大小来指定形状。

我想要干净的方式来做到这一点,因为我正在查看我的模型的计算图,这增加了很多膨胀。如果可以将所有这些操作隐藏到单个计算节点中,我会很高兴,但宁愿不必使用 3 个操作来完成像填充这样简单的操作。

我也怀疑这会有点慢,但我对 tensorflow 的了解还不够,无法真正了解。

标签: pythontensorflowkeras

解决方案


这是我的建议...我用零初始化一个假的 conv2d 层并使其不可训练,这将产生 0 输出

batch, H, W, F, C, P = 32, 28, 28, 3, 5, 6

X = np.random.uniform(0,1, (batch,H,W,F))

inp = Input((H,W,F))

x_c = Conv2D(C,3, padding='same')(inp) # BxNxNxC
x_p = Conv2D(P,3, padding='same', kernel_initializer='zeros', name='zeros')(inp) # BxNxNxP
concat = Concatenate()([x_c,x_p]) # BxNxNx(C+P)

model = Model(inp, concat)
model.get_layer('zeros').trainable = False # important
model.summary()

# check if zeros
model.predict(X)[:,:,:,-P:].sum() # 0

推荐阅读