<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                # 十八、調試 TensorFlow 模型 正如我們在本書中所學到的,TensorFlow 程序用于構建和訓練可用于各種任務預測的模型。在訓練模型時,您可以構建計算圖,運行圖以進行訓練,并評估圖以進行預測。重復這些任務,直到您對模型的質量感到滿意為止,然后將圖與學習的參數一起保存。在生產中,圖是從文件構建或恢復的,并使用參數填充。 構建深度學習模型是一項復雜的技術,TensorFlow API 及其生態系統同樣復雜。當我們在 TensorFlow 中構建和訓練模型時,有時我們會得到不同類型的錯誤,或者模型不能按預期工作。例如,您經常看到自己陷入以下一種或多種情況: * 在損失和指標輸出中得到了 NaN * 即使經過多次迭代,損失或其他指標也沒有改善 在這種情況下,我們需要調試使用 TensorFlow API 編寫的代碼。 要修復代碼以使其正常工作,可以使用調試器或平臺提供的其他方法和工具,例如 Python 中的 Python 調試器(`pdb`)和 Linux OS 中的 GNU 調試器(`gdb`)。當出現問題時,TensorFlow API 還提供一些額外的支持來修復代碼。 在本章中,我們將學習 TensorFlow 中可用的其他工具和技術,以幫助調試: * 使用`tf.Session.run()`獲取張量值 * 使用`tf.Print()`打印張量值 * 用`tf.Assert()`斷言條件 * 使用 TensorFlow 調試器進行調試(`tfdbg`) # 使用`tf.Session.run()`獲取張量值 您可以使用`tf.Session.run()`獲取要打印的張量值。這些值作為 NumPy 數組返回,可以使用 Python 語句打印或記錄。這是最簡單和最簡單的方法,最大的缺點是計算圖執行所有相關路徑,從獲取的張量開始,如果這些路徑包括訓練操作,那么它前進一步或一個周期。 因此,大多數情況下你不會調用`tf.Session.run()`來獲取圖中間的張量,但你會執行整個圖并獲取所有張量,你需要調試的那些張量以及你不需要的張量調試。 函數`tf.Session.partial_run()`也適用于您可能想要執行圖的一部分的情況,但它是一個高度實驗性的 API,尚未準備好用于生產。 # 使用`tf.Print()`打印張量值 為調試目的打印值的另一個選項是使用`tf.Print()`。當執行包含`tf.Print()`節點的路徑時,您可以在`tf.Print()`中包含張量以在標準錯誤控制臺中打印其值。`tf.Print()`函數具有以下簽名: ```py tf.Print( input_, data, message=None, first_n=None, summarize=None, name=None ) ``` 該函數的參數如下: * `input_`是一個從函數返回的張量,沒有任何操作 * `data`是要打印的張量列表 * `message`是一個字符串,它作為打印輸出的前綴打印出來 * `first_n`表示打印輸出的步驟數;如果此值為負,則只要執行路徑,就始終打印該值 * `summarize`表示從張量打印的元素數量;默認情況下,僅打印三個元素 您可以按照 Jupyter 筆記本中的代碼`ch-18_TensorFlow_Debugging`。 讓我們修改之前創建的 MNIST MLP 模型來添加`print`語句: ```py model = tf.Print(input_=model, data=[tf.argmax(model,1)], message='y_hat=', summarize=10, first_n=5 ) ``` 當我們運行代碼時,我們在 Jupyter 的控制臺中獲得以下內容: ```py I tensorflow/core/kernels/logging_ops.cc:79] y_hat=[0 0 0 7 0 0 0 0 0 0...] I tensorflow/core/kernels/logging_ops.cc:79] y_hat=[0 7 7 1 8 7 2 7 7 0...] I tensorflow/core/kernels/logging_ops.cc:79] y_hat=[4 8 0 6 1 8 1 0 7 0...] I tensorflow/core/kernels/logging_ops.cc:79] y_hat=[0 0 1 0 0 0 0 5 7 5...] I tensorflow/core/kernels/logging_ops.cc:79] y_hat=[9 2 2 8 8 6 6 1 7 7...] ``` 使用`tf.Print()`的唯一缺點是該函數提供了有限的格式化功能。 # `tf.Assert()` 調試 TensorFlow 模型的另一種方法是插入條件斷言。`tf.Assert()`函數需要一個條件,如果條件為假,則打印給定張量的列表并拋出`tf.errors.InvalidArgumentError`。 1. `tf.Assert()`函數具有以下特征: ```py tf.Assert( condition, data, summarize=None, name=None ) ``` 1. 斷言操作不會像`tf.Print()`函數那樣落入圖的路徑中。為了確保`tf.Assert()`操作得到執行,我們需要將它添加到依賴項中。例如,讓我們定義一個斷言來檢查所有輸入是否為正: ```py assert_op = tf.Assert(tf.reduce_all(tf.greater_equal(x,0)),[x]) ``` 1. 在定義模型時將`assert_op`添加到依賴項,如下所示: ```py with tf.control_dependencies([assert_op]): # x is input layer layer = x # add hidden layers for i in range(num_layers): layer = tf.nn.relu(tf.matmul(layer, w[i]) + b[i]) # add output layer layer = tf.matmul(layer, w[num_layers]) + b[num_layers] ``` 1. 為了測試這段代碼,我們在第 5 周期之后引入了一個雜質,如下: ```py if epoch > 5: X_batch = np.copy(X_batch) X_batch[0,0]=-2 ``` 1. 代碼運行正常五個周期,然后拋出錯誤: ```py epoch: 0000 loss = 6.975991 epoch: 0001 loss = 2.246228 epoch: 0002 loss = 1.924571 epoch: 0003 loss = 1.745509 epoch: 0004 loss = 1.616791 epoch: 0005 loss = 1.520804 ----------------------------------------------------------------- InvalidArgumentError Traceback (most recent call last) ... InvalidArgumentError: assertion failed: [[-2 0 0]...] ... ``` 除了`tf.Assert()`函數,它可以采用任何有效的條件表達式,TensorFlow 提供以下斷言操作,檢查特定條件并具有簡單的語法: * `assert_equal` * `assert_greater` * `assert_greater_equal` * `assert_integer` * `assert_less` * `assert_less_equal` * `assert_negative` * `assert_none_equal` * `assert_non_negative` * `assert_non_positive` * `assert_positive` * `assert_proper_iterable` * `assert_rank` * `assert_rank_at_least` * `assert_rank_in` * `assert_same_float_dtype` * `assert_scalar` * `assert_type` * `assert_variables_initialized` 作為示例,前面提到的示例斷言操作也可以寫成如下: ```py assert_op = tf.assert_greater_equal(x,0) ``` # 使用 TensorFlow 調試器(`tfdbg`)的調試 TensorFlow 調試器(`tfdbg`)與其他常用調試器(如`pdb`和`gdb`)的工作方式相同。要使用調試器,該過程通常如下: 1. 在代碼中的斷點處設置要中斷的位置并檢查變量 2. 在調試模式下運行代碼 3. 當代碼在斷點處中斷時,檢查它然后繼續下一步 一些調試器還允許您在代碼執行時以交互方式觀察變量,而不僅僅是在斷點處: 1. 為了使用`tfdbg`,首先導入所需的模塊并將會話包裝在調試器包裝器中: ```py from tensorflow.python import debug as tfd with tfd.LocalCLIDebugWrapperSession(tf.Session()) as tfs: ``` 1. 接下來,將過濾器附加到會話對象。附加過濾器與在其他調試器中設置斷點相同。例如,以下代碼附加`tfdbg.has_inf_or_nan`過濾器,如果任何中間張量具有`nan`或`inf`值,則會中斷: ```py tfs.add_tensor_filter('has_inf_or_nan_filter', tfd.has_inf_or_nan) ``` 1. 現在,當代碼執行`tfs.run()`時,調試器將在控制臺中啟動調試器接口,您可以在其中運行各種調試器命令來監視張量值。 2. 我們提供了在`ch-18_mnist_tfdbg.py`文件中試用`tfdbg`的代碼。當我們用`python3`執行代碼文件時,我們看到`tfdbg`控制臺: ```py python3 ch-18_mnist_tfdbg.py ``` ![](https://img.kancloud.cn/b0/bc/b0bcb19d093a3a0830ea0c3019ed6bb2_1455x757.png) 1. 在`tfdbg>`提示符下輸入命令`run -f has_inf_or_nan`。代碼在第一個周期后中斷,因為我們使用`np.inf`值填充數據: ![](https://img.kancloud.cn/91/16/9116cb1095f542a64c40d23701e11e68_1004x978.png) 1. 現在您可以使用`tfdbg`控制臺或可點擊界面來檢查各種張量的值。例如,我們查看其中一個梯度的值: ![](https://img.kancloud.cn/d8/af/d8af7bc23f7aed0943fd9a3fb65d458d_1707x973.png) [您可以在此鏈接中找到有關使用`tfdbg`控制臺和檢查變量的更多信息](https://www.tensorflow.org/programmers_guide/debugger)。 # 總結 在本章中,我們學習了如何在 TensorFlow 中調試用于構建和訓練模型的代碼。我們了解到我們可以使用`tf.Session.run()`將張量作為 NumPy 數組獲取。我們還可以通過在計算圖中添加`tf.Print()`操作來打印張量值。我們還學習了,在使用`tf.Assert()`和其他`tf.assert_*`操作執行期間,某些條件無法保持時如何引發錯誤。我們通過對 TensorFlow 調試器(`tfdbg`)的介紹結束本章,用于設置斷點和觀察張量值,就像我們在 Python 調試器(`pdb`)或 GNU 調試器(`gdb`中調試代碼一樣) )。 本章將我們的旅程帶入一個新的里程碑。我們不希望旅程在此結束,但我們相信旅程剛剛開始,您將進一步擴展和應用本書中獲得的知識和技能。 我們非常期待聽到您的經驗,反饋和建議。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看