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:
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))
不管是用于固定训练部分层还是打印网络参数,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)
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参数来指定需要更新的参数层
在用小数据finetuning网络的时候,发现训练loss下降的很快,最后几乎到零了,但是输出结果都几乎相同,原因是bn层中的平均值和方差没有更新
update_ops = tf.get_collection(tf.GraphKeys.UPDATE_OPS)
with tf.control_dependencies(update_ops):
train_op = optimizer.minimize(loss)