Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何计算张量流中RNN的复杂度_Python_Tensorflow_Lstm_Recurrent Neural Network - Fatal编程技术网

Python 如何计算张量流中RNN的复杂度

Python 如何计算张量流中RNN的复杂度,python,tensorflow,lstm,recurrent-neural-network,Python,Tensorflow,Lstm,Recurrent Neural Network,我正在运行RNN这个词,它是张量流的实现 如何计算RNN的复杂度 以下是训练中的代码,显示了每个历元的训练损失和其他情况: for e in range(model.epoch_pointer.eval(), args.num_epochs): sess.run(tf.assign(model.lr, args.learning_rate * (args.decay_rate ** e))) data_loader.reset_batch_pointer()

我正在运行RNN这个词,它是张量流的实现

如何计算RNN的复杂度

以下是训练中的代码,显示了每个历元的训练损失和其他情况:

for e in range(model.epoch_pointer.eval(), args.num_epochs):
        sess.run(tf.assign(model.lr, args.learning_rate * (args.decay_rate ** e)))
        data_loader.reset_batch_pointer()
        state = sess.run(model.initial_state)
        speed = 0
        if args.init_from is None:
            assign_op = model.batch_pointer.assign(0)
            sess.run(assign_op)
            assign_op = model.epoch_pointer.assign(e)
            sess.run(assign_op)
        if args.init_from is not None:
            data_loader.pointer = model.batch_pointer.eval()
            args.init_from = None
        for b in range(data_loader.pointer, data_loader.num_batches):
            start = time.time()
            x, y = data_loader.next_batch()
            feed = {model.input_data: x, model.targets: y, model.initial_state: state,
                    model.batch_time: speed}
            summary, train_loss, state, _, _ = sess.run([merged, model.cost, model.final_state,
                                                         model.train_op, model.inc_batch_pointer_op], feed)
            train_writer.add_summary(summary, e * data_loader.num_batches + b)
            speed = time.time() - start
            if (e * data_loader.num_batches + b) % args.batch_size == 0:
                print("{}/{} (epoch {}), train_loss = {:.3f}, time/batch = {:.3f}" \
                    .format(e * data_loader.num_batches + b,
                            args.num_epochs * data_loader.num_batches,
                            e, train_loss, speed))
            if (e * data_loader.num_batches + b) % args.save_every == 0 \
                    or (e==args.num_epochs-1 and b == data_loader.num_batches-1): # save for the last result
                checkpoint_path = os.path.join(args.save_dir, 'model.ckpt')
                saver.save(sess, checkpoint_path, global_step = e * data_loader.num_batches + b)
                print("model saved to {}".format(checkpoint_path))
    train_writer.close()

您正在引用的项目使用
sequence\u to\u sequence\u loss\u by\u example
,它返回交叉熵损失。因此,为了计算训练困惑度,您只需要将损失指数化,如所解释的

我们必须用e而不是2作为基数,因为TensorFlow用自然对数()来测量交叉熵损失。谢谢你,@Matthias Arro和@Colin Skow给我的提示

详细说明 当我们开发基于Q的编码方案时,两个概率分布p和Q的交叉熵告诉我们编码p事件所需的最小平均比特数。因此,p是真实分布,我们通常不知道。我们希望找到一个尽可能接近P的Q,这样我们就可以开发一个很好的编码方案,每个事件的比特数尽可能少

我不应该说位,因为如果我们在计算交叉熵时使用基数2,我们只能使用位作为度量。但是TensorFlow使用的是自然对数,因此让我们在nats中测量交叉熵

假设我们有一个糟糕的语言模型,它说词汇表中的每个标记(字符/单词)都有可能成为下一个标记。对于1000个令牌的词汇表,该模型的交叉熵为log(1000)=6.9 NAT。在预测下一个令牌时,它必须在每一步的1000个令牌之间进行统一选择

更好的语言模型将确定更接近p的概率分布Q。因此,交叉熵较低-我们可能会得到3.9个NAT的交叉熵。如果我们现在想测量困惑,我们只需将交叉熵指数化:

经验值(3.9)=49.4


因此,在我们计算损失的样本上,好的模型非常复杂,好像它必须在大约50个代币中统一和独立地进行选择。

这取决于损失函数是否为基数2或基数e中的数据提供对数似然。该模型使用传统的_seq2seq.sequence _loss _by _示例,该示例使用TensorFlow的二进制交叉熵。因此,即使我们处理的是离散概率分布(文本),我们也应该用e指数,即使用科林·斯科夫建议的tf.exp(火车损失)。

在我的例子中,火车损失是6.3,所以你说火车困惑度是2^6=64?@ShanKhan是的。你的模型在训练数据上很混乱,好像它必须在每个单词的64个选项中随机选择一样。我相信“指数化”是指e(e^x)的指数,而不是2的幂。根据我的研究,正确的计算方法是:train\u complexity=tf.exp(train\u loss)
train_perplexity = tf.exp(train_loss)