ubuntu16.04+python+anaconda+tensorflow的深度学习2

本文详细介绍了Tensorflow的源代码结构,包括contrib、core、examples和python目录下的主要内容,并探讨了Tensorflow源代码的学习方法。同时,文章深入讲解了机器学习的基础知识,包括有监督学习的概念、训练模型的通用框架、保存训练检查点的方法,以及Python的rsplit()方法、os.path.dirname用法和tf.train.get_checkpoint_state。通过对线性回归、对数几率回归和softmax分类的讨论,展示了Tensorflow在深度学习中的应用。
摘要由CSDN通过智能技术生成

目录

 

1、Tensorflow源代码解析

1.1 TensorFlow 的目录结构

1.1.1 contirb 

1.1.2  core

1.1.3 examples

1.1.4 python 

1.2 TensorFlow 源代码的学习方法 

2、机器学习基础

2.1 有监督学习简介

拓展知识1     协调器 tf.train.Coordinator 和入队线程启动器 tf.train.start_queue_runners

2.2 保存训练检查点

拓展知识1    Python rsplit() 方法

拓展知识2   os.path.dirname用法

拓展知识3   tf.train.get_checkpoint_state

2.3 线性回归

拓展知识1 :tf.matmul() 和tf.multiply() 的区别

拓展知识2    tf.squared_difference

拓展知识3   tf.reduce_sum tensorflow维度上的操作

拓展知识4   tf.zeros( shape, dtype=tf.float32, name=None )

2.4  对数几率回归

拓展知识1 t   ensorflow中 tf.reduce_mean函数

拓展知识2    tensorflow中四种不同交叉熵函数

拓展知识1     tf.train.string_input_producer()

拓展知识2      十图详解TensorFlow数据读取机制(附代码)

拓展知识2      文件读取器

拓展知识3   tf.train.shuffle_batch

拓展知识1        tf.equal()用法:

拓展知识2         tf.pack

拓展知识1     tf.data

拓展知识3 :  使用sess.run的情况总结

拓展知识3     python中获取路径函数区别

拓展知识4    os.path.join()函数

拓展知识4   assert 断言

2.5  softmax分类

拓展知识1 :  tf.argmax() 用法

拓展知识2 :  tf.cast()

拓展知识3:tf.stack()和tf.unstack()的用法__函数用法

拓展知识4     tf.nn.sparse_softmax_cross_entropy_with_logits()和tf.nn.softmax_cross_entropy_with_logits()的区别

2.6   多层神经网络


1、Tensorflow源代码解析

1.1 TensorFlow 的目录结构

1.1.1 contirb 

              contrib 目录中保存的是将常用的功能封装成的高级 API。但是这个目录并不是官方支持的,很有可能在高级 API 完善后被官方迁移到核心的 TensorFlow 目录中或去掉,现在有一部分包(package)在 https://github.com/tensorflow/models 有了更完整的体现。这里重点介绍几个常用包

            ● framework:很多函数(如 get_variables、get_global_step)都在这里定义,还有一些废弃或者不推推(deprecated)的函数。
            ● layers:这个包主要有 initializers.py、layers.py、optimizers.py、regularizers.py、summaries.py等文件。initializers.py 中主要是做变量初始化的函数。layers.py 中有关于层操作和权重偏置变量的函数。optimizers.py 中包含损失函数和 global_step 张量的优化器作。
regularizers.py 中包含带有权重的正则化函数。summaries.py 中包含将摘要操作添加到tf.GraphKeys.SUMMARIES 集合中的函数。
            ● learn:这个包是使用 TensorFlow 进行深度学习的高级 API,包括完成训练模型和评估模型、读取批处理数据和队列功能的 API 封装。
            ● rnn:这个包提供额外的 RNN Cell,也就是对 RNN 隐藏层的各种改进,如 LSTMBlockCell、GRUBlockCell、FusedRNNCell、GridLSTMCell、AttentionCellWrapper 等。
            ● seq2seq:这个包提供了建立神经网络 seq2seq 层和损失函数的操作。
            ● slim:TensorFlow-Slim (TF-Slim)是一个用于定义、训练和评估 TensorFlow 中的复杂模型的轻量级库。在使用中可以将 TF-Slim 与 TensorFlow 的原生函数和 tf.contrib 中的其他包进行自由组合。TF-Slim 现在已经被逐渐迁移到 TensorFlow 开源的 Models①
