词嵌入、循环神经网络与序列到序列学习
1. 循环神经网络(RNN)输出处理
在处理RNN输出时,我们可以使用以下代码对输出进行形状调整:
output2 = tf.reshape(output,[batchSz*windowSz, rnnSz]) logits = matmul(output2,W)这里的W是一个线性层(Wo),它将RNN的输出转换为图4.5中的对数概率(logits)。接着,我们可以将其传递给tf.nn.sparse_softmax_cross_entropy_with_logits,该函数会返回一个损失值的列向量,通过tf.reduce_mean可以将其缩减为一个单一的值。对这个最终值取指数,就能得到困惑度(perplexity)。
改变RNN输出的形状,一方面是为了便于教学,因为这样可以复用tf.matmul;另一方面是出于计算的考虑,它能使数据符合稀疏softmax所需的形状。不过,在其他情况下,下游计算可能需要原始形状,这时我们可以使用TensorFlow中处理多维张量的函数,例如:
tf.tensordot(outputs, W, [[2], [0]])这段代码会在outputs的第二个分量(从0开始计数)和W </