python - 寻找一种干净的方法来将额外的零通道添加到具有未知批量大小的 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 的了解还不够,无法真正了解。
解决方案
这是我的建议...我用零初始化一个假的 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
推荐阅读
- java - Java toString()如何返回String消息代替null
- javascript - Json 向左或向右合并打字稿
- html - 两条线之间的垂直对齐
- java - RxJava - 如何使用两个可观察对象重复 takeUntil 操作,一个可观察对象取决于另一个
- sql - 使用模式时,Postgresql ILIKE/LIKE ANY 不返回任何结果
- java - Java:将每个字母转换为数字,例如 a = 1、b = 2、c = 3
- java - 使用 Thread 和 Runnable 时,Lamba 在 Java 中如何工作?
- javascript - 从数组 MongoDB 中删除对象
- multidimensional-array - 复制到另一个可分配数组后,Fortran 90 不保留数组下限/上限
- reactjs - 如何绑定选择?