中,这里包含了几种广泛使用的卷积神经网络图像分类模型的代码,可以从头训练模型或者预训练模型开始微调。

1.1.2  core

             这个目录中保存的都是 C 语言的文件,是 TensorFlow 的原始实现

             

              ├── BUILD 
              ├── common_runtime # 公共运行库
              ├── debug 
              ├── distributed_runtime # 分布式执行模块,含有grpc session、grpc worker、 grpc master 等
              ├── example 
              ├── framework # 基础功能模块
              ├── graph 
              ├── kernels # 一些核心操作在 CPU、CUDA 内核上的实现
              ├── lib # 公共基础库
              ├── ops 
              ├── platform # 操作系统实现相关文件
              ├── protobuf # .proto 文件,用于传输时的结构序列化
              ├── public # API 的头文件目录
              ├── user_ops 
              └── util 

               Protocol Buffers 是谷歌公司创建的一个数据序列化②(serialization)工具,可以用于结构化数据序列化,很适合作为数据存储或者 RPC 数据交换的格式。定义完协议缓冲区后,将生成.pb.h和.pb.cc 文件,其中定义了相应的 get、set 以及序列化和反序列化函数。TensorFlow 的几个核心proto 文件 graph_def.proto、node_def.proto、op_def.proto 都保存在 framework 目录中。构图时先构建 graph_def,存储下来,然后在实际计算时再转成如图、节点、操作等的内存对象。

1.1.3 examples

              examples 目录中给出了深度学习的一些例子,包括 MNIST、Word2vec、Deepdream、Iris、HDF5 的一些例子,对入门非常有帮助。此外,这个目录中还有 TensorFlow 在 Android 系统上的移动端实现,以及一些扩展为.ipynb 的文档教程,可以用 jupyter 打开

1.1.4 python 

               大部分函数都存在于此目录中,比如激活函数、卷积函数、池化函数、损失函数、优化方法等

1.2 TensorFlow 源代码的学习方法 

           (1)了解自己要研究的基本领域,如图像分类、物体检测、语音识别等,了解对应这个领域所用的技术,如卷积神经网络(convolutional neural network,CNN)和循环神经网络(recurrent neural network,RNN),知道实现的基本原理。
          (2)尝试运行 GitHub 【https://github.com/tensorflow/models】上对应的基本模型,

               

              如果研究领域是计算机视觉,可以看代码中的如下几个目录:compresssion(图像压缩)、im2txt(图像描述)、inception(对 ImageNet 数据集用 Inception V3 架构去训练和评估)、resnet(残差网络)、slim(图像分类)和 street(路标识别或验证码识别)。

               如果研究领域是自然语言处理,可以看 lm_1b(语言模型)、namignizer(起名字)、swivel(使用 Swivel 算法转换词向量)、syntaxnet(分词和语法分析)、textsum(文本摘要)以及 tutorials目录里的 word2vec(词转换为向量)。

              这些都是教科书式的代码,看懂学懂对今后自己实现模型大有裨益。尝试运行上述模型,并对模型进行调试和调参。当你完整阅读完 MNIST 或者 CIFAR10 整个项目的逻辑后,就会掌握 TensorFlow 项目架构

            重说一下 slim 目录,该目录中 TF-Slim 是图像分类的一个库,它包含用于定义、训练和评估复杂模型的轻量级高级 API。可以用于训练和评估的几个广泛使用的 CNN 图像分类模型,如 lenet、alexnet、vgg、inception_v1、inception_v2 inception_v3、inception_v4、resnet_v1、resnet_v2 等,这些模型都位于 slim/nets 中,具体如下

               

              TF-Slim 包含的脚本可以让人从头训练模型或从预先训练的网络开始训练模型并微调,这些脚本位于 slim/scripts,具体如下

             

         TF-Slim 还包含用于下载标准图像数据集,将其转换为 TensorFlow 支持的 TFRecords 格式,这些脚本位于 slim/datasets,具体如下

             

               随后可以轻松地在任何上述数据集上训练任何模型

            (3)结合要做的项目,找到相关的论文,自己用 TensorFlow 实现这篇论文的内容,这会让你有一个质的飞跃

