최근에 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
A와tf.constant()
embedding
그 가치 를 취하는 로 .W = tf.constant(embedding, name="W")
이것은 가장 쉬운 방법이지만 a 값이
tf.constant()
메모리에 여러 번 저장 되기 때문에 메모리 효율성이 떨어 집니다. 때문에embedding
매우 클 수, 당신은 단지 장난감 예제는이 방법을 사용합니다. -
a로 생성
W
하고 atf.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))
답변
2.0 호환 가능한 답변 : Google에서 개발하고 오픈 소스로 된 사전 훈련 된 임베딩이 많이 있습니다.
그들 중 일부는 Universal Sentence Encoder (USE), ELMO, BERT
등이며 코드에서 재사용하기가 매우 쉽습니다.
를 재사용하는 코드는 Pre-Trained Embedding
, Universal Sentence Encoder
아래와 같습니다 :
!pip install "tensorflow_hub>=0.6.0"
!pip install "tensorflow>=2.0.0"
import tensorflow as tf
import tensorflow_hub as hub
module_url = "https://tfhub.dev/google/universal-sentence-encoder/4"
embed = hub.KerasLayer(module_url)
embeddings = embed(["A long sentence.", "single-word",
"http://example.com"])
print(embeddings.shape) #(3,128)
Google에서 개발하고 오픈 소스로 제공하는 사전 학습 된 임베딩에 대한 자세한 내용은 TF Hub Link를 참조하세요 .
답변
Tensorflow 버전 2에서는 Embedding 레이어를 사용하면 매우 쉽습니다.
X=tf.keras.layers.Embedding(input_dim=vocab_size,
output_dim=300,
input_length=Length_of_input_sequences,
embeddings_initializer=matrix_of_pretrained_weights
)(ur_inp)
답변
임베딩 문제에 직면했기 때문에 데이터 세트로 자세한 튜토리얼을 작성했습니다. 여기에 내가 시도한 것을 추가하고 싶습니다.이 방법을 시도해 볼 수도 있습니다.
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]}))
처음부터 이해하고 싶다면 자세한 튜토리얼 Ipython 예제를 살펴보세요.
답변
