2017-10-12 3 views
4

사전 훈련 된 단어 벡터를 사용하여 LSTM으로 분류 할 때 텐서 흐름에서 2GB보다 큰 룩업 테이블을 포함하는 방법을 처리하는 방법을 궁금해했습니다. tensorflow에서 큰 (> 2GB) 임베디드 찾아보기 테이블을 다루는 방법은 무엇입니까?

data = tf.nn.embedding_lookup(vector_array, input_data)

이 값에 오류가 발생했습니다, 나는 아래의 코드와 같이 조회 테이블을 삽입 만들려고,이 작업을 수행합니다. 코드에

ValueError: Cannot create a tensor proto whose content is larger than 2GB

vector_array 변수는 NumPy와 배열이며, 약 1400 만 고유 토큰 각 단어를 100 단어 차원 벡터를 포함한다.

귀하의 도움에 감사드립니다.

답변

2

나를 위해 허용되는 대답이 작동하지 않는 것 같습니다. 오류가없는 동안 (직접 초기화를 통한 더 작은 임베딩과 비교할 때) 결과는 끔찍했고 임베디드가 tf.Variable()이 초기화 된 상수 0이었던 것으로 의심됩니다.() 그래프의 모든 session.run에 매립 공급 추가 변수없이 다음

self.Wembed = tf.placeholder(
    tf.float32, self.embeddings.shape, 
    name='Wembed') 

및 단 자리 사용

그러나 작동하는 것으로 보인다.

+0

불편을 끼쳐 드려 죄송합니다. 내가 그것을 시도했을 때, 나는 대화 형 세션을 사용하여 개인 가중치를 확인했고, 모두 0이 아니었다. 또한, 나는 단지 Stackoverflow에 대한 답변을 Google의 직원이 제공 한 93 개 이상의 upvotes로 인용했기 때문에 무엇이 잘못되었는지 확실하지 않습니다. 코드 또는 사용자의 오타가있을 수 있습니다. 변수를 사용하지 말고 제안한 것을 확실히 할 수는 있지만, 그런 식으로 텐서를 유지할 수는 없을 것이라고 생각합니다. 미래에이 메모리 소비 프로세스를 실행할 필요가 없도록 변수를 저장합니다. 저장된 변수 만 복원합니다. – ltt

6

tf 변수에 복사해야합니다. Using a pre-trained word embedding (word2vec or Glove) in TensorFlow

이 내가 그것을 어떻게했는지됩니다 : StackOverflow의에서이 질문에 좋은 답변이 있습니다

embedding_weights = tf.Variable(tf.constant(0.0, shape=[embedding_vocab_size, EMBEDDING_DIM]),trainable=False, name="embedding_weights") 
embedding_placeholder = tf.placeholder(tf.float32, [embedding_vocab_size, EMBEDDING_DIM]) 
embedding_init = embedding_weights.assign(embedding_placeholder) 
sess = tf.Session(config=tf.ConfigProto(log_device_placement=True)) 
sess.run(embedding_init, feed_dict={embedding_placeholder: embedding_matrix}) 

그런 다음 조회를 수행하는 embedding_weights 변수를 사용할 수 있습니다 (저장 단어 인덱스 매핑 기억)

업데이트 : 변수를 사용할 필요는 없지만 이후에 다시 사용할 필요가 없도록 저장하면됩니다 (다시로드 할 때마다 랩톱에서 시간이 걸립니다). 삽입). 그게 중요하지 않다면 Niklas Schnelle과 같은 자리 표시자를 사용하면됩니다.

관련 문제