2017-01-25 4 views
3
import numpy as np 
import tensorflow as tf 

X_node = tf.placeholder('float',[1,10,1]) 
filter_tf = tf.Variable(tf.truncated_normal([3,1,1],stddev=0.1)) 

Xconv_tf_tensor = tf.nn.conv1d(X_node, filter_tf,1,'SAME') 

X = np.random.normal(0,1,[1,10,1]) 
with tf.Session() as sess: 
    tf.global_variables_initializer().run() 
    feed_dict = {X_node: X} 
    filter_np = filter_tf.eval() 
    Xconv_tf = sess.run(Xconv_tf_tensor,feed_dict) 
    Xconv_np = np.convolve(X[0,:,0],filter_np[:,0,0],'SAME') 

. Когда я запускаю свертку numpy и сравниваю ее с сверткой Tensorflow, ответ отличается. Вышеприведенный код - как я проверил тест. Я надеялся, что Xconv_tf и Xconv_np будут равны.Разница между сверткой тензора и сверткой numpy

Моя конечная цель - выполнение двумерной свертки на матрице с 1-мерным фильтром, который запускает 1d-свертку в каждой строке с тем же фильтром. Чтобы сделать эту работу (которая будет в основном петлей из 1d свертки над строками), мне нужно выяснить, почему мои np.convolve и tf.conv1d дают мне разные ответы.

+0

Совершенно разные цифры. Некоторые элементы даже отличаются по знакам. Разница определенно значительна –

ответ

3

Проблема, которую вы видите, потому что TF не реально вычислить свертку. Если вы посмотрите на объяснении того, что convolution actually does (проверку визуальных объяснений свертка), вы увидите, что вторая функция переворачивается:

  1. Экспресса каждой функции с точкой зрения фиктивной переменной
  2. Отразите одну из функций (это флип)
  3. ..... Некоторые другие вещи, которые я не буду копировать здесь.

TF делает все, кроме этого флип. Итак, все, что вам нужно сделать, это перевернуть ядро ​​либо в TF, либо в numpy. Flipping for 1d case - это просто ядро ​​в обратном порядке, для 2d вам нужно будет перевернуть обе оси (повернуть ядро ​​2 раза).

import tensorflow as tf 
import numpy as np 

I = [1, 0, 2, 3, 0, 1, 1] 
K = [2, 1, 3] 

i = tf.constant(I, dtype=tf.float32, name='i') 
k = tf.constant(K, dtype=tf.float32, name='k') 

data = tf.reshape(i, [1, int(i.shape[0]), 1], name='data') 
kernel = tf.reshape(k, [int(k.shape[0]), 1, 1], name='kernel') 

res = tf.squeeze(tf.nn.conv1d(data, kernel, 1, 'VALID')) 
with tf.Session() as sess: 
    print sess.run(res) 
    print np.convolve(I, K[::-1], 'VALID') 
2

Порядок изменения фильтра. Свертка TensorFlow на самом деле является корреляцией. Numpy получает обозначения от математики, TF получает обозначения из документов машинного обучения и где-то порядок был отменен.

Печатается True

filter_np2=filter_np[::-1,0,0] 
np.allclose(np.convolve(X[0,:,0],filter_np2,'SAME'), Xconv_tf.flatten()) np.convolve(X[0,:,0],filter_np2,'SAME') 

 Смежные вопросы

  • Нет связанных вопросов^_^