TF Boys (TensorFlow Boys ) 养成记(六)

圣诞节玩的有点嗨,差点忘记更新。祝大家昨天圣诞节快乐,再过几天元旦节快乐。

来继续学习,在/home/your_name/TensorFlow/cifar10/ 下新建文件夹cifar10_train,用来保存训练时的日志logs,继续在/home/your_name/TensorFlow/cifar10/ cifar10.py中输入如下代码:

def train():
    # global_step
    global_step = tf.Variable(0, name = ‘global_step‘, trainable=False)
    # cifar10 数据文件夹
    data_dir = ‘/home/your_name/TensorFlow/cifar10/data/cifar-10-batches-bin/‘
    # 训练时的日志logs文件,没有这个目录要先建一个
    train_dir = ‘/home/your_name/TensorFlow/cifar10/cifar10_train/‘
    # 加载 images,labels
    images, labels = my_cifar10_input.inputs(data_dir, BATCH_SIZE)

    # 求 loss
    loss = losses(inference(images), labels)
    # 设置优化算法,这里用 SGD 随机梯度下降法,恒定学习率
    optimizer = tf.train.GradientDescentOptimizer(LEARNING_RATE)
    # global_step 用来设置初始化
    train_op = optimizer.minimize(loss, global_step = global_step)
    # 保存操作
    saver = tf.train.Saver(tf.all_variables())
    # 汇总操作
    summary_op = tf.merge_all_summaries()
    # 初始化方式是初始化所有变量
    init = tf.initialize_all_variables()

    os.environ[‘CUDA_VISIBLE_DEVICES‘] = str(0)
    config = tf.ConfigProto()
    # 占用 GPU 的 20% 资源
    config.gpu_options.per_process_gpu_memory_fraction = 0.2
    # 设置会话模式,用 InteractiveSession 可交互的会话,逼格高
    sess = tf.InteractiveSession(config=config)
    # 运行初始化
    sess.run(init)

    # 设置多线程协调器
    coord = tf.train.Coordinator()
    # 开始 Queue Runners (队列运行器)
    threads = tf.train.start_queue_runners(sess = sess, coord = coord)
    # 把汇总写进 train_dir,注意此处还没有运行
    summary_writer = tf.train.SummaryWriter(train_dir, sess.graph)

    # 开始训练过程
    try:
        for step in xrange(MAX_STEP):
            if coord.should_stop():
                break
            start_time = time.time()
            # 在会话中运行 loss
            _, loss_value = sess.run([train_op, loss])
            duration = time.time() - start_time
            # 确认收敛
            assert not np.isnan(loss_value), ‘Model diverged with loss = NaN‘
            if step % 30 == 0:
                # 本小节代码设置一些花哨的打印格式,可以不用管
                num_examples_per_step = BATCH_SIZE
                examples_per_sec = num_examples_per_step / duration
                sec_per_batch = float(duration)
                format_str = (‘%s: step %d, loss = %.2f (%.1f examples/sec; %.3f ‘
                              ‘sec/batch)‘)
                print (format_str % (datetime.now(), step, loss_value,
                                     examples_per_sec, sec_per_batch))

            if step % 100 == 0:
                # 运行汇总操作, 写入汇总
                summary_str = sess.run(summary_op)
                summary_writer.add_summary(summary_str, step)                

            if step % 1000 == 0 or (step + 1) == MAX_STEP:
                # 保存当前的模型和权重到 train_dir,global_step 为当前的迭代次数
                checkpoint_path = os.path.join(train_dir, ‘model.ckpt‘)
                saver.save(sess, checkpoint_path, global_step=step)

    except Exception, e:
        coord.request_stop(e)
    finally:
        coord.request_stop()
        coord.join(threads)

    sess.close()

def evaluate():

    data_dir = ‘/home/your_name/TensorFlow/cifar10/data/cifar-10-batches-bin/‘
    train_dir = ‘/home/your_name/TensorFlow/cifar10/cifar10_train/‘
    images, labels = my_cifar10_input.inputs(data_dir, BATCH_SIZE, train = False)

    logits = inference(images)
    saver = tf.train.Saver(tf.all_variables())        

    os.environ[‘CUDA_VISIBLE_DEVICES‘] = str(0)
    config = tf.ConfigProto()
    config.gpu_options.per_process_gpu_memory_fraction = 0.2
    sess = tf.InteractiveSession(config=config)
    coord = tf.train.Coordinator()
    threads = tf.train.start_queue_runners(sess = sess, coord = coord)

    # 加载模型参数
    print("Reading checkpoints...")
    ckpt = tf.train.get_checkpoint_state(train_dir)
    if ckpt and ckpt.model_checkpoint_path:
        ckpt_name = os.path.basename(ckpt.model_checkpoint_path)
        global_step = ckpt.model_checkpoint_path.split(‘/‘)[-1].split(‘-‘)[-1]
        saver.restore(sess, os.path.join(train_dir, ckpt_name))
        print(‘Loading success, global_step is %s‘ % global_step)

    try:
        # 对比分类结果,至于为什么用这个函数,后面详谈
        top_k_op = tf.nn.in_top_k(logits, labels, 1)
        true_count = 0
        step = 0
        while step < 157:
            if coord.should_stop():
                break
            predictions = sess.run(top_k_op)
            true_count += np.sum(predictions)
            step += 1

        precision = true_count / 10000
        print(‘%s: precision @ 1 = %.3f‘ % (datetime.now(), precision))
    except tf.errors.OutOfRangeError:
        coord.request_stop()
    finally:
        coord.request_stop()
        coord.join(threads)

    sess.close()

