首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【TensorFlow】TensorFlow 的卷积神经网络 CNN - TensorBoard 版

【TensorFlow】TensorFlow 的卷积神经网络 CNN - TensorBoard 版

作者头像
Alan Lee
发布2019-05-26 21:41:17
5970
发布2019-05-26 21:41:17
举报
文章被收录于专栏:Small CodeSmall Code

前面 写了一篇用 TensorFlow 实现 CNN 的文章,没有实现 TensorBoard,这篇来加上 TensorBoard 的实现,代码可以从 这里 下载。


什么是 TensorBoard

To make it easier to understand, debug, and optimize TensorFlow programs, we’ve included a suite of visualization tools called TensorBoard. You can use TensorBoard to visualize your TensorFlow graph, plot quantitative metrics about the execution of your graph, and show additional data like images that pass through it.

上面是引用了官网的介绍,意思就是说 TensorBoard 就是一个方便你理解、调试、优化 TensorFlow 程序的可视化工具,你可以可视化你的 TensorFlow graph、学习参数以及其他数据比如图像。

启动你的 TensorBoard 并在浏览器中打开后应该是类似下面这样的:


CNN 结构

CNN 的结构和 上篇 一样,数据集仍为 CIFAR10 数据集。

下面我用 TensorBoard 绘制的结构图说一下:

为了简洁我隐掉了一些不必要的节点。从图中可以看出有两个卷积层两个池化层两个 norm 层以及三个全连接层,图中指向 train 节点的线条的粗细表示需要训练的参数的多少,各层之间的线条上的数字表示了传递给下一层的参数的维度,例如 conv1 传递给 pool1 的参数维度是 ?×32×32×64由于这个图不能放大导致重叠,在浏览器中是可以放大的),? 表示 batch 的大小。具体的各层参数如下:

  • conv1:kernel 大小是 [5, 5, 3, 64],步长为 1,padding 为 SAME
  • pool1:kernel 大小是 [1, 3, 3, 1],步长为 2,padding 为 SAME
  • conv1:kernel 大小是 [5, 5, 64, 64],步长为 1,padding 为 SAME
  • pool1:kernel 大小是 [1, 3, 3, 1],步长为 2,padding 为 SAME
  • fc1:神经元个数为 384
  • fc2:神经元个数为 192

代码

完整代码可以在 这里 下载,下面我就说下关于 TensorBoard 的部分。

上面那个图中的每个节点都是用 tf.namescope() 指定的,例如

with tf.name_scope('conv1'):
        conv1 = tf.nn.conv2d(x4d, weight_variable('conv1', [5, 5, 3, 64], 5e-2, 'w_conv1'), strides=[1, 1, 1, 1], padding='SAME')
        conv1 = tf.nn.bias_add(conv1, bias_variable('conv1', 0.0, tf.float32, [64], 'b_conv1'))
        conv1 = tf.nn.relu(conv1)

这就指定了 conv1 的节点。相同节点名字会在一起。

你可以使用 tf.summary.scalar 记录准确率、损失等数据,使用 tf.summary.histogram 记录参数的分布情况。

with tf.name_scope('accuracy'):
        with tf.name_scope('correct_prediction'):
            correct_pred = tf.equal(tf.argmax(fc3, 1), tf.argmax(y, 1))
        with tf.name_scope('accuracy'):
            accuracy = tf.reduce_mean(tf.cast(correct_pred, tf.float32))
    tf.summary.scalar('accuracy', accuracy)

然后用 tf.summary.merge_all 将这些操作集中起来。

merged_summary_op = tf.summary.merge_all()

最后运行的时候使用 tf.summary.FileWriter 将这些操作得到的数据写进日志文件,以供 TensorBoard 可视化。

summary_writer = tf.summary.FileWriter('./tensorboard/log/', graph=tf.get_default_graph())

还可以可以使用tf.train.Saver 保存模型,TensorBoard 可以显示每一步的运行时间以及内存使用情况。(下面仅是代码片段

saver = tf.train.Saver()
# 这里有其他代码
run_options = tf.RunOptions(trace_level=tf.RunOptions.FULL_TRACE)
run_metadata = tf.RunMetadata()
# 这里有其他代码
summary_writer.add_run_metadata(run_metadata, 'step%d' % (i * total_batch + batch))
saver.save(sess, './tensorboard/log/model.ckpt', i * total_batch + batch)

总之有好多功能,我在这里就不一一阐述了,可以去官网看文档。


效果

进入到 tensorboard 所在目录后,执行下面的语句即可启动 TensorBoard :

没有使用 tf.train.Saver() 的:

tensorboard --logdir=tensorboard/log/without-saver

使用 tf.train.Saver() 的:

tensorboard --logdir=tensorboard/log/with-saver

按照提示,在浏览器中打开地址就可以看到可视化结果了。

例如我这里是 http://192.168.16.1:6006/

训练准确率曲线:

损失曲线:

Graph:

Step 100 的各节点计算时间(需要使用 tf.train.Saver()):

Step 100 的各节点内存消耗(需要使用 tf.train.Saver()):

fc1 层参数的降维可视化,可以旋转缩放,这个在这里不太有用,仅作展示用,三个主成分解释的总方差才 21%。在做 NLP 的时候这个功能就非常有用了,可以方便的展示词的位置。


END

OK,先到这里吧。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017年03月17日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 什么是 TensorBoard
  • CNN 结构
  • 代码
  • 效果
  • END
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档