美文网首页机器学习
tensorflow使用笔记

tensorflow使用笔记

作者: ce0b74704937 | 来源:发表于2019-02-25 12:55 被阅读0次

    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使用笔记

        本文链接:https://www.haomeiwen.com/subject/fknwyqtx.html