tensorflow使用笔记

1. 运行训练代码时报如下错误

could not create cudnn handle: CUDNN_STATUS_INTERNAL_ERROR

could not destroy cudnn handle: CUDNN_STATUS_BAD_PARAM

可能是显存问题

解决办法:

使用allow_growth控制GPU的内存分配,代码如下

config = tf.ConfigProto()
config.gpu_options.allow_growth = True
session = tf.Session(config=config, ...)
gpu_options=tf.GPUOptions(allow_growth=True)
with tf.Session(config=tf.ConfigProto(gpu_options=gpu_options)) as sess:

还可以使用tf.GPUOptions控制GPU的使用显存,下面是使用75%的显存

gpu_options=tf.GPUOptions(per_process_gpu_memory_fraction=0.75)
with tf.Session(config=tf.ConfigProto(gpu_options=gpu_options, allow_soft_placement=True)) as sess:

2.打印网络运行的metadata信息

options = tf.RunOptions(trace_level=tf.RunOptions.SOFTWARE_TRACE)
metadata = tf.RunMetadata()
with tf.Session() as sess:
    sess.run([f_score, f_geometry], feed_dict={input_images: [im_resized]}, options=options, run_metadata=metadata)
    
    print ('metadata.partition_graphs:{}'.format(metadata.partition_graphs))
    print('metadata.step_stats:{}'.format(metadata.step_stats))

3.训练时打印网络参数

不管是用于固定训练部分层还是打印网络参数,tensorflow都是根据网络层的名字来操作的,但是有时候写的网络较大写了很多个tf.variable_scope导致网络层命名不好获取,可以使用如下代码查看

vn = [v.name for v in tf.trainable_variables()]
    for name in vn:
        print name

获取好网络层的代码后就可以通过session来获取网络参数了

vn_v = sess.run(vn)
for name, value in zip(vn, vn_v):
   print('name:{}\n'.format(name))
   print('shape:{}\n'.format(value.shape))
   print('value:{}\n'.format(value))

或者获取某一层

logits = sess.graph.get_tensor_by_name('MobilenetV2/Conv/weights:0')
logits_v = sess.run(logits)

4.只训练某些层

optimizer = tf.train.AdamOptimizer(learning_rate)
...
vars_list = [v for v in tf.trainable_variables() if 'resnet_v1_50/logits/weights:0' or 'resnet_v1_50/logits/biases:0' in v.name]
grads = optimizer.compute_gradients(total_loss, var_list=list_vars)

tensorflow中optimizer.minimize和optimizer.compute_gradients都有个var_list参数来指定需要更新的参数层

5.bn层参数的更新

在用小数据finetuning网络的时候,发现训练loss下降的很快,最后几乎到零了,但是输出结果都几乎相同,原因是bn层中的平均值和方差没有更新

  update_ops = tf.get_collection(tf.GraphKeys.UPDATE_OPS)
  with tf.control_dependencies(update_ops):
    train_op = optimizer.minimize(loss)

你可能感兴趣的:(tensorflow)