TensorBoard的可视化功能

在B站上面找到的深度学习框架TensorFLow的视频,学习了TensorBoardd。
虽然是照着视频写的,但是也出现了很多错误,不过,好在,自己一点一点的把错误找出来,并且解决了,因此得到了最后想要的结果,如果有需要的小伙伴可以自行拷贝程序。
但是,个人建议,最好还是自己调试,找错误 ,会让你收获更大。

# _*_ coding:utf-8 _*_
# 开发人员 : lenovo
#开发时间 :2019/6/1417:33
# 文件名称 :tensorflow10 5-4.py
# 开发工具 : PyCharm

import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data  #程序自己去下载mnist数据集
from tensorflow.contrib.tensorboard.plugins import projector

#载入数据集
mnist = input_data.read_data_sets("MNIST_data",one_hot=True) #如果mnist数据集自动下载失败,则将自己下载好的数据集存放在代码的目录下面,
# "MNIST_data"表示数据集存放的文件夹名字,自己命名

#运行次数
max_steps = 1001

# 图片数量
image_num = 3000   #最多可以修改成为10000,因为测试集里面有10000张图片

# 文件路径
#DIR = 'D:\PyCharm\PyCharmWorkPlace\WorkPlace1\TensorBoard'
DIR = 'D:/PyCharm/PyCharmWorkPlace/WorkPlace1/TensorBoard/'

# 定义会话
sess = tf.Session()

#载入图片
embedding = tf.Variable(tf.stack(mnist.test.images[:image_num]),trainable= False,name='embedding')
#打包的是手写数字test里面的图片0-image_num,然后存在embedding ''' stack函数:
# 把各个数组打包 x is [1,4] y is [2,5] z is [3,6] stack([x,y,z])
# ==> [[1,4],[2,5],[3,6]] axis默认为0,即横向打包 stack([x,y,z],axis=1)
# ==>[[1,2,3],[4,5,6]] axis为1时,即纵向打包
# '''


# 参数概要
def variable_summaries(var):  # 传入参数var
    with tf.name_scope('summaries'):
        mean = tf.reduce_mean(var)
        tf.summary.scalar('mean',mean) #平均值
        with tf.name_scope('stddev'):
            stddev = tf.sqrt(tf.reduce_mean(tf.square(var - mean)))
        tf.summary.scalar('stddev',stddev) #标准差
        tf.summary.scalar('max',tf.reduce_max(var)) # 最大值
        tf.summary.scalar('min',tf.reduce_min(var)) # 最小值
        tf.summary.histogram('histogram',var)  # 直方图


# 命名空间
with tf.name_scope('input'):
    # 定义两个placeholder
    #这里的none 表示第一个维度可以视任意长度
    x = tf.placeholder(tf.float32, [None, 784],name = 'x-input')  # 28*28 = 784.None和行有关系  输入是784个像素点
    y = tf.placeholder(tf.float32, [None, 10],name = 'y-input')  # y代表标签,是数字从0-9 总共10个值  输出是10个标签。没有隐藏层

#显示图片
with tf.name_scope('input_reshape'):
    image_shaped_input = tf.reshape(x,[-1,28,28,1]) #-1代表不确定的任意值  1代表黑白照片维度是1,如果是彩色图片,则维度是3
    tf.summary.image('input',image_shaped_input,10) #用summary.image把image_shaped_input存到input里面,一共放10张图片


with tf.name_scope("layer"):
    #创建一个简单的神经网络
    with tf.name_scope("wights"):
        W = tf.Variable(tf.zeros([784, 10]), name='W')
        variable_summaries(W)
    with tf.name_scope('biases'):
        b = tf.Variable(tf.zeros([10]),name='b')  # b表示偏置
        variable_summaries(b)
    with tf.name_scope('wx_plus_b'):
        wx_plus_b = tf.matmul(x,W)+b
    with tf.name_scope('softmax'):
        prediction = tf.nn.softmax(wx_plus_b)


#二次代价函数
with tf.name_scope('loss'):
    loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y, logits=prediction))
    tf.summary.scalar('loss',loss)
    #variable_summaries(loss)

#使用梯度下降法
## train_step = tf.train.GradientDescentOptimizer(0.2).minimize(loss)
with tf.name_scope('train'):
    train_step = tf.train.GradientDescentOptimizer(0.2).minimize(loss)

