跟踪培训中使用的示例计数

时间:2016-09-20 07:41:50

标签: tensorflow

我正在尝试基于tensorflow存储库上的skipgrams实现来实现CBOW word2vec模型:

https://github.com/tensorflow/tensorflow/blob/v0.10.0/tensorflow/models/embedding/word2vec.py

我在TensorFlow教程之后有previously implemented简化版本,所以我理解我必须修改数据批处理函数以及图形的一小部分来获取上下文嵌入。

在skipgram实现中,数据批处理函数用于行348-351

(words, counts, words_per_epoch, self._epoch, self._words, examples,
 labels) = word2vec.skipgram(filename=opts.train_data,
                             batch_size=opts.batch_size,
                             window_size=opts.window_size,
                             min_count=opts.min_count,
                             subsample=opts.subsample)

根据我的理解,分配的变量如下:

  • words:词汇表中的术语
  • counts:语料库中使用的相关术语计数
  • words_per_epoch:语料库中的总字数
  • self._epoch:当前使用的时期计数
  • self._words:当前使用的培训示例数
  • examples:当前一批培训示例
  • labels:当前一批培训标签

我设法复制wordscountswords_per_epochexampleslabels的张量。但是,self._epochself._words已经躲过了我。如果我的理解是正确的,我需要能够跟踪所使用的训练样例的数量。但是,sample batching function不提供此功能。计数稍后以多线程方式用于终止训练循环,因此我不能简单地使用循环来累计计数。

我知道tensorflow操作的位是用C ++实现的。但是,由于我不熟悉C ++,我将不得不使用Python复制这些部分。

如果我能得到一些建议来获得self._words的张量,那将会很棒。张量基本上只有在每次调用一批新的示例/标签时才会增加。有了它,我可以简单地使用self._epoch = self._words // words_per_epoch来获得另一个张量。

1 个答案:

答案 0 :(得分:1)

在查看tensorflow.models.embedding.word2vec_optimized.py的源代码时想出了诀窍。具体而言,在lines 218-225中调用global_steploss的递增方式。

就我而言,我必须这样做:

# codes to prepare features and labels tensors

data_processed = tf.Variable(0, trainable=False, dtype=tf.int64)
epochs_processed = data_processed // data_per_epoch

inc_op = data_processed.assign_add(batch_size)
with tf.control_dependencies([inc_op]):
    features_batch, labels_batch = tf.train.batch([features, labels],
                                                  batch_size=batch_size)

在这种情况下,只要调用data_processedbatch_size,张量features_batch将始终加labels_batchepochs_processed也会相应增加。

使用tf.control_dependencies(control_inputs)是关键。它返回一个上下文管理器。 control_inputs中指定的操作必须在上下文中定义的操作之前执行。