2、机器学习基础

2.1 有监督学习简介

              监督学习问题中,我们的目标是依据某个带标注信息的输入数据集(即其中的每个样本都标注了真实的或期望的输出)去训练一个推断模型。该模型应能覆盖一个数据集,并可对不存在于初始训练集中的新样本的输出进行预测

            推断模型即运用到数据上的一系列数学运算。具体的运算步骤是通过代码设置的,并由用于求解某个给定问题的模型确定。模型确定后,构成模型的运算也就固定了。在各运算内部,有一些与其定义相关的数值,如“乘以3”、“加2”。这些值都是模型的参数,且在训练过程中需要不断更新,以使模型能够学习,并对其输出进行调整

           虽然不同的推断模型在所使用的运算的数量、运算的组合方式以及所使用的参数数量上千差万别,但对于训练,我们始终可采用相同的一般结构:

                

               数据流图的高层、通用训练闭环

               我们创建了一个训练闭环,它具有如下功能。
              ·首先对模型参数进行初始化。通常采用对参数随机赋值的方法,但对于比较简单的模型,也可以将各参数的初值均设为0。
              ·读取训练数据(包括每个数据样本及其期望输出)。通常人们会在这些数据送入模型之前,随机打乱样本的次序。
              ·在训练数据上执行推断模型。这样,在当前模型参数配置下,每个训练样本都会得到一个输出值。
              ·计算损失,损失是一个能够刻画模型在最后一步得到的输出与来自训练集的期望输出之间差距的概括性指标。
             ·调整模型参数。这一步对应于实际的学习过程。给定损失函数,学习的目的在于通过大量训练步骤改善各参数的值,从而将损失最小化。最常见的策略是使用梯度下降算法。

              上述闭环会依据所需的学习速率、所给定的模型及其输入数据,通过大量循环不断重复上述过程。
              当训练结束后,便进入评估阶段。在这一阶段中,我们需要对一个同样含有期望输出信息的不同测试集依据模型进行推断,并评估模型在该数据集上的损失。该测试集中包含了何种样本,模型是预先无法获悉的。通过评估,可以了解到所训练的模型在训练集之外的推广能力。一种常见的方法是将原始数据集一分为二,将70%的样本用于训练,其余30%的样本用于评估

             下面利用上述结构为模型训练和评估定义一个通用的代码框架

import tensorflow as tf  # 导入tensorflow库
import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '3'   # 设置输出等级,此时不输出警告

#  初始化变量和模型参数,定义训练闭环中的运算;inference的中文翻译是推测


def inference(x):
    # 计算推断模型在数据x上的输出,并将结果返回
    return y


def loss(x,y):
    # 依据训练数据x及其期望输出y计算损失
    return total_loss


def inputs():
    # 读取或生成训练数据x及其期望输出y
    return x, y


def train(total_loss):
    # 根据计算的总损失训练或调整模型参数
    return train_op


def evaluate(sess, x, y):
    # 对训练得到的模型进行评估
    return evaluate_value


