我已经修改了@vijay m的代码,并进一步详细解释。他的答案是绝对正确的。然而,我仍然不理解。
简单来说,“channel multiplier”是该参数一个令人困惑的名称。它可以称为“您希望每个通道应用的过滤器数量”。因此,请注意此代码片段的大小:
filters = tf.Variable(tf.random_normal((5,5,100,10)))
这个大小允许您将10个不同的过滤器应用于每个输入通道。我创建了前面答案代码的一个版本,可能会更有启发性:
inputs_np = np.ones((2, 13, 13, 3))
inputs = tf.constant(inputs_np)
filters_np = np.zeros((5,5,3,4))
filters_np[2, 2, 0, 0] = 2.0
filters_np[2, 2, 0, 1] = 2.1
filters_np[2, 2, 0, 2] = 2.2
filters_np[2, 2, 0, 3] = 2.3
filters_np[2, 2, 1, 0] = 3.0
filters_np[2, 2, 1, 1] = 3.1
filters_np[2, 2, 1, 2] = 3.2
filters_np[2, 2, 1, 3] = 3.3
filters_np[2, 2, 2, 0] = 4.0
filters_np[2, 2, 2, 1] = 4.1
filters_np[2, 2, 2, 2] = 4.2
filters_np[2, 2, 2, 3] = 4.3
filters = tf.constant(filters_np)
out = tf.nn.depthwise_conv2d(
inputs,
filters,
strides=[1,1,1,1],
padding='SAME')
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
out_val = out.eval()
print("output cases 0 and 1 identical? {}".format(np.all(out_val[0]==out_val[1])))
print("One of the pixels for each of the 12 output {} ".format(out_val[0, 6, 6]))