我尝试使用不同翻译之间的余弦相似性来学习单词嵌入。 x1
是英语句子中单词的嵌入。 x2
是正确的Inuktitut翻译中的单词嵌入。 x3
是错误的Inuktitut翻译中的单词嵌入。我试图最大化x1
和x2
之间的余弦相似度,并在x1
和x3
之间将其最小化。有很多三连串的句子,我必须这样做。我目前的培训功能如下:
def train(self):
for epoch in range(self.epochs):
total_loss = 0
for x1, x2, x3 in zip(self.x1_list, self.x2_list, self.x3_list):
norm1 = tf.norm(x1, axis=1)
norm2 = tf.norm(x2, axis=1)
norm3 = tf.norm(x3, axis=1)
cos1 = tf.matmul(x1, x2, transpose_b=True) / norm2
cos1 = tf.transpose(tf.transpose(cos1) / norm1)
cos2 = tf.matmul(x1, x3, transpose_b=True) / norm3
cos2 = tf.transpose(tf.transpose(cos2) / norm1)
loss = tf.reduce_mean(cos2) - tf.reduce_mean(cos1)
optimizer = tf.train.AdamOptimizer(learning_rate=self.eta).minimize(loss)
self.session.run(tf.global_variables_initializer())
_, loss = self.session.run([optimizer, loss])
total_loss += loss
if epoch % 5 == 0 or epoch == self.epochs-1:
print("Epoch {}: loss = {}".format(epoch, total_loss))
我不想在每次循环迭代中重新创建所有tensorflow操作,但由于x1
,x2
和x3
是变量,我可以' t使用占位符。有没有办法将这些操作应用于可变张量列表?