Tensorflow conv2d на изображении RGB - PullRequest
0 голосов
/ 30 июня 2019

Из принятого ответа в этот вопрос ,

с учетом следующих входных и ядерных матриц вывод 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.]]

, поскольку, насколько я понимаю, каждый канал ядра свернут с каждым входным каналом, а результирующие матрицы суммируютсячтобы получить окончательный вывод.

Я что-то упустил из этого процесса или реализации тензорного потока?

1 Ответ

0 голосов
/ 30 июня 2019

Reshape - сложная функция. Он даст вам желаемую форму, но может легко соединить все вместе. В таких случаях, как ваш, следует избегать использования reshape всеми средствами.

В этом конкретном случае вместо этого лучше дублировать массивы вдоль новой оси. При использовании [batch, in_height, in_width, in_channels] канал является последним измерением, и его следует использовать в функции repeat (). Следующий код должен лучше отражать логику:

i_grey = np.expand_dims(i_grey, axis=0) # add batch dim
i_grey = np.expand_dims(i_grey, axis=3) # add channel dim
i_rgb = np.repeat(i_grey, 3, axis=3 )   # duplicate along channels dim

И с фильтрами:

k = np.expand_dims(k, axis=2) # input channels dim
k = np.expand_dims(k, axis=3) # output channels dim
k_rgb = np.repeat(k, 3, axis=2) # duplicate along the input channels dim
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...