Tensorflow 笔记:输入手写数字输出识别结果 (第六讲)
Tensorflow 笔记:第六讲
输入手写数字输出识别结果
本节目标:1、实现断点续训
2、输入真实图片,输出预测结果
3、制作数据集,实现特定应用
6.1
一、断点续传
√关键处理:加入 ckpt 操作:
二、输入真实图片,输出预测结果

√网络输入:一维数组(784 个像素点)
28x28input: 1x784

√像素点:0-1 之间的浮点数(接近 0 越黑,接近 1 越白)

√网络输出:一维数组(十个可能性概率),数组中最大的那个元素所对应的索引号就是预测的结果。
√关键处理:def application():
testNum = input("input the number of test pictures:")
for i in range(testNum):
testPic = raw_input("the path of test picture:")
testPicArr = pre_pic(testPic)
preValue = restore_model(testPicArr)
print "The prediction number is:", preValue
注解:
任务分成两个函数完成
1) testPicArr = pre_pic(testPic) 对手写数字图片做预处理√具体代码:



2) 运行 mnist_test.py 来监测模型的准确率


6.2
制作数据集,实现特定应用:1、数据集生成读取文件(mnist_generateds.py)
√tfrecords 文件
1) tfrecords:是一种二进制文件,可先将图片和标签制作成该格式的文件。使用 tfrecords 进行数据读取,会提高内存利用率。
2) tf.train.Example: 用来存储训练数据。训练数据的特征用键值对的形式表示。
如:‘img_raw’:值 ‘label’:值,值是 Byteslist/FloatList/Int64List
3)SerializeToString( ):把数据序列化成字符串存储。
√生成 tfrecords 文件
具体代码:

注解:
1)writer = tf.python_io.TFRecordWriter(tfRecordName) #新建一个 writer 
注解:
1)
filename_queue = tf.train.string_input_producer([tfRecord_path])
tf.train.string_input_producer( string_tensor,
num_epochs=None, shuffle=True, seed=None, capacity=32, shared_name=None, name=None, cancel_op=None)
该函数会生成一个先入先出的队列,文件阅读器会使用它来读取数据。
参数说明:string_tensor: 存储图像和标签信息的 TFRecord 文件名列表
num_epochs: 循环读取的轮数(可选)
shuffle:布尔值(可选),如果为 True,则在每轮随机打乱读取顺序
seed:随机读取时设置的种子(可选)
capacity:设置队列容量
shared_name:(可选) 如果设置,该队列将在多个会话中以给定名称共享。所有具有此队列的设备都可以通过 shared_name 访问它。在分布式设置中使用这种方法意味着每个名称只能被访问此操作的其中一个会话看到。
name:操作的名称(可选)
cancel_op:取消队列(None)
2)reader = tf.TFRecordReader() # 新 建 一 个 reader
3)serialized_example = reader.read(filename_queue)
features = tf.parse_single_example(serialized_example,features={
'img_raw': tf.FixedLenFeature([ ], tf.string) ,
'label': tf.FixedLenFeature([10], tf.int64)})
#把读出的每个样本保存在 serialized_example 中进行解序列化,标签和图片的键名应该和制作 tfrecords 的键名相同,其中标签给出几分类。tf.parse_single_example(serialized,features,
name=None,
example_names=None)
该函数可以将 tf.train.Example 协议内存块(protocol buffer)解析为张量。
参数说明:serialized: 一个标量字符串张量
features: 一个字典映射功能键 FixedLenFeature 或 VarLenFeature 值,也就是在协议内存块中储存的
name:操作的名称(可选)
example_names: 标量字符串联的名称(可选)参数说明:
tensors: 待乱序处理的列表中的样本(图像和标签)
batch_size: 从队列中提取的新批量大小
capacity:队列中元素的最大数量
min_after_dequeue: 出队后队列中的最小数量元素,用于确保元素的混合级别
num_threads: 排列 tensors 的线程数
seed:用于队列内的随机洗牌
enqueue_many: tensor 中的每个张量是否是一个例子
shapes: 每个示例的形状
allow_smaller_final_batch: (可选)布尔值。 如果为 True,则在队列中剩余数量不足时允许最终批次更小。
shared_name:(可选)如果设置,该队列将在多个会话中以给定名称共享。
name:操作的名称(可选) 10)return img_batch,label_batch
#返回的图片和标签为随机抽取的 batch_size 组2、反向传播文件修改图片标签获取的接口(mnist_backward.py)
√关键操作:利用多线程提高图片和标签的批获取效率方法:将批获取的操作放到线程协调器开启和关闭之间 开启线程协调器:
coord = tf.train.Coordinator( )
threads = tf.train.start_queue_runners(sess=sess, coord=coord)
关闭线程协调器:
coord.request_stop( )
coord.join(threads)
注解:tf.train.start_queue_runners( sess=None,
coord=None,
daemon=True,
start=True,
collection=tf.GraphKeys.QUEUE_RUNNERS)
这个函数将会启动输入队列的线程,填充训练样本到队列中,以便出队操作可以从队列中拿到样本。这种情况下最好配合使用一个 tf.train.Coordinator ,这样可以在发生错误的情况下正确地关闭这些线程。
参数说明:
sess:用于运行队列操作的会话。 默认为默认会话。
coord:可选协调器,用于协调启动的线程。
daemon: 守护进程,线程是否应该标记为守护进程,这意味着它们不会阻止程序退出。
start:设置为 False 只创建线程,不启动它们。
collection :指定图集合以获取启动队列的 GraphKey 。默认为GraphKeys.QUEUE_RUNNERS。
√具体对比反向传播中的 fc4 与 fc3 代码


3、测试文件修改图片标签获取的接口(mnist_test.py)
√具体对比反向传播中的 fc4 与 fc3 代码(和反向传播类似)


注 解 :
现在:要手动给出测试的总样本数,这个数是 1 万。
2)image_batch, label_batch=mnist_generateds.get_tfrecord(TEST_NUM,isTrain=False)
之前:用 mnist.test.next_batch 函数读出图片和标签喂给网络;
现在:用函数 get_tfrecord 替换读取所有测试集 1 万张图片。
isTrain:用来区分训练阶段和测试阶段,True 表示训练,False 表示测试。
3)xs,ys=sess.run([img_batch,label_batch])
之前:使用函数 xs,ys=mnist.test.next_batch(BATCH_SIZE)
现在:在 sess.run 中执行图片和标签的批获取。
4、实践代码验证
1) 运行测试代码 mnist_test.py

2) 准确率稳定在 95%以上后运行应用程序 mnist_app.py


浙公网安备 33010602011771号