Tensorflow tf.nn.conv2d针对变量与常量给出不同的结果

时间:2018-10-16 20:43:22

标签: python tensorflow

在将模型从张量流转换为Pytorch时,我遇到了一个奇怪的问题,即在使用相同的过滤器进行卷积时,tf.nn.conv2d会给出不同的结果,具体取决于变量还是<使用strong>常数。

我希望这是我代码中的错误,但是我将问题简化为一个小片段,该片段在tf.nn.conv2d上给出了截然不同的结果,我无法解释:

import tensorflow as tf
import numpy as np

rng = np.random.RandomState(42)

sess = tf.InteractiveSession()
some_input = rng.normal(size=(10, 10, 10, 32)).astype(np.float32)
w_value = rng.normal(size=(5, 5, 32, 64)).astype(np.float32)

variable = tf.Variable(w_value)
sess.run(variable.initializer)

constant = tf.constant(w_value)

with_var = sess.run(tf.nn.conv2d(some_input,
                                 variable,
                                 strides=[1, 1, 1, 1],
                                 padding='SAME'))


with_const = sess.run(tf.nn.conv2d(some_input,
                                   constant,
                                   strides=[1, 1, 1, 1],
                                   padding='SAME'))

print('Norm between results: {}'.format(np.linalg.norm(with_var - with_const)))
print('Max diff: {}'.format(np.max(np.abs(with_var - with_const))))

print('Norm between variable and constant: {}'.format(
    np.linalg.norm(sess.run(variable) - sess.run(constant))))

在tensorflow 1.11上,它给我两个输出之间的标准为1.18,太高了(应该为0)。我在GPU(GTX 1080)和CPU上都进行了测试,发现两种情况都存在差异。

有关此问题的任何线索吗?使用常量应该是非常正常的操作(例如,冻结图形时,我们会将变量转换为常量,而这不会改变结果)。

0 个答案:

没有答案
相关问题