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

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                # 基于卷積神經網絡的 Keras 深度學習庫中的目標識別 > 原文: [https://machinelearningmastery.com/object-recognition-convolutional-neural-networks-keras-deep-learning-library/](https://machinelearningmastery.com/object-recognition-convolutional-neural-networks-keras-deep-learning-library/) Keras 是一個用于深度學習的 Python 庫,它包含強大的數值庫 Theano 和 TensorFlow。 傳統神經網絡衰落的一個難題是物體識別。這是模型能夠識別圖像中的對象的地方。 在這篇文章中,您將了解如何開發和評估 Keras 中用于對象識別的深度學習模型。完成本教程后,您將了解: * 關于 CIFAR-10 對象識別數據集以及如何在 Keras 中加載和使用它。 * 如何創建一個簡單的卷積神經網絡進行對象識別。 * 如何通過創建更深層次的卷積神經網絡來提升表現。 讓我們開始吧。 * **2016 年 10 月更新**:更新了 Keras 1.1.0 和 TensorFlow 0.10.0 的示例。 * **2017 年 3 月更新**:更新了 Keras 2.0.2,TensorFlow 1.0.1 和 Theano 0.9.0 的示例。 ## CIFAR-10 問題描述 由于物體,位置,照明等幾乎無限多的排列,因此難以自動識別照片中的物體。這是一個非常難的問題。 這是計算機視覺中一個經過充分研究的問題,最近也是深度學習能力的重要證明。 [加拿大高級研究所(CIFAR)](https://en.wikipedia.org/wiki/Canadian_Institute_for_Advanced_Research)開發了針對該問題的標準計算機視覺和深度學習數據集。 [CIFAR-10 數據集](http://www.cs.toronto.edu/~kriz/cifar.html)由 60,000 張照片組成,分為 10 個類別(因此命名為 CIFAR-10)。課程包括飛機,汽車,鳥類,貓等常見物品。數據集以標準方式分割,其中 50,000 個圖像用于訓練模型,剩余的 10,000 個用于評估其表現。 這些照片的顏色為紅色,綠色和藍色,但很小,尺寸為 32 x 32 像素。 使用非常大的卷積神經網絡實現了現有技術的結果。您可以在 Rodrigo Benenson 的網頁上了解 [CIFAR-10 的結果狀態。模型表現以分類準確度報告,非常好的表現超過 90%,人類在該問題上的表現為 94%,而在撰寫本文時,最先進的結果為 96%。](http://rodrigob.github.io/are_we_there_yet/build/classification_datasets_results.html#43494641522d3130) 有一個 [Kaggle 比賽使用了 CIFAR-10 數據集](https://www.kaggle.com/c/cifar-10)。這是一個加入討論開發問題的新模型,并以模型和腳本為起點的好地方。 ## 在 Keras 中加載 CIFAR-10 數據集 CIFAR-10 數據集可以輕松加載到 Keras 中。 Keras 可以自動下載 CIFAR-10 等標準數據集,并使用 cifar10.load_data()函數將它們存儲在?/ .keras / datasets 目錄中。此數據集很大,為 163 兆字節,因此下載可能需要幾分鐘。 下載后,對該函數的后續調用將加載準備好使用的數據集。 數據集存儲為酸洗訓練和測試集,準備在 Keras 中使用。每個圖像表示為三維矩陣,具有紅色,綠色,藍色,寬度和高度的尺寸。我們可以使用 [matplotlib](http://matplotlib.org/) 直接繪制圖像。 ```py # Plot ad hoc CIFAR10 instances from keras.datasets import cifar10 from matplotlib import pyplot from scipy.misc import toimage # load data (X_train, y_train), (X_test, y_test) = cifar10.load_data() # create a grid of 3x3 images for i in range(0, 9): pyplot.subplot(330 + 1 + i) pyplot.imshow(toimage(X_train[i])) # show the plot pyplot.show() ``` 運行代碼可創建 3×3 的照片。圖像已經從 32×32 的小尺寸放大,但你可以清楚地看到卡車馬和汽車。您還可以在一些強制為方形寬高比的圖像中看到一些失真。 ![Small Sample of CIFAR-10 Images](https://img.kancloud.cn/21/07/2107b41773261d706fbcab8006f6db72_800x600.png) CIFAR-10 圖像的小樣本 ## CIFAR-10 的簡單卷積神經網絡 使用卷積神經網絡(CNN)可以最好地解決 CIFAR-10 問題。 我們可以通過定義本例中需要的所有類和函數來快速入門。 ```py # Simple CNN model for CIFAR-10 import numpy from keras.datasets import cifar10 from keras.models import Sequential from keras.layers import Dense from keras.layers import Dropout from keras.layers import Flatten from keras.constraints import maxnorm from keras.optimizers import SGD from keras.layers.convolutional import Conv2D from keras.layers.convolutional import MaxPooling2D from keras.utils import np_utils from keras import backend as K K.set_image_dim_ordering('th') ``` 好的做法是,我們接下來用常數初始化隨機數種子,以確保結果可重復。 ```py # fix random seed for reproducibility seed = 7 numpy.random.seed(seed) ``` 接下來,我們可以加載 CIFAR-10 數據集。 ```py # load data (X_train, y_train), (X_test, y_test) = cifar10.load_data() ``` 對于紅色,綠色和藍色通道中的每一個,像素值在 0 到 255 的范圍內。 使用標準化數據是一種很好的做法。因為輸入值很好理解,所以我們可以通過將每個值除以最大值 255 來輕松歸一化到 0 到 1 的范圍。 注意,數據作為整數加載,因此我們必須將其轉換為浮點值才能執行除法。 ```py # normalize inputs from 0-255 to 0.0-1.0 X_train = X_train.astype('float32') X_test = X_test.astype('float32') X_train = X_train / 255.0 X_test = X_test / 255.0 ``` 輸出變量定義為每個類從 0 到 1 的整數向量。 我們可以使用一個熱編碼將它們轉換為二進制矩陣,以便最好地對分類問題進行建模。我們知道這個問題有 10 個類,所以我們可以期望二進制矩陣的寬度為 10。 ```py # one hot encode outputs y_train = np_utils.to_categorical(y_train) y_test = np_utils.to_categorical(y_test) num_classes = y_test.shape[1] ``` 讓我們首先將一個簡單的 CNN 結構定義為基線,并評估它對問題的執行情況。 我們將使用具有兩個卷積層的結構,然后進行最大池化并將網絡展平為完全連接的層以進行預測。 我們的基線網絡結構可歸納如下: 1. 卷積輸入層,32 個大小為 3×3 的特征映射,整流器激活函數和最大范數的權重約束設置為 3。 2. dropout率設定為 20%。 3. 卷積層,32 個特征映射,大小為 3×3,整流器激活函數和最大范數的權重約束設置為 3。 4. Max Pool 層,大小為 2×2。 5. 展平層。 6. 完全連接的層具有 512 個單元和整流器激活功能。 7. dropout率設定為 50%。 8. 完全連接的輸出層,10 個單元和 softmax 激活功能。 對數損失函數與隨機梯度下降優化算法一起使用,該算法配置有大動量和重量衰減開始,學習率為 0.01。 ```py # Create the model model = Sequential() model.add(Conv2D(32, (3, 3), input_shape=(3, 32, 32), padding='same', activation='relu', kernel_constraint=maxnorm(3))) model.add(Dropout(0.2)) model.add(Conv2D(32, (3, 3), activation='relu', padding='same', kernel_constraint=maxnorm(3))) model.add(MaxPooling2D(pool_size=(2, 2))) model.add(Flatten()) model.add(Dense(512, activation='relu', kernel_constraint=maxnorm(3))) model.add(Dropout(0.5)) model.add(Dense(num_classes, activation='softmax')) # Compile model epochs = 25 lrate = 0.01 decay = lrate/epochs sgd = SGD(lr=lrate, momentum=0.9, decay=decay, nesterov=False) model.compile(loss='categorical_crossentropy', optimizer=sgd, metrics=['accuracy']) print(model.summary()) ``` 我們可以將這個模型與 25 個時期和 32 個批量大小相匹配。 選擇了少量的時代來幫助保持本教程的發展。通常,對于該問題,時期的數量將是一個或兩個數量級。 一旦模型適合,我們在測試數據集上對其進行評估并打印出分類準確度。 ```py # Fit the model model.fit(X_train, y_train, validation_data=(X_test, y_test), epochs=epochs, batch_size=32) # Final evaluation of the model scores = model.evaluate(X_test, y_test, verbose=0) print("Accuracy: %.2f%%" % (scores[1]*100)) ``` 運行此示例提供以下結果。首先總結網絡結構,確認我們的設計是正確實施的。 ```py _________________________________________________________________ Layer (type) Output Shape Param # ================================================================= conv2d_1 (Conv2D) (None, 32, 32, 32) 896 _________________________________________________________________ dropout_1 (Dropout) (None, 32, 32, 32) 0 _________________________________________________________________ conv2d_2 (Conv2D) (None, 32, 32, 32) 9248 _________________________________________________________________ max_pooling2d_1 (MaxPooling2 (None, 32, 16, 16) 0 _________________________________________________________________ flatten_1 (Flatten) (None, 8192) 0 _________________________________________________________________ dense_1 (Dense) (None, 512) 4194816 _________________________________________________________________ dropout_2 (Dropout) (None, 512) 0 _________________________________________________________________ dense_2 (Dense) (None, 10) 5130 ================================================================= Total params: 4,210,090.0 Trainable params: 4,210,090.0 Non-trainable params: 0.0 _________________________________________________________________ ``` 在訓練和測試數據集的每個時期打印分類準確度和損失。該模型在測試裝置上進行評估,達到 70.85%的準確度,這并不是很好。 ```py ... Epoch 20/25 50000/50000 [==============================] - 143s - loss: 0.2858 - acc: 0.9011 - val_loss: 1.0091 - val_acc: 0.7063 Epoch 21/25 50000/50000 [==============================] - 143s - loss: 0.2693 - acc: 0.9067 - val_loss: 1.0122 - val_acc: 0.7069 Epoch 22/25 50000/50000 [==============================] - 143s - loss: 0.2544 - acc: 0.9119 - val_loss: 1.0240 - val_acc: 0.7097 Epoch 23/25 50000/50000 [==============================] - 143s - loss: 0.2399 - acc: 0.9168 - val_loss: 1.0680 - val_acc: 0.7077 Epoch 24/25 50000/50000 [==============================] - 143s - loss: 0.2285 - acc: 0.9197 - val_loss: 1.0702 - val_acc: 0.7119 Epoch 25/25 50000/50000 [==============================] - 143s - loss: 0.2177 - acc: 0.9238 - val_loss: 1.0686 - val_acc: 0.7085 Accuracy: 70.85% ``` 我們可以通過創建更深入的網絡來顯著提高準確性。這是我們將在下一節中看到的內容。 ## 用于 CIFAR-10 的更大卷積神經網絡 我們已經看到一個簡單的 CNN 在這個復雜的問題上表現不佳。在本節中,我們將著眼于擴大模型的大小和復雜性。 讓我們設計上面簡單 CNN 的深層版本。我們可以引入額外的一輪卷積以及更多的特征映射。我們將使用相同的 Convolutional,Dropout,Convolutional 和 Max Pooling 層模式。 使用 32,64 和 128 個要素貼圖將重復此模式 3 次。效果是在給定最大池層的情況下,越來越多的特征圖具有越來越小的尺寸。最后,將在網絡的輸出端使用額外的更大的 Dense 層,以嘗試更好地將大量要素圖轉換為類值。 我們可以總結一個新的網絡架構如下: * 卷積輸入層,32 個大小為 3×3 的特征映射和整流器激活功能。 * dropout層為 20%。 * 卷積層,32 個特征映射,大小為 3×3,具有整流器激活功能。 * Max Pool 層,大小為 2×2。 * 卷積層,64 個特征映射,大小為 3×3,具有整流器激活功能。 * dropout層為 20%。 * 卷積層,64 個特征映射,大小為 3×3,具有整流器激活功能。 * Max Pool 層,大小為 2×2。 * 卷積層,128 個特征圖,大小為 3×3,具有整流器激活功能。 * dropout層為 20%。 * 卷積層,128 個特征圖,大小為 3×3,具有整流器激活功能。 * Max Pool 層,大小為 2×2。 * 展平層。 * dropout層為 20%。 * 完全連接的層具有 1024 個單元和整流器激活功能。 * dropout層為 20%。 * 完全連接的層具有 512 個單元和整流器激活功能。 * dropout層為 20%。 * 完全連接的輸出層,10 個單元和 softmax 激活功能。 我們可以很容易地在 Keras 中定義這種網絡拓撲,如下所示: ```py # Create the model model = Sequential() model.add(Conv2D(32, (3, 3), input_shape=(3, 32, 32), activation='relu', padding='same')) model.add(Dropout(0.2)) model.add(Conv2D(32, (3, 3), activation='relu', padding='same')) model.add(MaxPooling2D(pool_size=(2, 2))) model.add(Conv2D(64, (3, 3), activation='relu', padding='same')) model.add(Dropout(0.2)) model.add(Conv2D(64, (3, 3), activation='relu', padding='same')) model.add(MaxPooling2D(pool_size=(2, 2))) model.add(Conv2D(128, (3, 3), activation='relu', padding='same')) model.add(Dropout(0.2)) model.add(Conv2D(128, (3, 3), activation='relu', padding='same')) model.add(MaxPooling2D(pool_size=(2, 2))) model.add(Flatten()) model.add(Dropout(0.2)) model.add(Dense(1024, activation='relu', kernel_constraint=maxnorm(3))) model.add(Dropout(0.2)) model.add(Dense(512, activation='relu', kernel_constraint=maxnorm(3))) model.add(Dropout(0.2)) model.add(Dense(num_classes, activation='softmax')) # Compile model epochs = 25 lrate = 0.01 decay = lrate/epochs sgd = SGD(lr=lrate, momentum=0.9, decay=decay, nesterov=False) model.compile(loss='categorical_crossentropy', optimizer=sgd, metrics=['accuracy']) print(model.summary()) ``` 我們可以使用與上述相同的程序和相同數量的時期來擬合和評估該模型,但是通過一些小的實驗發現更大的批量大小為 64。 ```py numpy.random.seed(seed) model.fit(X_train, y_train, validation_data=(X_test, y_test), epochs=epochs, batch_size=64) # Final evaluation of the model scores = model.evaluate(X_test, y_test, verbose=0) print("Accuracy: %.2f%%" % (scores[1]*100)) ``` 運行此示例將在每個時期打印訓練和測試數據集的分類準確性和損失。最終模型的分類精度估計值為 80.18%,比我們的簡單模型好近 10 個點。 ```py # 50000/50000 [==============================] - 34s - loss: 0.4993 - acc: 0.8230 - val_loss: 0.5994 - val_acc: 0.7932 # Epoch 20/25 # 50000/50000 [==============================] - 34s - loss: 0.4877 - acc: 0.8271 - val_loss: 0.5986 - val_acc: 0.7932 # Epoch 21/25 # 50000/50000 [==============================] - 34s - loss: 0.4714 - acc: 0.8327 - val_loss: 0.5916 - val_acc: 0.7959 # Epoch 22/25 # 50000/50000 [==============================] - 34s - loss: 0.4603 - acc: 0.8376 - val_loss: 0.5954 - val_acc: 0.8003 # Epoch 23/25 # 50000/50000 [==============================] - 34s - loss: 0.4454 - acc: 0.8410 - val_loss: 0.5742 - val_acc: 0.8024 # Epoch 24/25 # 50000/50000 [==============================] - 34s - loss: 0.4332 - acc: 0.8468 - val_loss: 0.5829 - val_acc: 0.8027 # Epoch 25/25 # 50000/50000 [==============================] - 34s - loss: 0.4217 - acc: 0.8498 - val_loss: 0.5785 - val_acc: 0.8018 # Accuracy: 80.18% ``` ## 擴展以提高模型表現 我們在這個非常困難的問題上取得了很好的成績,但我們仍然是實現世界級成果的好方法。 以下是您可以嘗試擴展模型并提高模型表現的一些想法。 * **培養更多時代**。每個模型都訓練了極少數的時代,25。通常訓練大型卷積神經網絡數百或數千個時代。我希望通過大幅提高訓練時期的數量來實現績效提升。 * **圖像數據增強**。圖像中的對象位置不同。通過使用一些數據增強可以實現模型表現的另一個提升。諸如標準化和隨機移位以及水平圖像翻轉的方法可能是有益的。 * **更深入的網絡拓撲**。呈現的較大網絡很深,但可以針對該問題設計更大的網絡。這可能涉及更接近輸入的更多特征圖,并且可能涉及較不積極的池。另外,可以采用并評估已經顯示有用的標準卷積網絡拓撲結構。 ## 摘要 在這篇文章中,您發現了如何在 Keras 中創建深度學習模型,以便在照片中進行對象識別。 完成本教程后,您了解到: * 關于 CIFAR-10 數據集以及如何在 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>

                              哎呀哎呀视频在线观看