<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>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                # 一、入門 TensorFlow 是 Google 最近發布的新的機器學習和圖計算庫。 其 Python 接口可確保通用模型的優雅設計,而其編譯后的后端可確保速度。 讓我們看一下應用 TensorFlow 時要學習的技術和要構建的模型。 # 安裝 TensorFlow 在本節中,您將學習什么是 TensorFlow,如何安裝 TensorFlow 以及如何構建簡單模型和進行簡單計算。 此外,您將學習如何建立用于分類的邏輯回歸模型,并介紹機器學習問題以幫助我們學習 TensorFlow。 我們將學習 TensorFlow 是什么類型的庫,并將其安裝在我們自己的 Linux 機器上;如果您無法訪問 Linux 機器,則將其安裝在 CoCalc 的免費實例中。 ## TensorFlow 主頁 首先,什么是 TensorFlow? TensorFlow 是 Google 推出的新的機器學習庫。 它被設計為非常易于使用且非常快。 如果您訪問 [TensorFlow 網站](http://tensorflow.org),則可以訪問有關 TensorFlow 是什么以及如何使用的大量信息。 我們將經常提到這一點,特別是文檔。 ## TensorFlow 安裝頁面 在我們開始使用 TensorFlow 之前,請注意,您需要先安裝它,因為它可能尚未預先安裝在您的操作系統上。 因此,如果轉到 TensorFlow 網頁上的“安裝”選項卡,單擊在 Ubuntu 上安裝 TensorFlow,然后單擊“本機 PIP”,您將學習如何安裝 TensorFlow。 ![TensorFlow – the installation page](https://img.kancloud.cn/80/f4/80f44681bf841aa08451b0a4fb73ffbf_566x298.jpg) 即使對于經驗豐富的系統管理員來說,安裝 TensorFlow 也是非常困難的。 因此,我強烈建議您使用類似`pip`的安裝方式。 或者,如果您熟悉 Docker,請使用 Docker 安裝。 您可以從源代碼安裝 TensorFlow,但這可能非常困難。 我們將使用稱為 wheel 文件的預編譯二進制文件安裝 TensorFlow。 您可以使用 Python 的`pip`模塊安裝程序來安裝此文件。 ## 通過`pip`安裝 對于`pip`安裝,您可以選擇使用 Python2 或 Python3 版本。 另外,您可以在 CPU 和 GPU 版本之間進行選擇。 如果您的計算機具有功能強大的顯卡,則可能適合您使用 GPU 版本。 ![Installing via pip](https://img.kancloud.cn/44/fe/44fe696e06a9c41b5ba8662adb7da6fe_566x266.jpg) 但是,您需要檢查顯卡是否與 TensorFlow 兼容。 如果不是,那很好。 本系列中的所有內容都可以僅使用 CPU 版本來完成。 ### 注意 我們可以使用`pip install tensorflow`命令(基于您的 CPU 或 GPU 支持以及`pip`版本)安裝 TensorFlow,如前面的屏幕截圖所示。 因此,如果您為 TensorFlow 復制以下行,則也可以安裝它: ```py # Python 3.4 installation sudo pip3 install --upgrade \ https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-1.2.1-cp34-cp34m-linux_x86_64.whl ``` 如果您沒有 Python 3.4,請按照 wheel 文件的要求進行操作,那就可以了。 您可能仍然可以使用相同的 wheel 文件。 讓我們看一下如何在 Python 3.5 上執行此操作。 首先,只需將以下 URL 放在瀏覽器中,或使用命令行程序(例如`wget`)直接下載 wheel 文件,就像我們在這里所做的那樣: ```py wget https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-1.2.1-cp34-cp34m-linux_x86_64.whl ``` 如果下載此文件,它將很快被您的計算機抓住。 現在,您需要做的就是將文件名從`cp34`(代表 Python 3.4)更改為您使用的任何版本的 Python3。 在這種情況下,我們將其更改為使用 Python 3.5 的版本,因此我們將`4`更改為`5`: ```py mv tensorflow-1.2.1-cp34-cp34m-linux_x86_64.whl tensorflow-1.2.1-cp35-cp35m-linux_x86_64.whl ``` 現在您可以通過簡單地將安裝行更改為`pip3 install`并將新 wheel 文件的名稱更改為 3.5 后,來為 Python 3.5 安裝 TensorFlow: ```py sudo pip3 install ./tensorflow-1.2.1-cp35-cp35m-linux_x86_64.whl ``` 我們可以看到這很好。 現在,您已經安裝了 TensorFlow。 ![Installing via pip](https://img.kancloud.cn/cf/1f/cf1f387eed57ec28d42cd57f9634e5ac_566x339.jpg) 如果您的安裝以后因某種原因損壞了,您可以隨時跳回到該部分,以提醒自己有關安裝所涉及的步驟。 ## 通過 CoCalc 安裝 如果您沒有計算機的管理或安裝權限,但仍然想嘗試 TensorFlow,則可以嘗試在 CoCalc 實例中通過 Web 運行 TensorFlow。 如果轉到 [cocalc.com](https://cocalc.com/) 并創建一個新帳戶,則可以創建一個新項目。 這將為您提供一種可以玩耍的虛擬機。 方便的是,TensorFlow 已經安裝在 Anaconda 3 內核中。 ![Installing via CoCalc](https://img.kancloud.cn/2f/2a/2f2a6ff293f295f851dfa3b538215200_566x168.jpg) 讓我們創建一個名為`TensorFlow`的新項目。 單擊+創建新項目...,為您的項目輸入標題,然后單擊創建項目。 現在,我們可以通過單擊標題進入我們的項目。 加載將需要幾秒鐘。 ![Installing via CoCalc](https://img.kancloud.cn/30/93/30936306db35b09aec3b3b579d5535fb_566x219.jpg) 單擊+新建以創建一個新文件。 在這里,我們將創建一個 Jupyter 筆記本: ![Installing via CoCalc](https://img.kancloud.cn/f4/bc/f4bc4a71f32a20108fbe712d4e67f664_566x219.jpg) Jupyter 是與 IPython 進行交互的便捷方法,也是使用 CoCalc 進行這些計算的主要手段。 加載可能需要幾秒鐘。 進入下面的屏幕快照中所示的界面時,您需要做的第一件事是通過轉到“內核 | 更改內核… | Python3(Anaconda)”將內核更改為 Anaconda Python3: ![Installing via CoCalc](https://img.kancloud.cn/e8/b7/e8b7cfe69ba6c780de31603597fd57f3_566x233.jpg) 這將為您提供適當的依賴關系以使用 TensorFlow。 更改內核可能需要幾秒鐘。 連接到新內核后,可以在單元格中鍵入`import tensorflow`,然后轉到“單元格 | 運行單元格”以檢查其是否有效: ![Installing via CoCalc](https://img.kancloud.cn/eb/17/eb1790da6e92786a2c86bac520a88c93_566x229.jpg) 如果 Jupyter 筆記本需要很長時間才能加載,則可以使用以下屏幕截圖中所示的按鈕在 CoCalc 中創建終端: ![Installing via CoCalc](https://img.kancloud.cn/a1/04/a10416bac79ac451ab6e9ec63eec540c_566x220.jpg) 到那里后,鍵入`anaconda3`切換環境,然后鍵入`ipython3`啟動交互式 Python 會話,如以下屏幕截圖所示: ![Installing via CoCalc](https://img.kancloud.cn/ea/dd/eadd8389de735a368001cee66422a5f9_566x412.jpg) 盡管您無法可視化輸出,但是您可以在這里輕松地工作。 在終端中輸入`import tensorflow`,然后離開。 到目前為止,您已經了解了 TensorFlow 是什么以及如何在本地或 Web 上的虛擬機上安裝 TensorFlow。 現在我們準備在 TensorFlow 中探索簡單的計算。 # 簡單的計算 首先,我們將看一下張量對象類型。 然后,我們將理解定義計算的 TensorFlow 圖。 最后,我們將使用會話運行圖,顯示如何替換中間值。 ## 定義標量和張量 您需要做的第一件事是下載本書的源代碼包并打開`simple.py`文件。 您可以使用此文件將行復制并粘貼到 TensorFlow 或 CoCalc 中,也可以直接鍵入它們。 首先,讓我們將`tensorflow`導入為`tf`。 這是在 Python 中引用它的便捷方法。 您需要在`tf.constant`通話中保留常數。 例如,做`a = tf.constant(1)`和`b = tf.constant(2)`: ```py import tensorflow as tf # You can create constants in TF to hold specific values a = tf.constant(1) b = tf.constant(2) ``` 當然,您可以將它們相加并相乘以獲得其他值,即`c`和`d`: ```py # Of course you can add, multiply, and compute on these as you like c = a + b d = a * b ``` TensorFlow 數字以張量存儲,這是多維數組的一個花哨術語。 如果您將 Python 列表傳遞給 TensorFlow,它將做正確的事并將其轉換為適當尺寸的張量。 您可以在以下代碼中看到這一點: ```py # TF numbers are stored in "tensors", a fancy term for multidimensional arrays. If you pass TF a Python list, it can convert it V1 = tf.constant([1., 2.]) # Vector, 1-dimensional V2 = tf.constant([3., 4.]) # Vector, 1-dimensional M = tf.constant([[1., 2.]]) # Matrix, 2d N = tf.constant([[1., 2.],[3.,4.]]) # Matrix, 2d K = tf.constant([[[1., 2.],[3.,4.]]]) # Tensor, 3d+ ``` `V1`向量(一維張量)作為`[1\. , 2.]`的 Python 列表傳遞。 這里的點只是強制 Python 將數字存儲為十進制值而不是整數。 `V2`向量是`[3\. , 4\. ]`的另一個 Python 列表。 `M`變量是由 Python 中的列表列表構成的二維矩陣,在 TensorFlow 中創建了二維張量。 `N`變量也是二維矩陣。 請注意,這一行實際上有多行。 最后,`K`是一個真實的張量,包含三個維度。 請注意,最終維度僅包含一個條目,即一個`2 x 2`框。 如果該項有點混亂,請不要擔心。 每當您看到一個奇怪的新變量時,都可以跳回到這一點以了解它可能是什么。 ## 張量計算 您還可以做一些簡單的事情,例如將張量相加: ```py V3 = V1 + V2 ``` 或者,您可以將它們逐個元素相乘,以便將每個公共位置相乘在一起: ```py # Operations are element-wise by default M2 = M * M ``` 但是,對于真正的矩陣乘法,您需要使用`tf.matmul`,傳入兩個張量作為參數: ```py NN = tf.matmul(N,N) ``` ## 執行計算 到目前為止,所有內容都已指定 TensorFlow 圖; 我們還沒有計算任何東西。 為此,我們需要啟動一個進行計算的會話。 以下代碼創建一個新的會話: ```py sess = tf.Session() ``` 打開會話后,請執行以下操作:`sess.run(NN)`將計算給定的表達式并返回一個數組。 通過執行以下操作,我們可以輕松地將其發送到變量: ```py output = sess.run(NN) print("NN is:") print(output) ``` 如果現在運行此單元格,則應該在屏幕上看到`NN`輸出的正確張量數組: ![Doing computation](https://img.kancloud.cn/ea/79/ea7978b55ae9498d84ff5cefa9b539fb_290x145.jpg) 使用完會話后,最好將其關閉,就像關閉文件句柄一樣: ```py # Remember to close your session when you're done using it sess.close() ``` 對于交互式工作,我們可以像這樣使用`tf.InteractiveSession()`: ```py sess = tf.InteractiveSession() ``` 然后,您可以輕松計算任何節點的值。 例如,輸入以下代碼并運行單元格將輸出`M2`的值: ```py # Now we can compute any node print("M2 is:") print(M2.eval()) ``` ## 可變張量 當然,并非我們所有的數字都是恒定的。 例如,要更新神經網絡中的權重,我們需要使用`tf.Variable`創建適當的對象: ```py W = tf.Variable(0, name="weight") ``` 請注意,TensorFlow 中的變量不會自動初始化。 為此,我們需要使用一個特殊的調用,即`tf.global_variables_initializer()`,然后使用`sess.run()`運行該調用: ```py init_op = tf.global_variables_initializer() sess.run(init_op) ``` 這是在該變量中放置一個值。 在這種情況下,它將把`0`值填充到`W`變量中。 讓我們驗證一下`W`是否具有該值: ```py print("W is:") print(W.eval()) ``` 您應該在單元格中看到`0`的`W`的輸出值: ![Variable tensors](https://img.kancloud.cn/25/47/2547729f4c58e3d4b79225751cf103ab_284x112.jpg) 讓我們看看向其中添加`a`會發生什么: ```py W += a print("W after adding a:") print(W.eval()) ``` 回想一下`a`是`1`,因此您在這里得到`1`的期望值: ![Variable tensors](https://img.kancloud.cn/67/ea/67ea66cb94107beb27269b5e10aaf37f_357x137.jpg) 讓我們再次添加`a`,以確保我們可以遞增并且它確實是一個變量: ```py W += a print("W after adding a:") print(W.eval()) ``` 現在您應該看到`W`持有`2`,因為我們已經使用`a`對其進行了兩次遞增: ![Variable tensors](https://img.kancloud.cn/73/4e/734eba27d2a1fb65e672c1bbd3f72d87_434x165.jpg) ## 查看和替換中間值 在執行 TensorFlow 計算時,您可以返回或提供任意節點。 讓我們定義一個新節點,但同時在`fetch`調用中返回另一個節點。 首先,讓我們定義新節點`E`,如下所示: ```py E = d + b # 1*2 + 2 = 4 ``` 讓我們看看`E`的開頭是: ```py print("E as defined:") print(E.eval()) ``` 如您所料,您應該看到`E`等于`4`。 現在讓我們看一下如何傳遞`E`和`d`多個節點,以從`sess.run`調用中返回多個值: ```py # Let's see what d was at the same time print("E and d:") print(sess.run([E,d])) ``` 您應該看到輸出中返回了多個值,即`4`和`2`: ![Viewing and substituting intermediate values](https://img.kancloud.cn/2d/34/2d342b1a2c9a958c45ea651a8350a2fa_364x109.jpg) 現在假設我們要使用其他中間值,例如出于調試目的。 返回值時,我們可以使用`feed_dict`將自定義值提供給計算中任何位置的節點。 讓我們現在用`d`等于`4`而不是`2`來做: ```py # Use a custom d by specifying a dictionary print("E with custom d=4:") print(sess.run(E, feed_dict = {d:4.})) ``` 請記住,`E` 等于 `d + b`,`d`和`b`的值都是`2`。 盡管我們為`d`插入了`4`的新值,但是您應該看到`E`的值現在將輸出為`6`: ![Viewing and substituting intermediate values](https://img.kancloud.cn/76/09/7609ac95de3e25ede3042849b08dccf3_494x130.jpg) 您現在已經了解了如何使用 TensorFlow 張量進行核心計算。 現在是時候通過建立邏輯回歸模型來邁出下一步。 # 邏輯回歸模型構建 好的,讓我們開始構建一個真正的機器學習模型。 首先,我們將看到提出的機器學習問題:字體分類。 然后,我們將回顧一個簡單的分類算法,稱為邏輯回歸。 最后,我們將在 TensorFlow 中實現邏輯回歸。 ## 字體分類數據集簡介 在開始之前,讓我們加載所有必需的模塊: ```py import tensorflow as tf import numpy as np ``` 如果要復制并粘貼到 IPython,請確保將`autoindent`屬性設置為`OFF`: ```py %autoindent ``` `tqdm`模塊是可選的; 它只是顯示了不錯的進度條: ```py try: from tqdm import tqdm except ImportError: def tqdm(x, *args, **kwargs): return x ``` 接下來,我們將設置`0`的種子,以使每次運行之間的數據分割保持一致: ```py # Set random seed np.random.seed(0) ``` 在本書中,我們提供了使用五種字體的字符圖像數據集。 為方便起見,這些文件存儲在壓縮的 NumPy 文件(`data_with_labels.npz`)中,該文件可在本書的下載包中找到。 您可以使用`numpy.load`輕松將它們加載到 Python 中: ```py # Load data data = np.load('data_with_labels.npz') train = data['arr_0']/255. labels = data['arr_1'] ``` 這里的`train`變量保存從 0 到 1 縮放的實際像素值,`labels`保留原來的字體類型。 因此,它將是 0、1、2、3 或 4,因為總共有五種字體。 您可以打印這些值,因此可以使用以下代碼查看它們: ```py # Look at some data print(train[0]) print(labels[0]) ``` 但是,這不是很有啟發性,因為大多數值都是零,并且僅屏幕的中央部分包含圖像數據: ![Introducing the font classification dataset](https://img.kancloud.cn/b9/e1/b9e11123d76bad7bd217f75daae4d335_356x236.jpg) 如果您已安裝 Matplotlib,則現在是導入它的好地方。 在需要時,我們將使用`plt.ion()`自動調出數字: ```py # If you have matplotlib installed import matplotlib.pyplot as plt plt.ion() ``` 這是每種字體的一些字符示例圖: ![Introducing the font classification dataset](https://img.kancloud.cn/7c/1e/7c1ef24e6c8107d640ee28d3331d646e_346x751.jpg) 是的,他們很浮華。 在數據集中,每個圖像都表示為像素暗度值的`36 x 36`二維矩陣。 0 值表示白色像素,而 255 表示黑色像素。 兩者之間的一切都是灰色陰影。 這是在您自己的計算機上顯示這些字體的代碼: ```py # Let's look at a subplot of one of A in each font f, plts = plt.subplots(5, sharex=True) c = 91 for i in range(5): plts[i].pcolor(train[c + i * 558], cmap=plt.cm.gray_r) ``` 如果您的圖看起來確實很寬,則可以使用鼠標輕松調整窗口大小。 如果您只是以交互方式進行繪圖,則在 Python 中提前調整其大小通常需要做很多工作。 鑒于我們還有許多其他標記的字體圖像,我們的目標是確定圖像屬于哪種字體。 為了擴展數據集并避免過擬合,我們還在`36 x 36`區域內抖動了每個字符,為我們提供了 9 倍的數據點。 在使用較新的模型后重新回到這一點可能會有所幫助。 無論最終模型有多高級,記住原始數據都非常重要。 ## 邏輯回歸 如果您熟悉線性回歸,那么您將了解邏輯回歸。 基本上,我們將為圖像中的每個像素分配一個權重,然后對這些像素進行加權求和(權重為`beta`,像素為`X`)。 這將為我們提供該圖像是特定字體的分數。 每種字體都有自己的權重集,因為它們對像素的重視程度不同。 要將這些分數轉換為適當的概率(由`Y`表示),我們將使用`softmax`函數將其總和強制在 0 到 1 之間,如下所示。 對于特定圖像而言,無論最大概率是多少,我們都將其分類為關聯的類別。 您可以在大多數統計建模教科書中閱讀有關邏輯回歸理論的更多信息。 這是它的公式: ![Logistic regression](https://img.kancloud.cn/08/7c/087c9d73c42c97c24b2d8d44f3aa4738_566x244.jpg) William H. Greene 的《計量經濟學分析》(Pearson)于 2012 年出版,這是一本針對應用的很好的參考。 ## 準備數據 在 TensorFlow 中實現邏輯回歸非常容易,并將作為更復雜的機器學習算法的基礎。 首先,我們需要將整數標簽轉換為單格式。 這意味著,不是將字體類標記為 2,而是將標簽轉換為`[0, 0, 1, 0, 0]`。 也就是說,我們將`1`放在第二個位置(注意,向上計數在計算機科學中很常見),而`0`則放在其他位置。 這是我們的`to_onehot`函數的代碼: ```py def to_onehot(labels,nclasses = 5): ''' Convert labels to "one-hot" format. >>> a = [0,1,2,3] >>> to_onehot(a,5) array([[ 1., 0., 0., 0., 0.], [ 0., 1., 0., 0., 0.], [ 0., 0., 1., 0., 0.], [ 0., 0., 0., 1., 0.]]) ''' outlabels = np.zeros((len(labels),nclasses)) for i,l in enumerate(labels): outlabels[i,l] = 1 return outlabels ``` 完成此操作后,我們可以繼續調用該函數: ```py onehot = to_onehot(labels) ``` 對于像素,在這種情況下,我們實際上并不需要矩陣,因此我們將`36 x 36`的數字展平為長度為 1,296 的一維向量,但這會在以后出現。 另外,回想一下,我們已經重新調整了 0-255 的像素值,使其介于 0 和 1 之間。 好的,我們的最后準備是將數據集分為訓練和驗證集。 這將有助于我們稍后解決過擬合問題。 訓練集將幫助我們確定邏輯回歸模型中的權重,而驗證集將僅用于確認這些權重在新數據上是否合理: ```py # Split data into training and validation indices = np.random.permutation(train.shape[0]) valid_cnt = int(train.shape[0] * 0.1) test_idx, training_idx = indices[:valid_cnt],\ indices[valid_cnt:] test, train = train[test_idx,:],\ train[training_idx,:] onehot_test, onehot_train = onehot[test_idx,:],\ onehot[training_idx,:] ``` ## 建立 TensorFlow 模型 好的,讓我們通過創建一個交互式會話來開始 TensorFlow 代碼: ```py sess = tf.InteractiveSession() ``` 這樣,我們就在 TensorFlow 中開始了我們的第一個模型。 我們將為`x`使用占位符變量,該變量代表我們的輸入圖像。 這只是告訴 TensorFlow 我們稍后將通過`feed_dict`為該節點提供值: ```py # These will be inputs ## Input pixels, flattened x = tf.placeholder("float", [None, 1296]) ``` 另外,請注意,我們可以指定此張量的形狀,在這里我們將`None`用作大小之一。 `None`的大小允許我們立即將任意數量的數據點發送到算法中以進行批量。 同樣,我們將使用變量`y_`來保存我們已知的標簽,以便稍后進行訓練: ```py ## Known labels y_ = tf.placeholder("float", [None,5]) ``` 要執行邏輯回歸,我們需要一組權重(`W`)。 實際上,五個字體類別中的每一個都需要 1,296 的權重,這將為我們提供形狀。 請注意,我們還希望為每個類別添加一個額外的權重作為偏差(`b`)。 這與添加始終為`1`值的額外輸入變量相同: ```py # Variables W = tf.Variable(tf.zeros([1296,5])) b = tf.Variable(tf.zeros([5])) ``` 隨著所有這些 TensorFlow 變量浮動,我們需要確保對其進行初始化。 現在給他們打電話: ```py # Just initialize sess.run(tf.global_variables_initializer()) ``` 做得好! 您已經準備好一切。 現在,您可以實現`softmax`公式來計算概率。 由于我們非常仔細地設置權重和輸入,因此 TensorFlow 只需調用`tf.matmul`和`tf.nn.softmax`就可以輕松完成此任務: ```py # Define model y = tf.nn.softmax(tf.matmul(x,W) + b) ``` 而已! 您已經在 TensorFlow 中實現了整個機器學習分類器。辛苦了。但是,我們從哪里獲得權重的值? 讓我們看一下使用 TensorFlow 訓練模型。 # 邏輯回歸訓練 首先,您將了解我們的機器學習分類器的損失函數,并在 TensorFlow 中實現它。 然后,我們將通過求值正確的 TensorFlow 節點來快速訓練模型。 最后,我們將驗證我們的模型是否合理準確,權重是否合理。 ## 定義損失函數 優化我們的模型實際上意味著最大程度地減少我們的誤差。 使用我們的標簽,可以很容易地將它們與模型預測的類概率進行比較。 類別`cross_entropy`函數是測量此函數的正式方法。 盡管確切的統計信息超出了本課程的范圍,但是您可以將其視為對模型的懲罰,以期獲得更不準確的預測。 為了進行計算,我們將單熱的實數標簽與預測概率的自然對數相乘,然后將這些值相加并取反。 為方便起見,TensorFlow 已經包含此函數為`tf.nn.softmax_cross_entropy_with_logits()`,我們可以這樣稱呼它: ```py # Climb on cross-entropy cross_entropy = tf.reduce_mean( tf.nn.softmax_cross_entropy_with_logits( logits = y + 1e-50, labels = y_)) ``` 請注意,我們在此處添加了一個較小的`1e-50`誤差值,以避免數值不穩定問題。 ## 訓練模型 TensorFlow 的便利之處在于它提供了內置的優化器,以利用我們剛剛編寫的損失函數。 梯度下降是一種常見的選擇,它將使我們的權重逐漸趨于更好。 這是將更新我們權重的節點: ```py # How we train train_step = tf.train.GradientDescentOptimizer( 0.02).minimize(cross_entropy) ``` 在我們實際開始訓練之前,我們應該指定一些其他節點來評估模型的表現: ```py # Define accuracy correct_prediction = tf.equal(tf.argmax(y,1), tf.argmax(y_,1)) accuracy = tf.reduce_mean(tf.cast( correct_prediction, "float")) ``` 如果我們的模型將最高概率分配給正確的類別,則`correct_prediction`節點為`1`,否則為`0`。 `accuracy`變量對可用數據的這些預測取平均值,從而使我們對模型的執行情況有一個整體認識。 在進行機器學習訓練時,我們經常希望多次使用同一數據點,以擠出所有信息。 每次遍歷整個訓練數據都稱為一個周期。 在這里,我們將每 10 個時間段同時保存訓練和驗證準確率: ```py # Actually train epochs = 1000 train_acc = np.zeros(epochs//10) test_acc = np.zeros(epochs//10) for i in tqdm(range(epochs)): # Record summary data, and the accuracy if i % 10 == 0: # Check accuracy on train set A = accuracy.eval(feed_dict={ x: train.reshape([-1,1296]), y_: onehot_train}) train_acc[i//10] = A # And now the validation set A = accuracy.eval(feed_dict={ x: test.reshape([-1,1296]), y_: onehot_test}) test_acc[i//10] = A train_step.run(feed_dict={ x: train.reshape([-1,1296]), y_: onehot_train}) ``` 請注意,我們使用`feed_dict`傳遞不同類型的數據以獲得不同的輸出值。 最后,`train_step.run`每次迭代都會更新模型。 在典型的計算機上,這只需幾分鐘,如果使用 GPU,則要少得多,而在功率不足的計算機上則要花更多時間。 您剛剛使用 TensorFlow 訓練了模型; 真棒! ## 評估模型準確率 在 1,000 個周期之后,讓我們看一下模型。 如果您安裝了 Matplotlib,則可以在繪圖中查看精度; 如果沒有,您仍然可以查看電話號碼。 對于最終結果,請使用以下代碼: ```py # Notice that accuracy flattens out print(train_acc[-1]) print(test_acc[-1]) ``` 如果您確實安裝了 Matplotlib,則可以使用以下代碼顯示圖: ```py # Plot the accuracy curves plt.figure(figsize=(6,6)) plt.plot(train_acc,'bo') plt.plot(test_acc,'rx') ``` 您應該看到類似下面的圖(請注意,我們使用了一些隨機初始化,因此可能并不完全相同): ![Evaluating the model accuracy](https://img.kancloud.cn/a8/fe/a8fe12c4c9915d1ad0cec66ee1e96f17_479x542.jpg) 驗證精度似乎在經過約 400-500 次迭代后趨于平穩; 除此之外,我們的模型可能過擬合或沒有學到更多。 同樣,即使最終精度大約是 40%,看起來也很差,但請記住,對于五個類別,完全隨機的猜測將僅具有 20% 的精度。 有了這個有限的數據集,簡單的模型就可以做到。 查看計算出的權重通常也很有幫助。 這些可以為您提供有關模型認為重要的線索。 讓我們按給定類的像素位置繪制它們: ```py # Look at a subplot of the weights for each font f, plts = plt.subplots(5, sharex=True) for i in range(5): plts[i].pcolor(W.eval()[:,i].reshape([36,36])) ``` 這應該給您類似于以下的結果(同樣,如果圖顯示得很寬,則可以擠壓窗口大小以使其平方): ![Evaluating the model accuracy](https://img.kancloud.cn/23/93/2393dd823c903fa269089e117d883dcd_367x751.jpg) 我們可以看到,在某些模型中,靠近內部的權重很重要,而外部的權重基本上為零。 這是有道理的,因為沒有字體字符到達圖像的角落。 同樣,請注意,由于隨機初始化的影響,最終結果可能看起來有些不同。 隨時可以嘗試并更改模型的參數; 這就是您學習新事物的方式。 ## 總結 在本章中,我們在可以使用的機器上安裝了 TensorFlow。 經過一些基本計算的小步驟,我們跳入了機器學習問題,僅通過邏輯回歸和幾行 TensorFlow 代碼就成功構建了一個體面的模型。 在下一章中,我們將看到 TensorFlow 在深度神經網絡方面的優勢。
                  <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>

                              哎呀哎呀视频在线观看