if __name__ == ‘__main__‘:

    if TRAIN:
        train ()
    else:
        evaluate()

现在说明一下 in_top_k 这个函数的作用,官方文档介绍中: tf.nn.in_top_k(predictions, targets, k, name=None)这个函数返回一个 batch_size 大小的布尔矩阵 array,predictions 是一个 batch_size*classes 大小的矩阵,targets 是一个 batch_size 大小的类别 index 矩阵,这个函数的作用是,如果 targets[i] 是 predictions[i][:] 的前 k 个最大值,则返回的 array[i] = True, 否则,返回的 array[i] = False。可以看到,在上述评估程序 evaluate 中,这个函数没有用 softmax 的结果进行计算,而是用 inference 最后的输出结果(一个全连接层)进行计算。

写完之后,点击运行,可以看到,训练的 loss 值,从刚开始的 2.31 左右,下降到最终的 0.00 左右,在训练的过程中,/home/your_name/TensorFlow/cifar10/cifar10_train/ 文件夹下会出现12个文件,其中有 5 个 model.ckpt-0000 文件,这个是训练过程中保存的模型,后面的数字表示迭代次数,5 个 model.ckpt-0000.meta 文件,这个是训练过程中保存的元数据(暂时不清楚功能),TensorFlow 默认只保存近期的几个模型和几个元数据,删除前面没用的模型和元数据。还有个 checkpoint 的文本文档,和一个 out.tfevents 形式的文件,是summary 的日志文件。如果不想用 tensorboard 看网络结构和训练过程中的权重分布,损失情况等等,在程序中可以不写 summary 语句。

训练完成之后,我们用 tensorboard 进行可视化(事实上在训练的过程中,随时可以可视化)。在任意位置打开命令行终端,输入:

tensorboard --logdir=/home/your_name/TensorFlow/cifar10/cifar10_train/

会出现如下指示:

根据指示,打开浏览器,输入 http://127.0.1.1:6006(有的浏览器可能不支持,建议多换几个浏览器试试)会看到可视化的界面,有六个选项卡:

EVENTS 对话框里面有两个图,一个是训练过程中的 loss 图,一个是队列 queue 的图;由于没有 image_summary() 和 audio_summary() 语句,所以,IMAGES 和 AUDIO 选项卡都没有内容;GRAPHS 选项卡包含了整个模型的流程图,如下图,可以展开和移动选定的 namespace;DISTRBUTIONS 和 HISTOGRAMS 包含了训练时的各种汇总的分布和柱状图。

训练完之后,设置 TRAIN = False,进行测试,得到如下结果:

可以看到,测试的精度只有 76%,测试结果不够高的原因可能是,测试的时候没有经过 softmax 层,直接用全连接层的权重(存疑?),另外官方的代码也给出了官方的运行结果,如下:

可以看到,经过 10 万次迭代,官方给出的正确率达到 83%,我们只进行了 5 万次,达到 76% 的正确率,相对来说,还算可以,效果没有官方好的原因可能是:

1. 官方使用了非固定的学习率;

2. 官方迭代比本代码迭代次数多一倍;

参考文献:

1. https://github.com/tensorflow/models/tree/master/tutorials/image/cifar10

时间: 2024-08-23 23:28:45

TF Boys (TensorFlow Boys ) 养成记(六)的相关文章

TF Boys (TensorFlow Boys ) 养成记(一)

本资料是在Ubuntu14.0.4版本下进行,用来进行图像处理,所以只介绍关于图像处理部分的内容,并且默认TensorFlow已经配置好,如果没有配置好,请参考官方文档配置安装,推荐用pip安装.关于配置TensorFlow,官方已经说得很详细了,我这里就不啰嗦了.官方教程看这里:https://www.tensorflow.org/get_started/os_setup 如果安装了GPU版本的TensorFlow,还需要配置Cuda,关于Cuda安装看这里:https://www.tenso

TF Boys (TensorFlow Boys ) 养成记(五)

