<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 如何工作 * 聲明變量和張量 * 使用占位符和變量 * 使用矩陣 * 聲明操作符 * 實現激活函數 * 使用數據源 * 其他資源 # 介紹 谷歌的 TensorFlow 引擎有一種解決問題的獨特方式。這種獨特的方式使我們能夠非常有效地解決機器學習問題。機器學習幾乎用于生活和工作的所有領域,但一些更著名的領域是計算機視覺,語音識別,語言翻譯,醫療保健等等。我們將介紹了解 TensorFlow 如何運行的基本步驟,并最終在本書后面構建生產代碼技術。這些基礎知識對于理解本書其余部分的秘籍非常重要。 # TensorFlow 如何工作 起初,TensorFlow 中的計算可能看起來不必要地復雜化。但有一個原因:由于 TensorFlow 如何處理計算,開發更復雜的算法相對容易。該秘籍將指導我們完成 TensorFlow 算法的偽代碼。 ## 準備 目前,TensorFlow 在 Linux,macOS 和 Windows 上受支持。本書的代碼已經在 Linux 系統上創建和運行,但也應該在任何其他系統上運行。該書的代碼可在 [GitHub](https://github.com/nfmcclure/tensorflow_cookbook) 以及 [Packt 倉庫](https://github.com/PacktPublishing/TensorFlow-Machine-Learning-Cookbook-Second-Edition)中找到。 在本書中,我們只關注 TensorFlow 的 Python 庫包裝器,盡管 TensorFlow 的大多數原始核心代碼都是用 C++ 編寫的。本書將使用 [Python 3.6+](https://www.python.org) 和 [TensorFlow 1.10.0+](https://www.tensorflow.org)。雖然 TensorFlow 可以在 CPU 上運行,但是如果在 GPU 上處理,大多數算法運行得更快,并且在具有 Nvidia Compute Capability v4.0+(推薦 v5.1)的顯卡上支持。 TensorFlow 的流行 GPU 是 Nvidia Tesla 架構和具有至少 4 GB 視頻 RAM 的 Pascal 架構。要在 GPU 上運行,您還需要下載并安裝 Nvidia CUDA 工具包以及[版本 5.x+](https://developer.nvidia.com/cuda-downloads)。 本章中的一些秘籍將依賴于當前安裝的 SciPy,NumPy 和 scikit-learn Python 包。這些隨附的包也包含在 [Anaconda 包](https://www.continuum.io/downloads)中。 ## 操作步驟 在這里,我們將介紹 TensorFlow 算法的一般流程。大多數秘籍將遵循以下大綱: 1. 導入或生成數據集:我們所有的機器學習算法都依賴于數據集。在本書中,我們將生成數據或使用外部數據集源。有時,最好依賴生成的數據,因為我們只想知道預期的結果。大多數情況下,我們將訪問給定秘籍的公共數據集。有關訪問這些數據集的詳細信息,請參見本章第 8 節的其他資源。 2. 轉換和正則化數據:通常,輸入數據集不會出現在圖片中。 TensorFlow 期望我們需要轉換 TensorFlow,以便它們獲得可接受的形狀。數據通常不在我們的算法所期望的正確維度或類型中。在我們使用之前,我們必須轉換數據。大多數算法也期望歸一化數據,我們也會在這里看一下。 TensorFlow 具有內置函數,可以為您正則化數據,如下所示: ```py import tensorflow as tf data = tf.nn.batch_norm_with_global_normalization(...) ``` 1. 將數據集劃分為訓練集,測試集和驗證集:我們通常希望在我們訓練過的不同集上測試我們的算法。此外,許多算法需要超參數調整,因此我們留出一個驗證集來確定最佳的超參數集。 2. 設置算法參數(超參數):我們的算法通常有一組參數,我們在整個過程中保持不變。例如,這可以是我們選擇的迭代次數,學習率或其他固定參數。將這些一起初始化是一種良好的做法,以便讀者或用戶可以輕松找到它們,如下所示: ```py learning_rate = 0.01 batch_size = 100 iterations = 1000 ``` 1. 初始化變量和占位符:TensorFlow 依賴于知道它能夠和不能修改的內容。 TensorFlow 將在優化期間修改/調整變量(模型權重/偏差)以最小化損失函數。為此,我們通過占位符提供數據。我們需要初始化變量和占位符的大小和類型,以便 TensorFlow 知道會發生什么。 TensorFlow 還需要知道期望的數據類型。對于本書的大部分內容,我們將使用`float32`。 TensorFlow 還提供`float64`和`float16`。請注意,用于精度的更多字節會導致算法速度變慢,但使用較少會導致精度降低。請參閱以下代碼: ```py a_var = tf.constant(42) x_input = tf.placeholder(tf.float32, [None, input_size]) y_input = tf.placeholder(tf.float32, [None, num_classes]) ``` 1. 定義模型結構:在獲得數據并初始化變量和占位符之后,我們必須定義模型。這是通過構建計算圖來完成的。我們將在第 2 章,TensorFlow 方法中更詳細地討論計算圖 TensorFlow 秘籍中的運算中的計算圖。此示例的模型將是線性模型(`y = mx + b`): ```py y_pred = tf.add(tf.mul(x_input, weight_matrix), b_matrix) ``` 1. 聲明損失函數:定義模型后,我們必須能夠評估輸出。這是我們宣布損失函數的地方。損失函數非常重要,因為它告訴我們預測距實際值有多遠。在第 2 章,TensorFlow 方法中的實現反向傳播秘籍中更詳細地探討了不同類型的損失函數。在這里,我們實現了 n 點的均方誤差,即: ![](https://img.kancloud.cn/04/c4/04c410732c7594841395dcafd2a53bb1_2880x290.png) ```py loss = tf.reduce_mean(tf.square(y_actual - y_pred)) ``` 1. 初始化和訓練模型:現在我們已經完成了所有工作,我們需要創建圖實例,通過占位符輸入數據,讓 TensorFlow 更改變量以更好地預測我們的訓練數據。這是初始化計算圖的一種方法: ```py with tf.Session(graph=graph) as session: ... session.run(...) ... Note that we can also initiate our graph with: session = tf.Session(graph=graph) session.run(...) ``` 1. 評估模型:一旦我們構建并訓練了模型,我們應該通過查看通過某些指定標準對新數據的處理程度來評估模型。我們對訓練和測試裝置進行評估,這些評估將使我們能夠看到模型是否過擬合。我們將在后面的秘籍中解決這個問題。 2. 調整超參數:大多數情況下,我們希望根據模型的表現返回并更改一些超參數。然后,我們使用不同的超參數重復前面的步驟,并在驗證集上評估模型。 3. 部署/預測新結果:了解如何對新數據和未見數據進行預測也很重要。一旦我們對他們進行了訓練,我們就可以對所有模型進行此操作。 ## 工作原理 在 TensorFlow 中,我們必須先設置數據,變量,占位符和模型,然后才能告訴程序訓練和更改變量以改進預測。 TensorFlow 通過計算圖完成此任務。這些計算圖是沒有遞歸的有向圖,這允許計算并行性。為此,我們需要為 TensorFlow 創建一個最小化的損失函數。 TensorFlow 通過修改計算圖中的變量來實現此目的。 TensorFlow 知道如何修改變量,因為它跟蹤模型中的計算并自動計算變量梯度(如何更改每個變量)以最小化損失。因此,我們可以看到進行更改和嘗試不同數據源是多么容易。 ## 另見 有關 TensorFlow 的更多介紹和資源,請參閱官方文檔和教程: * [一個更好的起點是 Python API 官方文檔](https://www.tensorflow.org/api_docs/python/) * [還有教程](https://www.tensorflow.org/tutorials/) * [TensorFlow 教程,項目,演示文稿和代碼倉庫的非官方集合](https://github.com/jtoy/awesome-tensorflow) # 聲明變量和張量 張量是 TensorFlow 用于在計算圖上操作的主要數據結構。我們可以將這些張量聲明為變量和/或將它們作為占位符提供。要做到這一點,首先,我們必須學習如何創建張量。 > `tensor`是指廣義向量或矩陣的數學術語。如果向量是一維的并且矩陣是二維的,則張量是 n 維的(其中`n`可以是 1,2 或甚至更大)。 ## 準備 當我們創建一個張量并將其聲明為變量時,TensorFlow 會在我們的計算圖中創建幾個圖結構。同樣重要的是要指出,僅通過創建張量,TensorFlow 不會向計算圖中添加任何內容。 TensorFlow 僅在運行初始化變量的操作后執行此操作。有關更多信息,請參閱下一節有關變量和占位符的內容。 ## 操作步驟 在這里,我們將介紹我們可以在 TensorFlow 中創建張量的主要方法: 1.固定張量: * * 在下面的代碼中,我們創建了一個零填充張量: ```py zero_tsr = tf.zeros([row_dim, col_dim]) ``` * * 在下面的代碼中,我們創建了一個填充張量: ```py ones_tsr = tf.ones([row_dim, col_dim]) ``` * * 在下面的代碼中,我們創建了一個常量填充張量: ```py filled_tsr = tf.fill([row_dim, col_dim], 42) ``` * * 在下面的代碼中,我們從現有常量中創建一個張量: ```py constant_tsr = tf.constant([1,2,3]) ``` > 請注意,`tf.constant()`函數可用于將值廣播到數組中,通過編寫`tf.constant(42, [row_dim, col_dim])`來模仿`tf.fill()`的行為。 1. 相似形狀的張量:我們還可以根據其他張量的形狀初始化變量,如下所示: ```py zeros_similar = tf.zeros_like(constant_tsr) ones_similar = tf.ones_like(constant_tsr) ``` > 請注意,由于這些張量依賴于先前的張量,我們必須按順序初始化它們。嘗試一次初始化所有張量將導致錯誤。有關變量和占位符,請參閱下一節末尾的“更多”小節。 1. 序列張量:TensorFlow 允許我們指定包含定義間隔的張量。以下函數與 NumPy 的`linspace()`輸出和`range()`輸出非常相似。請參閱以下函數: ```py linear_tsr = tf.linspace(start=0, stop=1, start=3) ``` 得到的張量具有[0.0,0.5,1.0]的序列。請注意,此函數包含指定的停止值。有關更多信息,請參閱以下函數: ```py integer_seq_tsr = tf.range(start=6, limit=15, delta=3) ``` 結果是序列[6,9,12]。請注意,此函數不包括限制值。 1. 隨機張量:以下生成的隨機數來自均勻分布: ```py randunif_tsr = tf.random_uniform([row_dim, col_dim], minval=0, maxval=1) ``` 注意,這種隨機均勻分布來自包含`minval`但不包括`maxval`(`minval >= x < maxval`)的區間。 要從正態分布中獲取隨機抽取的張量,可以運行以下代碼: ```py randnorm_tsr = tf.random_normal([row_dim, col_dim], mean=0.0, stddev=1.0) ``` 有時候我們想要生成在某些范圍內保證的正常隨機值。`truncated_normal()`函數總是在指定均值的兩個標準偏差內選擇正常值: ```py runcnorm_tsr = tf.truncated_normal([row_dim, col_dim], mean=0.0, stddev=1.0) ``` 我們可能也對隨機化數組條目感興趣。要做到這一點,有兩個函數可以幫助我們:`random_shuffle()`和`random_crop()`。以下代碼執行此操作: ```py shuffled_output = tf.random_shuffle(input_tensor) cropped_output = tf.random_crop(input_tensor, crop_size) ``` 在本書的后面,我們將有興趣隨機裁剪大小(高度,寬度,3)的圖像,其中有三種顏色光譜。要修復`cropped_output`中的大小,您必須在該大小中為其指定最大大小: ```py cropped_image = tf.random_crop(my_image, [height/2, width/2, 3]) ``` ## 工作原理 一旦我們決定如何創建張量,我們也可以通過在`Variable()`函數中包含張量來創建相應的變量,如下所示(下一節將詳細介紹): ```py my_var = tf.Variable(tf.zeros([row_dim, col_dim])) ``` ## 更多 我們不僅限于內置函數:我們可以使用`convert_to_tensor()`函數將任何 NumPy 數組轉換為 Python 列表,或將常量轉換為張量。注意,如果我們希望概括函數內部的計算,該函數也接受張量作為輸入。 # 使用占位符和變量 占位符和變量是在 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 不會在饋送字典中返回自引用占位符。換句話說,在下圖中運行`sess.run(x, feed_dict={x: x_vals})`將返回誤差。 ## 工作原理 將變量初始化為零張量的計算圖如下圖所示: ![](https://img.kancloud.cn/f6/41/f64186742e74c3d7deda7e4373cb3871_1191x401.png) 圖 1:變量 在這里,我們只用一個變量就可以看到計算圖的詳細信息,并將其全部初始化為零。灰色陰影區域是對所涉及的操作和常數的非常詳細的視圖。細節較少的主要計算圖是右上角灰色區域之外的較小圖。有關創建和可視化圖的更多詳細信息,請參閱第 10 章的第一部分,將 TensorFlow 轉換為生產。類似地,可以在下圖中看到將 NumPy 數組送入占位符的計算圖: ![](https://img.kancloud.cn/80/3b/803b2d4c9350383092b985d1aecdd5fa_160x195.png) 圖 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 為我們提供了易于使用的操作來執行此類矩陣計算。對于以下所有示例,我們首先通過運行以下代碼來創建圖會話: ```py import tensorflow as tf sess = tf.Session() ``` ## 操作步驟 我們將按如下方式處理秘籍: 1. 創建矩陣:我們可以從 NumPy 數組或嵌套列表創建二維矩陣,正如我們在創建和使用張量秘籍中所描述的那樣。我們還可以使用張量創建函數并為`zeros()`,`ones()`,`truncated_normal()`等函數指定二維形狀。 TensorFlow 還允許我們使用`diag()`函數從一維數組或列表創建對角矩陣,如下所示: ```py identity_matrix = tf.diag([1.0, 1.0, 1.0]) A = tf.truncated_normal([2, 3]) B = tf.fill([2,3], 5.0) C = tf.random_uniform([3,2]) D = tf.convert_to_tensor(np.array([[1., 2., 3.],[-3., -7., -1.],[0., 5., -2.]])) print(sess.run(identity_matrix)) [[ 1\. 0\. 0.] [ 0\. 1\. 0.] [ 0\. 0\. 1.]] print(sess.run(A)) [[ 0.96751703 0.11397751 -0.3438891 ] [-0.10132604 -0.8432678 0.29810596]] print(sess.run(B)) [[ 5\. 5\. 5.] [ 5\. 5\. 5.]] print(sess.run(C)) [[ 0.33184157 0.08907614] [ 0.53189191 0.67605299] [ 0.95889051 0.67061249]] print(sess.run(D)) [[ 1\. 2\. 3.] [-3\. -7\. -1.] [ 0\. 5\. -2.]] ``` > 請注意,如果我們再次運行`sess.run(C)`,我們將重新初始化隨機變量并最終得到不同的隨機值。 1. 加法,減法和乘法:要添加,減去或相乘相同維度的矩陣,TensorFlow 使用以下函數: ```py print(sess.run(A+B)) [[ 4.61596632 5.39771316 4.4325695 ] [ 3.26702736 5.14477345 4.98265553]] print(sess.run(B-B)) [[ 0\. 0\. 0.] [ 0\. 0\. 0.]] Multiplication print(sess.run(tf.matmul(B, identity_matrix))) [[ 5\. 5\. 5.] [ 5\. 5\. 5.]] ``` 值得注意的是,`matmul()`函數具有參數,用于指定是否在乘法之前轉置參數或每個矩陣是否稀疏。 > 請注意,未明確定義矩陣除法。雖然許多人將矩陣劃分定義為乘以逆,但與實數除法相比,它基本上是不同的。 1. 轉置:轉置矩陣(翻轉列和行),如下所示: ```py print(sess.run(tf.transpose(C))) [[ 0.67124544 0.26766731 0.99068872] [ 0.25006068 0.86560275 0.58411312]] ``` 同樣,值得一提的是,重新初始化為我們提供了與以前不同的值。 1. 行列式:要計算行列式,請使用以下內容: ```py print(sess.run(tf.matrix_determinant(D))) -38.0 ``` 1. 逆:要查找方陣的逆,請參閱以下內容: ```py print(sess.run(tf.matrix_inverse(D))) [[-0.5 -0.5 -0.5 ] [ 0.15789474 0.05263158 0.21052632] [ 0.39473684 0.13157895 0.02631579]] ``` > 只有當矩陣是對稱正定時,逆方法才基于 Cholesky 分解。如果矩陣不是對稱正定,那么它基于 LU 分解。 1. 分解:對于 Cholesky 分解,請使用以下內容: ```py print(sess.run(tf.cholesky(identity_matrix))) [[ 1\. 0\. 1.] [ 0\. 1\. 0.] [ 0\. 0\. 1.]] ``` 1. 特征值和特征向量:對于特征值和特征向量,請使用以下代碼: ```py print(sess.run(tf.self_adjoint_eig(D)) [[-10.65907521 -0.22750691 2.88658212] [ 0.21749542 0.63250104 -0.74339638] [ 0.84526515 0.2587998 0.46749277] [ -0.4880805 0.73004459 0.47834331]] ``` 注意,`self_adjoint_eig()`函數輸出第一行中的特征值和剩余向量中的后續向量。在數學中,這被稱為矩陣的特征分解。 ## 工作原理 TensorFlow 為我們提供了開始使用數值計算并將這些計算添加到圖中的所有工具。對于簡單的矩陣運算,這種表示法可能看起來很重。請記住,我們正在將這些操作添加到圖中,并告訴 TensorFlow 哪些張量運行這些操作。雖然現在看起來似乎很冗長,但它有助于我們理解后面章節中的符號,這種計算方式將使我們更容易實現目標。 # 聲明操作符 現在,我們必須了解我們可以添加到 TensorFlow 圖的其他操作。 ## 準備 除了標準算術運算之外,TensorFlow 還為我們提供了更多我們應該了解的操作以及如何在繼續操作之前使用它們。同樣,我們可以通過運行以下代碼來創建圖會話: ```py import tensorflow as tf sess = tf.Session() ``` ## 操作步驟 TensorFlow 對張量有標準操作,即`add()`,`sub()`,`mul()`和`div()`。請注意,除非另有說明,否則本節中的所有操作都將按元素評估輸入: 1. TensorFlow 提供了`div()`和相關函數的一些變體。 2. 值得一提的是`div()`返回與輸入相同的類型。這意味著如果輸入是整數,它確實返回了分區的底線(類似于 Python2)。要返回 Python3 版本,它在分割之前將整數轉換為浮點數并始終返回浮點數,TensorFlow 提供`truediv()`函數,如下所示: ```py print(sess.run(tf.div(3, 4))) 0 print(sess.run(tf.truediv(3, 4))) 0.75 ``` 1. 如果我們有浮點數并想要整數除法,我們可以使用`floordiv()`函數。請注意,這仍然會返回一個浮點數,但它會向下舍入到最接近的整數。這個函數如下: ```py print(sess.run(tf.floordiv(3.0,4.0))) 0.0 ``` 1. 另一個重要函數是`mod()`。此函數返回除法后的余數。它如下: ```py print(sess.run(tf.mod(22.0, 5.0))) 2.0 ``` 1. 兩個張量之間的交叉積通過`cross()`函數實現。請記住,交叉乘積僅針對兩個三維向量定義,因此它只接受兩個三維張量。以下代碼說明了這種用法: ```py print(sess.run(tf.cross([1., 0., 0.], [0., 1., 0.]))) [ 0\. 0\. 1.0] ``` 1. 這是一個更常見的數學函數的緊湊列表。所有這些函數都以元素方式運行: | | | | --- | --- | | `abs()` | 輸入張量的絕對值 | | `ceil()` | 輸入張量的向上取整函數 | | `cos()` | 輸入張量的余弦函數 | | `exp()` | 輸入張量的基于`e`指數 | | `floor()` | 輸入張量的向下取整函數 | | `inv()` | 輸入張量的乘法逆(`1 / x`) | | `log()` | 輸入張量的自然對數 | | `maximum()` | 兩個張量的逐元素最大值 | | `minimum()` | 兩個張量的逐元素最小值 | | `neg()` | 輸入張量的反轉 | | `pow()` | 第一個張量元素的第二個張量元素次冪 | | `round()` | 輸入張量的舍入 | | `rsqrt()` | 輸入張量的平方根倒數 | | `sign()` | 返回 -1,0 或 1,具體取決于張量的符號 | | `sin()` | 輸入張量的正弦函數 | | `sqrt()` | 輸入張量的平方根 | | `square()` | 輸入張量的平方 | 1. 專業數學函數:有一些特殊的數學函數可以在機器學習中使用,值得一提,TensorFlow 為它們提供了內置函數。同樣,除非另有說明,否則這些函數在元素方面運行: | | | | --- | --- | | `digamma()` | Psi 函數,`lgamma()`函數的導數 | | `erf()` | 張量的逐元素高斯誤差函數 | | `erfc()` | 張量的互補誤差函數 | | `igamma()` | 較低正則化的不完全伽瑪函數 | | `igammac()` | 較高正則化的不完全伽馬函數 | | `lbeta()` | Beta 函數絕對值的自然對數 | | `lgamma()` | 伽瑪函數絕對值的自然對數 | | `squared_difference()` | 兩個張量之間差異的平方 | ## 工作原理 重要的是要知道我們可以使用哪些函數,以便我們可以將它們添加到我們的計算圖中。我們將主要關注前面的函數。我們還可以生成許多不同的自定義函數作為前面的組合,如下所示: ```py # Tangent function (tan(pi/4)=1) print(sess.run(tf.tan(3.1416/4.))) 1.0 ``` ## 更多 如果我們希望向我們未在此處列出的圖添加其他操作,我們必須從前面的函數創建自己的操作。以下是我們之前未使用的操作示例,我們可以將其添加到圖中。我們選擇使用以下代碼添加自定義多項式函數`3x^2 - x + 10`: ```py def custom_polynomial(value): return tf.sub(3 * tf.square(value), value) + 10 print(sess.run(custom_polynomial(11))) 362 ``` # 實現激活函數 激活函數是神經網絡近似非線性輸出并適應非線性特征的關鍵。他們將非線性運算引入神經網絡。如果我們小心選擇了哪些激活函數以及放置它們的位置,它們是非常強大的操作,我們可以告訴 TensorFlow 適合和優化。 ## 準備 當我們開始使用神經網絡時,我們將定期使用激活函數,因為激活函數是任何神經網絡的重要組成部分。激活函數的目標只是調整權重和偏差。在 TensorFlow 中,激活函數是作用于張量的非線性操作。它們是以與先前的數學運算類似的方式運行的函數。激活函數有很多用途,但主要的概念是它們在對輸出進行歸一化的同時在圖中引入了非線性。使用以下命令啟動 TensorFlow 圖: ```py import tensorflow as tf sess = tf.Session() ``` ## 操作步驟 激活函數存在于 TensorFlow 中的神經網絡(`nn`)庫中。除了使用內置激活函數外,我們還可以使用 TensorFlow 操作設計自己的函數。我們可以導入預定義的激活函數(`import tensorflow.nn as nn`)或顯式,并在函數調用中寫入`nn`。在這里,我們選擇明確每個函數調用: 1. 被整流的線性單元,稱為 ReLU,是將非線性引入神經網絡的最常見和最基本的方式。這個函數叫做`max(0,x)`。它是連續的,但不是平滑的。它看起來如下: ```py print(sess.run(tf.nn.relu([-3., 3., 10.]))) [ 0\. 3\. 10.] ``` 1. 有時我們會想要限制前面的 ReLU 激活函數的線性增加部分。我們可以通過將`max(0,x)`函數嵌套到`min()`函數中來實現。 TensorFlow 具有的實現稱為 ReLU6 函數。這被定義為`min(max(0,x),6)`。這是硬 sigmoid 函數的一個版本,并且計算速度更快,并且不會消失(無窮小接近零)或爆炸值。當我們在第 8 章,卷積神經網絡和第 9 章,循環神經網絡中討論更深層的神經網絡時,這將派上用場。它看起來如下: ```py print(sess.run(tf.nn.relu6([-3., 3., 10.]))) [ 0\. 3\. 6.] ``` 1. Sigmoid 函數是最常見的連續和平滑激活函數。它也被稱為邏輯函數,其形式為`1 / (1 + exp(-x))`。 Sigmoid 函數不經常使用,因為它傾向于在訓練期間將反向傳播項置零。它看起來如下: ```py print(sess.run(tf.nn.sigmoid([-1., 0., 1.]))) [ 0.26894143 0.5 0.7310586 ] ``` > 我們應該知道一些激活函數不是以零為中心的,例如 sigmoid。這將要求我們在大多數計算圖算法中使用之前將數據歸零。 1. 另一個平滑激活函數是超切線。超正切函數與 sigmoid 非常相似,除了它的范圍在 0 和 1 之間,它的范圍在 -1 和 1 之間。該函數具有雙曲正弦與雙曲余弦的比率的形式。寫這個的另一種方法是`(exp(x) - exp(-x)) / (exp(x) + exp(-x))`。此激活函數如下: ```py print(sess.run(tf.nn.tanh([-1., 0., 1.]))) [-0.76159418 0\. 0.76159418 ] ``` 1. `softsign`函數也可用作激活函數。該函數的形式是`x / (|x| + 1)`。`softsign`函數應該是符號函數的連續(但不是平滑)近似。請參閱以下代碼: ```py print(sess.run(tf.nn.softsign([-1., 0., -1.]))) [-0.5 0\. 0.5] ``` 1. 另一個函數是`softplus`函數,是 ReLU 函數的流暢版本。該函數的形式是`log(exp(x) + 1)`。它看起來如下: ```py print(sess.run(tf.nn.softplus([-1., 0., -1.]))) [ 0.31326166 0.69314718 1.31326163] ``` > 當輸入增加時,`softplus`函數變為無窮大,而`softsign`函數變為 1.然而,當輸入變小時,`softplus`函數接近零,`softsign`函數變為 -1。 1. 指數線性單元(ELU)與 softplus 函數非常相似,只是底部漸近線為 -1 而不是 0.如果`x < 0`其他`x`,則形式為`exp(x) + 1`。它看起來如下: ```py print(sess.run(tf.nn.elu([-1., 0., -1.]))) [-0.63212055 0\. 1\. ] ``` ## 工作原理 這些激活函數是我們將來可以在神經網絡或其他計算圖中引入非線性的方法。重要的是要注意我們的網絡中我們使用激活函數的位置。如果激活函數的范圍在 0 和 1(sigmoid)之間,則計算圖只能輸出 0 到 1 之間的值。如果激活函數在內部并隱藏在節點之間,那么我們想要知道當我們傳遞它們時,范圍可以在我們的張量上。如果我們的張量被縮放到平均值為零,我們將希望使用一個激活函數來保持盡可能多的方差在零附近。這意味著我們想要選擇激活函數,例如雙曲正切(tanh)或 softsign。如果張量都被縮放為正數,那么我們理想地選擇一個激活函數來保留正域中的方差。 ## 更多 以下是兩個繪圖,說明了不同的激活函數。下圖顯示了 ReLU,ReLU6,softplus,指數 LU,sigmoid,softsign 和雙曲正切函數: ![](https://img.kancloud.cn/73/a7/73a7aace9be047d92ddb5c5574c5dcbc_371x256.png) 圖 3:softplus,ReLU,ReLU6 和指數 LU 的激活函數 在這里,我們可以看到四個激活函數:softplus,ReLU,ReLU6 和指數 LU。這些函數在零的左邊展平并線性增加到零的右邊,但 ReLU6 除外,其最大值為 6: ![](https://img.kancloud.cn/e0/7b/e07be57137cca4c75195c81b1bf7404a_381x256.png) 圖 4:Sigmoid,雙曲正切(tanh)和 softsign 激活函數 這是 sigmoid,雙曲正切(tanh)和 softsign 激活函數。這些激活函數都是平滑的,具有`S n`形狀。請注意,這些函數有兩個水平漸近線。 # 使用數據源 對于本書的大部分內容,我們將依賴數據集的使用來適應機器學習算法。本節介紹如何通過 TensorFlow 和 Python 訪問每個數據集。 > 一些數據源依賴于外部網站的維護,以便您可以訪問數據。如果這些網站更改或刪除此數據,則可能需要更新本節中的以下某些代碼。您可以在作者的 [GitHub 頁面](https://github.com/nfmcclure/tensorflow_cookbook)上找到更新的代碼。 ## 準備 在 TensorFlow 中,我們將使用的一些數據集構建在 Python 庫中,一些將需要 Python 腳本下載,一些將通過互聯網手動下載。幾乎所有這些數據集都需要有效的互聯網連接,以便您可以檢索它們。 ## 操作步驟 1. 鳶尾數據:該數據集可以說是機器學習中使用的最經典的數據集,也可能是所有統計數據。它是一個數據集,可以測量三種不同類型鳶尾花的萼片長度,萼片寬度,花瓣長度和花瓣寬度:山鳶尾,弗吉尼亞和雜色鳶尾。總共有 150 個測量值,這意味著每個物種有 50 個測量值。要在 Python 中加載數據集,我們將使用 scikit-learn 的數據集函數,如下所示: ```py from sklearn import datasets iris = datasets.load_iris() print(len(iris.data)) 150 print(len(iris.target)) 150 print(iris.data[0]) # Sepal length, Sepal width, Petal length, Petal width [ 5.1 3.5 1.4 0.2] print(set(iris.target)) # I. setosa, I. virginica, I. versicolor {0, 1, 2} ``` 1. 出生體重數據:該數據最初來自 Baystate Medical Center,Springfield,Mass 1986(1)。該數據集包含出生體重的測量以及母親和家族病史的其他人口統計學和醫學測量。有 11 個變量的 189 個觀測值。以下代碼顯示了如何在 Python 中訪問此數據: ```py import requests birthdata_url = 'https://github.com/nfmcclure/tensorflow_cookbook/raw/master/01_Introduction/07_Working_with_Data_Sources/birthweight_data/birthweight.dat' birth_file = requests.get(birthdata_url) birth_data = birth_file.text.split('\r\n') birth_header = birth_data[0].split('\t') birth_data = [[float(x) for x in y.split('\t') if len(x)>=1] for y in birth_data[1:] if len(y)>=1] print(len(birth_data)) 189 print(len(birth_data[0])) 9 ``` 1. 波士頓住房數據:卡內基梅隆大學在其 StatLib 庫中維護著一個數據集庫。這些數據可通過[加州大學歐文分校的機器學習庫](https://archive.ics.uci.edu/ml/index.php)輕松訪問。有 506 個房屋價值觀察,以及各種人口統計數據和住房屬性(14 個變量)。以下代碼顯示了如何通過 Keras 庫在 Python 中訪問此數據: ```py from keras.datasets import boston_housing (x_train, y_train), (x_test, y_test) = boston_housing.load_data() housing_header = ['CRIM', 'ZN', 'INDUS', 'CHAS', 'NOX', 'RM', 'AGE', 'DIS', 'RAD', 'TAX', 'PTRATIO', 'B', 'LSTAT', 'MEDV'] print(x_train.shape[0]) 404 print(x_train.shape[1]) 13 ``` 1. MNIST 手寫數據:MNIST(混合國家標準與技術研究院)數據集是較大的 NIST 手寫數據庫的子集。 MNIST 手寫數據集托管在 [Yann LeCun 的網站](https://yann.lecun.com/exdb/mnist/)上。它是一個包含 70,000 個單元數字圖像(0-9)的數據庫,其中帶標簽的約 60,000 個用于訓練集,10,000 個用于測試集。 TensorFlow 在圖像識別中經常使用此數據集,TensorFlow 提供了訪問此數據的內置函數。在機器學習中,提供驗證數據以防止過擬合(目標泄漏)也很重要。因此,TensorFlow 將 5000 列訓練圖像留在驗證集中。以下代碼顯示了如何在 Python 中訪問此數據: ```py from tensorflow.examples.tutorials.mnist import input_data mnist = input_data.read_data_sets("MNIST_data/"," one_hot=True) print(len(mnist.train.images)) 55000 print(len(mnist.test.images)) 10000 print(len(mnist.validation.images)) 5000 print(mnist.train.labels[1,:]) # The first label is a 3 [ 0\. 0\. 0\. 1\. 0\. 0\. 0\. 0\. 0\. 0.] ``` 1. 垃圾郵件文本數據。 UCI 的機器學習數據集庫還包含垃圾短信文本消息數據集。我們可以訪問此`.zip`文件并獲取垃圾郵件文本數據,如下所示: ```py import requests import io from zipfile import ZipFile zip_url = 'http://archive.ics.uci.edu/ml/machine-learning-databases/00228/smsspamcollection.zip' r = requests.get(zip_url) z = ZipFile(io.BytesIO(r.content)) file = z.read('SMSSpamCollection') text_data = file.decode() text_data = text_data.encode('ascii',errors='ignore') text_data = text_data.decode().split('\n') text_data = [x.split('\t') for x in text_data if len(x)>=1] [text_data_target, text_data_train] = [list(x) for x in zip(*text_data)] print(len(text_data_train)) 5574 print(set(text_data_target)) {'ham', 'spam'} print(text_data_train[1]) Ok lar... Joking wif u oni... ``` 1. 電影評論數據:來自康奈爾大學的 Bo Pang 發布了一個電影評論數據集,將評論分為好或壞(3)。[您可以在以下網站上找到數據](http://www.cs.cornell.edu/people/pabo/movie-review-data/)。要下載,提取和轉換此數據,我們可以運行以下代碼: ```py import requests import io import tarfile movie_data_url = 'http://www.cs.cornell.edu/people/pabo/movie-review-data/rt-polaritydata.tar.gz' r = requests.get(movie_data_url) # Stream data into temp object stream_data = io.BytesIO(r.content) tmp = io.BytesIO() while True: s = stream_data.read(16384) if not s: break tmp.write(s) stream_data.close() tmp.seek(0) # Extract tar file tar_file = tarfile.open(fileobj=tmp, mode="r:gz") pos = tar_file.extractfile('rt-polaritydata/rt-polarity.pos') neg = tar_file.extractfile('rt-polaritydata/rt-polarity.neg') # Save pos/neg reviews (Also deal with encoding) pos_data = [] for line in pos: pos_data.append(line.decode('ISO-8859-1').encode('ascii',errors='ignore').decode()) neg_data = [] for line in neg: neg_data.append(line.decode('ISO-8859-1').encode('ascii',errors='ignore').decode()) tar_file.close() print(len(pos_data)) 5331 print(len(neg_data)) 5331 # Print out first negative review print(neg_data[0]) simplistic , silly and tedious . ``` 1. CIFAR-10 圖像數據:加拿大高級研究院發布了一個圖像集,其中包含 8000 萬個帶標簽的彩色圖像(每個圖像縮放為`32 x 32`像素)。有 10 種不同的目標類別(飛機,汽車,鳥類等)。 CIFAR-10 是包含 60,000 張圖像的子集。訓練集中有 50,000 個圖像,測試集中有 10,000 個。由于我們將以多種方式使用此數據集,并且因為它是我們較大的數據集之一,因此我們不會在每次需要時運行腳本。要獲取此數據集,請導航至[此鏈接](http://www.cs.toronto.edu/~kriz/cifar.html)并下載 CIFAR-10 數據集。我們將在相應的章節中介紹如何使用此數據集。 2. 莎士比亞文本數據的作品:古登堡項目(5)是一個發布免費書籍電子版的項目。他們一起編輯了莎士比亞的所有作品。以下代碼顯示了如何通過 Python 訪問此文本文件: ```py import requests shakespeare_url = 'http://www.gutenberg.org/cache/epub/100/pg100.txt' # Get Shakespeare text response = requests.get(shakespeare_url) shakespeare_file = response.content # Decode binary into string shakespeare_text = shakespeare_file.decode('utf-8') # Drop first few descriptive paragraphs. shakespeare_text = shakespeare_text[7675:] print(len(shakespeare_text)) # Number of characters 5582212 ``` 1. 英語 - 德語句子翻譯數據:[Tatoeba 項目](http://tatoeba.org) 收集多種語言的句子翻譯。他們的數據已在 CC 協議下發布。根據這些數據,[ManyThings.org](http://www.manythings.org) 編譯了可供下載的文本文件中的句子到句子的翻譯。在這里,我們將使用英語 - 德語翻譯文件,但您可以將 URL 更改為您想要使用的語言: ```py import requests import io from zipfile import ZipFile sentence_url = 'http://www.manythings.org/anki/deu-eng.zip' r = requests.get(sentence_url) z = ZipFile(io.BytesIO(r.content)) file = z.read('deu.txt') # Format Data eng_ger_data = file.decode() eng_ger_data = eng_ger_data.encode('ascii',errors='ignore') eng_ger_data = eng_ger_data.decode().split('\n') eng_ger_data = [x.split('\t') for x in eng_ger_data if len(x)>=1] [english_sentence, german_sentence] = [list(x) for x in zip(*eng_ger_data)] print(len(english_sentence)) 137673 print(len(german_sentence)) 137673 print(eng_ger_data[10]) ['I' won!, 'Ich habe gewonnen!'] ``` ## 工作原理 當在秘籍中使用這些數據集之一時,我們將引用您到本節并假設數據以上一節中描述的方式加載。如果需要進一步的數據轉換或預處理,那么這些代碼將在秘籍本身中提供。 ## 另見 以下是我們在本書中使用的數據資源的其他參考: * Hosmer,D.W.,Lemeshow,S. 和 Sturdivant,R.X.,2013,應用邏輯回歸:第三版 * [Lichman,M.,2013,UCI 機器學習庫,Irvine,CA:加州大學信息與計算機科學學院](http://archive.ics.uci.edu/ml) * [Bo Pang,Lillian Lee 和 Shivakumar Vaithyanathan,豎起大拇指?使用機器學習技術的情感分類,EMNLP 2002 年會議錄](http://www.cs.cornell.edu/people/pabo/movie-review-data/) * [Krizhevsky,2009 年,從微小圖像學習多層特征](http://www.cs.toronto.edu/~kriz/cifar.html) * [古騰堡項目,2016 年 4 月](http://www.gutenberg.org/) # 其他資源 在本節中,您將找到對學習和使用 TensorFlow 有很大幫助的其他鏈接,文檔資源和教程。 ## 準備 在學習如何使用 TensorFlow 時,有助于知道在哪里尋求幫助或指針。本節列出了運行 TensorFlow 和解決問題的資源。 ## 操作步驟 以下是 TensorFlow 資源列表: * 本書的代碼可在 [Packt 倉庫](https://github.com/nfmcclure/tensorflow_cookbook)在線獲取。 * TensorFlow Python API 官方文檔位于[這里](https://www.tensorflow.org/api_docs/python)。這里有 TensorFlow 中所有函數,對象和方法的文檔和示例。 * TensorFlow 的官方教程非常詳盡。它們位于[這里](https://www.tensorflow.org/tutorials/index.html)。他們開始覆蓋圖像識別模型,并通過 Word2Vec,RNN 模型和序列到序列模型進行工作。他們還有額外的教程來生成分形和解決 PDE 系統。請注意,他們不斷向此集合添加更多教程和示例。 * TensorFlow 的 GitHub 官方倉庫可通過[此鏈接](https://github.com/tensorflow/tensorflow)獲得。在這里,您可以查看開源代碼,甚至可以根據需要分叉或克隆最新版本的代碼。如果導航到 issues 目錄,您還可以查看當前提交的問題。 * Dockerhub 的[此鏈接](https://hub.docker.com/r/tensorflow/tensorflow/)提供了一個由 TensorFlow 保持最新的公共 Docker 容器。 * Stack Overflow 是社區幫助的重要來源。 TensorFlow 有一個標簽。隨著 TensorFlow 越來越受歡迎,這個標簽似乎越來越受關注。要查看此標記上的活動,請訪問[此鏈接](http://stackoverflow.com/questions/tagged/Tensorflow)。 * 雖然 TensorFlow 非常靈活且可以用于很多事情,但 TensorFlow 最常見的用途是深度學習。為了理解深度學習的基礎,基礎數學如何運作,以及在深度學習方面發展更多直覺,谷歌創建了一個在 Udacity 上可用的在線課程。要注冊并參加視頻講座課程,請訪問[此鏈接](https://www.udacity.com/course/deep-learning--ud730)。 * TensorFlow 還建立了一個網站,您可以在視覺上探索訓練神經網絡,同時更改參數和數據集。訪問[此鏈接](http://playground.tensorflow.org/),探討不同的設置如何影響神經網絡的訓練。 * [Geoffrey Hinton 通過 Coursera 教授一個名為神經網絡的機器學習在線課程](https://www.coursera.org/learn/neural-networks)。 * 斯坦福大學有一個[在線教學大綱和詳細的視覺識別卷積神經網絡課程筆記](http://cs231n.stanford.edu/)。
                  <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>

                              哎呀哎呀视频在线观看