<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 功能強大 支持多語言、二開方便! 廣告
                # 八、機器學習最佳實踐和故障排除 在機器學習工程中,至關重要的是要知道如何在系統開發過程中進行操作,以避免陷阱并解決常見問題。 創建機器學習系統(最節省時間和金錢)的最簡單方法是重用已應用于您自己的類似問題的代碼和預先訓練的模型。 如果這不能滿足您的需求,那么您可能需要訓練自己的 CNN 體??系結構,因為有時這可能是解決問題的最佳方法。 但是,面臨的最大挑戰之一是找到針對您的問題量身定制的大規模,公開可用的數據集。 因此,通常情況下,您可能需要創建自己的數據集。 創建自己的數據集時,至關重要的是適當組織它,以確保成功進行模型訓練。 在本章中,我們將介紹并討論日常工作流程,這些工作流程將幫助您回答以下問題: * 我應該如何分割數據集? * 我的數據集足以代表我的問題嗎? * 我的模型應該有多復雜才能有效且準確? * 評估模型的最佳方法是什么? * 我應該如何構造我的代碼? # 建立機器學習系統 為了構建機器學習系統,建議從一個新的小項目開始并逐步改進它: 1. 查找與您類似的問題并下載代碼(并測試模型以檢查結果) 2. 根據需要找到擴展計算的方法(即 AWS/Google Cloud) 3. 從較小的數據集開始,以避免浪費時間等待一個周期 4. 從簡單的架構開始 5. 使用可視化/調試(例如,TensorBoard) 6. 微調模型,微調超參數,深度,架構,層和損失函數 7. 擴展數據集并確保其盡可能干凈 8. 將您的數據集分為訓練,開發和測試集 9. 評估模型 # 數據準備 所有機器學習算法的骨干都是數據。 機器學習算法學習的一切都來自數據。 因此,至關重要的是向算法提供代表問題陳述的正確數據。 就像已經看到的那樣,深度學習特別需要大量數據用于訓練模型。 有時我們可以說一定數量的數據足以解決問題,但是卻永遠不夠! 多多益善。 能夠正確訓練的模型的復雜度與訓練模型上的數據量成正比。 有限的數據將為該問題的模型架構選擇設定上限。 在考慮可用數據量時,還值得注意的是,其中一部分也需要用于驗證和測試目的。 下一節將討論數據分區及其對任何機器學習任務進度的重要性。 # 訓練/開發/測試集的劃分 在討論將數據劃分到其中之前,讓我們定義“訓練集”,“開發集”和“測試集”。 * **訓練集**:用于訓練機器學習算法的數據/示例集。 在機器學習中,此數據用于查找模型/分類器的“最佳”權重。 通常,使用的大多數數據都進入訓練集。 * **開發**/**驗證集**:用于在訓練的中間階段評估模型/分類器的數據部分。 該集合用于微調超參數和評估具有各種配置的模型架構。 它在模型開發期間使用,而不是在最終模型評估中使用。 * **測試集**:模型經過微調和充分訓練(我們對訓練/開發集的損失感到滿意),我們認為它已完全訓練。 然后評估該模型。 對其進行評估的數據稱為測試集。 測試集由數據的看不見部分組成,因此提供了最終模型表現的無偏估計。 為了獲得高表現的神經網絡,將數據集正確劃分為訓練集,開發集和測試集非常重要。 它有助于更??快地迭代。 另外,它允許更有效地測量算法的偏差和方差,以便我們可以選擇有效方式進行改進的方法。 在以前的周期,我們擁有較小的數據集(例如最多 10,000 個示例)和簡單的分類器,我們會將數據集拆分為訓練和測試集。 通常將訓練集分成較小的集,以使用稱為交叉驗證的技術來訓練分類器。 優良作法是按 60/20/20 的比例拆分數據集(即 60% 的訓練數據,20% 的開發數據,20% 的測試數據)。 但是,大數據的現代周期已經改變了這一經驗法則。 如果我們有 1,000,000 個示例,則拆分比例已更改為 98/1/1(即 98% 的訓練數據,1% 的開發數據,1% 的測試數據)。 隨著我們擁有更多的數據,開發和測試集的比例將變小。 ![](https://img.kancloud.cn/55/4f/554f213ec7954cf01367fe33034df0f1_621x339.png) # 開發和測試集不匹配 除了拆分數據之外,數據的分布還對神經網絡的表現產生巨大影響。 應用深度學習中的大多數問題來自開發人員和測試集數據分布的不匹配。 我們需要記住,開發和測試數據應該來自類似的分發。 例如,如果我們以如下方式收集和分割人員檢測數據,即從網頁上收集人員的訓練圖像,而使用移動電話收集測試集圖像,則會出現分布不匹配的情況。 這里的問題是,在訓練模型時,我們會根據其在開發數據上的表現來微調網絡的參數和架構,如果開發數據與訓練數據相似且與測試數據不同,則與訓練集相比開發數據中存在很高的偏差。 在開發集上獲得良好的評估結果并不一定意味著該模型可以很好地推廣。 在這種情況下,對分布完全不同的集合進行測試可能會導致不良結果。 這是浪費時間和精力。 解決方案是首先合并開發集和測試集,隨機將它們洗牌,最后將洗過的數據再次拆分為開發集和測試集。 這有助于在將機器學習算法成功訓練到最終應用方面取得更快的進展。 # 何時更改開發/測試集 根據評估指標對開發/測試集執行良好但不滿足客戶要求(即在部署時執行不佳)的算法,表明我們在數據集中缺少正確的目標數據。 在這種情況下,我們需要對數據集進行更改,因為它對于目標應用而言不夠代??表性。 考慮對貓圖像進行分類。 如果訓練/開發/測試集使用的是高分辨率,高質量的圖像(姿勢完美的貓),而目標應用正在查看具有不同視角的貓或運動中的圖像(模糊),則可以期望算法在部署時表現不佳。 ![](https://img.kancloud.cn/c3/65/c365ba746554ca55cb6c86ba92e8bda6_602x401.png) # 偏差和方差 如第 2 章,“深度學習和卷積神經網絡”中所討論的,方差和偏差分別表示過擬合和欠擬合。 我們可以使用訓練集,開發集和測試集誤差來診斷“欠擬合”和“過擬合”的問題。 考慮以下場景,其中我們的數據來自兩個不同的分布,分別稱為分布 1 和分布 2。分布 2 表示我們關心的目標應用。 問題是,我們如何在這種分布上定義訓練,開發和測試集。 ![](https://img.kancloud.cn/5c/87/5c877871be2244ae81bd2b43e68e7ea7_471x76.png) 最好的方法是根據上圖將其拆分。 分布 1 被拆分為訓練集,其一部分用作開發集。 在這里,我們稱其為“訓練開發集”(因為開發集與訓練集具有相同的分布)。 分布 1 主要用于訓練,因為它是一個大型數據集。 分布 2 分為測試集和開發集,它們與分布 1 中的任一集無關。這里要強調的一點是,測試和開發集應來自同一發行版,并且屬于我們實際上關心的應用,即目標應用。 開發集和測試集通常是小的數據集,因為它們的目的是給出模型/算法的無偏表現估計。 模型在不同數據集分區上的誤差差異,以及查看人為誤差可為我們提供診斷偏差和方差問題的見解 下表顯示了當左列中的集合之間存在誤差時,應如何診斷。 注意,人為水平誤差是此分析的基準,它為比較模型提供了基準。 ![](https://img.kancloud.cn/0c/26/0c265051c98352baf776fde7ee4660ac_418x203.png) 下表可以更好地說明這一點。 在這些示例中,我們假設在所有情況下的最佳/人為誤差均最小,即 1%。 通常,深度學習模型的準確率與人類相似,因此將其作為比較可幫助您找到良好的架構。 * 高偏差/欠擬合 | | | | --- | --- | | 人為/最佳誤差 | 1% | | 訓練誤差 | 15% | 與人員水平的表現相比,訓練誤差較大,這意味著該模型甚至無法擬合數據。 訓練有素,因此欠擬合/高偏差。 但是,當我們在這種情況下查看開發誤差時,它可以很好地概括,因此不會丟失所有內容。 * 高方差/過擬合 | | | | --- | --- | | 訓練誤差 | 1.5% | | 訓練開發誤差 | 30% | 在這種情況下,該模型在看不見的數據上表現不佳,該數據與訓練集屬于同一分布,但不是訓練的一部分。 這意味著該模型無法概括,因此會過擬合訓練數據。 * 高方差和高偏差 | 訓練誤差 | 20% | | 訓練開發誤差 | 40% | 這種情況是最壞的情況,因為我們觀察到該模型無法正確擬合訓練數據,并且不能很好地概括。 這可以通過更改模型架構來解決。 * 數據不匹配 | | | | --- | --- | | 訓練開發誤差 | 2% | | 開發誤差 | 15% | 當模型很好地適合來自與訓練集相同分布的開發集,并且對來自不同分布的開發集表現不佳時,這會導致數據不匹配問題,如本章前面所述。 * 過擬合開發集 | | | | --- | --- | | 開發誤差 | 2% | | 測試誤差 | 15% | 下圖以流程圖的形式介紹了解決上述問題的解決方案/指南: ![](https://img.kancloud.cn/b1/90/b19094c165e8379903e645cb7b02c5fc_1182x994.png) ML 基本秘籍 有用的圖表說明了測試和訓練誤差如何隨模型復雜性而變化,如下所示。 一方面,當模型過于復雜時,往往會過擬合訓練數據,因此,訓練誤差減小而測試誤差增大。 另一方面,較簡單的模型往往不適合并且無法推廣。 模型復雜度的理想范圍是在“測試誤差”開始增加之前以及“訓練誤差”接近零時的某個位置。 ![](https://img.kancloud.cn/66/ac/66ac515feb7ffffed6c20129e2bfce64_1194x668.png) # 數據不平衡 我們已經看到了數據表示和分布在解決偏差和方差問題中的重要性。 我們遇到的另一個相關問題是分類任務中各個類之間的數據分配不均。 這稱為數據不平衡。 例如,如果我們有一個二分類問題,并且其中一個類別有 50000 張圖像,而另一個類別只有 1000 張圖像,這可能會導致訓練算法的表現出現巨大問題。 我們必須通過以下方法解決數據不平衡的問題: # 收集更多數據 是的,最好使類數據分布相等。 收集盡可能多的數據,并用較少的樣本填充類。 為此,您可以在互聯網上搜索與您的問題相似的數據庫并將其包括在內。 簡單的網絡搜索還可以帶來許多由各種來源上傳的圖像。 有時您會發現,使用更多數據不會提高模型表現。 這表明您的模型可能已達到極限。 # 查看您的效果指標 分類準確率不是一個很好的衡量標準,尤其是當我們的數據不平衡時。 這種準確率將更傾向于具有更多數據的類。 有許多良好的表現評估指標可以真實地描述算法的執行方式,例如混淆矩陣,**受試者工作特性曲線**(ROC),**精確召回**(PR)曲線和 F1 分數。 這些將在本章稍后詳細說明。 # 數據綜合/增強 在無法從其他資源收集數據,數據集太小或收集的數據不能很好地表示的情況下,我們需要以某種方式自行生成數據。 這稱為數據增強。 智能生成的數據可以解決許多問題,包括數據集不平衡,訓練數據不足和過擬合。 數據擴充通常是作為輸入數據流水線的一部分來完成的,該流水線在訓練時為模型提供數據。 隨機地,而不是提供原始訓練圖像,您將應用一些增強來更改它。 有很多方法可以進行數據擴充,但是一些示例是: * 增加噪音 * 應用幾何變換 * 交換顏色通道 * 隨機顏色擾動 * 調整亮度/對比度/色相 * 只需添加類似于網絡存在問題的增強,例如,您的模型不適用于黑白圖像; 只需將其添加為新的擴充 # 重采樣數據 這是關于改變我們建立訓練批次的方式。 我們通過更改選擇特定類別的可能性來做到這一點。 例如,如果您有兩個類 A 和 B,其中我們的 A 實例比 B 多得多,則可以更改采樣系統以選擇比 A 多的 B。 # 損失函數加權 我們還可以處理不平衡類,并通過將損失權重包括在內來處理不平衡數據的分類問題。 這種懲罰或權重迫使模型更多地關注少數群體(樣本較少的類別)。 在前面的章節中討論過的懲罰型 SVM 和焦點損失檢測器算法就是這樣的例子。 Tensorflow 已經具有其損失函數,并內置了加權選項: * `tf.losses.sparse_softmax_cross_entropy(labels=label, logits=logits, weights=weights)` * `Tf.nn.weighted_cross_entropy_with_logits` 例如,如果您嘗試對 A,B,C 三個類別進行分類,其中 A 為 10%,B 為 45%,C 為 45%,則可以將`tf.losses.sparse_softmax_cross_entropy`用于以下權重:`[1.0, 0.3, 0.3]`。 # 評價指標 在為模型選擇評估指標時,我們還需要小心。 假設對于狗/非狗分類問題,我們有兩種算法的準確率分別為 98% 和 96%。 乍一看,這些算法看起來都具有相似的表現。 讓我們記住,分類準確率定義為做出的正確預測數除以做出的預測總數。 換句話說,真陽性(TP)和真陰性(TN)預測數除以預測總數。 但是,可能出現的情況是,隨著狗圖像的出現,我們還會得到大量被錯誤分類為狗的背景或類似外觀的對象,通常稱為假陽性(FP)。 另一個不良行為可能是許多狗圖像被錯誤分類為負面或假陰性(FN)。 顯然,根據定義,分類準確率不能捕獲誤報或誤報的概念。 因此,需要更好的評估指標。 第一步,我們將構建一個混淆矩陣,該矩陣總結最后顯示的段落: ![](https://img.kancloud.cn/db/13/db1310e2a14109ab619073bda507bad0_565x183.png) 根據此表,我們可以定義四個其他指標,這些指標可以使我們更好地了解已實現的結果。 這些是: * **真陽性率(TPR)或靈敏度或召回率**:當對象存在時測試結果為陽性的概率(真實陽性率,以百分比表示),`= TP / (TP + FN)` * **假陽性率(FPR)**:是特定測試錯誤拒絕實際陰性的概率,`= FP / (FP + TN)` * **陽性預測值(PPV)或精度**:當檢測結果為陽性(以百分比表示)時該對象存在的概率,`= TP / (TP + FP)` * **陰性預測值(NPV)**:測試陰性(表示為百分比)時不存在對象的概率,`= TN / (TN + FN)` 為了更好地了解這些指標的實用性,我們以兩種不同算法的以下兩個混淆矩陣為例,并計算前面的指標。 范例 1: | | 正 | 負 | | | --- | --- | --- | --- | | 預測為正 | 10(TP) | 13(FP) | 23 | | 預測為負 | 75(FN) | 188(TN) | 263 | | | 85 | 201 | 286 | ```py ACC: (TP + TN) / (TP + TN + FP + FN) = 198/286 = 0.69 TPR: TP / (TP + FN) = 10/85 = 0.11 FPR: FP / (FP + TN) = 13 / 201 = 0.06 PPV: TP / (TP + FP) = 10/23 = 0.43 NPV: TN / (TN + FN) = 188/263 = 0.71 ``` 范例 2: | | 正 | 負 | | | --- | --- | --- | --- | | 預測為正 | 0(TP) | 0(FP) | 0 | | 預測為負 | 85(FN) | 201(TN) | 286 | | | 85 | 201 | 286 | ```py ACC: (TP + TN) / (TP + TN + FP + FN) = 201/286 = 0.70 TPR: TP / (TP + FN) = 0/85 = 0 FPR: FP / (FP + TN) = 0 / 201 = 0 PPV: TP / (TP + FP) = 0/0 = 0 NPV: TN / (TN + FN) = 201/286 = 0.70 ``` 在第一個示例中,我們可以得到 69% 的正確精度,但是在第二個示例中,通過僅對每個示例進行預測,我們實際上將我們的精度提高到 70% ! 顯然,僅預測所有事物為負類的模型并不是一個很好的模型,這就是我們所說的準確率悖論。 簡單來說,“準確率悖論”說,即使模型可能具有更高的準確率,但實際上可能并不是更好的模型。 如前面的示例中所示,當類別不平衡變大時,更可能發生這種現象。 鼓勵讀者對包含 85 個正樣本和 85 個負樣本的平衡數據集重復上述測試。 如果假陽性與假陰性的比例與前面的示例相同,則這將導致第一個示例的分類準確率為 52%,第二個示例的分類準確率為 50%,這表明準確率悖論不適用于平衡數據集。 為了能夠正確評估算法,我們需要查看其他評估指標,例如 TPR 和 FPR。 我們可以看到在第二個示例中它們都為零,這表明算法根本無法檢測到所需的正向對象。 使用精度度量的不平衡數據集的另一種情況是癌癥測試,其中生病的人數大大少于健康的人數。 以下是為此解決的示例。 | | 生病 | 健康 | 總數 | | --- | --- | --- | --- | | 測試結果陽性 | 99(TP) | 999(FP) | 1,098 | | 測試結果陰性 | 1(FN) | 98,901(TN) | 98,902 | | 總數 | 100 | 99,900 | 100,000 | ```py ACC: (TP + TN) / (TP + TN + FP + FN) = 0.99 TPR: TP / (TP + FN) = 0.99 FPR: FP / (FP + TN) = 0.01 PPV: TP / (TP + FP) = 0.09 NPV: TN / (TN + FN) = 0.99 ``` 此處的測試似乎表現不錯,因為準確率為 99%。 但是,如果您被診斷出患有癌癥,這并不意味著您患該病的可能性為 99%。 應該注意的是,在 1098 個測試陽性的患者中,只有 99 個患有該疾病。 這意味著,如果您獲得了陽性測試,那么對于準確率高達 99% 的測試,您實際患病的可能性僅為 9%。 這些示例很好地警告了我們的目標是在測試數據中進行均衡分配,尤其是當您使用準確率指標比較不同模型的有效性時。 比較不同算法的其他有用方法是精確調用和接收器操作特性曲線。 如果我們針對不同的閾值計算上述指標,則可以繪制這些圖。 如果我們算法的輸出不是二進制的(0 表示負數,1 表示正數),但分數在測試為正時接近 1,而在測試為負時接近零,那么 TP,TN,FP,FN 的數量將取決于我們選擇的閾值。 讓我們以圖像中貓檢測為例。 對于每個區域,分類器輸出一個分數,該分數顯示出它對檢測的信心。 如果將閾值設置為 0.5,則 0.6 的分數表示檢測為陽性,而 0.45 的分數表示陰性。 如果閾值降低到 0.4,則兩次檢測都將變為陽性。 下表說明了前面的指標隨閾值而變化的情況。 | 閾值 | FPR | TPR | PPV | TP | TN | FN | FP | | --- | --- | --- | --- | --- | --- | --- | --- | | 0.72 | 1 | 0.98 | 0.33 | 487 | 0 | 7 | 990 | | 0.88 | 0.5 | 0.97 | 0.46 | 485 | 430 | 9 | 560 | | 0.97 | 0.1 | 0.94 | 0.8 | 464 | 878 | 30 | 112 | | 0.99 | 0.05 | 0.93 | 0.87 | 460 | 923 | 34 | 67 | | 1.06 | 0.01 | 0.87 | 0.96 | 430 | 976 | 64 | 14 | | 1.08 | 0.005 | 0.84 | 0.98 | 416 | 985 | 78 | 5 | | 1.16 | 0.001 | 0.69 | 0.99 | 344 | 989 | 150 | 1 | 如果將 FPR 與 TPR 作圖,我們將得到所謂的 ROC(受試者工作特性)曲線,如下所示: ![](https://img.kancloud.cn/b3/40/b340c9f93698592e912d9faff5cc38e5_800x600.png) 要獲得精確召回(PR)曲線,我們需要針對精確度/ PPV 繪制召回率/ TPR。 下圖顯示了該曲線的示例。 建議讀者進一步研究如何解釋 ROC 和 PR 曲線。 ![](https://img.kancloud.cn/5d/24/5d24f279955aa7e8e78a6be292214549_800x600.png) # 代碼結構最佳實踐 在前面的章節中,我們將張量流圖封裝到一個類中,而無需進一步討論。 這個想法本身已經是很好的編碼實踐。 有一個類負責構建圖并僅公開對使用模型有用的東西(即輸入/輸出)是一種很好的編程習慣,可以節省大量時間。 # 單例模式 使用設計模式來解決一些軟件設計問題也是一種常見的做法。 python 中最簡單,最有用的設計模式之一就是單例模式。 當您只想將一個類的實例強制僅用于一個對象時,可以使用它,因此,即使您在項目中的多個不同位置多次實例化該類,也將引用同一個對象。 在我們的情況下,如果我們要求 TensorFlow 創建具有相同名稱的多個節點或圖,則會引發錯誤。 因此,我們在創建圖使用單例模式,以避免生成兩次。 在下面的示例中,我們總結了一個簡單的分類模型,同時還確保不會多次構建圖(也稱為單例模式)。 注意`__new__`類方法的定義。 在 Python 中,當我們創建一個類的新實例時,將調用`__new__`。 ```py class CAE_CNN_Encoder(object): __instance = None # Singleton pattern def __new__(cls): if CAE_CNN_Encoder.__instance is None: # First time new is called CAE_CNN_Encoder.__instance = object.__new__(cls) CAE_CNN_Encoder.__instance.build_graph() return CAE_CNN_Encoder.__instance def build_graph(self, img_size=28): self.__x = tf.placeholder(tf.float32, shape=[None, img_size * img_size], name='IMAGE_IN') self.__x_image = tf.reshape(self.__x, [-1, img_size, img_size, 1]) self.__y_ = tf.placeholder("float", shape=[None, 10], name='Y') with tf.name_scope('ENCODER'): ##### ENCODER # CONV1: Input 28x28x1 after CONV 5x5 P:2 S:2 H_out: 1 + (28+4-5)/2 = 14, W_out= 1 + (28+4-5)/2 = 14 self.__conv1_act = tf.layers.conv2d(inputs=self.__x_image, strides=(2, 2), name='conv1', filters=16, kernel_size=[5, 5], padding="same", activation=tf.nn.relu) # CONV2: Input 14x14x16 after CONV 5x5 P:0 S:2 H_out: 1 + (14+4-5)/2 = 7, W_out= 1 + (14+4-5)/2 = 7 self.__conv2_act = tf.layers.conv2d(inputs=self.__conv1_act, strides=(2, 2), name='conv2', filters=32, kernel_size=[5, 5], padding="same", activation=tf.nn.relu) with tf.name_scope('LATENT'): # Reshape: Input 7x7x32 after [7x7x32] self.__enc_out = tf.layers.flatten(self.__conv2_act, name='flatten_conv2') self.__dense = tf.layers.dense(inputs=self.__enc_out, units=200, activation=tf.nn.relu, name='fc1') self.__logits = tf.layers.dense(inputs=self.__dense, units=10, name='logits') def __init__(self, img_size=28): if CAE_CNN_Encoder.__instance is None: self.build_graph(img_size) @property def output(self): return self.__logits @property def labels(self): return self.__y_ @property def input(self): return self.__x @property def image_in(self): return self.__x_image ``` # CNN 創建秘籍 以下幾點基于我們在訓練神經網絡方面的經驗以及該領域研究人員認為的當前最佳實踐。 希望如果您需要從頭開始設計自己的 CNN 架構,他們將為您提供幫助。 但是,在嘗試設計自己的 CNN 之前,您應該查看其他現成的架構以從中學習,并檢查它們是否已經為您完成了工作。 1. 使用內核大小為`3x3`的卷積層。 就參數和計算而言,較大的內核更昂貴。 最重要的是,如我們在前面的章節中所看到的,您可以堆疊卷積層以產生更大的感受域,并受益于更多的非線性激活。 2. 第一層卷積通常應至少具有 32 個過濾器。 這樣,更深的層不受第一層提取的特征數量的限制。 3. 盡可能避免使用池化層。 相反,請使用步長為 2 的卷積層。這將像池化那樣對輸入進行下采樣,但它不會像池化那樣丟棄寶貴的信息。 同樣,使用跨步卷積就像將卷積和合并在一層中一樣。 4. 減小特征圖的空間大小時,應增加使用的過濾器數量,以免丟失過多信息。 在深度網絡中,請避免在第一層中過快減小空間大小。 5. 請遵循本章中有關從小規模開始網絡設計,然后逐漸增加復雜性的建議,以避免出現過大的問題。 6. 使用批量規范化。 確實有助于訓練您的網絡! 7. 隨著您對網絡的深入了解,逐漸減小特征圖的空間大小。 8. 最小化 FC 層的數量(在最后一層之前使用丟棄)。 僅在最終需要連接某些標量特征時才使用 FC。 (您甚至可以通過在輸入通道上進行編碼來避免這種情況) 9. 如果您需要較大的感受域(對象大小接近總圖像大小的檢測或分類),請嘗試對每層使用具有指數膨脹因子的膨脹卷積。 這樣,您將在保持少量參數的同時非常迅速地擴大接收范圍。 10. 如果網絡變深并且訓練損失沒有減少,請考慮使用剩余連接。 11. 在使網絡精度在期望值之內并且如果計算成本成為問題之后,您可能會根據使用情況,研究深度卷積,瓶頸模塊之類的技術,或現場出現的任何技術。 請記住,CNN 的訓練和設計是一門經驗豐富的科學,因此請始終注意,被視為最佳實踐的內容會迅速發生變化。 # 總結 在本章中,我們了解到遵循最佳實踐將對作為機器學習工程師的日常活動有所幫助。 我們已經看到了如何準備數據集并將其拆分為子集,以促進對網絡的正確訓練和微調。 此外,我們還研究了執行有意義的測試,其中獲得的結果代表了將模型部署到目標應用時所看到的結果。 涉及的另一個主題是對數據的過擬合和不足,以及為了解決這些問題而應遵循的最佳實踐。 此外,解決了數據集不平衡的問題,我們已經看到了一個簡單的示例,該示例可能在哪里找到(疾病診斷)。 為了解決這個問題,建議收集更多的數據,擴充數據集并選擇不平衡數據集不變的評估指標。 最后,展示了如何構造代碼以使其更具可讀性和重用性。 在下一章中,我們將看到如何管理大型數據集以及如何將訓練過程擴展到多個 GPU 和系統。
                  <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>

                              哎呀哎呀视频在线观看