Я определяю свой ввод и свои ядра таким образом
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. Кто-нибудь знает, что я делаю не так?






Вам просто нужно использовать 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.]]]