在将模型从张量流转换为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上都进行了测试,发现两种情况都存在差异。
有关此问题的任何线索吗?使用常量应该是非常正常的操作(例如,冻结图形时,我们会将变量转换为常量,而这不会改变结果)。