郑重声明:此文为本人原创,转载请注明出处:http://www.cnblogs.com/Charles-Wan/p/6207039.html 有了数据,有了网络结构,下面我们就来写 cifar10 的代码. 首先处理输入,在 /home/your_name/TensorFlow/cifar10/ 下建立 cifar10_input.py,输入如下代码: from __future__ import absolute_import # 绝对导入 from __future__ import div

TF Boys (TensorFlow Boys ) 养成记(三)

上次说到了 TensorFlow 从文件读取数据,这次我们来谈一谈变量共享的问题. 为什么要共享变量?我举个简单的例子:例如,当我们研究生成对抗网络GAN的时候,判别器的任务是,如果接收到的是生成器生成的图像,判别器就尝试优化自己的网络结构来使自己输出0,如果接收到的是来自真实数据的图像,那么就尝试优化自己的网络结构来使自己输出1.也就是说,生成图像和真实图像经过判别器的时候,要共享同一套变量,所以TensorFlow引入了变量共享机制. 变量共享主要涉及到两个函数: tf.get_variab

TF Boys (TensorFlow Boys ) 养成记(二)

TensorFlow 的 How-Tos,讲解了这么几点: 1. 变量:创建,初始化,保存,加载,共享: 2. TensorFlow 的可视化学习,(r0.12版本后,加入了Embedding Visualization) 3. 数据的读取: 4. 线程和队列: 5. 分布式的TensorFlow: 6. 增加新的Ops: 7. 自定义数据读取: 由于各种原因,本人只看了前5个部分,剩下的2个部分还没来得及看,时间紧任务重,所以匆匆发车了,以后如果有用到的地方,再回过头来研究.学习过程中深感官方

2016级算法第六次上机-C.AlvinZH的学霸养成记II

1032 AlvinZH的学霸养成记II 思路 中等题,贪心. 所有课程按照DDL的大小来排序. 维护一个当前时间curTime,初始为0. 遍历课程,curTime加上此课程持续时间d,如果这时curTime大于此课程DDL,表示无法学习此课程,但是我们不减去此课程,而是减去用时最长的那门课程(优先队列队首,课时最长). 贪心: 假设当前课程为B,被替换课程为A,则有A.d≥B.d,A.e≤B.e.既然curTime+A.d≤A.e,那么curTime+B.d≤B.e绝对成立,保证了B的合法性

中产阶级养成记:现代人需要的8点能力素养(一)(不服来战,欢迎勾搭)

首先,要说明"中产阶级养成记",这个确实有点"标题党"了.我自认为,关于以下几点的能力素养,对从贫穷晋升到中产阶级方面,有很大帮助,至少我现在是这么想的,也认为是可行的. 自己的家庭或者说家族,本来就是那种平民百姓,在早期属于"农民",最近些年,属于"半农半工","全工"的状态. 作为整个家庭,甚至是家族,几代人中间唯一的一个有较高含金量的"大学生" ,我最想做的事情之一,就是想在经济方

前端工程师养成记:开发环境搭建(Sublime Text必备插件推荐)

为了让自己更像一个前端工程师,决定从开发环境开始武装自己.本文将介绍前段工程师开发的一些利器的安装步骤,主要包括了: 1.Node.js的安装 2.Grunt的安装及常用插件 3.Sublime Text的安装及必备插件 一.Node.js的安装 Node.js就是一堆前端工程师捧红的,所以装上这个嘛,主要不是自己需要使用Node.js而是一堆工具对他的依赖. Windows下安装步骤很简单: 1.去到http://nodejs.org/下载最新的安装包,安装. 2.在CMD下运行,node和n

【活动】DevOps直播技术架构养成记

背景 半月前,参加了UCloud直播云的活动,主题"DevOps|直播技术架构养成记",很是不错的.能够整理出本篇博文,非常感谢参加会议的朋友们在微信群中提供的非常好的资料,以作分享. Now, go into! 低延迟.秒开? 网络视频直播存在已有很长一段时间,随着移动上下行带宽提升及资费的下调,视频直播被赋予了更多娱乐和社交的属性,人们享受随时随地进行直播和观看,主播不满足于单向的直播,观众则更渴望互动,直播的打开时间和延迟变成了影响产品功能发展重要指标.那么,问题来了:如何实现低

网络工程师高手养成记(集),你凑齐了吗?

多数网工都听过很多教程,看过很多书,尤其是刚毕业的网工,刚刚考完CCIE或HCIE,斗志昂扬,但在听到需求后却无从下手. 那些老师没讲过的知识? 老师讲过OSPF骨干区域和Normal区域,讲过各种LSA,但没讲一个城市5个Site该怎么连接最好,拉光纤,MSTP专线,MPLS专线还是IPSEC V P N ?VLAN怎么设计,1个楼层1个还是俩楼层一个?一个Mac笔记本用户使用无线丢包该怎么排错? 给你一张CAD图,你怎么部署设计AP?安全部门要求你办公网全网IP可溯源(查找某一时刻这个IP谁