私はTensorflowを初めて使用し、単純なプログラムを使用して高密度レイヤーを保存および復元する方法を見つけようとしていました。次の簡単なプログラムを使用して、グラフを初期化して保存しました。
from __future__ import absolute_import, division, print_function
import os
import tensorflow as tf
x = tf.constant([[1], [2], [3], [4]], dtype=tf.float32,name = "x" )
y_true = tf.constant([[0], [-1], [-2], [-3]], dtype=tf.float32, name = "y_t")
linear_model = tf.layers.Dense(units=1, name = "sutej")
y_pred = linear_model(x)
loss = tf.losses.mean_squared_error(labels=y_true, predictions=y_pred)
optimizer = tf.train.GradientDescentOptimizer(0.01)
train = optimizer.minimize(loss)
init = tf.global_variables_initializer()
sess = tf.Session()
sess.run(init)
for i in range(1000):
_, loss_value = sess.run((train, loss))
print(loss_value)
all_vars = tf.get_collection(tf.GraphKeys.GLOBAL_VARIABLES)
print(all_vars)
for v in all_vars:
v_ = sess.run(v)
print(v_)
print(sess.run(y_pred))
saver = tf.train.Saver()
saver.save(sess, '/home/sutej/Tensorflow/newsave/newsave',global_step=1000)
そして、グラフを復元するための次のコード
from __future__ import absolute_import, division, print_function
import os
import tensorflow as tf
sess = tf.Session()
saver = tf.train.import_meta_graph('/home/sutej/Tensorflow/newsave/newsave-1000.meta')
saver.restore(sess,tf.train.latest_checkpoint('/home/sutej/Tensorflow/newsave/'))
graph = tf.get_default_graph()
x=graph.get_tensor_by_name('x:0')
y_true=graph.get_tensor_by_name('y_t:0')
graph = tf.get_default_graph()
all_vars = tf.get_collection(tf.GraphKeys.GLOBAL_VARIABLES)
print(all_vars)
for v in all_vars:
v_ = sess.run(v)
print(v_)
print(sess.run('sutej/kernel:0'))
print(sess.run(tf.layers.dense(inputs=x,units=1,name = 'sutej', reuse=True)))
出力では、グラフが復元され、保存されたファイルの定数、バイアス、重みが復元されていることがわかります。しかし、入力を高密度レイヤー(復元コードの最後の行)に渡そうとすると、エラーが発生します。出力ログは以下のとおりです。
[<tf.Variable 'sutej/kernel:0' shape=(1, 1) dtype=float32_ref>, <tf.Variable 'sutej/bias:0' shape=(1,) dtype=float32_ref>]
[[-0.98440635]]
[0.95415276]
[[-0.98440635]]
Traceback (most recent call last):
File "load_saver.py", line 26, in <module>
print(sess.run(tf.layers.dense(inputs=x,units=1,name = 'sutej', reuse=True)))
File "/home/sutej/.local/lib/python3.5/site-packages/tensorflow/python/layers/core.py", line 253, in dense
return layer.apply(inputs)
File "/home/sutej/.local/lib/python3.5/site-packages/tensorflow/python/layers/base.py", line 828, in apply
return self.__call__(inputs, *args, **kwargs)
File "/home/sutej/.local/lib/python3.5/site-packages/tensorflow/python/layers/base.py", line 699, in __call__
self.build(input_shapes)
File "/home/sutej/.local/lib/python3.5/site-packages/tensorflow/python/layers/core.py", line 138, in build
trainable=True)
File "/home/sutej/.local/lib/python3.5/site-packages/tensorflow/python/layers/base.py", line 546, in add_variable
partitioner=partitioner)
File "/home/sutej/.local/lib/python3.5/site-packages/tensorflow/python/training/checkpointable.py", line 436, in _add_variable_with_custom_getter
**kwargs_for_getter)
File "/home/sutej/.local/lib/python3.5/site-packages/tensorflow/python/ops/variable_scope.py", line 1317, in get_variable
constraint=constraint)
File "/home/sutej/.local/lib/python3.5/site-packages/tensorflow/python/ops/variable_scope.py", line 1079, in get_variable
constraint=constraint)
File "/home/sutej/.local/lib/python3.5/site-packages/tensorflow/python/ops/variable_scope.py", line 425, in get_variable
constraint=constraint)
File "/home/sutej/.local/lib/python3.5/site-packages/tensorflow/python/ops/variable_scope.py", line 394, in _true_getter
use_resource=use_resource, constraint=constraint)
File "/home/sutej/.local/lib/python3.5/site-packages/tensorflow/python/ops/variable_scope.py", line 751, in _get_single_variable
"reuse=tf.AUTO_REUSE in VarScope?" % name)
ValueError: Variable sutej/kernel does not exist, or was not created with tf.get_variable(). Did you mean to set reuse=tf.AUTO_REUSE in VarScope?
私が間違っているのは何ですか?そして、どうすればそれを回避できますか?カーネルを手動で乗算してバイアスを追加したくはありませんprint(sess.run(y_pred))
が、コードの最初の部分のように、よりエレガントなものを探しています。
お手伝いありがとう。
あなたが望むこと---print(sess.run(y_pred))
はまさにあなたが復元後にすべきことです。グラフをインポートし、変数を復元しました。TensorFlowの世界は、トレーニングスクリプトでの状態とほぼ同じです。トレーニングスクリプトで実行するのと同じ方法でグラフを実行できます。
あなたの理解を少し進めるために。を呼び出すとtf.layers.dense
、変数と操作が作成されます(グラフではノードとして表されます)。このため、トレーニングスクリプトでそれを呼び出しました。グラフをインポートして変数値を復元すると、変数と操作が作成されます。tf.layers.dense
もう一度呼び出すのはほとんど意味がありません。
sess.run()
文字列を使用して呼び出しを試みたところ、テンソルオブジェクトを渡す必要があるため、機能しませんでした。必要なテンソルを取得するには、いくつかの方法があります。
get_tensor_by_name
あなたがしたように使用します。モデルで作業するときにテンソル名が変わる可能性があるため、これは少し脆弱です。collection
グラフを保存する前にテンソルをaに追加し、復元時にこのコレクションからテンソルを取得できます。コレクション名は、テンソル名よりも安定している必要があります。y_pred
トレーニング中に持っていたのと同じpythonオブジェクトがあります。この場合、復元スクリプトを変更する必要があります。コードを使用してグラフを作成したので、する必要はありませんimport_meta_graph_def
。変数値を復元する必要があります。この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加