<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)(3)

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

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

正則化

正則化的方法有多種,這里使用 Dropout 應用到網(wǎng)絡(luò )層中,它會(huì )隨機將一部分神經(jīng)元的激活值停止工作,在訓練過(guò)程中從該層中暫時(shí)退出,從而不對輸出產(chǎn)生影響;后續訓練先恢復之前被停止工作的神經(jīng)元,再隨機將一部分神經(jīng)元停止工作,再訓練。

這樣使模型不會(huì )太依賴(lài)某些局部的特征,泛化性更強。a圖全連接結構的模型。b圖是在a網(wǎng)絡(luò )結構基礎上,使用 Dropout后,隨機將一部分神經(jīng)元的暫時(shí)停止工作。

8.jpg

訓練流程:

首先隨機(臨時(shí))刪除網(wǎng)絡(luò )中一些的隱藏層神經(jīng)元(退出此次訓練),輸入輸出神經(jīng)元保存不變。

然后把輸入x通過(guò)修改后的網(wǎng)絡(luò )前向傳播,得到的損失結果通過(guò)修改后的網(wǎng)絡(luò )反向傳播;一批訓練樣本執行完這個(gè)過(guò)程后,在沒(méi)有被刪除的神經(jīng)元上按照梯度下降法更新對應的參數(w, b)。

最后重復1、2步過(guò)程?;謴捅粍h掉的神經(jīng)元,此時(shí)被刪除的神經(jīng)元保持原樣,而沒(méi)有被刪除的神經(jīng)元已經(jīng)更新相關(guān)參數。

參考:Dropout(正則化)

Dropout 以一小部分數字作為其輸入值,形式為 0.1、0.2、0.4 等。使得此層的10%、20%、40%的神經(jīng)元被暫時(shí)停止工作。

下面使用:layers.Dropout(0.2)

model = Sequential([
  data_augmentation,
  layers.experimental.preprocessing.Rescaling(1./255),
  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.Dropout(0.2),
  layers.Flatten(),
  layers.Dense(128, activation='relu'),
  layers.Dense(num_classes)
])

重新編譯和訓練模型

# 編譯模型
model.compile(optimizer='adam',
              loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
              metrics=['accuracy'])
# 查看網(wǎng)絡(luò )結構
model.summary()
# 訓練模型
epochs = 15
history = model.fit(
  train_ds,
  validation_data=val_ds,
  epochs=epochs
)

在訓練和驗證集上查看損失值和準確性:

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

9.png

對比之前模型的效果,差別還是挺大的;使用數據增強、正則化后的模型,降低了過(guò)擬合的影響;驗證集的損失和模型準確度,與訓練集更接近了。

10.png

預測新數據

# 預測新數據 下載一張新圖片,來(lái)預測它屬于什么類(lèi)型花朵
sunflower_url = "https://storage.googleapis.com/download.tensorflow.org/example_images/592px-Red_sunflower.jpg"
sunflower_path = tf.keras.utils.get_file('Red_sunflower', origin=sunflower_url)
img = keras.preprocessing.image.load_img(
    sunflower_path, target_size=(img_height, img_width)
)
img_array = keras.preprocessing.image.img_to_array(img)
img_array = tf.expand_dims(img_array, 0) # Create a batch
predictions = model.predict(img_array)
score = tf.nn.softmax(predictions[0])
print(
    "該圖像最有可能屬于{},置信度為 {:.2f}%"
    .format(class_names[n

p.argmax(score)], 100 * np.max(score))
)

該圖像最有可能屬于sunflowers,置信度為 97.38%

完整代碼

'''
環(huán)境:Tensorflow2  Python3.x
'''
import matplotlib.pyplot as plt
import numpy as np
import os
import PIL
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers
from tensorflow.keras.models import Sequential
# 下載數據集
import pathlib
dataset_url = "https://storage.googleapis.com/download.tensorflow.org/example_images/flower_photos.tgz"
data_dir = tf.keras.utils.get_file('flower_photos', origin=dataset_url, untar=True)
data_dir = pathlib.Path(data_dir)
# 查看數據集圖片的總數量
image_count = len(list(data_dir.glob('*/*.jpg')))
print(image_count)
# 查看郁金香tulips目錄下的第1張圖片;
tulips = list(data_dir.glob('tulips/*'))
PIL.Image.open(str(tulips[0]))
# 定義加載圖片的一些參數,包括:批量大小、圖像高度、圖像寬度
batch_size = 32
img_height = 180
img_width = 180
# 將80%的圖像用于訓練
train_ds = tf.keras.preprocessing.image_dataset_from_directory(
  data_dir,
  validation_split=0.2,
  subset="training",
  seed=123,
  image_size=(img_height, img_width),
  batch_size=batch_size)
# 將20%的圖像用于驗證
val_ds = tf.keras.preprocessing.image_dataset_from_directory(
  data_dir,
  validation_split=0.2,
  subset="validation",
  seed=123,
  image_size=(img_height, img_width),
  batch_size=batch_size)
# 打印數據集中花朵的類(lèi)別名稱(chēng),字母順序對應于目錄名稱(chēng)
class_names = train_ds.class_names
print(class_names)
# 將像素的值標準化至0到1的區間內。
normalization_layer = layers.experimental.preprocessing.Rescaling(1./255)
# 調用map將其應用于數據集:
normalized_ds = train_ds.map(lambda x, y: (normalization_layer(x), y))
image_batch, labels_batch = next(iter(normalized_ds))
first_image = image_batch[0]
# Notice the pixels values are now in `[0,1]`.
print(np.min(first_image), np.max(first_image))
# 數據增強 通過(guò)對已有的訓練集圖片 隨機轉換(反轉、旋轉、縮放等),來(lái)生成其它訓練數據
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),
  ]
)
# 搭建 網(wǎng)絡(luò )模型
model = Sequential([
  data_augmentation,
  layers.experimental.preprocessing.Rescaling(1./255),
  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.Dropout(0.2),
  layers.Flatten(),
  layers.Dense(128, activation='relu'),
  layers.Dense(num_classes)
])
# 編譯模型
model.compile(optimizer='adam',
              loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
              metrics=['accuracy'])
# 查看網(wǎng)絡(luò )結構
model.summary()
# 訓練模型
epochs = 15
history = model.fit(
  train_ds,
  validation_data=val_ds,
  epochs=epochs
)
# 在訓練和驗證集上查看損失值和準確性
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()

作者簡(jiǎn)介:黎國溥,華為云-云享專(zhuān)家、CSDN博客專(zhuān)家、華為云-云創(chuàng )·首席貢獻官、華為云-年度社區風(fēng)云人物

參考鏈接:

https://colab.research.google.com/github/tensorflow/docs/blob/master/site/en/tutorials/images/classification.ipynb#scrollTo=L1WtoaOHVrVh

原文鏈接:

https://blog.csdn.net/qq_41204464/article/details/116567051

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



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