#  在一个会话中启动数据流图,搭建流程
with tf.Session() as sess:
    # 初始化所有的变量
    tf.global_variables_initializer().run()
    # 获取训练数据
    x, y = inputs()
    # 获取所有损失值
    total_loss = loss(x, y)
    # 获取经过此次训练更新后的模型参数
    train_op = train(total_loss)
    # 创建一个线程管理器(协调器)对象
    coord = tf.train.Coordinator()
    # 启动多个线程的同时将多个tensor(数据)推入内存序列中
    threads = tf.train.start_queue_runners(sess=sess, coord=coord)
    # 实际的训练迭代次数
    training_step = 1000
    for step in range(training_step):
        train_op = sess.run([train_op])
        # 出于调试和学习的目的,查看损失在训练过程中递减的情况
        if step % 10 ==0:
            print('loss:', train_op)
    # 评估现在的模型
    evaluate_value = evaluate(sess, x, y)

    # 终止所有的行程
    coord.request_stop()
    # 把线程加入主线程,等待threads结束
    coord.join(threads)
    # 关闭会话
    sess.close()

拓展知识1     协调器 tf.train.Coordinator 和入队线程启动器 tf.train.start_queue_runners

                              https://blog.csdn.net/weixin_42052460/article/details/80714539

                             TensorFlow的Session对象是支持多线程的,可以在同一个会话(Session)中创建多个线程,并行执行。在  Session 中的所有线程都必须能被同步终止,异常必须能被正确捕获并报告,会话终止时, 队列必须能被正确地关闭ensorFlow提供了两个类来实现对Session中多线程的管理:tf.Coordinator和 tf.QueueRunner,这两个类往往一起使用。

                             Coordinator类用来管理在Session中的多个线程,可以用来同时停止多个工作线程并且向那个在等待所有工作线程终止的程序报告异常,该线程捕获到这个异常之后就会终止所有线程。使用 tf.train.Coordinator()来创建一个线程管理器(协调器)对象。

                            QueueRunner类用来启动tensor的入队线程,可以用来启动多个工作线程同时将多个tensor(训练数据)推送  入文件名称队列中,具体执行函数是 tf.train.start_queue_runners , 只有调用 tf.train.start_queue_runners 之后,才会真正把tensor推入内存序列中,供计算单元调用,否则会由于内存序列为空,数据流图会处于一直等待状态。


               以上便是模型训练和评估的基本代码框架。首先需要对模型参数进行初始化;然后为每个训练闭环中的运算定义一个方法:读取训练数据(inputs方法),计算推断模型(inference方法),计算相对期望输出的损失(loss方法),调整模型参数(train方法),评估训练得到的模型(evaluate方法);之后,启动一个会话对象,并运行训练闭环。在接下来的几节中,将针对不同类型的推断模型为这些模板方法填充所需的代码。当对模型的响应满意后,便可将精力放在模型导出,以及用它对所需要使用的数据进行推断上。

2.2 保存训练检查点

             上文曾经提到,训练模型意味着通过许多个训练周期更新其参数(或者用TensorFlow的语言来说,变量)。由于变量都保存在内存中,所以若计算机经历长时间训练后突然断电,所有工作都将丢失。幸运的是,借助tf.train.Saver类可将数据流图中的变量保存到专门的二进制文件中。我们应当周期性地保存所有变量,创建检查点(checkpoint)文件,并在必要时从最近的检查点恢复训练

             为使用Saver类,需要对之前的训练闭环代码框架略做修改:

import tensorflow as tf  # 导入tensorflow库
import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '3'   # 设置输出等级,此时不输出警告

#  初始化变量和模型参数,定义训练闭环中的运算;inference的中文翻译是推测


def inference(x):
    # 计算推断模型在数据x上的输出,并将结果返回
    return y


def loss(x, y):
    # 依据训练数据x及其期望输出y计算损失
    return total_loss


def inputs():
    # 读取或生成训练数据x及其期望输出y
    return x, y


def train(total_loss):
    # 根据计算的总损失训练或调整模型参数
    return train_op


def evaluate(sess, x, y):
    # 对训练得到的模型进行评估
    return evaluate_value


# 创建一个saver对象
saver = tf.train.Saver()

