2017-01-15 1 views
1

NLP의 CNN을 이해하기 위해 this tutorial을 따르고 있습니다. 내 앞에 코드가 있음에도 불구하고 이해할 수없는 몇 가지 사항이 있습니다. 누군가 여기서 몇 가지를 정리해주기를 바랍니다.Tensorflow를 사용하여 NLP 자습서를 CNN에서 이해하려고 시도합니다.


첫 번째 오히려 사소한 것은 TextCNN 개체의 sequence_length 매개 변수입니다. github의 예제에서 이것은 단지 56입니다. 나는 이것이 훈련 데이터의 모든 문장의 최대 길이라고 생각합니다. 즉, self.input_x은 각 단어에 대한 문장 사전의 색인 만 포함하는 56 차원 벡터입니다.

이 목록은 에 의해 주어진 단어의 단어 embeddings로 구성된 행렬을 반환합니다 tf.nn.embedding_lookup(W, self.intput_x)에 들어갑니다.

matrix = np.random.random([1024, 64]) 
ids = np.array([0, 5, 17, 33]) 
print matrix[ids] 

그러나 여기에서 문제는 대부분의 시간 self.input_x[1 3 44 25 64 0 0 0 0 0 0 0 .. 0 0]처럼 보이는 것입니다 : this answer에 따르면이 작업은 NumPy와 함께 색인을 사용하는 것과 비슷합니다. tf.nn.embedding_lookup이 값 0을 무시한다고 가정하면 나는 맞습니까?

나는 가정
# Embedding layer 
with tf.device('/cpu:0'), tf.name_scope("embedding"): 
    W = tf.Variable(
     tf.random_uniform([vocab_size, embedding_size], -1.0, 1.0), 
      name="W") 
    self.embedded_chars = tf.nn.embedding_lookup(W, self.input_x) 
    self.embedded_chars_expanded = tf.expand_dims(self.embedded_chars, -1) 

는 taht를 self.embedded_chars 각 행이 나타내는 CNN에 실제 입력되는 행렬이다 :


내가하지 않는 또 다른 것은 어떻게 tf.nn.embedding_lookup 여기서 일하는입니다 단어 삽입 하나 단어. 그러나 tf.nn.embedding_lookupself.input_x에 의해 주어진 지표에 대해 어떻게 알 수 있습니까? 내가 여기에 이해가 안


마지막 것은

W 우리는 훈련 기간 동안 배우고 우리의 삽입 행렬이다. 무작위 균일 분포를 사용하여 초기화합니다. tf.nn.embedding_lookup은 실제 삽입 작업을 만듭니다. 임베딩 작업의 결과는 모양이 3 차원 텐서 인 [None, sequence_length, embedding_size]입니다.

이 우리가 단어 묻어 여기 학습 실제로 것을 의미합니까? 이 튜토리얼의 시작 부분은 다음과 같습니다.

단어 삽입을 위해 사전 훈련 된 word2vec 벡터는 사용하지 않습니다. 대신 처음부터 embedding을 배웁니다.

그러나 실제로 발생하는 코드 줄은 표시되지 않습니다. code of the embedding layer은 훈련되거나 배운 것이없는 것처럼 보이지 않으므로 어떻게됩니까? QUES 1

답변

3

대답 (그래서 tf.nn.embedding_lookup는 0 값을 무시한다고 가정하면 내가 해결 해요?) : 입력 벡터의

0으로부터의의는 어휘에서 0 번째 심볼의 인덱스 인 PAD 기호입니다. 조회가 수행 될 때 무시되지 않는다고 생각합니다.매입 행렬의 0 번째 행이 반환됩니다. QUES 2

답변 (그러나 self.input_x가 제공 한 인덱스에 대해 알고 tf.nn.embedding_lookup 수 있습니까?) :

매입 행렬의

크기 [V의 *의 E]입니다 어휘의 크기입니다 E는 임베딩 벡터의 차원이다. 행렬의 0 번째 행은 어휘의 0 번째 요소에 대한 벡터를 포함하고, 행렬의 첫 번째 행은 어휘의 첫 번째 요소에 대한 벡터를 포함합니다. 입력 벡터 x에서 단어의 색인을 단어로 가져옵니다.이 단어는 포함 행렬 색인에 사용됩니다.

ques 3에 대한 답변 (이것은 실제로 여기에 단어 삽입을 배우고 있다는 의미입니까?)

예, 우리는 실제로 삽입 행렬을 학습하고 있습니다. 삽입 레이어에서 W = tf.Variable( tf.random_uniform([vocab_size, embedding_size], -1.0, 1.0),name="W") W는 삽입 행렬이며 기본적으로 변수의 경우 텐서 흐름 trainable=TRUE입니다. W는 또한 학습 된 매개 변수가됩니다. 사전 학습 된 모델을 사용하려면 trainable = False을 설정하십시오. https://agarnitin86.github.io/blog/2016/12/23/text-classification-cnn

+0

감사합니다 : 당신이 블로그에 따라 할 수있는 코드의 자세한 설명

! 또한 링크를 위해 - 나는 그 것을 가능한 빨리 공부할 것이다 :) – displayname

관련 문제