<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>
"); //-->

博客專(zhuān)欄

EEPW首頁(yè) > 博客 > 熱文 | 卷積神經(jīng)網(wǎng)絡(luò )入門(mén)案例,輕松實(shí)現花朵分類(lèi)(2)

熱文 | 卷積神經(jīng)網(wǎng)絡(luò )入門(mén)案例,輕松實(shí)現花朵分類(lèi)(2)

發(fā)布人:AI科技大本營(yíng) 時(shí)間:2021-05-15 來(lái)源:工程師 發(fā)布文章

構建模型

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

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

實(shí)現分類(lèi)——全連接層

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

花朵數據集中的圖片,形狀是 (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)
])

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

編譯模型

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

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

3.png

訓練模型

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

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

下圖是訓練過(guò)程的截圖:

4.png

通常loss越小越好,對了解釋下什么是loss;簡(jiǎn)單來(lái)說(shuō)是 模型預測值 和 真實(shí)值 的相差的值,反映模型預測的結果和真實(shí)值的相差程度;通常準確度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%的精度。

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

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

使用模型

通常使用 model.predict( )  函數進(jìn)行預測。 

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

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

過(guò)擬合

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

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

解決過(guò)擬合的思路

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

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

簡(jiǎn)化神經(jīng)網(wǎng)絡(luò )結構。

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

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

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

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

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

數據增強

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

這里使用 tf.layers.experimental.preprocessing 層實(shí)現數據增強。

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)) 指定輸入圖片,并對圖片進(jìn)行隨機水平反轉

RandomRotation(0.1) 對圖片進(jìn)行隨機旋轉

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

通過(guò)將數據增強應用到同一圖像中幾次來(lái)可視化幾個(gè)增強示例的外觀(guān):

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

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

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


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


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


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


關(guān)鍵詞: AI

相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>