在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()