2017-06-21 3 views
4

私はテキスト分類の問題を解決しています。私は、私自身のmodel_fnと一緒にEstimatorクラスを使って分類器を定義しました。 Googleの事前トレーニング済みのword2vecの埋め込みを初期値として使用して、それを手近な作業のためにさらに最適化したいと思います。訓練を終えたword2vecを読み込んで、見積もりにembedding_lookupを初期化するmodel_fn

私はこの投稿を見ました:Using a pre-trained word embedding (word2vec or Glove) in TensorFlow
これは「生の」TensorFlowコードでどうやって進むのか説明しています。しかし、実際にはEstimatorクラスを使用したいと思います。

拡張子として、このコードをCloud ML Engineで訓練したいと思いますが、かなり大きなファイルを初期値で渡す良い方法はありますか?

のは、我々のようなものがあるとしましょう:

def build_model_fn(): 
    def _model_fn(features, labels, mode, params): 
     input_layer = features['feat'] #shape=[-1, params["sequence_length"]] 
     #... what goes here to initialize W 

     embedded = tf.nn.embedding_lookup(W, input_layer) 
     ... 
     return predictions 

estimator = tf.contrib.learn.Estimator(
    model_fn=build_model_fn(), 
    model_dir=MODEL_DIR, 
    params=params) 
estimator.fit(input_fn=read_data, max_steps=2500) 

答えて

7

、組み込み環境では唯一の現実的なアプローチは、あなたのグラフにtf.Variableを初期化するためにそれらを使用していることを十分に一般的に大きいです。これにより、分散などのパラメータサーバを利用することができます。

新しい「コア」見積もり、tf.estimator.Estimatorを使用することをお勧めします。これにより作業がはるかに簡単になります。あなたが提供リンクで答えから

、そして私たちは、変数が一定ではないしたいことを知って、我々はアプローチを取ることができ、次のいずれか

(2)飼料の辞書を使用して変数を初期化し、または (3)

あなたmodel_fnでは、単純に返さTensorを使用して変数を初期化します。それははるかに簡単に、そして良いでしょう最初ため、(3)私はオプションを取り上げるチェックポイント


から変数をロードしますtf.contrib.framework.load_variableによって呼び出されます。これが必要です。

  1. あなたの埋め込み
  2. あなたがチェックポイント内の埋め込み変数の完全修飾名前を知っていると、有効なTFのチェックポイントを持っていること。

コードは非常に単純です:

def model_fn(mode, features, labels, hparams): 
    embeddings = tf.Variable(tf.contrib.framework.load_variable(
     'gs://my-bucket/word2vec_checkpoints/', 
     'a/fully/qualified/scope/embeddings' 
)) 
    .... 
    return tf.estimator.EstimatorSpec(...) 

あなたの埋め込みが他のTFモデルによって生成されなかった場合は、このアプローチは、オプション(2)したがって、あなたのために動作しません。 (2)について


、我々は、本質的に(推定が意図的理由のロットの隠蔽)tf.Sessionを開始するためのすべてのオプションを保持する構成オブジェクトであるtf.train.Scaffoldを使用する必要があります。

model_fnに返信するtf.train.EstimatorSpecScaffoldを指定することができます。

私たちは、その後、Scaffold経由init_feed_dictを渡し、私たちのmodel_fnにプレースホルダを作成し、それ私たちの埋込み変数の初期化子 操作します。例えばここで何が起こっている

def model_fn(mode, features, labels, hparams): 
    embed_ph = tf.placeholder(
     shape=[hparams.vocab_size, hparams.embedding_size], 
     dtype=tf.float32) 
    embeddings = tf.Variable(embed_ph) 
    # Define your model 
    return tf.estimator.EstimatorSpec(
     ..., # normal EstimatorSpec args 
     scaffold=tf.train.Scaffold(init_feed_dict={embed_ph: my_embedding_numpy_array}) 
) 

init_feed_dictが、その後実行するために、embeddings.initialization_op(プレースホルダの割り当て)できるようになる、実行時にembed_phプレースホルダの値を移入しますです。


+0

おかげで、ちょうど小さなもの:) ' – Tristan

+0

おかげトリスタン等間隔。:それは' tf.estimator.EstimatorSpec(...、足場= tf.train.Scaffold(ini​​t_feed_dict = {my_embedding_numpy_array embed_ph}でなければなりません私は説明を笑ったにもかかわらず構文。 –

関連する問題