我正在尝试基于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
:当前一批培训标签我设法复制words
,counts
,words_per_epoch
,examples
和labels
的张量。但是,self._epoch
和self._words
已经躲过了我。如果我的理解是正确的,我需要能够跟踪所使用的训练样例的数量。但是,sample batching function不提供此功能。计数稍后以多线程方式用于终止训练循环,因此我不能简单地使用循环来累计计数。
我知道tensorflow操作的位是用C ++实现的。但是,由于我不熟悉C ++,我将不得不使用Python复制这些部分。
如果我能得到一些建议来获得self._words
的张量,那将会很棒。张量基本上只有在每次调用一批新的示例/标签时才会增加。有了它,我可以简单地使用self._epoch = self._words // words_per_epoch
来获得另一个张量。
答案 0 :(得分:1)
在查看tensorflow.models.embedding.word2vec_optimized.py的源代码时想出了诀窍。具体而言,在lines 218-225中调用global_step
时loss
的递增方式。
就我而言,我必须这样做:
# 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_batch
将始终加labels_batch
。 epochs_processed
也会相应增加。
使用tf.control_dependencies(control_inputs)
是关键。它返回一个上下文管理器。 control_inputs
中指定的操作必须在上下文中定义的操作之前执行。