TensorFlow 小抄(一)

各位好久不见了,最近事情有点多,还在适应工作节奏吧(下班回去就觉得很困了,人的惰性真可怕。。。)可能最近2-3周都没时间更新了(特殊原因),希望我回来后,你们还在哈,别取关了。

目录

闲扯淡TensorFlow FundamentalsTensorFlow 基础了解静态和动态形状范围的使用广播

闲扯淡

如今AI这么火,最牛的技术当属深度学习,而在我们Python中最厉害的一把利器当属Google开发的了。之前发过一系列深度学习的框架———,之所以这个工具好用,主要是因为非常简单很容易上手,掌握一些基本的深度学习理论就可以很自如得调用其中的一些方法,而且都是有套路可循的。

TensorFlow与其他数值计算库(如NumPy)之间最显着的区别在于TensorFlow中的操作是。这是一个强大的概念,它允许TensorFlow完成所有类型的事情(例如自动区分),而NumPy等命令式库是不可能完成的。但这也是以让它更难掌握为代价的(有利必有弊)。

TensorFlow Fundamentals

TensorFlow 基础

让我们先从一个简单的例子开始,我们想要两个随机矩阵相乘。看看用NumPy该怎么搞:

现在在TensorFlow中执行完全相同的计算:

与立即执行计算并生成结果的NumPy不同,。如果我们尝试直接打印z的值,我们会得到这样的结果:

由于两个输入都具有完全定义的形状,因此张量流能够推断张量的形状及其类型。为了计算张量的值,我们需要创建一个会话并使用Session.run()方法对其进行评估。

要理解强大的符号计算,我们可以看看另一个例子。

假设我们有一条曲线的样本(比如f(x)= 5x ^ 2 + 3),我们想要根据这些样本估计f(x)。我们定义一个参数函数g(x,w)= w0 x ^ 2 + w1 x + w2,它是输入x和潜在参数w的函数,我们的目标是找到潜在的参数,使得g(x,w)≈f(x)。这可以通过最小化以下损失函数来完成:L(w)=Σ(f(x)-g(x,w))^ 2。虽然这个简单问题有一个,但我们选择使用更通用的方法,可以应用于任意任意的可微函数,并且使用。我们。

结果为参数的一个相对接近的近似值。:

了解静态和动态形状

TensorFlow中的张量具有静态形状属性,该属性在图形构造期间确定。静态形状可能未指定。例如,我们可以定义一个形状张量[None,128]:

。您可以按如下方式查询Tensor的静态形状:

要获得张量的动态形状,可以调用tf.shape ,它返回一个表示给定张量形状的张量:

可以使用Tensor.set_shape()方法设置张量的静态形状:

您可以使用tf.reshape函数动态重塑给定的张量:

在可用时返回静态形状的函数和不在时返回动态形状的函数可能很方便。以下实用程序功能就是这样:

实际上,我们可以编写一个通用的重塑函数来折叠任何维度列表:

折叠第二个维度变得非常容易:

范围的使用

TensorFlow中的变量和张量具有name属性,用于在符号图中标识它们。如果在创建变量或张量时未指定名称,TensorFlow会自动为您指定名称:

可以通过显式指定来覆盖默认名称:

TensorFlow引入了两个不同的上下文管理器来改变张量和变量的名称。第一个是tf.name_scope:

请注意,有两种方法可以在TensorFlow中定义新变量,方法是创建tf.Variable对象或调用tf.get_variable。使用新名称调用tf.get_variable会导致创建新变量,但如果存在具有相同名称的变量,则会引发ValueError异常,告诉我们不允许重新声明变量。

tf.name_scope影响使用tf.Variable创建的张量和变量的名称,但不影响使用tf.get_variable创建的变量。

与tf.name_scope不同,tf.variable_scope也修改了使用tf.get_variable创建的变量的名称:

但是,如果我们真的想要重用先前声明的变量呢?变量范围还提供了执行此操作的功能:

这在使用内置神经网络层时变得很方便:

或者可以将重用设置为tf.AUTO_REUSE,如果不存在具有相同名称的变量,则告知TensorFlow创建新变量,否则重用:

如果你想做很多变量共享,跟踪何时定义新变量以及何时重用它们可能很麻烦且容易出错。tf.AUTO_REUSE简化了此任务,但增加了共享不应共享的变量的风险。TensorFlow模板是解决同一问题的另一种方法,没有这种风险:

广播

TensorFlow支持广播元素操作。通常,当您想要执行加法和乘法等操作时,您需要确保操作数的形状匹配,例如,你不能将形状张量[3,2]添加到形状张量[3,4]。但是有一个特例,那就是你有一个单一的维度。TensorFlow隐式地将张量跨越其奇异维度以匹配另一个操作数的形状。因此,将张量形状[3,2]添加到形状张量[3,1]是有效的。

广播允许我们执行隐式平铺,这使得代码更短,内存效率更高,因为我们不需要存储平铺操作的结果。可以使用的一个巧妙的地方是组合不同长度的特征。为了连接不同长度的特征,我们通常平铺输入张量,连接结果并应用一些非线性。这是各种神经网络架构的常见模式:

但这可以通过广播更有效地完成。我们使用f(m(x + y))等于f(mx + my)的事实。所以我们可以单独进行线性操作,并使用广播进行隐式连接:

实际上,这段代码非常通用,只要可以在张量之间进行广播,就可以应用于任意形状的张量:

到目前为止,我们讨论了广播的好处。但是你可能会问的缺点是什么?隐含的假设几乎总是让调试变得更难。请考虑以下示例:

您认为评估后c的价值是什么?如果你猜对了6,那就错了。它将是12.这是因为当两个张量的秩不匹配时,TensorFlow会在元素运算之前自动扩展张量的第一维,并且加法的结果将是[[2,3],[3,4]],减少所有参数将给我们12。

避免这个问题的方法是尽可能明确。如果我们指定了我们希望减少哪个维度,那么捕获这个bug会更容易:

这里c的值是[5,7],我们立即根据结果的形状猜测出错了。一般的经验法则是。

TensorFlow系列下期预告:

数据提供给TensorFlow

重载运算符

希望大家多多关注并支持哦,想要入坑的小伙伴可在公众号后台点击“入坑”即可

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180729G1DZOD00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券