2016-09-20 80 views
2

我想基于对tensorflow库中的skipgrams实施执行CBOW word2vec型号:跟踪计数在训练中使用

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

我有previously implemented继TensorFlow教程的简化版本,所以我知道我将不得不修改数据批处理函数以及图的一小部分来获取上下文嵌入。

在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 ops的各个部分是用C++实现的。但是,由于我对C++不熟悉,我将不得不使用Python复制这些部分。

如果我能得到一些建议来获得self._words的张量,那将是非常好的。张量基本上只在每次调用一批新的示例/标签时才增加。这样,我可以简单地使用self._epoch = self._words // words_per_epoch来获得其他张量。

回答

1

在查看tensorflow.models.embedding.word2vec_optimized.py的源代码时找出了诀窍。具体而言,在lines 218-225中调用loss时如何增加global_step

在我的情况,我会做它像这样:

# 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_processed将始终由batch_size每当features_batchlabels_batch被称为递增。 epochs_processed也会相应增加。

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