日本a√视频在线,久久青青亚洲国产,亚洲一区欧美二区,免费g片在线观看网站

        <style id="k3y6c"><u id="k3y6c"></u></style>
        <s id="k3y6c"></s>
        <mark id="k3y6c"></mark>
          
          

          <mark id="k3y6c"></mark>

          "); //-->

          博客專欄

          EEPW首頁 > 博客 > 熱文 | 卷積神經(jīng)網(wǎng)絡入門案例,輕松實現(xiàn)花朵分類(2)

          熱文 | 卷積神經(jīng)網(wǎng)絡入門案例,輕松實現(xiàn)花朵分類(2)

          發(fā)布人:AI科技大本營 時間:2021-05-15 來源:工程師 發(fā)布文章

          構(gòu)建模型

          常見卷積神經(jīng)網(wǎng)絡(CNN),主要由幾個 卷積層Conv2D 和 池化層MaxPooling2D 層組成。卷積層與池化層的疊加實現(xiàn)對輸入數(shù)據(jù)的特征提取,最后連接全連接層實現(xiàn)分類。

          特征提取——卷積層與池化層

          實現(xiàn)分類——全連接層

          CNN 的輸入是張量 (Tensor) 形式的 (image_height, image_width, color_channels),包含了圖像高度、寬度及顏色信息。通常圖像使用 RGB 色彩模式,color_channels 為 (R,G,B) 分別對應 RGB 的三個顏色通道,即:image_height 和 image_width 根據(jù)圖像的像素高度、寬度決定color_channels是3,對應RGB的3通道。

          花朵數(shù)據(jù)集中的圖片,形狀是 (180, 180, 3),我們可以在聲明第一層時將形狀賦值給參數(shù) input_shape 。

          num_classes = 5
          model = Sequential([
            layers.experimental.preprocessing.Rescaling(1./255, input_shape=(img_height, img_width, 3)),
            layers.Conv2D(16, 3, padding='same', activation='relu'),
            layers.MaxPooling2D(),
            layers.Conv2D(32, 3, padding='same', activation='relu'),
            layers.MaxPooling2D(),
            layers.Conv2D(64, 3, padding='same', activation='relu'),
            layers.MaxPooling2D(),
            layers.Flatten(),
            layers.Dense(128, activation='relu'),
            layers.Dense(num_classes)
          ])

          該模型由三個卷積塊組成,每個卷積塊中包括2D卷積層+最大池化層。最后有一個全連接層,有128個單元,可以通過relu激活功能激活該層。

          編譯模型

          model.compile(optimizer='adam',
                        loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
                        metrics=['accuracy'])

          查看一下網(wǎng)絡模型:tf.keras.utils.plot_model(model) ,或者用這樣方式看看:model.summary()

          3.png

          訓練模型

          這里我們輸入準備好的訓練集數(shù)據(jù)(包括圖像、對應的標簽),測試集的數(shù)據(jù)(包括圖像、對應的標簽),模型一共訓練10次。

          epochs=10
          history = model.fit(
            train_ds,
            validation_data=val_ds,
            epochs=epochs
          )

          下圖是訓練過程的截圖:

          4.png

          通常loss越小越好,對了解釋下什么是loss;簡單來說是 模型預測值 和 真實值 的相差的值,反映模型預測的結(jié)果和真實值的相差程度;通常準確度accuracy 越高,模型效果越好。

          評估模型

          在訓練和驗證集上創(chuàng)建損失和準確性圖。

          acc = history.history['accuracy']
          val_acc = history.history['val_accuracy']
          loss = history.history['loss']
          val_loss = history.history['val_loss']
          epochs_range = range(epochs)
          plt.figure(figsize=(8, 8))
          plt.subplot(1, 2, 1)
          plt.plot(epochs_range, acc, label='Training Accuracy')
          plt.plot(epochs_range, val_acc, label='Validation Accuracy')
          plt.legend(loc='lower right')
          plt.title('Training and Validation Accuracy')
          plt.subplot(1, 2, 2)
          plt.plot(epochs_range, loss, label='Training Loss')
          plt.plot(epochs_range, val_loss, label='Validation Loss')
          plt.legend(loc='upper right')
          plt.title('Training and Validation Loss')
          plt.show()

          5.png

          從圖中可以看出,訓練精度和驗證精度相差很大,模型僅在驗證集上獲得了約60%的精度。

          訓練精度隨時間增長,而驗證精度在訓練過程中停滯在60%左右。訓練和驗證準確性之間的準確性差異很明顯,這是過擬合的標志。

          可能過擬合出現(xiàn)的原因 :當訓練示例數(shù)量很少時,像這次的只有3000多張圖片,該模型有時會從訓練示例中的噪音或不必要的細節(jié)中學習,從而模型在新示例上的性能產(chǎn)生負面影響。 

          使用模型

          通常使用 model.predict( )  函數(shù)進行預測。 

          優(yōu)化模型、重新構(gòu)建模型、訓練模型、使用模型

          這里的優(yōu)化模型,主要是針對模型出現(xiàn)“過擬合”的問題。

          過擬合

          模型將過度擬合訓練數(shù)據(jù),在訓練集上達到較高的準確性,但在未見的數(shù)據(jù)(測試集)上得到比較低的準確性;模型的“泛化能力”不足。

          我們訓練模型的主要目的,也是希望模型在未見數(shù)據(jù)的預測上能有較高的準確性;解決過擬合問題是比較重要的。

          解決過擬合的思路

          使用更完整的訓練數(shù)據(jù)。(最好的解決方案)

          使用正則化之類的技術(shù)。

          簡化神經(jīng)網(wǎng)絡結(jié)構(gòu)。

          使用更完整的訓練數(shù)據(jù),數(shù)據(jù)集應涵蓋模型應處理的所有輸入范圍。僅當涉及新的有趣案例時,其他數(shù)據(jù)才有用。

          比如:在訓練集的花朵圖片都是近距離拍攝的,測試集的花朵有部分是遠距離拍攝,訓練出來的模型,自然在測試集的準確度不高了;如果一開始在訓練集也包含部分遠距離的花朵圖片,那么模型在測試集時準確度會較高,基本和訓練集的準確度接近。

          使用正規(guī)化等技術(shù),這些限制了模型可以存儲的信息的數(shù)量和類型。如果一個網(wǎng)絡只能記住少量的模式,優(yōu)化過程將迫使它專注于最突出的模式,這些模式更有可能很好地概括。

          簡化神經(jīng)網(wǎng)絡結(jié)構(gòu),如果訓練集比較小,網(wǎng)絡結(jié)構(gòu)又十分復雜,使得模型過度擬合訓練數(shù)據(jù),這時需要考慮簡化模型了。減少一些神經(jīng)元數(shù)量,或減少一些網(wǎng)絡層。

          結(jié)合上面的例子,使用數(shù)據(jù)增強和正則化技術(shù),來優(yōu)化網(wǎng)絡。

          數(shù)據(jù)增強

          通過對已有的訓練集圖片 隨機轉(zhuǎn)換(反轉(zhuǎn)、旋轉(zhuǎn)、縮放等),來生成其它訓練數(shù)據(jù)。這有助于將模型暴露在數(shù)據(jù)的更多方面,并更好地概括。

          這里使用 tf.layers.experimental.preprocessing 層實現(xiàn)數(shù)據(jù)增強。

          data_augmentation = keras.Sequential(
            [
              layers.experimental.preprocessing.RandomFlip("horizontal", 
                                                           input_shape=(img_height, 
                                                                        img_width,
                                                                        3)),
              layers.experimental.preprocessing.RandomRotation(0.1),
              layers.experimental.preprocessing.RandomZoom(0.1),
            ]
          )

          RandomFlip("horizontal", input_shape=(img_height,  img_width, 3)) 指定輸入圖片,并對圖片進行隨機水平反轉(zhuǎn)

          RandomRotation(0.1) 對圖片進行隨機旋轉(zhuǎn)

          RandomZoom(0.1)     對圖片進行隨機縮放

          通過將數(shù)據(jù)增強應用到同一圖像中幾次來可視化幾個增強示例的外觀:

          plt.figure(figsize=(10, 10))
          for images, _ in train_ds.take(1):
            for i in range(9):
              augmented_images = data_augmentation(images)
              ax = plt.subplot(3, 3, i + 1)
              plt.imshow(augmented_images[0].numpy().astype("uint8"))
              plt.axis("off")

          7.png

          *博客內(nèi)容為網(wǎng)友個人發(fā)布,僅代表博主個人觀點,如有侵權(quán)請聯(lián)系工作人員刪除。

          單片機相關(guān)文章:單片機教程


          單片機相關(guān)文章:單片機視頻教程


          單片機相關(guān)文章:單片機工作原理


          汽車防盜機相關(guān)文章:汽車防盜機原理


          關(guān)鍵詞: AI

          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