<p>只是对<a href="https://stackoverflow.com/a/57176796/1782792">Stewart_R</a>已经说过的内容进行一点扩展。在大多数情况下,当您使用TensorFlow操作时,您使用的是张量(<a href="https://www.tensorflow.org/api_docs/python/tf/Tensor" rel="nofollow noreferrer">^{<cd1>}</a>)。如果我写下:</p>
<pre><code>c = tf.add(a, b)
</code></pre>
<p>新的张量<code>c</code>总是加上<code>a</code>和<code>b</code>的结果。现在,<code>a</code>和<code>b</code>每次都可以是不同的东西(例如,如果它们是占位符,您为它们输入一个值),但是<code>c</code>总是它们相加的结果。因此,在每次对<code>session.run</code>的调用中,如果其他所有内容都是相同的,<code>c</code>总是相同的。你知道吗</p>
<p>与NumPy不同,您不能执行以下操作:</p>
<pre><code>c[2] = 3
</code></pre>
<p>如果你想创建一个“像<code>c</code>但索引2变为值3”的张量,你必须创建一个像那样的新张量(这是一个常见的问题)。不过,不要将此与这样做混淆:</p>
<pre><code>c = something_else()
</code></pre>
<p>现在<code>c</code>将包含对<code>something_else()</code>结果的引用,但是<code>tf.add(a, b)</code>的原始张量结果仍然存在,在TensorFlow图(<a href="https://www.tensorflow.org/api_docs/python/tf/Graph" rel="nofollow noreferrer">^{<cd14>}</a>)中(这在急切模式下工作有点不同,但是让我们把它留到另一个场合)。你知道吗</p>
<p>不过,有时也会处理另一种实体,它们是变量(<a href="https://www.tensorflow.org/api_docs/python/tf/Variable" rel="nofollow noreferrer">^{<cd15>}</a>)。变量的关键特性是,它们可以保存在对<code>session.run</code>的不同调用之间的值。其工作原理是,用类型和大小声明它们,然后进行赋值操作。在会话中运行赋值操作时,该值将在会话中固定,直到执行新的赋值操作。变量要求您在会话中首次使用它们之前为它们赋值,因为创建会话时它们处于“空”状态。这就是初始化的目的。你知道吗</p>
<p>变量通常(但不是唯一的或必要的)用于保存可训练模型的参数。例如,如果你训练一个神经网络,你有几个“权重”要训练。在每个训练步骤上,调用<code>session.run</code>,然后使用一批示例执行优化步骤。显然,您希望下一步从上一步继续,因此需要在调用<code>session.run</code>之间保留参数值。你知道吗</p>
<p>另一方面,变量值只存在于会话中。当会话关闭时,值将消失。因此,您可以使用各种机制将变量值保存到会话之外,如<a href="https://www.tensorflow.org/guide/checkpoints" rel="nofollow noreferrer">checkpoints</a>、<a href="https://www.tensorflow.org/guide/saved_model" rel="nofollow noreferrer">saved models</a>、<a href="https://keras.io/getting-started/faq/#how-can-i-save-a-keras-model" rel="nofollow noreferrer">HDF5 Keras files</a>、<a href="https://www.tensorflow.org/guide/extend/model_files#freezing" rel="nofollow noreferrer">graph freezing</a>。。。你知道吗</p>
<p>就像斯图尔特说的,你可以。问题是,要训练一个神经网络(或类似的东西),你需要计算你正在做的操作的梯度,而NumPy不提供现成的支持。虽然您可以使用<a href="https://github.com/HIPS/autograd" rel="nofollow noreferrer">autograd</a>(请参见<a href="https://github.com/HIPS/autograd/blob/master/examples/neural_net.py" rel="nofollow noreferrer">this example</a>)之类的东西,但TensorFlow是从零开始构建的,并且非常支持它。类似的框架包括<a href="http://deeplearning.net/software/theano/" rel="nofollow noreferrer">Theano</a>或<a href="https://pytorch.org/" rel="nofollow noreferrer">PyTorch</a>。使用TensorFlow这样的框架也有它自己的额外优势,比如GPU支持(同样,NumPy也不是不可能,但也不是很简单)、多平台支持、分布式培训。。。当然,这些东西有某种趋势因素,谷歌的支持也有帮助,但TensorFlow在普通NumPy上有显著的好处。你知道吗</p>