# 使用占位符和變量
占位符和變量是在 TensorFlow 中使用計算圖的關鍵工具。我們必須了解它們之間的區別以及何時最好地利用它們對我們有利。
## 做好準備
與數據最重要的區別之一是它是占位符還是變量。變量是算法的模型參數,TensorFlow 跟蹤如何更改這些參數以優化算法。占位符是允許您提供特定類型和形狀的數據的對象,或者取決于計算圖的結果,例如計算的預期結果。
## 操作步驟
創建變量的主要方法是使用`Variable()`函數,該函數將張量作為輸入并輸出變量。這只是聲明,我們仍然需要初始化變量。初始化是將變量與相應方法放在計算圖上的內容。以下是創建和初始化變量的示例:
```py
my_var = tf.Variable(tf.zeros([2,3]))
sess = tf.Session()
initialize_op = tf.global_variables_initializer()
sess.run(initialize_op)
```
要在創建和初始化變量后查看計算圖是什么樣的,請參閱此秘籍的以下部分。占位符只是保持數據的位置以輸入圖。占位符從會話中的`feed_dict`參數獲取數據。要將占位符放入圖中,我們必須對占位符執行至少一個操作。在下面的代碼片段中,我們初始化圖,將`x`聲明為占位符(預定義大小),并將`y`定義為`x`上的標識操作,它只返回`x`。然后,我們創建數據以提供給`x`占位符并運行身份操作。代碼如下所示,結果圖如下:
```py
sess = tf.Session()
x = tf.placeholder(tf.float32, shape=[2,2])
y = tf.identity(x)
x_vals = np.random.rand(2,2)
sess.run(y, feed_dict={x: x_vals})
# Note that sess.run(x, feed_dict={x: x_vals}) will result in a self-referencing error.
```
> 值得注意的是,TensorFlow 不會在 Feed 字典中返回自引用占位符。換句話說,在下圖中運行`sess.run(x, feed_dict={x: x_vals})`將返回錯誤。
## 工作原理
將變量初始化為零張量的計算圖如下圖所示:

圖 1:變量
在這里,我們只用一個變量就可以看到計算圖的詳細信息,并將其全部初始化為零。灰色陰影區域是對所涉及的操作和常數的非常詳細的視圖。細節較少的主要計算圖是右上角灰色區域之外的較小圖。有關創建和可視化圖的更多詳細信息,請參閱[第 10 章](http://Taking%20TensorFlow%20to%20Production)的第一部分,將 TensorFlow 轉換為生產。類似地,可以在下圖中看到將 NumPy 數組送入占位符的計算圖:

圖 2:初始化占位符的計算圖
灰色陰影區域是對所涉及的操作和常數的非常詳細的視圖。細節較少的主要計算圖是右上角灰色區域之外的較小圖。
## 更多
在計算圖運行期間,我們必須告訴 TensorFlow 何時初始化我們創建的變量。雖然每個變量都有一個`initializer`方法,但最常用的方法是使用輔助函數,即`global_variables_initializer()`。此函數在圖中創建一個初始化我們創建的所有變量的操作,如下所示:
```py
initializer_op = tf.global_variables_initializer()
```
但是如果我們想根據初始化另一個變量的結果來初始化變量,我們必須按照我們想要的順序初始化變量,如下所示:
```py
sess = tf.Session()
first_var = tf.Variable(tf.zeros([2,3]))
sess.run(first_var.initializer)
second_var = tf.Variable(tf.zeros_like(first_var))
# 'second_var' depends on the 'first_var'
sess.run(second_var.initializer)
```
- TensorFlow 入門
- 介紹
- TensorFlow 如何工作
- 聲明變量和張量
- 使用占位符和變量
- 使用矩陣
- 聲明操作符
- 實現激活函數
- 使用數據源
- 其他資源
- TensorFlow 的方式
- 介紹
- 計算圖中的操作
- 對嵌套操作分層
- 使用多個層
- 實現損失函數
- 實現反向傳播
- 使用批量和隨機訓練
- 把所有東西結合在一起
- 評估模型
- 線性回歸
- 介紹
- 使用矩陣逆方法
- 實現分解方法
- 學習 TensorFlow 線性回歸方法
- 理解線性回歸中的損失函數
- 實現 deming 回歸
- 實現套索和嶺回歸
- 實現彈性網絡回歸
- 實現邏輯回歸
- 支持向量機
- 介紹
- 使用線性 SVM
- 簡化為線性回歸
- 在 TensorFlow 中使用內核
- 實現非線性 SVM
- 實現多類 SVM
- 最近鄰方法
- 介紹
- 使用最近鄰
- 使用基于文本的距離
- 使用混合距離函數的計算
- 使用地址匹配的示例
- 使用最近鄰進行圖像識別
- 神經網絡
- 介紹
- 實現操作門
- 使用門和激活函數
- 實現單層神經網絡
- 實現不同的層
- 使用多層神經網絡
- 改進線性模型的預測
- 學習玩井字棋
- 自然語言處理
- 介紹
- 使用詞袋嵌入
- 實現 TF-IDF
- 使用 Skip-Gram 嵌入
- 使用 CBOW 嵌入
- 使用 word2vec 進行預測
- 使用 doc2vec 進行情緒分析
- 卷積神經網絡
- 介紹
- 實現簡單的 CNN
- 實現先進的 CNN
- 重新訓練現有的 CNN 模型
- 應用 StyleNet 和 NeuralStyle 項目
- 實現 DeepDream
- 循環神經網絡
- 介紹
- 為垃圾郵件預測實現 RNN
- 實現 LSTM 模型
- 堆疊多個 LSTM 層
- 創建序列到序列模型
- 訓練 Siamese RNN 相似性度量
- 將 TensorFlow 投入生產
- 介紹
- 實現單元測試
- 使用多個執行程序
- 并行化 TensorFlow
- 將 TensorFlow 投入生產
- 生產環境 TensorFlow 的一個例子
- 使用 TensorFlow 服務
- 更多 TensorFlow
- 介紹
- 可視化 TensorBoard 中的圖
- 使用遺傳算法
- 使用 k 均值聚類
- 求解常微分方程組
- 使用隨機森林
- 使用 TensorFlow 和 Keras