如何传递tensorflow中的参数 我想使用TensorFlow训练网络,我选择“ Inception_Resnet_v2”作为NET(从这里),这是我的火车代码, def train(train_dir,注释,max_step,checkpoint_dir ='。/

问题描述 投票:0回答:2
def train(train_dir, annotations, max_step, checkpoint_dir='./checkpoint2/'): # train the model features = tf.placeholder("float32", shape=[None, IMAGE_SIZE, IMAGE_SIZE, IMAGE_CHANNEL], name="features") labels = tf.placeholder("float32", [None], name="labels") one_hot_labels = tf.one_hot(indices=tf.cast(labels, tf.int32), depth=80) keep_prob = tf.placeholder("float32") isTraining = tf.placeholder("bool") #train_step, cross_entropy, logits, keep_prob = network.inference(features, one_hot_labels) logits, _=inception_resnet_v2.inception_resnet_v2(features,80,isTraining,keep_prob) # calculate loss cross_entropy = tf.reduce_mean( tf.nn.softmax_cross_entropy_with_logits(labels=one_hot_labels, logits=logits)) train_step = tf.train.AdamOptimizer(LEARNINGRATE).minimize(cross_entropy) correct_prediction = tf.equal(tf.argmax(logits, 1), tf.argmax(one_hot_labels, 1)) accuracy = tf.reduce_mean(tf.cast(correct_prediction, "float")) image_list, label_list = scene_input2.get_files(train_dir, annotations) image_batch, label_batch = scene_input2.get_batch(image_list, label_list, IMAGE_SIZE, IMAGE_SIZE, BATCH_SIZE) with tf.Session() as sess: saver = tf.train.Saver() ckpt = tf.train.get_checkpoint_state(checkpoint_dir) if ckpt and ckpt.model_checkpoint_path: print('Restore the model from checkpoint %s' % ckpt.model_checkpoint_path) # Restores from checkpoint saver.restore(sess, ckpt.model_checkpoint_path) start_step = int(ckpt.model_checkpoint_path.split('/')[-1].split('-')[-1]) else: sess.run(tf.global_variables_initializer()) start_step = 0 print('start training from new state') logger = scene_input.train_log(LOGNAME) coord = tf.train.Coordinator() threads = tf.train.start_queue_runners(coord=coord) try: # Check if stop was requested. step=start_step while not coord.should_stop() and step<start_step + max_step: start_time = time.time() x, y = sess.run([image_batch, label_batch]) #y = tf.one_hot(indices=tf.cast(y, tf.int32), depth=80) #y = sess.run(y) sess.run(train_step, feed_dict={features: x, labels: y, isTraining: True, keep_prob: 0.5}) if step % 50 == 0: train_accuracy = sess.run(accuracy, feed_dict={features: x, labels: y, isTraining: False, keep_prob: 1}) train_loss = sess.run(cross_entropy, feed_dict={features: x, labels: y, isTraining:False, keep_prob: 1}) duration = time.time() - start_time logger.info("step %d: training accuracy %g, loss is %g (%0.3f sec)" % (step, train_accuracy, train_loss, duration)) if step % 1000 == 1: saver.save(sess, CHECKFILE, global_step=step) print('writing checkpoint at step %s' % step) step=step+1 except tf.errors.OutOfRangeError: print('done!') finally: #Request that the threads stop.After this is called, calls to should_stop() will return True. coord.request_stop() coord.join(threads)

但是当我训练网时,我会遇到一个错误:

Traceback (most recent call last): File "scene2.py", line 245, in <module> train(FLAGS.train_dir, FLAGS. annotations, FLAGS.max_step) File "scene2.py", line 82, in train logits, _=inception_resnet_v2.inception_resnet_v2(features,80,isTraining,keep_prob) File "/home/vision/inception_resnet_v2.py", line 357, in inception_resnet_v2 scope='Dropout') File "/usr/local/lib/python3.4/dist-packages/tensorflow/contrib/framework/python/ops/arg_scope.py", line 181, in func_with_args return func(*args, **current_args) File "/usr/local/lib/python3.4/dist-packages/tensorflow/contrib/layers/python/layers/layers.py", line 1216, in dropout _scope=sc) File "/usr/local/lib/python3.4/dist-packages/tensorflow/python/layers/core.py", line 247, in __init__ self.rate = min(1., max(0., rate)) File "/usr/local/lib/python3.4/dist-packages/tensorflow/python/framework/ops.py", line 564, in __bool__ raise TypeError("Using a `tf.Tensor` as a Python `bool` is not allowed. " TypeError: Using a `tf.Tensor` as a Python `bool` is not allowed. Use `if t is not None:` instead of `if t:` to test if a tensor is defined, and use TensorFlow ops such as tf.cond to execute subgraphs conditioned on the value of a tensor. vision@Hjl:~/$ CUDA_VISIBLE_DEVICES=0 python3 scene2.py --mode train Traceback (most recent call last): File "scene2.py", line 245, in <module> train(FLAGS.train_dir, FLAGS. annotations, FLAGS.max_step) File "scene2.py", line 82, in train logits, _=inception_resnet_v2.inception_resnet_v2(features,80,isTraining,keep_prob) File "/home/vision/inception_resnet_v2.py", line 357, in inception_resnet_v2 scope='Dropout') File "/usr/local/lib/python3.4/dist-packages/tensorflow/contrib/framework/python/ops/arg_scope.py", line 181, in func_with_args return func(*args, **current_args) File "/usr/local/lib/python3.4/dist-packages/tensorflow/contrib/layers/python/layers/layers.py", line 1216, in dropout _scope=sc) File "/usr/local/lib/python3.4/dist-packages/tensorflow/python/layers/core.py", line 247, in __init__ self.rate = min(1., max(0., rate)) File "/usr/local/lib/python3.4/dist-packages/tensorflow/python/framework/ops.py", line 564, in __bool__ raise TypeError("Using a `tf.Tensor` as a Python `bool` is not allowed. " TypeError: Using a `tf.Tensor` as a Python `bool` is not allowed. Use `if t is not None:` instead of `if t:` to test if a tensor is defined, and use TensorFlow ops such as tf.cond to execute subgraphs conditioned on the value of a tensor.
当我将keep_prob和keep_prob传递给inception_resnet_v2.inception_resnet_v2(功能,80,ISTRAINing,keep_prob)时,发生了错误。我该如何解决这个问题?

当我训练网络时,我想设置keep_prob = 0.5,instraining = true,但与此同时,每50步,我想观看模型的train_accuracy和train_loss,所以我应该设置keep_prob = 1.0,istraining,istraining = false,我对吗?我该如何实施?
    

如果您的最终目标是同时进行培训和评估,并且您正在使用TF-SLIM库提供的神经网络实现,那么最容易遵循TF-SLIM合着者NathanSilberman

处方的方法。

python tensorflow tensor
2个回答
1
投票
要开始,您应该查看train_image_classifier.py和eval_image_classifier.py脚本,提供了TensorFlow-Slim Image分类模型库。

Ineval_image_classifier.py,您将需要替换代码: if tf.gfile.IsDirectory(FLAGS.checkpoint_path): checkpoint_path = tf.train.latest_checkpoint(FLAGS.checkpoint_path) else: checkpoint_path = FLAGS.checkpoint_path tf.logging.info('Evaluating %s' % checkpoint_path) slim.evaluation.evaluate_once( master=FLAGS.master, checkpoint_path=checkpoint_path, logdir=FLAGS.eval_dir, num_evals=num_batches, eval_op=list(names_to_updates.values()), variables_to_restore=variables_to_restore)

代码:

tf.logging.info('Evaluating %s' % FLAGS.checkpoint_path) slim.evaluation.evaluation_loop( master=FLAGS.master, checkpoint_dir=FLAGS.checkpoint_path, logdir=FLAGS.eval_dir, num_evals=num_batches, eval_op=list(names_to_updates.values()), variables_to_restore=variables_to_restore) 如果您希望这两个进程都可以使用GPU而不遇到OOM错误,则可以通过创建一个configproto对象并将其作为

session_config

slim.learning.train()
参数的参数传递给每个过程。有关参考

slim.evaluation.evaluation_loop()

的参数化进行了重新确定,您会注意到,火车和评估脚本分别通过
is_training

True

作为其参数传递给
False
.
is_training
参数。 重新标记nets_factory.get_netowrk_fn()

的参数化,nets_factory不会揭示Slim Nets的

keep_prob

参数。取而代之的是,
dropout_keep_prob
接受
slim.dropout()
作为参数,并替换构成身份函数的辍学的计算。换句话说,tf-slim真是太棒了,以至于当您传递到
is_training
时,它会自动“禁用”辍学,就像eval_image_classifier.py.
中的情况一样。
如果您想直接暴露于Train_image_classifier.py(例如,用于超参数调整目的),则必须摆弄
is_training=False

.

的实现。


如果您使用的是this
方法,那么它会期望一个python
nets_factory.get_netowrk_fn()
dropout_keep_prob
值而不是
nets_factory.get_network_fn()
。因此,您需要通过类似的值
boolean

instead

float

update
但是,如果您需要在培训时间喂养它们,我认为最简单的方法是在此

line

0
投票
tensor

方法参数(如下)(删除默认参数值), keep_prob = 0.5 isTraining = True

然后您将能够通过
keep_prob = tf.placeholder("float32")
isTraining = tf.placeholder("bool")
inception_resnet_v2
。希望它有帮助


最新问题
© www.soinside.com 2019 - 2025. All rights reserved.