2017-02-22 10 views
2

あらかじめ訓練されたモデルを使用して、少し違いを持っ​​て別のモデルを暖かく起動したい。単純に、私は新しいモデルを作成し、同じ名前の変数にあらかじめ訓練されたモデル加重を割り当てます。しかし、モデルを保存するときにエラーが発生しました。Tensorflow: "GraphDefは2GBを超えることはできません。"変数を割り当てた後にモデルを保存するときにエラーが発生する

Traceback (most recent call last): File "tf_test.py", line 23, in <module> save_path = saver.save(sess, "./model.ckpt") File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/training/saver.py", line 1308, in save self.export_meta_graph(meta_graph_filename) File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/training/saver.py", line 1331, in export_meta_graph graph_def=ops.get_default_graph().as_graph_def(add_shapes=True), File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/framework/ops.py", line 2268, in as_graph_def result, _ = self._as_graph_def(from_version, add_shapes) File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/framework/ops.py", line 2231, in _as_graph_def raise ValueError("GraphDef cannot be larger than 2GB.") ValueError: GraphDef cannot be larger than 2GB.

例のコードは次の通りである:

import tensorflow as tf 
import numpy as np 

v1 = tf.get_variable("L_enc", [400000, 1024]) 
v2 = tf.get_variable("L_dec", [400000, 1024]) 

init_op = tf.initialize_all_variables() 

saver = tf.train.Saver(tf.all_variables()) 

with tf.Session() as sess: 
    sess.run(init_op) 
    for v in tf.trainable_variables(): 
    embedding = np.random.uniform(-1, 1, (400000, 1024)) 
    sess.run(v.assign(embedding)) 
    # Save the variables to disk. 
    save_path = saver.save(sess, "./model.ckpt") 
    print("Model saved in file: %s" % save_path) 

答えて

4

ファブリツィオcorrectly points outがプロトコルバッファのサイズのハード2GBの制限がありますが、あなたのプログラムがその制限に当たるなぜあなたはを不思議に思われるかもしれません。問題は、これらの行から茎:

for v in tf.trainable_variables(): 
    embedding = np.random.uniform(-1, 1, (400000, 1024)) 
    sess.run(v.assign(embedding)) 

実行がv.assign(embedding)を打つ、新しいノードがTensorFlowグラフに追加されます。特に、各embedding配列はtf.constant()テンソルに変換されますが、これはかなり大きくなります(私の見積もりで約328MB)。

これを避ける最も良い方法は、tf.train.Saverを使用して、以前のモデルの変数を新しいモデルに直接ロードすることです。モデルの構造が異なる可能性があるため、古いモデルの変数名から新しいモデルのtf.Variableオブジェクトへのマッピングを指定する必要があります。


あなたの問題を解決するための別の方法は、各変数に値を割り当てるための事前に作成tf.placeholder() OPになります。

v1 = tf.get_variable("L_enc", [400000, 1024]) 
v2 = tf.get_variable("L_dec", [400000, 1024]) 

# Define a separate placeholder and assign op for each variable, so 
# that we can feed the initial value without adding it to the graph. 
vars = [v1, v2] 
placeholders = [tf.placeholder(tf.float32, shape=[400000, 1024]) for v in vars] 
assign_ops = [v.assign(p) for (v, p) in zip(vars, placeholders)] 

init_op = tf.global_variables_initializer() 

saver = tf.train.Saver(tf.all_variables()) 

with tf.Session() as sess: 
    sess.run(init_op) 
    for p, assign_op in zip(placeholders, assign_ops): 
    embedding = np.random.uniform(-1, 1, (400000, 1024)) 
    sess.run(assign_op, {p: embedding}) 

    # Save the variables to disk. 
    save_path = saver.save(sess, "./model.ckpt") 
    print("Model saved in file: %s" % save_path) 
+0

プレースホルダのトリックは私のケースでは機能しましたが、不幸なパフォーマンスが崖から落ちました - その制限を解除する計画はありますか? –

関連する問題