

英语原文共 367 页,剩余内容已隐藏,支付完成后下载完整资料
探索TensorFlow数据结构
TensorFlow是一个使用数据流图进行数值计算的开源软件库。图中的节点表示数学运算,而图的边表示在它们之间传递的多维数据数组(张量)。 该库包含各种功能,使您能够实现和探索用于图像和文本处理的尖端卷积神经网络(CNN)和循环神经网络(RNN)架构。 由于复杂的计算以图形的形式排列,TensorFlow可以用作一个框架,使您可以轻松地开发自己的模型,并在机器学习领域使用它们。它还能够在从CPU到移动处理器的最异构环境中运行,包括高度并行的GPU计算,并且新的服务架构能够在所有命名选项的非常复杂的混合上运行:
TensorFlow立足于张量的数据管理。张量是来自数学领域的概念,并且被发展为向量和矩阵的线性代数项的概括。在TensorFlow中,张量只是一个类型化的多维数组,具有在张量对象中建模的附加操作。
如先前所讨论的,使用TensorFlow张量数据结构来表示的所有数据。任何张量都具有静态类型和动态维度,因此您可以实时更改张量的内部组织。张量的另一个属性是秩,只有张量类型的对象可以在计算图中的节点之间传递。现在让我们看看张量的属性是什么(从现在开始,每次我们使用张量这个词时,我们都会指TensorFlow的张量对象)。
张量的等级表示张量的维度方面,但与矩阵行列不同。它表示张量所在的维数,而不是行/列或空间等价物中张量扩展的精确度量。一级张量是一个矢量的等效。对于二级张量,您可以使用语法t [i,j]访问任何元素。 对于三级张量,您需要使用t [i,j,k]等来处理元素。在下面的例子中,我们将创建一个张量,并访问其组件之一:
gt;gt;gt; import tensorflow as tf
gt;gt;gt; tens1 = tf.constant([[[1,2],[2,3]],[[3,4],[5,6]]])
gt;gt;gt; print sess.run(tens1)[1,1,0]
这是三级的张量,因为在包含矩阵的每个元素中,都有一个向量元素:
TensorFlow文档使用三种符号约定来描述张量维度:等级,形状和维度编号。下表显示了这些内容之间的关系:
在下面的例子中,我们创建了一个样本等级为3的张量,并打印它的形状:
除了维度,张量具有固定的数据类型。 您可以将以下任何一种数据类型分配给张量
创建新的张量
我们可以创建自己的张量,也可以从着名的numpy库中导出它们。在下面的例子中,我们创造了一些numpy的阵列,并做一些基本的数学运算:
import tensorflow as tf
import numpy as np
x=tf.constant(np.random.rand(32).astype(np.float32))
y=tf.constant ([1,2,3])
TensorFlow与numpy可互操作,通常eval()函数将返回一个numpy对象,准备使用标准数值工具。
提示:
我们必须注意,张量对象是操作结果的符号句柄,因此它不保存它包含的结构的结果值。出于这个原因,我们必须运行eval()方法来获取实际值,这相当于Session.run(tensor_to_eval)。
在下例中,我们构建两个numpy的阵列,并将它们转换为张量:
import tensorflow as tf #we import tensorflow
import numpy as np #we import numpy
sess = tf.Session() #start a new Session Object
x_data = np.array([[1.,2.,3.], [3.,2.,6.]]) # 2x3 matrix
x = tf.convert_to_tensor(x_data, dtype=tf.float32)
帮助:tf.convert_to_tensor:此函数将各种类型的Python对象转换为张量对象。它接受tensorobjects,numpy的阵列,Python列表和Python标量。
与大多数Python模块一样,TensorFlow允许使用Python的交互式控制台:
在上图中,我们调用Python解释器(通过简单地调用Python)并创建一个常量类型的张量。 然后我们再次调用它,Python解释器显示张量的形状和类型。 我们还可以使用IPython解释器,这将允许我们采用与笔记本式工具更兼容的格式,例如Jupyter:
当谈到以交互方式运行TensorFlow会话时,最好使用InteractiveSession对象。 与普通的tf.Session类不同,tf.InteractiveSession类将自身安装为构造时的默认会话。 因此,当您尝试评估张量或运行操作时,没有必要传递Session对象来指示它引用的会话。
TensorFlow的数据流图:
TensorBoard上绘制的简单数据流图形表示简洁地说,数据流图是完整的TensorFlow计算,表示为节点是操作的图形,边缘是在操作之间流动的数据。 通常,节点实现数学运算,但也表示连接数据或变量,或推出结果。边缘描述节点之间的输入/输出关系。 这些数据边缘专门传输张量。 节点被分配给计算设备,并且一旦其输入边缘上的所有张量变得可用,就异步并行地执行。 所有操作都有一个名称并代表一个抽象计算(例如,逆矩阵)。
计算图通常在库用户创建模型将支持的张量和操作时构建,因此无需直接构建Graph()对象。 Python张量构造函数(如tf.constant())将向默认图形添加必要的元素。同样发生了TensorFlow操作。 例如,c = tf.matmul(a,b)创建MatMul类型的操作,该操作将张量a和b作为输入并产生c作为输出。
TensorFlow还提供了一种进给机制,用于将张量直接修补到图中的任何操作中。进料暂时替换的操作用张量的值的输出。 您将提要数据作为run()调用的参数提供。饲料仅用于其所传递的运行呼叫。 最常见的用例是通过使用tf.placeholder()来创建它们,将特定操作指定为feed操作。
在大多数计算中,图形被执行多次。 大多数张量都不会超过图表的单次执行。 但是,变量是一种特殊的操作,它返回一个持久的,可变的张量的句柄,该张量在图形的执行中幸存。 对于TensorFlow的机器学习应用程序,模型的参数通常存储在变量中保存的张量中,并在运行模型的训练图时更新。
要初始化变量,只需调用Variable对象构造函数,并将张量作为参数。在这个例子中,我们初始化的1000零数组一些变量:
b=tf.Variable(tf.zeros([1000])
客户端程序通过创建会话与TensorFlow系统交互。 Session对象表示将运行计算的环境。 Session对象开始为空,当程序员创建不同的操作和张量时,它们将自动添加到Session中,在调用Run()方法之前不会进行计算。 Run()方法采用一组需要计算的输出名称,以及一组可选的张量,用于代替节点的某些输出。 如果我们调用此方法,并且存在命名操作所依赖的操作,则Session对象将执行所有这些操作,然后继续执行命名操作。这句简单的话是创建一个会话所需要的只有一个:
s = tf.Session()
Sample command line output: tensorflow/core/common_runtime/local_session.cc:45]Localsessioninteropparallel
ism threads:6
为了从大数据集中提取和合并有用信息,切片和连接方法允许您合并所需的列信息,而不必占用具有非特定信息的内存空间。 在以下示例中,我们将提取矩阵切片,拆分它们,添加填充,以及打包和解压缩行:
可视化汇总信息是任何数据科学家工具箱的重要组成部分。 TensorBoard是一个软件实用程序,它允许数据流图形的图形表示和用于解释结果的仪表板,通常来自日志记录实用程序:
GUI图形的所有张量和操作都可以设置为将信息写入日志。 TensorBoard会在会话运行时分析正常写入的信息并显示用户有许多图形项,一个用于每个图形项。
命令行用法
要调用TensorBoard,命令行的用法是
我们构建的每个计算图工作时,TensorFlow都有一个实时的日志记录机制,以便保存模型拥有的几乎所有信息。 但是,模型构建器必须考虑它应该保存的可能的百个信息维度中的哪一个,以便稍后用作分析工具。 为了保存所有必需的信息,TensorFlow API使用称为Summaries的数据输出对象。 这些Summaries将结果写入TensorFlow事件文件,这些文件收集Session运行期间生成的所有必需数据。 在以下示例中,我们将直接在生成的事件日志目录上运行TensorBoard:
TensorFlow会话中的所有摘要都是由SummaryWriter对象编写的。调用的主要方法是:tf.train.SummaryWriter .__ init __(logdir,graph_def = None)。此命令将创建一个SummaryWriter和事件的文件,在参数的路径。在该SummaryWriter的构造函数将创建LOGDIR一个新的事件文件。此事件文件将包含在调用以下函数之一时构造的事件类型协议缓冲区:add_summary(),add_session_log(),add_event()或add_graph()。如果你传递一个graph_def协议缓冲区来构造,它被添加到事件的文件。(这相当于稍后调用add_graph())。当您运行TensorBoard时,它将从文件中读取图形定义并以图形方式显示它,以便您可以与它进行交互。首先,创建您希望从中收集摘要数据的TensorFlow图,并决定要使用摘要操作注释哪些节点。TensorFlow中的操作在运行它们之前不会执行任何操作,也不会执行依赖于其输出的操作。我们刚刚创建的摘要节点是图表的外围设备:您当前运行的操作都不依赖于它们。因此,要生成摘要,我们需要运行所有这些摘要节点。手动管理它们会很繁琐,因此请使用tf.merge_all_summaries将它们组合成一个生成所有摘要数据的操作。然后,您可以运行合并的摘要op,它将生成一个序列化的Summary protobuf对象,其中包含给定步骤中的所有摘要数据。最后,要将此摘要数据写入磁盘,请将Summary protobuf传递给tf.train.SummaryWriter。SummaryWriter在其构造函数中使用logdir,这个logdir非常重要,它是将写出所有事件的目录。此外,SummaryWriter可以选择在其构造函数中使用GraphDef。如果它收到一个,那么TensorBoard也会显示你的图形。既然您已经修改了图表并拥有了SummaryWriter,那么您就可以开始运行网络!如果需要,您可以每一步运行合并的摘要操作,并记录大量的培训数据。这很可能是比你需要更多的数据,虽然。相反,请考虑每n步执行合并的摘要操作。
卷积神经网络
neocognitron是卷积网络的前身,由Fukushima教授在1980年的论文中介绍,是一种自组织神经网络。这种想法在1986年再次出现在有关原始反向传播算法的书籍版本中,并且它也在1988年用于语音识别中。 最初的设计在1998年得到了回顾和改进,LeCun的论文《gradientbased learning applied to document recognition》,它提供了LeNet-5网络,该网络能够对手写数字进行分类。与其他现有模型相比,该模型显示出更高的性能,尤其是SVM的几种变体,这是该年度中性能最高的操作之一。然后在2003年对该论文进行了概括,其中包括用于图像解释的分层神经网络。
连续卷积函数的最初使用来自十八世纪,并且可以在原始应用程序的上下文中表示为混合按时发生的两个函数的操作。
而离散卷积函数可以转换为离散域,并以离散项表示离散函数:
当在离散域中应用卷积的概念时,内核被频繁使用。 内核可以定义为nxm维矩阵,它通常是所有维度中长的几个元素,通常,m = n。 卷积运算包括将相应的像素与内核相乘,一次一个像素,并将这些值相加以便将该值分配给中心像素。 然后将应用相同的操作,将卷积矩阵向左移位,直到访问所有可能的像素。 在下面的示例中,我们有一个包含许多像素的图像和一个大小为3x3的内核,这在图像处理中尤为常见:
卷积运算的解释在回顾了连续和离散场的卷积运算的主要特征之后,现在让我们看看这个运算在机器学习中的应用。根据训练的(或在示例中,手动设置)参数,我们可以开始发现参数,例如不同维度的方向和边缘。 我们还可以通过模糊内核等方式来覆盖一些不需要的细节或异常值。 LeCun在他的论文中指出:“卷积网络可以被视为合成他们自己的特征提取器。” 卷积神经网络的这种特性是先前数据处理技术的主要优点; 我们可以非常灵活地确定确定数据集的主要组成部分,
全文共7392字,剩余内容已隐藏,支付完成后下载完整资料
资料编号:[298],资料为PDF文档或Word文档,PDF文档可免费转换为Word
