今は入力をfeed_dict
にするように設定されたモデルがあります。コードは次のようになります。TensorFlowモデルへの入力のためにfeed_dictとqueueを簡単に切り替える
# model.py
class MyModel(object):
def __init__(self, hyperparams):
self.build_model(hyperparams)
def build_model(self, hps):
self.input_data = tf.placeholder(dtype=tf.float32, shape=[hps.batch_size, hps.nfeats])
self.labels = tf.placeholder(dtype=tf.float32, shape=[hps.batch_size])
# Define hidden layers, loss, training step, etc.
# train.py
model = MyModel(hps)
for _ in range(100):
x, y = some_python_function() # Read a batch from disk, preprocess
sess.run(model.train_step, feed_dict={model.input_data: x, model.labels: y})
パフォーマンス上の理由から、トレーニング用にキューを使用したいと思います。しかし、私はfeed_dict
を使用する能力を維持したいと思います。推論やテストのために。
これを行うにはエレガントな方法がありますか?私がしたいのは、キューを使用するときに、キューのデキュー・オペレーションによって返されたテンソルのプレースホルダ変数を「スワップ・アウト」することです。私はtf.assign
はこれを行う方法、すなわち:
single_x, single_y = tf.parse_single_example(...)
x, y = tf.train.batch([single_x, single_y], batch_size)
model = MyModel(hps)
sess.run([tf.assign(model.input_data, x), tf.assign(model.labels, y)])
for _ in range(100):
sess.run(model.train_step)
だろうと思った。しかし、これはAttributeError: 'Tensor' object has no attribute 'assign'
を発生させます。 tf.assign
のAPIドキュメントでは、最初の引数は「変更可能なTensor
です。Variable
ノードである必要があります。初期化されていない可能性があります。これは私のプレースホルダが変更可能でないことを意味しますか?私はそうすることができますか?または私はこれに間違った方法で近づいていますか?
最小実行可能な例here。