将迭代器馈送到 Tensorflow Graph
Feed Iterator to Tensorflow Graph
我用 make_one_shot_iterator()
创建了一个 tf.data.Iterator
,想用它来训练我的(现有)模型。
目前我的训练是这样的
input_node = tf.placeholder(tf.float32, shape=(None, height, width, channels))
net = models.ResNet50UpProj({'data': input_node}, batch_size, keep_prob=True,is_training=True)
labels = tf.placeholder(tf.float32, shape=(None, width, height, 1))
huberloss = tf.losses.huber_loss(predictions=net.get_output(),labels=labels)
然后调用
sess.run(train_op, feed_dict={labels:output_img, input_node:input_img})
训练后我可以得到这样的预测:
pred = sess.run(net.get_output(), feed_dict={input_node: img})
现在用迭代器我尝试了这样的事情
next_element = iterator.get_next()
像这样传递输入数据:
net = models.ResNet50UpProj({'data': next_element[0]}, batch_size, keep_prob=True,is_training=True)
像这样定义损失函数:
huberloss = tf.losses.huber_loss(predictions=net.get_output(),labels=next_element[1])
并且执行训练就像在每次调用时自动迭代迭代器一样简单:
sess.run(train_op)
我的问题是:训练后我无法做出任何预测。或者更确切地说,我不知道在我的例子中使用迭代器的正确方法。
解决方案 1:创建一个单独的子图仅用于推理,尤其是当您具有批归一化和丢弃等层时 (is_training=False
)。
# The following code assumes that you create variables with `tf.get_variable`.
# If you create variables manually, you have to reuse them manually.
with tf.variable_scope('somename'):
net = models.ResNet50UpProj({'data': next_element[0]}, batch_size, keep_prob=True, is_training=True)
with tf.variable_scope('somename', reuse=True):
net_for_eval = models.ResNet50UpProj({'data': some_placeholder_or_inference_data_iterator}, batch_size, keep_prob=True, is_training=False)
解决方案 2:使用 feed_dict
。您可以用 feed dict 替换几乎任何 tf.Tensor
,而不仅仅是 tf.placeholder
。
sess.run(huber_loss, {next_element[0]: inference_image, next_element[1]: inference_labels})
我用 make_one_shot_iterator()
创建了一个 tf.data.Iterator
,想用它来训练我的(现有)模型。
目前我的训练是这样的
input_node = tf.placeholder(tf.float32, shape=(None, height, width, channels))
net = models.ResNet50UpProj({'data': input_node}, batch_size, keep_prob=True,is_training=True)
labels = tf.placeholder(tf.float32, shape=(None, width, height, 1))
huberloss = tf.losses.huber_loss(predictions=net.get_output(),labels=labels)
然后调用
sess.run(train_op, feed_dict={labels:output_img, input_node:input_img})
训练后我可以得到这样的预测:
pred = sess.run(net.get_output(), feed_dict={input_node: img})
现在用迭代器我尝试了这样的事情
next_element = iterator.get_next()
像这样传递输入数据:
net = models.ResNet50UpProj({'data': next_element[0]}, batch_size, keep_prob=True,is_training=True)
像这样定义损失函数:
huberloss = tf.losses.huber_loss(predictions=net.get_output(),labels=next_element[1])
并且执行训练就像在每次调用时自动迭代迭代器一样简单:
sess.run(train_op)
我的问题是:训练后我无法做出任何预测。或者更确切地说,我不知道在我的例子中使用迭代器的正确方法。
解决方案 1:创建一个单独的子图仅用于推理,尤其是当您具有批归一化和丢弃等层时 (is_training=False
)。
# The following code assumes that you create variables with `tf.get_variable`.
# If you create variables manually, you have to reuse them manually.
with tf.variable_scope('somename'):
net = models.ResNet50UpProj({'data': next_element[0]}, batch_size, keep_prob=True, is_training=True)
with tf.variable_scope('somename', reuse=True):
net_for_eval = models.ResNet50UpProj({'data': some_placeholder_or_inference_data_iterator}, batch_size, keep_prob=True, is_training=False)
解决方案 2:使用 feed_dict
。您可以用 feed dict 替换几乎任何 tf.Tensor
,而不仅仅是 tf.placeholder
。
sess.run(huber_loss, {next_element[0]: inference_image, next_element[1]: inference_labels})