在本文中,我们将使用Python在TensorFlow中实现一个非常基本的程序,以查看它的运行情况。TensorFlow中的计算包括两个阶段:构建计算图和运行计算图。计算图就是前面提到的数据流图。数据流图的每个节点都将有助于评估TensorFlow计算的运行情况。在TensorFlow中,每个节点将零个或多个张量作为输入并产生一个张量作为输出。一种类型的节点是不可变的,不需要输入,并输出内部存储的值。让我们看看如何在TensorFlow中定义常量。输出语句将是:注意输出不是9.0或19.0,而是张量对象。这是因为我们只是构建了计算图,但没有运行它。在运行它之前,让我们看看上面的输出意味着什么。在Tensor对象中,第一个参数是张量的名称。名称的Const部分是由TensorFlow自己分配给它的,而不是程序员显式指定的。生成的名称后跟一个:,然后是一个数字(本例中为0)。这个数字是被命名的张量的索引。这意味着,一个节点可以产生多个输出或多个张量。在这种情况下,这个数字将是输出中每个张量的下标。这里虽然只有一个输出,所以张量被赋值0。如果再有一个输出,张量将被赋值1。第二个参数表示张量的形状。.第三种是张量的数据类型。您可以显式地给出它,就像第一个常量那样,或者TensorFlow可以推断它,就像第二个常量一样。如果我们想看到9.0和19.0作为输出,我们将不得不实际运行我们刚刚构建的计算图。为此,必须创建会话对象并调用其运行方法。这可以按如下方式完成:以上代码的输出将是9.0和19.0。现在,添加这两个常量。Add是一个操作,而一个操作只是TensorFlow中的另一个节点。上面代码的输出是:这里,+只是tf.add()的简写。那么,如何将自己的价值观传递给它呢?为了实现这些,占位符出现在图片中。占位符承诺稍后提供一个值。让我们快速创建两个占位符并对它们执行操作以便于查看操作。在这里,myValue1和myValue2都是占位符,稍后会提供其值。请注意,此处给出的数据类型是强制性的(dtype)。在调用会话对象的run方法时,可以提供占位符的值,如上例所示。这些值在run方法的feed_dict参数中提供。所以上面代码的输出是:但机器学习的全部意义在于让我们的数据可训练,这样我们就可以训练它,根据训练结果对其进行优化,并获得一个几乎可以在真实数据上工作的模型。那么,我们如何让我们的数据在TensorFlow中可训练呢?为了实现这一点,变量允许我们向我们的程序添加可训练的参数。变量定义如下:Evey变量被初始化为一个值(在本例中为2.0),并且给定的数据类型是可选的。但是变量只是用上面的方式定义的,还没有初始化。当您调用tf.Variable时,变量不会被初始化。要初始化TensorFlow程序中的所有变量,必须显式调用特殊操作,如下所示:重要的是要认识到init是初始化所有全局变量的TensorFlow子图的句柄。在调用sess.run之前,变量不会被初始化。输出myVariable=2.0。如果我们想改变一个变量的值,我们可以使用assign函数,如下所示:(这将输出10.0)好了,现在编写TensorFlow程序的基础已经清楚了,让我们举一个非常简单的例子来实现它。我们将实现以下模式:我们将为zheg程序提供一些训练数据,x的一些值和y的期望值,根据训练数据计算W的值,然后将测试数据提供给查看结果的准确性。由于使用的模型非常简单,准确率很容易达到100%。然而,在真实和更复杂的模型中,这几乎不会发生。但是为了便于理解,可以这样来做。由于我们将为x和y提供值,因此我们将它们声明为占位符。由于每个输入都必须改变W的值,因此将其声明为具有初始值的变量,假设1。声明将如下所示:现在,我们将定义简单模型如下:现在,对于训练数据和更接近于在真实模型中,我们将不得不编写一个损失函数,然后将其最小化。为简单起见,我们使用误差平方和作为损失函数。错误只不过是使用我们的模型的结果与预期值(y)之间的差异。然后将每个输入平方并相加。这是相同的实现:为了简单起见,我们将基于梯度下降优化器的概念构建我们自己的小优化器(如果您不知道这个问题,请不要担心,请继续阅读)来更正W的值,然后测试它。需要做的就是计算模型的损失,操纵W的值使损失最小,检查损失是否减少,并根据损失的结果进一步操纵W的值。这个优化器写的代码如下:当然,loss可以达到0,因为我们用的是简单的模型。对于更复杂的模型,可以适当改变条件。在上面的代码中,加法和减法是用来记住上次执行了什么操作(加法或减法)的标志。currentLoss是存储循环开始时损失函数值的变量,oldLoss是存储循环结束时损失函数值的变量。这两个变量在循环之间进行比较,以检查操作(加法或减法)如何影响损失值,即减少或增加损失值。在此基础上进行进一步的操作。将W的值减少1或将其增加1。这只是一个示例优化器。好的优化器要复杂和高效得多,而且很多已经在TensorFlow中实现了。这只是一个示例优化器,可能无法完美运行,但它可以让您了解TensorFlow的工作原理,这是本文的主要目标。上面写的代码读起来很容易理解,代码中使用的所有内容都在本文中讨论。对于输入,给出[1,2,3,4]的x和[10,20,30,40]的y(期望值)。所以,你可以看到W的值应该是10.0,我们已经初始化为1.0。该模型应使用提供给它的训练数据并将W从1.0转换为10.0,然后在测试数据上使用W。要运行程序,必须初始化全局变量,创建一个会话对象,并在全局变量句柄上调用其运行方法,如下所示:基本上到此结束,为了检查W的值,我们将放置一个输出语句:这将在运行时输出10.0作为输出。这意味着W的值从1.0变为10.0。如果我们为模型提供其他数据来检查y的值,那么我们应该得到该值的10倍。我通过在代码后添加三个输出语句来检查输出:得到的输出是:不出所料,本文以相对简单易懂的方式解释了这些概念。
