Тензор потока вычислений tf.nn.conv2d - PullRequest
0 голосов
/ 22 октября 2018

Я вычислил свертку между изображением 3x3 и двумя фильтрами 2x2 в Excel вручную:

enter image description here

Я хочу воспроизвести тот же результат, используя тензор потокаtf.nn.conv2d:

x_raw = np.array([
    [2,5,3],
    [3,4,2],
    [4,1,1]
])

f_raw = np.array(
[[
    [2,1],
    [3,4]
],[
    [4,1],
    [1,2]   
]])

f = tf.constant(f_raw, dtype=tf.float32)
x = tf.constant(x_raw, dtype=tf.float32)

filter = tf.reshape(f, [2, 2, 1, 2])
image  = tf.reshape(x, [1, 3, 3, 1])

tf.nn.conv2d(image, filter, [1, 1, 1, 1], "VALID").eval()

Но вывод, который у меня есть от tenorflow, отключен:

массив ([[[[35., 33.], [37., 25.]], [[35., 25.], [19., 15.]]]], Dtype = float32)

Что я делаю не так?

1 Ответ

0 голосов
/ 22 октября 2018

Чтобы получить идентичные результаты, как в примере с Excel, вам необходимо внести следующие изменения:

  1. создать два отдельных веса
  2. вычислить свертки для каждого веса отдельно

Пример кода:

x_raw = np.array([
    [2,5,3],
    [3,4,2],
    [4,1,1]
])
#created two seperate weights 
weight1 = np.array(
[[
    [2,1],
    [3,4]
]])

weight2 = np.array(
[[
    [4,1],
    [1,2]
]]
)
weight1 = tf.constant(weight1, dtype=tf.float32)
weight2 = tf.constant(weight2, dtype=tf.float32)
x = tf.constant(x_raw, dtype=tf.float32)

#change out_channels to 1 
filter1 = tf.reshape(weight1, [2, 2, 1, 1])
filter2 = tf.reshape(weight2, [2, 2, 1, 1])
image = tf.reshape(x, [1, 3, 3, 1])

with tf.Session() as sess:
  print(tf.nn.conv2d(image, filter1, [1, 1, 1, 1], "VALID").eval())
  print(tf.nn.conv2d(image, filter2, [1, 1, 1, 1], "VALID").eval())
...