Tensorflow - 2D свертка с множественными каналами - PullRequest
0 голосов
/ 27 апреля 2018

Я определяю свой ввод и мои ядра таким образом

import numpy as np
k = np.array([[
    [1, 0, 1],
    [2, 1, 0],
    [0, 0, 1]
],[
    [1, 0, 1],
    [2, 1, 0],
    [0, 0, 1]
]
], dtype=np.float32)
i = np.array([
    [4, 3, 1, 0],
    [2, 1, 0, 1],
    [1, 2, 4, 1],
    [3, 1, 0, 2]
], dtype=np.float32)

И сворачиваем их, используя

import tensorflow as tf
kernel = tf.reshape(k, [3, 3, 1, 2], name='kernel')
image  = tf.reshape(i, [1, 4, 4, 1], name='image')
res = tf.squeeze(tf.nn.conv2d(image, kernel, [1, 1, 1, 1], "VALID"))
with tf.Session() as sess:
   print sess.run(res)

Дает результат

[[[11. 12.]
  [ 8.  6.]]

 [[11. 11.]
  [ 8.  8.]]]

Что я хочу сделать, так это выполнить одну свертку с одним «подфильтром»

[
[1, 0, 1],
[2, 1, 0],
[0, 0, 1]
]

на входе в то время. Делая это сам с ручкой и бумагой, я получаю

[[[14.  6.]
  [ 6. 12.]]

 [[14.  6.]
  [ 6. 12.]]]

Все другие перестановки "параметров формы" приводят к ошибкам, и я не могу найти то, что я делаю неправильно в документации TF. Кто-нибудь знает, что я делаю не так?

1 Ответ

0 голосов
/ 27 апреля 2018

Вам просто нужно использовать tf.transpose до и после вычисления:

import numpy as np
import tensorflow as tf

k = np.array([[
    [1, 0, 1],
    [2, 1, 0],
    [0, 0, 1]
],[
    [1, 0, 1],
    [2, 1, 0],
    [0, 0, 1]
]
], dtype=np.float32)
i = np.array([
    [4, 3, 1, 0],
    [2, 1, 0, 1],
    [1, 2, 4, 1],
    [3, 1, 0, 2]
], dtype=np.float32)

with tf.Graph().as_default(), tf.Session() as sess:
    kernel = tf.expand_dims(tf.transpose(k, (1, 2, 0)), 2, name='kernel')
    image  = tf.reshape(i, [1, 4, 4, 1], name='image')
    res = tf.squeeze(tf.nn.conv2d(image, kernel, [1, 1, 1, 1], "VALID"))
    res = tf.transpose(res, (2, 0, 1))
    print sess.run(res)

Выход:

[[[ 14.   6.]
  [  6.  12.]]

 [[ 14.   6.]
  [  6.  12.]]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...