#  在一个会话中启动数据流图,搭建流程
with tf.Session() as sess:
    # 初始化所有的变量
    tf.global_variables_initializer().run()
    # 获取训练数据
    x, y = inputs()
    # 获取所有损失值
    total_loss = loss(x, y)
    # 获取经过此次训练更新后的模型参数
    train_op = train(total_loss)
    # 创建一个线程管理器(协调器)对象
    coord = tf.train.Coordinator()
    # 启动多个线程的同时将多个tensor(数据)推入内存序列中
    threads = tf.train.start_queue_runners(sess=sess, coord=coord)
    # 实际的训练迭代次数
    training_step = 1000
    for step in range(training_step):
        train_op = sess.run([train_op])
        # 出于调试和学习的目的,查看损失在训练过程中递减的情况
        if step % 10 == 0:
            saver.save(sess,'my-model', global_step=step)
            print('loss:', train_op)
    # 评估现在的模型
    evaluate_value = evaluate(sess, x, y)

    # 终止所有的行程
    coord.request_stop()
    # 把线程加入主线程,等待threads结束
    coord.join(threads)
    # 保存训练模型
    saver.save(sess, 'my_model', global_step=training_step)
    # 关闭会话
    sess.close()

              在上述代码中,在开启会话对象之前实例化了一个Saver对象,然后在训练闭环部分插入了几行代码,使的每完成10次训练迭代便调用一次tf.train.Saver.save方法,并在训练结束后,再次调用该方法。每次调用tf.train.Saver.save方法都将创建一个遵循命名模板my-model-{step}的检查点文件,如my-model-10、my-model-20等。该文件会保存每个变量的当前值。默认情况下,Saver对象只会保留最近的5个文件,更早的文件都将被自动删除。

               如果希望从某个检查点恢复训练,则应使用tf.train.get_checkpoint_state方法,以验证之前是否有检查点文件被保存下来,而tf.train.Saver.restore方法将负责恢复变量的值

import tensorflow as tf  # 导入tensorflow库
import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '3'   # 设置输出等级,此时不输出警告

#  initialize variables/model parameters(初始化变量和模型参数)


# define the training loop operations(定义训练闭环中的运算)
def inference(x):
    # compute inference model over data X and return the result
    # 计算推断模型在数据x上的输出,并将结果返回
    return y


def loss(x, y):
    # compute loss over training data X and expected values Y
    # 依据训练数据x及其期望输出y计算损失
    return total_loss


def inputs():
    # read/generate input training data X and expected outputs Y
    # 读取或生成训练数据x及其期望输出y
    return x,y


def train(total_loss):
    # train / adjust model parameters according to computed total loss
    # 根据计算的总损失训练或调整模型参数
    return train_op


def evaluate(sess, x, y):
    # evaluate the resulting trained model
    # 对训练得到的模型进行评估
    return evaluate_value


# 创建一个saver对象
saver = tf.train.Saver()

#  在一个会话中启动数据流图,搭建流程
with tf.Session() as sess:
    # 初始化所有的变量
    tf.global_variables_initializer().run()
    # 获取训练数据
    x, y = inputs()
    # 获取所有损失值
    total_loss = loss(x, y)
    # 获取经过此次训练更新后的模型参数
    train_op = train(total_loss)
    # 创建一个线程管理器(协调器)对象
    coord = tf.train.Coordinator()
    # 启动多个线程的同时将多个tensor(数据)推入内存序列中
    threads = tf.train.start_queue_runners(sess=sess, coord=coord)
    # 验证之前是否已经保存了检查点文件,若有则恢复
    initial_step = 0
    # 检查当前文件的绝对目录下是否有检查点文件
    ckpt = tf.train.get_checkpoint_state(os.path.dirname('__file__'))
    # 如果有检查点文件,则恢复参数
    if ckpt and ckpt.model_checkpoint_path:
        saver.restore(sess, ckpt.model_checkpoint_path)
        initial_step = int(ckpt.model_checkpoint_path.rsplit('-', 1)[1])
    # 实际的训练迭代次数
    training_step = 1000
    for step in range(training_step):
        train_op = sess.run([train_op])
        # 出于调试和学习的目的,查看损失在训练过程中递减的情况
        if step % 10 == 0:
            saver.save(sess,'my-model', global_step=step)
            print('loss:', train_op)
    # 评估现在的模型
    evaluate_value = evaluate(sess, x, y)

    # 终止所有的行程
    coord.request_stop()
    # 把线程加入主线程,等待threads结束
    coord.join(threads)
    # 保存训练模型
    saver.save(sess, 'my_model', global_step=training_step)
    # 关闭会话
    sess.close()

