在此处回答:Tensorflow - matmul of input matrix with batch data
我在基于std::wstring
的结果和基于tf.scan
的结果之间进行了比较。据我所知,结果应该是相同的,但我总是得到不同的结果。我还与Keras'tf.matmul
进行了比较,其功能与参考相同。
我会理解为什么会这样,或者我的错误是什么。
附件是完整的MWE,有两个结果,在两台独立的计算机(具有不同的GPU)上进行评估。
K.dot
计算机1中的输出:
import tensorflow as tf
import keras.backend as K
from keras.layers import Lambda, Input
import numpy as np
na = 100
nb = 10000
mb = 10
v = Input( (1,na) )
e = tf.placeholder(dtype=tf.float32, shape=(na,nb))
def dot_a(v):
res = K.dot(v,e)
return res
initer = np.zeros((1,nb),dtype=np.float32)
def dot_b(v):
res = tf.scan(lambda a,x: tf.matmul(x, e), v, initializer=tf.constant(initer))
return res
def dot_c(v):
v = tf.reshape(v, [-1, na])
h = tf.matmul(v, e)
res = tf.reshape(h, [-1, 1, nb])
return res
mul1 = Lambda(dot_a)(v)
mul2 = Lambda(dot_b)(v)
mul3 = Lambda(dot_c)(v)
# inputs
v0 = np.random.random((mb,1,na)).astype(np.float32)
e0 = np.random.random((na,nb)).astype(np.float32)
v0 = np.round(v0,decimals=2)
e0 = np.round(e0,decimals=2)
sess = tf.Session()
out1,out2,out3 = sess.run([mul1,mul2,mul3], feed_dict={v:v0,e:e0})
print 'norm(out, out-matmul)',np.linalg.norm(out1-out2)
print 'norm(out, out-scan)',np.linalg.norm(out1-out3)
计算机2中的输出:
norm(out, out-matmul) 0.000715436
norm(out, out-scan) 0.0