slim库是tensorflow轻量级的库,用起来很方便
slim=tf.contrib.slim
slim.arg_scope()
为tensorflow常用的的layer函数提供默认值.
1、函数可以为多个,可以用list来同时定义多个函数的默认参数(前提是这些函数都有这些参数)
2、它可以嵌套使用
但使用的函数要满足以下条件:
被装饰器@add_arg_scope装饰,
e.g.slim.conv2d( ),slim.fully_connected( ),slim.max_pool2d( )
参考博客:https://blog.youkuaiyun.com/weixin_35653315/article/details/78160886;博客里还通过源码分析了工作原理,with语句可以嵌套,所以scope的值用栈这种数据来实现。
with slim.arg_scope(
[layers.conv2d],
padding='SAME',
initializer= xavier_initializer(),
regularizer= l2_regularizer(0.05)):
net = slim.conv2d(net, 256, [5, 5])
slim.utils.convert_collection_to_dict()
集合转换为字典,{节点名:输出张量值}
with tf.variable_scope(scope, 'convolutional_alexnet', [inputs], reuse=reuse) as sc:
end_points_collection = sc.name + '_end_points'
with slim.arg_scope([slim.conv2d, slim.max_pool2d],
outputs_collections=end_points_collection):
.....#网络结构
#Convert end_points_collection into a dictionary of end_points.
end_points = slim.utils.convert_collection_to_dict(end_points_collection)
return net, end_points
除了网络最后的输出外,还返回了{节点名:输出张量值}的一个字典
slim.utils.collect_named_outputs(outputs_collections,sc.name,net)
在查看源码的时候,我发现layers的几个函数最终不是直接返回output,而是return 这个函数。
该函数定义:
if collections: append_tensor_alias(outputs,alias) ops.add_to_collections(collections,outputs) return outputs
把这个tensor的输出值收集到collections中去,然后再返回输出值
tensorboard
可视化是由tensorboard和tf.summary共同实现的
summary_writer = tf.summary.FileWriter(train_dir, g)#可视化图
tf.summary.scalar("loss", loss)#可视化参数
summary_op = tf.summary.merge_all()#汇总所有的tf.summary,整理所有的日志生成操作
if step % 100 == 0: #每100次更新一下tf.summary里的值
summary_str = sess.run(summary_op)
summary_writer.add_summary(summary_str, step)
注意:还可以添加:tf.summary.histogram,tf.summary.image
运行代码后,另起一个命令行运行:tensorboard --logdir train_dir
TensorBoard 1.9.0 at http://DESKTOP-VHRP9S3:6006(用浏览器打开)
小结:
TensorBoard的使用流程链接:https://www.jianshu.com/p/2f1bc36c08e0
- 添加记录节点:
tf.summary.scalar/image/histogram()
等 - 汇总记录节点:
merged = tf.summary.merge_all()
- 运行汇总节点:
summary = sess.run(merged)
,得到汇总结果 - 日志书写器实例化:
summary_writer = tf.summary.FileWriter(logdir, graph=sess.graph)
,实例化的同时传入 graph 将当前计算图写入日志 - 调用日志书写器实例对象
summary_writer
的add_summary(summary, global_step=i)
方法将所有汇总日志写入文件 - 调用日志书写器实例对象
summary_writer
的close()
方法写入内存,否则它每隔120s写入一次 - 如果显示不出来,可以尝试下
file_writer.flush()
7、如果显示不出来,可以尝试下file_writer.flush()
从头开始训练,或者接着上一次的结果继续训
model_path = tf.train.latest_checkpoint(train_config['train_dir'])
if not model_path:
sess.run(tf.global_variables_initializer())
sess.run(tf.local_variables_initializer())
start_step = 0
if model_config['embed_config']['embedding_checkpoint_file']:
model.init_fn(sess)
else:
logging.info('Restore from last checkpoint: {}'.format(model_path))
sess.run(tf.local_variables_initializer())
saver.restore(sess, model_path)
start_step = tf.train.global_step(sess, model.global_step.name) + 1