拓展知识1    Python rsplit() 方法

                           http://www.cnblogs.com/wushuaishuai/p/7792874.html

                          Python rsplit() 方法通过指定分隔符对字符串进行分割并返回一个列表,默认分隔符为所有空字符,包括空格、换行(\n)、制表符(\t)等。类似于 split() 方法,只不过是从字符串最后面开始分割

                          rsplit() 方法语法       S.rsplit([sep=None][,count=S.count(sep)])

                          sep -- 可选参数,指定的分隔符,默认为所有的空字符,包括空格、换行(\n)、制表符(\t)等。                                                                        count -- 可选参数,分割次数,默认为分隔符在字符串中出现的总次数。

拓展知识2   os.path.dirname用法

                           https://blog.csdn.net/weixin_38470851/article/details/80367143

                           os.path.dirname(path)      功能:去掉文件名,返回目录 

                           os.path.dirname(__file__)         功能: 得到当前文件的绝对路径

                            __file__表示了当前文件的path

拓展知识3   tf.train.get_checkpoint_state

                            https://blog.csdn.net/changeforeve/article/details/80268522

                           tf.train.get_checkpoint_state(checkpoint_dir,latest_filename=None)通过checkpoint文件checkpoint_dir找到模型文件名

                        函数返回:checkpoint文件CheckpointState proto类型的内容,其有model_checkpoint_path和all_model_checkpoint_paths两个属性。其中model_checkpoint_path保存了最新的tensorflow模型文件的文件名,all_model_checkpoint_paths则有未被删除的所有tensorflow模型文件的文件名


2.3 线性回归

              在有监督学习问题中,线性回归是一种最简单的建模手段。给定一个数据点集合作为训练集,线性回归的目标是找到一个与这些数据最为吻合的线性函数。对于2D数据,这样的函数对应一条直线。

                    

                   上图展示了一个2D情形下的线性回归模型。图中的点代表训练数据,而直线代表模型的推断结果。

                   下面运用少量数学公式解释线性回归模型的基本原理。线性函数的一般表达式为:

                    

                   其矩阵(或张量)形式为: 

                   
                  ·Y为待预测的值。
                  ·x1 ,x2 ,…,xk 是一组独立的预测变量;在使用模型对新样本进行预测时,需要提供这些值。若采用矩阵形式,可一次性提供多个样本,其中每行对应一个样本。
                 ·w1 ,w2 ,…,wk 为模型从训练数据中学习到的参数,或赋予每个变量的“权值”。
                 ·b也是一个学习到的参数,这个线性函数中的常量也称为模型的偏置(bias)。

                 下面用代码来表示这种模型。这里没有使用权值的转置,而是将它们定义为单个列向

import tensorflow as tf  # 导入tensorflow库
import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '3'   # 设置输出等级,此时不输出警告


#  初始化变脸和模型参数,定义训练闭环中的运算;inference的中文翻译是推测
w = tf.Variable(tf.zeros([2, 1]), name='weights')
b = tf.Variable(0, name='bias')
init = tf.global_variables_initializer()


def inference(x):
    return tf.matmul(x, w)+b

               接下来需要定义如何计算损失。对于这种简单的模型,将采用总平方误差,即模型对每个训练样本的预测值与期望输出之差的平方的总和。从代数角度看,这个损失函数实际上是预测的输出

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值