我正在编写一个函数,使用Google的universal sentence encoder比较两个字符串的相似性。按照here提供的笔记本中的说明,我在班上有以下方法,该方法将两个句子作为输入并打印它们之间的相似性。
void f(atype a={/*.../*})
作为参考,self.embed属性如下所示:
protocol Tester {
func printTest()
}
extension Tester {
func printTest() {
print("XXXXTestXXXX")
}
}
class TestController: UIViewController, Tester {
let testing = Tester()// error here
override func viewDidLoad() {
super.viewDidLoad()
testing.printTest()
}
}
当我调用函数时:
def tf_sim(self, text1, text2):
# Reduce logging output.
tf.logging.set_verbosity(tf.logging.ERROR)
sim_input1 = tf.placeholder(tf.string, shape=(None), name="sim_input1")
sim_input2 = tf.placeholder(tf.string, shape=(None), name="sim_input2")
embedding1 = self.embed([sim_input1])
embedding2 = self.embed([sim_input2])
encode1 = tf.nn.l2_normalize(embedding1, axis=1)
encode2 = tf.nn.l2_normalize(embedding2, axis=1)
sim_scores = -tf.acos(tf.reduce_sum(tf.multiply(encode1, encode2), axis=1))
init_vars = tf.global_variables_initializer()
init_tables = tf.tables_initializer()
with tf.Session() as sess:
sess.run([init_vars, init_tables])
sess.run(sim_scores, feed_dict={sim_input1: text1, sim_input2: text2})
print (sim_scores.eval())
我得到以下堆栈跟踪:
self.embed = hub.Module("https://tfhub.dev/google/universal-sentence-encoder/2")
基本上告诉我,即使看起来像我正在做的那样,我也需要向占位符提供一个字符串。有什么我想念的吗?任何帮助将不胜感激!
答案 0 :(得分:2)
sim_scores.eval()
等效于:
sess.run(sim_scores, feed_dict={})
因此tensorflow(理所当然)抱怨您没有喂sim_input1
(或sim_input2
)
相反,应存储sess.run()
调用的结果并打印出来,或者将feed_dict参数赋予eval()
调用。
答案 1 :(得分:1)
正如f4
所说,您已经评估了sim_scores
的值。您只需要存储和打印它即可:
with tf.Session() as sess:
sess.run([init_vars, init_tables])
evaluated_sim_scores = sess.run(sim_scores, feed_dict={sim_input1: text1, sim_input2: text2})
print (evaluated_sim_scores)
注意:请勿使用相同的名称来存储sim_scores
。