簡體   English   中英

如何計算在 Tensorflow 中訓練 RNN 語言模型的准確率?

[英]How to calculate accuracy in training RNN language model in Tensorflow?

我在這里使用這個詞級 RNN 語言模型: https : //github.com/hunkim/word-rnn-tensorflow

如何計算每個 epoch 中 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.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()

由於該模型具有每個類別的目標和預測概率。 您可以減少概率張量以保持最高概率的類索引。

predictions = tf.cast(tf.argmax(model.probs, axis=2), tf.int32)

然后您可以與目標進行比較,以了解它是否成功預測:

correct_preds = tf.equal(predictions, model.targets)

最后,准確度是正確預測與輸入大小之間的比率,也就是這個布爾張量的平均值。

accuracy = tf.reduce_mean(tf.cast(correct_preds, tf.float32))

您還可以使用 Tensorflow 的tf.metrics.accuracy函數。

accuracy, accuracy_update_op  = tf.metrics.accuracy(labels = tf.argmax(y, axis = 2), predictions = tf.argmax(predictions, axis = 2), name = 'accuracy')
running_vars_accuracy = tf.get_collection(tf.GraphKeys.LOCAL_VARIABLES, scope="LSTM/Accuracy")

accuracy_update_op操作將更新每批中的兩個局部變量:

[<tf.Variable 'accuracy/total:0' shape=() dtype=float32_ref>,
 <tf.Variable 'accuracy/count:0' shape=() dtype=float32_ref>]

然后,只需調用accuracy op 將打印每個epoch 中的整體准確度:

for epoch in range(num_epochs):
    avg_cost_train = 0.
    total_train_batch = int((len(X_train)/(batch_size)) + 1)

    running_vars_initializer_accuracy.run()
    for _ in range(total_train_batch):
        _, miniBatchCost_train, miniBatchAccuracy_train = sess.run([trainer, loss, accuracy_update_op], feed_dict = {X: Xtrain, y: ytrain})
        avg_cost_train += miniBatchCost_train / total_train_batch
    accuracy_train = sess.run(accuracy)

這里需要注意的是不要在同一個session.run()函數調用中調用tf_metrictf_metric_update

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM