2017-10-12 34 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のアレイであり、約14万のユニークトークンと各ワード100個の寸法単語ベクトルを含みます。

ありがとうございました

答えて

2

私にとっては、受け入れられた答えはうまくいかないようです。エラーはありませんが、結果はひどく(直接的な初期化による小さな埋め込みと比較して)、埋め込みがtf.Variable()が初期化された定数0であったと思われます。グラフの

余分可変

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

ことなく単にプレースホルダを使用した後、すべてのsession.runに埋め込みを供給は、()が動作するように思われます。

+0

ご迷惑をおかけして申し訳ございません。試してみると、私はインタラクティブなセッションを使って個々の体重をチェックしましたが、それらはすべて0ではありませんでした。また、私は単にStackoverflowの回答をGoogleの従業員から与えられた93以上のアップボックスで引用していたので、何が間違っているのか分かりませんでした。おそらくコードやあなたのタイプミスがあります。あなたは確かにあなたが提案したことをすることができます変数を使用していないが、私はあなたがテンソルをそのように持続できるようになるとは思わない。私は変数を保存するので、将来このメモリ消費プロセスを実行する必要はありません。保存された変数を復元するだけです。 – ltt

6

あなたはtf変数にコピーする必要があります。 StackOverflowの中にこの質問への偉大な答えがあります: Using a pre-trained word embedding (word2vec or Glove) in TensorFlow

は、これは私がそれをやった方法です:

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のようなプレースホルダーを使用することができます。

関連する問題