2016-09-20 2 views
2

나는 tensorflow 저장소에 skipgrams 구현에 따라 CBOW word2vec 모델을 구현하기 위해 노력하고 있습니다 :추적 카운트 훈련에 사용

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

내가 TensorFlow 자습서 다음과 같은 단순화 된 버전을 previously implemented, 그래서 컨텍스트 임베딩을 얻기 위해 그래프의 작은 부분뿐만 아니라 데이터 일괄 처리 기능을 수정해야한다는 것을 이해합니다.

스킵 그램 구현에서 데이터 일괄 처리 함수는 행 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 : 교육의 현재 배치,

내가 counts, words_per_epoch, words의 텐서를 복제하는 데 성공했다 레이블 exampleslabels. 그러나 self._epochself._words은 나를 벗어났습니다. 내 이해가 정확하다면, 나는 사용 된 훈련 예제의 수를 추적 할 수 있어야합니다. 그러나 이것은 sample batching function에서 제공하지 않습니다. 카운트는 나중에 멀티 스레드 방식으로 트레이닝 루프를 종료하는 데 사용되므로 루프를 사용하여 카운트를 더할 수 없습니다.

나는 tensorflow 연산의 비트가 C++로 구현된다는 것을 알고 있습니다. 그러나 C++에 익숙하지 않으므로 Python을 사용하여 이러한 부분을 복제해야합니다.

self._words의 텐서를 얻으려는 제안이 있으면 좋겠습니다. 텐서는 기본적으로 예제/레이블의 새 배치가 호출 될 때마다 증가해야합니다. 이것으로 다른 텐서를 얻으려면 self._epoch = self._words // words_per_epoch을 간단히 사용할 수 있습니다.

답변

1

tensorflow.models.embedding.word2vec_optimized.py의 소스 코드를 보면서 트릭을 알아 냈습니다. 구체적으로, 이 lines 218-225에서 호출 될 때 global_step이 증가 된 방법. 내 경우

, 나는 그래서 그것을 할 것이다 : features_batch 또는 labels_batch가 호출 될 때마다이 경우

# 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에 의해 증가 될 것이다. epochs_processed도 그에 따라 증가됩니다.

여기에 tf.control_dependencies(control_inputs)을 사용하는 것이 중요합니다. 컨텍스트 관리자를 반환합니다. control_inputs에 지정된 작업은 컨텍스트에 정의 된 작업 전에 실행해야합니다.