Из принятого ответа в этот вопрос ,
с учетом следующих входных и ядерных матриц вывод tf.nn.conv2d равен
[[14 6]
[6 12]]
, что имеет смысл.Однако, когда я делаю матрицы ввода и ядра по 3 канала (повторяя каждую исходную матрицу) и запускаю один и тот же код:
# the previous input
i_grey = np.array([
[4, 3, 1, 0],
[2, 1, 0, 1],
[1, 2, 4, 1],
[3, 1, 0, 2]
])
# copy to 3-dimensions
i_rgb = np.repeat( np.expand_dims(i_grey, axis=0), 3, axis=0 )
# convert to tensor
i_rgb = tf.constant(i_rgb, dtype=tf.float32)
# make kernel depth match input; same process as input
k = np.array([
[1, 0, 1],
[2, 1, 0],
[0, 0, 1]
])
k_rgb = np.repeat( np.expand_dims(k, axis=0), 3, axis=0 )
# convert to tensor
k_rgb = tf.constant(k_rgb, dtype=tf.float32)
здесь то, что мой вводи матрицы ядра выглядят так:
# reshape input to format: [batch, in_height, in_width, in_channels]
image_rgb = tf.reshape(i_rgb, [1, 4, 4, 3])
# reshape kernel to format: [filter_height, filter_width, in_channels, out_channels]
kernel_rgb = tf.reshape(k_rgb, [3, 3, 3, 1])
conv_rgb = tf.squeeze( tf.nn.conv2d(image_rgb, kernel_rgb, [1,1,1,1], "VALID") )
with tf.Session() as sess:
conv_result = sess.run(conv_rgb)
print(conv_result)
Я получаю окончательный результат:
[[35. 15.]
[35. 26.]]
Но я ожидал оригиналoutput * 3:
[[42. 18.]
[18. 36.]]
, поскольку, насколько я понимаю, каждый канал ядра свернут с каждым входным каналом, а результирующие матрицы суммируютсячтобы получить окончательный вывод.
Я что-то упустил из этого процесса или реализации тензорного потока?