#初始化变量
init = tf.global_variables_initializer()

#结果存放在一个布尔型列表中
with tf.name_scope('accuarcy'):
    with tf.name_scope('correct_prediction'):
        # tf.argmax(y,1) :求y值里面最大的值在那个位置。 对应于本实例是返回概率最大的数字在哪个位置
        correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(prediction, 1))  # 比较两个参数大小是否一致,一致返回True,否则返回False
    with tf.name_scope('accuracy'):
        # 求准确率
        accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))  # cast(a,b)将a类型转化为b类型 ,此例中是将布尔型转化为float32型
        tf.summary.scalar('accuracy',accuracy)

# 产生metadata文件
#if tf.gfile.Exists(DIR+'projector/projector/metadata.tsv'):
  #  tf.gfile.DeleteRecursively(DIR+'projector/projector/metadata.tsv')
#with open(DIR+'projector/projector/metadata.tsv','w') as f:
   # labels = sess.run(tf.argmax(mnist.test.labels[:],1))
  #  for i in range(image_num):
    #    f.write(str(labels[i])+'\n')

#产生metadata文件,其实就是test图片对应的label值
if tf.gfile.Exists('./projector/metadata.tsv'):
    tf.gfile.DeleteRecursively('./projector/metadata.tsv')# 检测是否已有该文件,有的话就将其删除
with open('./projector/metadata.tsv','w') as f:# 生成该文件,并以写的方式打开
    labels=sess.run(tf.argmax(mnist.test.labels[:],1))
# #得到test里面的label,argmax找到最大值位置,即label如果是0的话,则数据格式是1000000000;如果是1的话,数据格式是0100000000
    for i in range(image_num):
      f.write(str(labels[i])+'\n')#把image_num个图片对应的label写入metadata.tsv文件中



#合并所有的summary,并将其加入到sess.run的语句里
merged = tf.summary.merge_all()

#下面这段是为了生成三维立体动态图像模型,embedding,以及上面各参数的显示
projector_writer=tf.summary.FileWriter(DIR+'projector/projector',sess.graph)#前面是路径,graph存在该文件夹中,从而可以使用tensorboard查看
saver=tf.train.Saver()#保存这个网络的模型
config=projector.ProjectorConfig()#定义一个配置项
embed=config.embeddings.add()
embed.tensor_name=embedding.name#前面embedding变量的名字赋予tensor_name
embed.metadata_path=DIR+'projector/metadata.tsv'#把metadata.tsv传给embed.metadata_path
embed.sprite.image_path=DIR+'projector/data/mnist_10k_sprite.png'#把单张1万个手写数字图片传给embed程序
embed.sprite.single_image_dim.extend([28,28])#把上面图片切分成每个数字块,即[28,28]的小块,每一个数字对应的像素点
projector.visualize_embeddings(projector_writer,config)#显示三维图


#训练
with tf.Session() as sess:
    sess.run(init)
    for i in range(max_steps):

        #每个批次100个样本
        batch_xs,batch_ys = mnist.train.next_batch(100)
        run_options = tf.RunOptions(trace_level = tf.RunOptions.FULL_TRACE)
        run_metadata = tf.RunMetadata()
        summary,_ = sess.run([merged,train_step],feed_dict={x:batch_xs,y:batch_ys},options=run_options,run_metadata = run_metadata)
        projector_writer.add_run_metadata(run_metadata,'step%03d' % i)
        projector_writer.add_summary(summary,i)

        if i % 100 == 0:
          acc = sess.run(accuracy, feed_dict={x: mnist.test.images, y: mnist.test.labels})  # 测试集里面的图片,以及测试集里面的便签
           # 注意里面的值是images 和labels ,不能忘记加s,如果忘记加s则不能顺利读取mnist数据集里面的东西
          print("Iter:" + str(i) + ", Testing Accuracy " + str(acc))  #

    saver.save(sess,DIR+'projector/projector/a_model.ckpt',global_step= max_steps)  #将训练好的模型保存在如下路径
    projector_writer.close()
    sess.close()

   


运行成功的截图如下所示:
TensorBoard的可视化功能_第1张图片TensorBoard框架可视化如下截图所示:
TensorBoard的可视化功能_第2张图片

你可能感兴趣的:(TensorFlow)