第一次写博客,原因是在大三考试周的紧要关头被【线(ji)性(qi)优(xue)化(xi)】这门课的编程作业坑了........
心中愤懑不平,在这里调整一下,给自己一点微弱的成就感,如果还能帮到和我一样的“大白”那就再好不过了hh
- Tensorflow参数训练结果的可视化
我要做的是tensorflow训练出的kernel(即权重)的可视化显示。
其实后来想想道理真的很简单:网络(CNN)训练完成后肯定会将模型参数都保存下来,这是训练的结果所在。我们只要知道这些结果的数值不就ok了吗?可视化也就是把参数值变成以下或者别的可能的图像:
- 有关训练轮数的折线图;
- 直方图
- 像素值
- ......
所以我们通过session.run(变量)得到参数值就好了,然后就是变成图像。以我的代码为例,把kernel变成像素值,然后记录:
for var in tf.trainable_variables():
if var.name == 'conv2d/kernel:0':
print(var)
kernel1 = sess.run('conv2d/kernel:0') #获取参数值!!
kmin = np.min(kernel1)
kmax = np.max(kernel1)
kernel1_n = (kernel1-kmin) / (kmax-kmin) #归一
print(kernel1_n.shape)
#维度位置交换,个数在最前、通道数在最后
#因为图片输出函数tf.summary.image()需要输入维度的格式是(batch数,长,宽,彩色通道)
kernel_transposed = tf.transpose(kernel1_n, [3, 0, 1, 2])
tf.summary.image('filter1', kernel_transposed, max_outputs=32) # 32个kernel都记录下来
merged = tf.summary.merge_all() #所有的summary操作集合起来
summary_writer = tf.summary.FileWriter('/tmp/tensorboard', sess.graph) #写到磁盘
summary_all = sess.run(merged) #启动所有的summary
summary_writer.add_summary(summary_all, 0) # summary的结果传给writer写到磁盘,第二个参数需要的话就是训练的轮数(或者说时间参数)
summary_writer.close()
- Tensorboard巨坑
这里有一个坑,运气好了没关系,运气差了碰到这个问题都不知道为什么....这个问题是启动tensorboard时的日志的目录位置到底怎么写。
上面的代码中,控制summary写到磁盘什么位置的一行是:
summary_writer = tf.summary.FileWriter('/tmp/tensorboard', sess.graph) #写到磁盘
这里我写的位置是:'/tmp/tensorboard'
通过尝试我发现,这并不是在我的项目目录下新建这个目录,而是在项目所在的磁盘(比如D盘)建立这个目录。所以说“写到磁盘”这句话莫名贴切。
发现了日志文件的位置,我在命令行cmd中输入以下指令启动tensorboard:
结果tensorboard告诉我什么都没有......
百般查询之后,通过我的实验确认,执行指令时所在磁盘应该要和日志所在的磁盘是同一个......尼玛还真是奇怪的统一。
如果你比较懒,那就让日志输出到C盘去,把writer的那行代码指出的目录改掉,例如:
summary_writer = tf.summary.FileWriter('C:/tmp/tensorboard', sess.graph)
这样每次打开cmd都在用户目录也不用去cd了。
- Kernel可视化结果
最终我在tensorboard上得到的部分kernel图像如下: