【TensorFlow-windows】TensorBoard可视化

前言

紧接上一篇博客,学习tensorboard可视化训练过程。

国际惯例,参考博客:

MNIST机器学习入门

Tensorboard 详解(上篇)

Tensorboard 可视化好帮手 2

tf-dev-summit-tensorboard-tutorial

tensorflow官方mnist_with_summaries

预备知识

根据之前学的知识,创建一个卷积结构进行手写数字分类

import tensorflow as tf
import numpy as np
from tensorflow.examples.tutorials.mnist import input_data

#读取手写数字
mnist = input_data.read_data_sets('./dataset/',one_hot=True)

#定义卷积操作
def conv_layer(input,size_in,size_out,name='conv'):
    with tf.name_scope(name):
        w=tf.Variable(tf.truncated_normal([5,5,size_in,size_out],stddev=0.1),name='W')
        b=tf.Variable(tf.constant(0.1,shape=[size_out]),name='B')
        conv = tf.nn.conv2d(input,w,strides=[1,1,1,1],padding='SAME')
        act = tf.nn.relu(conv+b)
        return tf.nn.max_pool(act,ksize=[1,2,2,1],strides=[1,2,2,1],padding='SAME')

#全连接层
def fc_layer(input,size_in,size_out,name='fc'):
    with tf.name_scope(name):
        w=tf.Variable(tf.truncated_normal([size_in,size_out],stddev=0.1),name='W')
        b=tf.Variable(tf.constant(0.1,shape=[size_out]),name='B')
        act=tf.matmul(input,w)+b
        return act

#创建模型
def create_model(input_x):
        #卷积
        input_img = tf.reshape(input_x,[-1,28,28,1])
        conv1=conv_layer(input_img,1,32,'conv1')
        conv2=conv_layer(conv1,32,64,'conv2')
        #全连接
        flattened=tf.reshape(conv2,[-1,7*7*64])
        fc1=fc_layer(flattened,7*7*64, 1024,'fc1')
        act1=tf.nn.relu(fc1)
        out=fc_layer(act1,1024,10,'fc2')
        return out

#定义网络输入,输出
X=tf.placeholder(tf.float32,shape=[None,28*28],name='x')
Y=tf.placeholder(tf.float32,shape=[None,10],name='y')

logits = create_model(X) #创建模型
prediction=tf.nn.softmax(logits=logits,name='prediction') #预测

# 损失函数
loss_op = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits_v2(logits=logits,labels=Y))
optimize = tf.train.AdamOptimizer(learning_rate=0.01)
train_op = optimize.minimize(loss_op)

#评估函数
correct_pred = tf.equal(tf.argmax(prediction,1),tf.argmax(Y,1))
accuracy = tf.reduce_mean(tf.cast(correct_pred,tf.float32))

with tf.Session() as sess:
        sess.run(tf.global_variables_initializer())
        for step in range(20000):
            batch_xs,batch_ys=mnist.train.next_batch(50)
            sess.run(train_op,feed_dict={X:batch_xs,Y:batch_ys})
            if(step%10==0 or step==1):
                loss,acc = sess.run([loss_op,accuracy],feed_dict={X: mnist.test.images,Y: mnist.test.labels})
                print('Step:{0},loss:{1},acc:{2}'.format(step,loss,acc))

依旧是那几个流程:读数据→初始化相关参数→定义接收数据的接口以便测试使用→初始化权重和偏置→定义基本模块(编码和解码)→构建模型(先编码再解码)→定义预测函数、损失函数、优化器→训练

加入TensorBoard

tensorflow的官方文档来看,支持可视化操作函数有:scalarimageaudiotexthistogram

这里我们只需要使用scalar可视化loss值的变动,image可视化部分输入数据、histogram可视化权重与偏置的分布。

很简单,调用方法统一是tf.summary

可视化卷积层的权重和偏置

#定义卷积操作
def conv_layer(input,size_in,size_out,name='conv'):
    with tf.name_scope(name):
        w=tf.Variable(tf.truncated_normal([5,5,size_in,size_out],stddev=0.1),name='W')        
        b=tf.Variable(tf.constant(0.1,shape=[size_out]),name='B')        
        conv = tf.nn.conv2d(input,w,strides=[1,1,1,1],padding='SAME')
        act = tf.nn.relu(conv+b)

        tf.summary.histogram(name+'/weights',w)
        tf.summary.histogram(name+'/bias',b)
        return tf.nn.max_pool(act,ksize=[1,2,2,1],strides=[1,2,2,1],padding='SAME')

可视化部分训练数据:

#创建模型
def create_model(input_x):
        #卷积
        input_img = tf.reshape(input_x,[-1,28,28,1])
        tf.summary.image('input',input_img,3)
        conv1=conv_layer(input_img,1,32,'conv1')
        conv2=conv_layer(conv1,32,64,'conv2')
        #全连接
        flattened=tf.reshape(conv2,[-1,7*7*64])
        fc1=fc_layer(flattened,7*7*64, 1024,'fc1')
        act1=tf.nn.relu(fc1)
        out=fc_layer(act1,1024,10,'fc2')
        return out

可视化损失函数变动:

# 损失函数
loss_op = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits_v2(logits=logits,labels=Y))
tf.summary.scalar('loss',loss_op)

最终要把所有需要可视化的操作合并到一起:

merged=tf.summary.merge_all()

tensorflow中的操作一般需要由session执行,也就是说如果我们想写入日志,就需要在session中执行merged操作,并使用add_summary将每次训练的记录写入到日志文件。

with tf.Session() as sess:
        writer=tf.summary.FileWriter('logs/',sess.graph)
        sess.run(tf.global_variables_initializer())
        for step in range(20000):
            batch_xs,batch_ys=mnist.train.next_batch(50)
            sess.run(train_op,feed_dict={X:batch_xs,Y:batch_ys})
            if(step%10==0 or step==1):
                loss,acc,s = sess.run([loss_op,accuracy,merged],feed_dict={X: mnist.test.images[:100],Y: mnist.test.labels[:100]})
                print('Step:{0},loss:{1},acc:{2}'.format(step,loss,acc))
                writer.add_summary(s,step)

然后运行训练脚本,开始训练以后,打开终端,启动tensorboard

tensorboard --logdir 'logs'

其中最后一个参数logs代表日志存储的地方,根据自己的情况定义

运行以后会弹出一个网址:

/home/xx/anaconda3/lib/python3.6/site-packages/h5py/__init__.py:36: FutureWarning: Conversion of the second argument of issubdtype from `float` to `np.floating` is deprecated. In future, it will be treated as `np.float64 == np.dtype(float).type`.
  from ._conv import register_converters as _register_converters
TensorBoard 1.12.2 at http://xx-XPS-8700:6006 (Press CTRL+C to quit)

浏览器中打开此网址,能够看到tensorboard显示的你想可视化的内容。

在这里插入图片描述

【注】可能参数不会实施更新,在右上角的齿轮那里可以调整刷新间隔,默认30s

后续

可视化对训练过程是十分重要的,有时候模型不起作用,loss不降或者炸了,可以通过权重来判断是否参数更新是否出现了问题,而且如果是生成对抗网络,可以把训练过程中的重建图像打印出来,也可以看到模型是否有效。
本博文源码:https://download.youkuaiyun.com/download/zb1165048017/11536994

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

风翼冰舟

额~~~优快云还能打赏了

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值