语言模型上的tensorflow tutorial允许计算句子的概率:
probabilities = tf.nn.softmax(logits)
在下面的评论中,它还指定了一种预测下一个词而不是概率的方法,但没有说明如何做到这一点。那么如何使用这个例子输出一个单词而不是概率呢?
lstm = rnn_cell.BasicLSTMCell(lstm_size)
# Initial state of the LSTM memory.
state = tf.zeros([batch_size, lstm.state_size])
loss = 0.0
for current_batch_of_words in words_in_dataset:
# The value of state is updated after processing each batch of words.
output, state = lstm(current_batch_of_words, state)
# The LSTM output can be used to make next word predictions
logits = tf.matmul(output, softmax_w) + softmax_b
probabilities = tf.nn.softmax(logits)
loss += loss_function(probabilities, target_words)
答案 0 :(得分:1)
您需要找到概率的argmax,并通过反转word_to_id地图将索引转换回单词。要使其工作,您必须将概率保存在模型中,然后从run_epoch函数中获取它们(您也可以只保存argmax本身)。这是一个片段:
inverseDictionary = dict(zip(word_to_id.values(), word_to_id.keys()))
def run_epoch(...):
decodedWordId = int(np.argmax(logits))
print (" ".join([inverseDictionary[int(x1)] for x1 in np.nditer(x)])
+ " got" + inverseDictionary[decodedWordId] +
+ " expected:" + inverseDictionary[int(y)])
请参阅此处的完整实施:https://github.com/nelken/tf
答案 1 :(得分:0)
您的输出是TensorFlow列表,可以使用TensorFlow函数获取其最大参数(预测的最可能类)。这通常是包含下一个单词概率的列表。
At"评估模型"在此示例page中,您的输出列表在以下示例中为y
:
首先,我们要弄清楚我们预测正确标签的位置。
tf.argmax
是一个非常有用的函数,它给你的索引 沿某个轴的张量中的最高条目。例如,tf.argmax(y,1)
是我们的模型认为最有可能为每个输入的标签,而tf.argmax(y_,1)
是真正的标签。我们可以使用tf.equal
来检查我们是否可以 预测符合事实。correct_prediction = tf.equal(tf.argmax(y,1), tf.argmax(y_,1))
另一种不同的方法是预先矢量化(嵌入/编码)字。你可以使用Word2vec对你的单词进行矢量化(因此嵌入它们)以加速学习,你可能想看看这个。每个单词都可以表示为300维意义空间中的一个点,你可以自动找到" N个单词"最接近网络输出的空间预测点。在这种情况下,argmax
进行的方法不再起作用,你可以将余弦相似性与你真正想要比较的词进行比较,但是为此我不确定这实际上是如何导致数值不稳定的。在这种情况下,y
不会将单词表示为要素,而是根据不同的模型将字嵌入在尺寸上,例如100到2000。你可以谷歌这样的东西更多的信息:"男人女王女王的话加词word2vec"更多地了解嵌入的主题。
注意:当我在这里谈论word2vec时,它是关于使用外部预训练的word2vec模型来帮助你的训练只有预嵌入输入和创建嵌入输出。那些输出'可以通过word2vec重新找出相应的单词,以找到相应的类似的顶部预测单词。
请注意,我建议的方法并不准确,因为只知道我们是否确切地预测了我们想要预测的单词。对于更软的方法,可以使用ROUGE或BLEU指标来评估模型,以防您使用句子或长于单词的内容。
答案 2 :(得分:-1)
函数返回概率而不是单词本身实际上是一个优点。由于它使用了具有相关概率的单词列表,因此您可以进行进一步处理,并提高结果的准确性。
回答你的问题: 您可以获取单词列表,迭代它,并使程序以最高概率显示单词。