我认为所提出的技巧实际上是不对的。会发生什么情况tf.conv3d()
层是输入在深度(=实际批量)维度上进行卷积,然后沿着结果特征图求和。和padding='SAME'
结果输出的数量恰好与批量大小相同,所以有人被愚弄了!
编辑:我认为对不同的小批量元素使用不同的过滤器进行卷积的一种可能方法涉及“破解”深度卷积。假设批量大小MB
已知:
inp = tf.placeholder(tf.float32, [MB, H, W, channels_img])
# F has shape (MB, fh, fw, channels, out_channels)
# REM: with the notation in the question, we need: channels_img==channels
F = tf.transpose(F, [1, 2, 0, 3, 4])
F = tf.reshape(F, [fh, fw, channels*MB, out_channels)
inp_r = tf.transpose(inp, [1, 2, 0, 3]) # shape (H, W, MB, channels_img)
inp_r = tf.reshape(inp, [1, H, W, MB*channels_img])
out = tf.nn.depthwise_conv2d(
inp_r,
filter=F,
strides=[1, 1, 1, 1],
padding='VALID') # here no requirement about padding being 'VALID', use whatever you want.
# Now out shape is (1, H, W, MB*channels*out_channels)
out = tf.reshape(out, [H, W, MB, channels, out_channels) # careful about the order of depthwise conv out_channels!
out = tf.transpose(out, [2, 0, 1, 3, 4])
out = tf.reduce_sum(out, axis=3)
# out shape is now (MB, H, W, out_channels)
In case MB
未知,应该可以使用动态确定它tf.shape()
(我认为)