TensorFlow에서 사전 학습 된 단어 임베딩 (word2vec 또는 Glove) 사용
최근에 convolutional text classification에 대한 흥미로운 구현을 검토했습니다 . 그러나 내가 검토 한 모든 TensorFlow 코드는 다음과 같은 임의의 (사전 학습되지 않은) 임베딩 벡터를 사용합니다.
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)
아무도 Word2vec 또는 GloVe 사전 훈련 된 단어 임베딩의 결과를 무작위 대신 사용하는 방법을 알고 있습니까?
TensorFlow에서 사전 학습 된 임베딩을 사용할 수있는 몇 가지 방법이 있습니다. 하자 당신이라는 NumPy와 배열의 삽입이 말 embedding
과 함께, vocab_size
행과 embedding_dim
열 그리고 당신은 텐서 만들려 W
에 대한 호출에 사용할 수 있습니다 tf.nn.embedding_lookup()
.
그 가치 를 취하는 로 만들기 만하면
W
됩니다 .tf.constant()
embedding
W = tf.constant(embedding, name="W")
이것은 가장 쉬운 방법이지만 a 값이
tf.constant()
메모리에 여러 번 저장 되기 때문에 메모리 효율성이 떨어 집니다. 때문에embedding
매우 클 수, 당신은 단지 장난감 예제는이 방법을 사용합니다.로 생성
W
하고 다음 을tf.Variable
통해 NumPy 배열에서 초기화합니다tf.placeholder()
.W = tf.Variable(tf.constant(0.0, shape=[vocab_size, embedding_dim]), trainable=False, name="W") embedding_placeholder = tf.placeholder(tf.float32, [vocab_size, embedding_dim]) embedding_init = W.assign(embedding_placeholder) # ... sess = tf.Session() sess.run(embedding_init, feed_dict={embedding_placeholder: embedding})
이렇게
embedding
하면 그래프에의 복사본이 저장되는 것을 피할 수 있지만 한 번에 메모리에 행렬의 두 복사본을 보관할 수있는 충분한 메모리가 필요합니다 (하나는 NumPy 배열 용이고 다른 하나는tf.Variable
). 내가 그렇게, 당신이 훈련 도중 매입 매트릭스를 일정하게 유지하려는 것으로 가정 한 것을 참고W
로 작성됩니다trainable=False
.임베딩이 다른 TensorFlow 모델의 일부로 학습 된 경우를 사용
tf.train.Saver
하여 다른 모델의 체크 포인트 파일에서 값을로드 할 수 있습니다 . 이는 임베딩 행렬이 Python을 모두 우회 할 수 있음을 의미합니다.W
옵션 2에서와 같이 생성 한 후 다음을 수행합니다.W = tf.Variable(...) embedding_saver = tf.train.Saver({"name_of_variable_in_other_model": W}) # ... sess = tf.Session() embedding_saver.restore(sess, "checkpoint_filename.ckpt")
이 방법을 사용하여 임베딩을로드하고 공유합니다.
W = tf.get_variable(name="W", shape=embedding.shape, initializer=tf.constant_initializer(embedding), trainable=False)
@mrry의 대답은 네트워크가 실행될 때마다 임베딩 가중치 덮어 쓰기를 유발하기 때문에 옳지 않습니다. 따라서 네트워크를 훈련하기 위해 미니 배치 접근 방식을 따르는 경우 임베딩 가중치를 덮어 쓰게됩니다. 따라서 내 관점에서 사전 훈련 된 임베딩에 대한 올바른 방법은 다음과 같습니다.
embeddings = tf.get_variable("embeddings", shape=[dim1, dim2], initializer=tf.constant_initializer(np.array(embeddings_matrix))
임베딩 문제에 직면했기 때문에 데이터 세트로 자세한 튜토리얼을 작성했습니다. 여기에 내가 시도한 것을 추가하고 싶습니다.이 방법을 시도해 볼 수도 있습니다.
import tensorflow as tf
tf.reset_default_graph()
input_x=tf.placeholder(tf.int32,shape=[None,None])
#you have to edit shape according to your embedding size
Word_embedding = tf.get_variable(name="W", shape=[400000,100], initializer=tf.constant_initializer(np.array(word_embedding)), trainable=False)
embedding_loopup= tf.nn.embedding_lookup(Word_embedding,input_x)
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
for ii in final_:
print(sess.run(embedding_loopup,feed_dict={input_x:[ii]}))
Here is working detailed Tutorial Ipython example if you want to understand from scratch , take a look .
'IT박스' 카테고리의 다른 글
jquery없이 트위터 부트 스트랩을 사용할 수 있습니까? (0) | 2020.09.14 |
---|---|
부트 스트랩 3-navbar 축소 비활성화 (0) | 2020.09.14 |
MSIL 방법에서 hidebysig의 목적은 무엇입니까? (0) | 2020.09.14 |
Java에서 JSON 개체 구문 분석 (0) | 2020.09.14 |
TypeError : p.easing [this.easing]은 함수가 아닙니다. (0) | 2020.09.14 |