<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智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                # Keras 深度學習庫的二元分類教程 > 原文: [https://machinelearningmastery.com/binary-classification-tutorial-with-the-keras-deep-learning-library/](https://machinelearningmastery.com/binary-classification-tutorial-with-the-keras-deep-learning-library/) Keras 是一個用于深度學習的 Python 庫,它包含了高效的數值庫 TensorFlow 和 Theano。 Keras 允許您快速簡單地設計和訓練神經網絡和深度學習模型。 在這篇文章中,您將逐步完成二元分類項目并了解如何在機器學習項目中高效使用 Keras 庫。 完成本教程后,您將了解: * 如何加載訓練數據并將其提供給 Keras。 * 如何設計和訓練表格數據形式的神經網絡。 * 如何評估 Keras 神經網絡模型在不可見的數據上的性能。 * 如何在使用神經網絡時進行數據預處理以提升模型性能。 * 如何調整 Keras 中神經網絡的拓撲和配置。 讓我們現在開始吧。 * **2016 年 10 月更新**:更新了 Keras 1.1.0 和 scikit-learn v0.18 的示例。 * **2017 年 3 月更新**:更新了 Keras 2.0.2,TensorFlow 1.0.1 和 Theano 0.9.0 的示例。 ![Binary Classification Worked Example with the Keras Deep Learning Library](https://img.kancloud.cn/3a/04/3a04e64a73ab6371210d4d1f6ca81ea7_640x454.png) 圖片由[Mattia Merlo](https://www.flickr.com/photos/h_crimson/9405280189/) 提供,并保留所屬權利。 ## 1.數據集的描述 我們將在本教程中使用的數據集是 [Sonar 數據集](https://archive.ics.uci.edu/ml/datasets/Connectionist+Bench+(Sonar,+Mines+vs.+Rocks))。 這是一個描述聲納啁啾返回彈跳不同服務的數據集,60 個輸入變量是不同角度的回報強度。這是一個二元分類問題,需要構建一個模型來區分巖石和金屬。 您可以在 [UCI 機器學習庫](https://archive.ics.uci.edu/ml/datasets/Connectionist+Bench+(Sonar,+Mines+vs.+Rocks))上了解有關此數據集的更多信息。您可以[免費下載數據集](https://archive.ics.uci.edu/ml/machine-learning-databases/undocumented/connectionist-bench/sonar/sonar.all-data)并將其放在工作目錄中,文件名為 sonar.csv。 這是一個眾所周知的數據集。所有變量都是連續的,通常在 0 到 1 的范圍內。輸出變量是代表礦石的字符“M”和代表巖石的字符“R” 使用此數據集的好處是它是一個標準的基準問題,這意味著我們對構建一個較好模型的預期技巧有所了解。使用交叉驗證,神經網絡[應該能夠達到 84%左右的性能](http://www.is.umk.pl/projects/datasets.html#Sonar),定制模型的精確度上限約為 88%。 ## 2.基線神經網絡模型性能 讓我們為這個問題創建一個基線模型和結果。 我們將首先導入我們需要的所有類和函數。 ```py import numpy import pandas from keras.models import Sequential from keras.layers import Dense from keras.wrappers.scikit_learn import KerasClassifier from sklearn.model_selection import cross_val_score from sklearn.preprocessing import LabelEncoder from sklearn.model_selection import StratifiedKFold from sklearn.preprocessing import StandardScaler from sklearn.pipeline import Pipeline ``` 接下來,我們可以初始化隨機數生成器,以確保在執行此代碼時始終獲得相同的結果。如果我們正在調試模型,這將對我們有所幫助。 ```py # 固定隨機種子的在線性 seed = 7 numpy.random.seed(seed) ``` 現在我們可以使用 [pandas](http://pandas.pydata.org/) 加載數據集,并將列拆分為 60 個輸入變量(X)和 1 個輸出變量(Y),我們使用 pandas 來加載數據,因為它可以輕松處理字符串(輸出變量),如果嘗試使用 NumPy 直接加載數據會比較困難。 ```py # 加載數據集 dataframe = pandas.read_csv("sonar.csv", header=None) dataset = dataframe.values # 將數據集分割為輸入變量和輸出變量 X = dataset[:,0:60].astype(float) Y = dataset[:,60] ``` 輸出變量是字符串值,我們必須將它們轉換為整數值 0 和 1。 我們可以使用 scikit-learn 中的 LabelEncoder 類來完成此操作。此類將通過 `fit()`函數使用整個數據集對所需的編碼進行建模,然后應用編碼以使用`transform()`函數創建新的輸出變量。 ```py # 轉換字符編碼 encoder = LabelEncoder() encoder.fit(Y) encoded_Y = encoder.transform(Y) ``` 我們現在準備使用 Keras 創建我們的神經網絡模型。 我們將使用 scikit-learn 來使用分層 k 折交叉驗證來評估模型,這是一種重采樣技術,可以提供模型性能的估計。它通過將數據集分成 k 個部分來實現這一點,除了作為測試集的一部分用以評估模型的性能外,在其他所有訓練數據上訓練模型,該過程重復 k 次,并且所有構建的模型的平均分數被用作模型性能的穩健估計,因為它是分層的設計,這意味著它將查看輸出值并嘗試平衡屬于數據 k 分裂中每個類的實例數。 要將 Keras 模型與 scikit-learn 一起使用,我們必須使用 KerasClassifier封裝器。該類采用創建并返回神經網絡模型的函數,將參數傳遞給 `fit()`調用,例如迭代數和批量大小。 讓我們從定義創建基線模型的函數開始,我們的模型將具有單個完全連接的隱藏層,其具有與輸入變量相同數量的神經元,這是創建神經網絡時的一個很好的默認起點。 使用較小的高斯隨機數初始化權重參數,使用整流器激活函數,輸出層包含單個神經元以進行預測,它使用 `sigmod()`激活函數,以產生 0 到 1 范圍內的概率輸出,可以輕松地轉換為清晰的類值(如0和1)。 最后,我們在訓練期間使用對數損失函數(binary_crossentropy),這是二元分類問題的首選損失函數。該模型還使用高效的 Adam 優化算法進行梯度下降,并在訓練模型時收集精度度量指標。 ```py # 基線模型 def create_baseline(): # 創建模型 model = Sequential() model.add(Dense(60, input_dim=60, kernel_initializer='normal', activation='relu')) model.add(Dense(1, kernel_initializer='normal', activation='sigmoid')) # 編譯模型 model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy']) return model ``` 現在可以在在 scikit-learn 框架中使用分層交叉驗證來評估這個模型。 我們再次使用合理的默認值將訓練時期的數量傳遞給 KerasClassifier,設定00模型將被創建 10 次以進行 10 次交叉驗證,并且關閉詳細輸出選項(即參數`verbose = 0`)。 ```py # evaluate model with standardized dataset estimator = KerasClassifier(build_fn=create_baseline, epochs=100, batch_size=5, verbose=0) kfold = StratifiedKFold(n_splits=10, shuffle=True, random_state=seed) results = cross_val_score(estimator, X, encoded_Y, cv=kfold) print("Results: %.2f%% (%.2f%%)" % (results.mean()*100, results.std()*100)) ``` 運行此代碼將生成以下輸出,顯示模型在不可見數據上的估計精度的平均值和標準差。 ```py Baseline: 81.68% (7.26%) ``` 這是一個很好的分數,沒有做任何艱苦的工作。 ## 3.使用數據預處理并重新運行基線模型 在建模之前進行數據預處理是一種很好的做法。 神經網絡模型尤其適用于在數據規模和分布方面具有一致性的輸入值。 建立神經網絡模型時表格數據的有效數據chuli1方案是標準化,這是重新調整數據,使得數據每個屬性的平均值為 0,標準偏差為 1.這種處理方法保留了高斯和高斯類分布,同時規范了數據每個屬性的中心趨勢。 我們可以使用 scikit-learn 使用 [StandardScaler](http://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.StandardScaler.html) 類來執行 Sonar 數據集的標準化。 優化算法的方法是在交叉驗證運行的過程中對訓練數據進行標準化處理,并使用經過訓練的標準化數據來預處理“不可見”的測試折疊,而不是對整個數據集執行標準化。這使得標準化成為交叉驗證過程中模型預處理的一個必要步驟,并且能夠阻止算法在評估期間具有從數據預處理過程中傳遞的“不可見”信息,如更清晰的分布。 我們可以使用 [Pipeline](http://scikit-learn.org/stable/modules/generated/sklearn.pipeline.Pipeline.html) 在 scikit-learn 中實現這一點,此管道是一個包裝器,它在交叉驗證過程的傳遞中執行一個或多個模型。在這里,我們可以使用 StandardScaler 定義管道,然后將其應用于我們的神經網絡模型。 ```py # 使用標準數據集評估基線模型 numpy.random.seed(seed) estimators = [] estimators.append(('standardize', StandardScaler())) estimators.append(('mlp', KerasClassifier(build_fn=create_baseline, epochs=100, batch_size=5, verbose=0))) pipeline = Pipeline(estimators) kfold = StratifiedKFold(n_splits=10, shuffle=True, random_state=seed) results = cross_val_score(pipeline, X, encoded_Y, cv=kfold) print("Standardized: %.2f%% (%.2f%%)" % (results.mean()*100, results.std()*100)) ``` 運行此示例結果如下所示,我們確實看到精度值有一個較小的提升。 ```py Standardized: 84.56% (5.74%) ``` ## 4.調整模型中的層和神經元數量 在神經網絡上需要設置很多東西,例如權重初始化,激活函數,優化過程等。 具有超大的影響方面的的網絡本身被稱為網絡拓撲,在本節中,我們將看一下關于網絡結構的兩個實驗:將其縮小和將其放大。 這些實驗能夠在調節神經網絡的問題上給予你幫助。 ### 4.1. 評估較小的網絡 我認為描述聲納數據集的輸入變量有較大的冗余。 數據描述了來自不同角度的相同信號。也許其中一些角度比其他角度更有意義。我們可以通過限制第一個隱藏層中的表示空間來強制網絡進行特征提取。 在這個實驗中,我們將采用隱藏層中有 60 個神經元的基線模型,并將其減少一半到 30 個。這將在訓練期間對網絡施加壓力,以挑選輸入數據中最重要的結構進行建模。 我們還將在數據準備的前一個實驗中對數據進行標準化,并嘗試利用數據標準化后性能較小的提升。 ```py # 更小的模型 def create_smaller(): # 創建模型 model = Sequential() model.add(Dense(30, input_dim=60, kernel_initializer='normal', activation='relu')) model.add(Dense(1, kernel_initializer='normal', activation='sigmoid')) # 編譯模型 model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy']) return model estimators = [] estimators.append(('standardize', StandardScaler())) estimators.append(('mlp', KerasClassifier(build_fn=create_smaller, epochs=100, batch_size=5, verbose=0))) pipeline = Pipeline(estimators) kfold = StratifiedKFold(n_splits=10, shuffle=True, random_state=seed) results = cross_val_score(pipeline, X, encoded_Y, cv=kfold) print("Smaller: %.2f%% (%.2f%%)" % (results.mean()*100, results.std()*100)) ``` 運行此示例結果如下所示,我們可以看到,我們對平均估計精度有一個非常小的提高,并且模型的精度分數的標準偏差(平均分布)顯著降低。 這是一個很好的結果,因為我們在網絡規模減半的情況下做得更好一些,而這僅需要一半的時間來訓練。 ```py Smaller: 86.04% (4.00%) ``` ### 4.2. 評估更大的網絡 具有更多層的神經網絡拓撲為網絡提供了更多機會來提取關鍵特征并以更有用的非線性方式重新組合它們。 我們可以通過對用于創建模型的函數進行另一個小的調整來評估是否向網絡添加更多層以輕松地改善性能。在這里,我們向網絡添加一個新層(一行),即也就是在第一個隱藏層之后引入另一個隱藏層,其中包含 30 個神經元。 我們的網絡現在具有拓撲結構: ```py 60 inputs -> [60 -> 30] -> 1 output ``` 這里的方法是,網絡有機會在瓶頸之前對所有輸入變量進行建模,并被強制將表示能力減半,就像我們在上書的縮小網絡拓撲的實驗中所做的那樣。 我們有一個額外的隱藏層來實現這個過程,而不是壓縮輸入層本身的表示。 ```py # 更大的模型 def create_larger(): # 創建模型 model = Sequential() model.add(Dense(60, input_dim=60, kernel_initializer='normal', activation='relu')) model.add(Dense(30, kernel_initializer='normal', activation='relu')) model.add(Dense(1, kernel_initializer='normal', activation='sigmoid')) # Compile model model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy']) return model estimators = [] estimators.append(('standardize', StandardScaler())) estimators.append(('mlp', KerasClassifier(build_fn=create_larger, epochs=100, batch_size=5, verbose=0))) pipeline = Pipeline(estimators) kfold = StratifiedKFold(n_splits=10, shuffle=True, random_state=seed) results = cross_val_score(pipeline, X, encoded_Y, cv=kfold) print("Larger: %.2f%% (%.2f%%)" % (results.mean()*100, results.std()*100)) ``` 運行此示例將生成以下結果。我們可以看到,我們在模型表現方面并沒有得到提升,這可能是統計噪音或需要進一步訓練的跡象。 ```py Larger: 83.14% (4.52%) ``` 通過進一步調整諸如優化算法和訓練時期的數量之類的方面,預期結果可以進一步提升。您可以在此數據集上獲得的最佳分數是多少? ## 摘要 在這篇文章中,您了解了 Python 中的 Keras 深度學習庫。 您了解了如何使用 Keras 逐步完成二元分類問題,具體如下: * 如何加載和準備在 Keras 中使用的數據。 * 如何創建基線神經網絡模型。 * 如何使用 scikit-learn 和分層 k 折交叉驗證來評估 Keras 模型。 * 數據預處理方案如何提升模型的性能。 * 調整網絡拓撲的實驗如何提升模型性能。 您對 Keras 的深度學習或此帖子有任何疑問嗎?在評論中提出您的問題,我會盡力回答。
                  <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>

                              哎呀哎呀视频在线观看