unk*_*_jy 5 python numpy convolution tensorflow
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')
Run Code Online (Sandbox Code Playgroud)
我试图从Tensorflow看到卷积的结果,以检查它是否按照我的意图行事.当我运行numpy卷积并将其与Tensorflow卷积进行比较时,答案是不同的.上面的代码是我运行测试的方式.我希望Xconv_tf并且Xconv_np平等.
我的最终目标是在具有1维滤波器的矩阵上运行2D卷积,该滤波器在每行上使用相同的滤波器运行1d卷积.为了使这项工作(基本上是行上的1d卷积循环),我需要找出为什么我的np.convolve并tf.conv1d给我不同的答案.
你看到的问题是因为TF并没有真正计算卷积.如果您将看一下卷积实际执行的解释(检查卷积的视觉解释),您将看到第二个函数被翻转:
除了翻转之外,TF会做所有事情.所以你需要做的就是在TF或numpy中翻转内核.翻转1d情况只是内核以相反的顺序,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')
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1696 次 |
| 最近记录: |