日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 人工智能 > 卷积神经网络 >内容正文

卷积神经网络

深度学习100例-卷积神经网络(VGG-16)识别海贼王草帽一伙 | 第6天

發(fā)布時間:2024/3/12 卷积神经网络 106 豆豆
生活随笔 收集整理的這篇文章主要介紹了 深度学习100例-卷积神经网络(VGG-16)识别海贼王草帽一伙 | 第6天 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

文章目錄

  • 一、前期工作
    • 1. 設(shè)置GPU
    • 2. 導(dǎo)入數(shù)據(jù)
    • 3. 查看數(shù)據(jù)
  • 二、數(shù)據(jù)預(yù)處理
    • 1. 加載數(shù)據(jù)
    • 2. 可視化數(shù)據(jù)
    • 3. 再次檢查數(shù)據(jù)
    • 4. 配置數(shù)據(jù)集
    • 5. 歸一化
  • 三、構(gòu)建VGG-16網(wǎng)絡(luò)
    • 1. 官方模型(已打包好)
    • 2. 自建模型
    • 3. 網(wǎng)絡(luò)結(jié)構(gòu)圖
  • 四、編譯
  • 五、訓(xùn)練模型
  • 六、模型評估

一、前期工作

本文將實現(xiàn)海賊王中人物角色的識別。

🚀 我的環(huán)境:

  • 語言環(huán)境:Python3.6.5
  • 編譯器:jupyter notebook
  • 深度學(xué)習(xí)環(huán)境:TensorFlow2.4.1
  • 數(shù)據(jù)和代碼:📌【傳送門】

🚀 來自專欄:《深度學(xué)習(xí)100例》

如果你是一名深度學(xué)習(xí)小白可以先看看我這個專門為你寫的專欄:《小白入門深度學(xué)習(xí)》

  • 小白入門深度學(xué)習(xí) | 第一篇:配置深度學(xué)習(xí)環(huán)境
  • 小白入門深度學(xué)習(xí) | 第二篇:編譯器的使用-Jupyter Notebook
  • 小白入門深度學(xué)習(xí) | 第三篇:深度學(xué)習(xí)初體驗
  • 小白入門深度學(xué)習(xí) | 第四篇:配置PyTorch環(huán)境
  • 🚀 往期精彩-卷積神經(jīng)網(wǎng)絡(luò)篇:

  • 深度學(xué)習(xí)100例-卷積神經(jīng)網(wǎng)絡(luò)(CNN)實現(xiàn)mnist手寫數(shù)字識別 | 第1天
  • 深度學(xué)習(xí)100例-卷積神經(jīng)網(wǎng)絡(luò)(CNN)彩色圖片分類 | 第2天
  • 深度學(xué)習(xí)100例-卷積神經(jīng)網(wǎng)絡(luò)(CNN)服裝圖像分類 | 第3天
  • 深度學(xué)習(xí)100例-卷積神經(jīng)網(wǎng)絡(luò)(CNN)花朵識別 | 第4天
  • 深度學(xué)習(xí)100例-卷積神經(jīng)網(wǎng)絡(luò)(CNN)天氣識別 | 第5天
  • 深度學(xué)習(xí)100例-卷積神經(jīng)網(wǎng)絡(luò)(VGG-16)識別海賊王草帽一伙 | 第6天
  • 深度學(xué)習(xí)100例-卷積神經(jīng)網(wǎng)絡(luò)(VGG-19)識別靈籠中的人物 | 第7天
  • 深度學(xué)習(xí)100例-卷積神經(jīng)網(wǎng)絡(luò)(ResNet-50)鳥類識別 | 第8天
  • 深度學(xué)習(xí)100例-卷積神經(jīng)網(wǎng)絡(luò)(AlexNet)手把手教學(xué) | 第11天
  • 深度學(xué)習(xí)100例-卷積神經(jīng)網(wǎng)絡(luò)(CNN)識別驗證碼 | 第12天
  • 深度學(xué)習(xí)100例-卷積神經(jīng)網(wǎng)絡(luò)(Inception V3)識別手語 | 第13天
  • 深度學(xué)習(xí)100例-卷積神經(jīng)網(wǎng)絡(luò)(Inception-ResNet-v2)識別交通標(biāo)志 | 第14天
  • 深度學(xué)習(xí)100例-卷積神經(jīng)網(wǎng)絡(luò)(CNN)實現(xiàn)車牌識別 | 第15天
  • 深度學(xué)習(xí)100例-卷積神經(jīng)網(wǎng)絡(luò)(CNN)識別神奇寶貝小智一伙 | 第16天
  • 深度學(xué)習(xí)100例-卷積神經(jīng)網(wǎng)絡(luò)(CNN)注意力檢測 | 第17天
  • 深度學(xué)習(xí)100例-卷積神經(jīng)網(wǎng)絡(luò)(VGG-16)貓狗識別 | 第21天
  • 深度學(xué)習(xí)100例-卷積神經(jīng)網(wǎng)絡(luò)(LeNet-5)深度學(xué)習(xí)里的“Hello Word” | 第22天
  • 深度學(xué)習(xí)100例-卷積神經(jīng)網(wǎng)絡(luò)(CNN)3D醫(yī)療影像識別 | 第23天
  • 深度學(xué)習(xí)100例 | 第24天-卷積神經(jīng)網(wǎng)絡(luò)(Xception):動物識別
  • 🚀 往期精彩-循環(huán)神經(jīng)網(wǎng)絡(luò)篇:

  • 深度學(xué)習(xí)100例-循環(huán)神經(jīng)網(wǎng)絡(luò)(RNN)實現(xiàn)股票預(yù)測 | 第9天
  • 深度學(xué)習(xí)100例-循環(huán)神經(jīng)網(wǎng)絡(luò)(LSTM)實現(xiàn)股票預(yù)測 | 第10天
  • 🚀 往期精彩-生成對抗網(wǎng)絡(luò)篇:

  • 深度學(xué)習(xí)100例-生成對抗網(wǎng)絡(luò)(GAN)手寫數(shù)字生成 | 第18天
  • 深度學(xué)習(xí)100例-生成對抗網(wǎng)絡(luò)(DCGAN)手寫數(shù)字生成 | 第19天
  • 深度學(xué)習(xí)100例-生成對抗網(wǎng)絡(luò)(DCGAN)生成動漫小姐姐 | 第20天

  • 1. 設(shè)置GPU

    如果使用的是CPU可以忽略這步

    import tensorflow as tfgpus = tf.config.list_physical_devices("GPU")if gpus:tf.config.experimental.set_memory_growth(gpus[0], True) #設(shè)置GPU顯存用量按需使用tf.config.set_visible_devices([gpus[0]],"GPU")

    2. 導(dǎo)入數(shù)據(jù)

    import matplotlib.pyplot as plt import os,PIL# 設(shè)置隨機種子盡可能使結(jié)果可以重現(xiàn) import numpy as np np.random.seed(1)# 設(shè)置隨機種子盡可能使結(jié)果可以重現(xiàn) import tensorflow as tf tf.random.set_seed(1)from tensorflow import keras from tensorflow.keras import layers,modelsimport pathlib data_dir = "D:\jupyter notebook\DL-100-days\datasets\hzw_photos"data_dir = pathlib.Path(data_dir)

    3. 查看數(shù)據(jù)

    數(shù)據(jù)集中一共有路飛、索隆、娜美、烏索普、喬巴、山治、羅賓等7個人物角色

    文件夾含義數(shù)量
    lufei路飛117 張
    suolong索隆90 張
    namei娜美84 張
    wusuopu烏索普77張
    qiaoba喬巴102 張
    shanzhi山治47 張
    luobin羅賓105張
    image_count = len(list(data_dir.glob('*/*.png')))print("圖片總數(shù)為:",image_count) 圖片總數(shù)為: 621

    二、數(shù)據(jù)預(yù)處理

    1. 加載數(shù)據(jù)

    使用image_dataset_from_directory方法將磁盤中的數(shù)據(jù)加載到tf.data.Dataset中

    batch_size = 32 img_height = 224 img_width = 224 """ 關(guān)于image_dataset_from_directory()的詳細(xì)介紹可以參考文章:https://mtyjkh.blog.csdn.net/article/details/117018789 """ 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) Found 621 files belonging to 7 classes. Using 497 files for training. """ 關(guān)于image_dataset_from_directory()的詳細(xì)介紹可以參考文章:https://mtyjkh.blog.csdn.net/article/details/117018789 """ 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) Found 621 files belonging to 7 classes. Using 124 files for validation.

    我們可以通過class_names輸出數(shù)據(jù)集的標(biāo)簽。標(biāo)簽將按字母順序?qū)?yīng)于目錄名稱。

    class_names = train_ds.class_names print(class_names) ['lufei', 'luobin', 'namei', 'qiaoba', 'shanzhi', 'suolong', 'wusuopu']

    2. 可視化數(shù)據(jù)

    plt.figure(figsize=(10, 5)) # 圖形的寬為10高為5for images, labels in train_ds.take(1):for i in range(8):ax = plt.subplot(2, 4, i + 1) plt.imshow(images[i].numpy().astype("uint8"))plt.title(class_names[labels[i]])plt.axis("off")

    plt.imshow(images[1].numpy().astype("uint8")) <matplotlib.image.AxesImage at 0x2adcea36ee0>

    3. 再次檢查數(shù)據(jù)

    for image_batch, labels_batch in train_ds:print(image_batch.shape)print(labels_batch.shape)break (32, 224, 224, 3) (32,)
    • Image_batch是形狀的張量(32,180,180,3)。這是一批形狀180x180x3的32張圖片(最后一維指的是彩色通道RGB)。
    • Label_batch是形狀(32,)的張量,這些標(biāo)簽對應(yīng)32張圖片

    4. 配置數(shù)據(jù)集

    • shuffle():打亂數(shù)據(jù),關(guān)于此函數(shù)的詳細(xì)介紹可以參考:https://zhuanlan.zhihu.com/p/42417456
    • prefetch():預(yù)取數(shù)據(jù),加速運行,其詳細(xì)介紹可以參考我前兩篇文章,里面都有講解。
    • cache():將數(shù)據(jù)集緩存到內(nèi)存當(dāng)中,加速運行
    AUTOTUNE = tf.data.AUTOTUNEtrain_ds = train_ds.cache().shuffle(1000).prefetch(buffer_size=AUTOTUNE) val_ds = val_ds.cache().prefetch(buffer_size=AUTOTUNE)

    5. 歸一化

    normalization_layer = layers.experimental.preprocessing.Rescaling(1./255)normalization_train_ds = train_ds.map(lambda x, y: (normalization_layer(x), y)) val_ds = val_ds.map(lambda x, y: (normalization_layer(x), y)) image_batch, labels_batch = next(iter(val_ds)) first_image = image_batch[0]# 查看歸一化后的數(shù)據(jù) print(np.min(first_image), np.max(first_image)) 0.0 0.9928046

    三、構(gòu)建VGG-16網(wǎng)絡(luò)

    在官方模型與自建模型之間進行二選一就可以啦,選著一個注釋掉另外一個,都是正版的VGG-16哈。

    VGG優(yōu)缺點分析:

    • VGG優(yōu)點

    VGG的結(jié)構(gòu)非常簡潔,整個網(wǎng)絡(luò)都使用了同樣大小的卷積核尺寸(3x3)和最大池化尺寸(2x2)。

    • VGG缺點

    1)訓(xùn)練時間過長,調(diào)參難度大。2)需要的存儲容量大,不利于部署。例如存儲VGG-16權(quán)重值文件的大小為500多MB,不利于安裝到嵌入式系統(tǒng)中。

    1. 官方模型(已打包好)

    官網(wǎng)模型調(diào)用這塊我放到后面幾篇文章中,下面主要講一下VGG-16

    # model = keras.applications.VGG16() # model.summary()

    2. 自建模型

    from tensorflow.keras import layers, models, Input from tensorflow.keras.models import Model from tensorflow.keras.layers import Conv2D, MaxPooling2D, Dense, Flatten, Dropoutdef VGG16(nb_classes, input_shape):input_tensor = Input(shape=input_shape)# 1st blockx = Conv2D(64, (3,3), activation='relu', padding='same',name='block1_conv1')(input_tensor)x = Conv2D(64, (3,3), activation='relu', padding='same',name='block1_conv2')(x)x = MaxPooling2D((2,2), strides=(2,2), name = 'block1_pool')(x)# 2nd blockx = Conv2D(128, (3,3), activation='relu', padding='same',name='block2_conv1')(x)x = Conv2D(128, (3,3), activation='relu', padding='same',name='block2_conv2')(x)x = MaxPooling2D((2,2), strides=(2,2), name = 'block2_pool')(x)# 3rd blockx = Conv2D(256, (3,3), activation='relu', padding='same',name='block3_conv1')(x)x = Conv2D(256, (3,3), activation='relu', padding='same',name='block3_conv2')(x)x = Conv2D(256, (3,3), activation='relu', padding='same',name='block3_conv3')(x)x = MaxPooling2D((2,2), strides=(2,2), name = 'block3_pool')(x)# 4th blockx = Conv2D(512, (3,3), activation='relu', padding='same',name='block4_conv1')(x)x = Conv2D(512, (3,3), activation='relu', padding='same',name='block4_conv2')(x)x = Conv2D(512, (3,3), activation='relu', padding='same',name='block4_conv3')(x)x = MaxPooling2D((2,2), strides=(2,2), name = 'block4_pool')(x)# 5th blockx = Conv2D(512, (3,3), activation='relu', padding='same',name='block5_conv1')(x)x = Conv2D(512, (3,3), activation='relu', padding='same',name='block5_conv2')(x)x = Conv2D(512, (3,3), activation='relu', padding='same',name='block5_conv3')(x)x = MaxPooling2D((2,2), strides=(2,2), name = 'block5_pool')(x)# full connectionx = Flatten()(x)x = Dense(4096, activation='relu', name='fc1')(x)x = Dense(4096, activation='relu', name='fc2')(x)output_tensor = Dense(nb_classes, activation='softmax', name='predictions')(x)model = Model(input_tensor, output_tensor)return modelmodel=VGG16(1000, (img_width, img_height, 3)) model.summary() Model: "model" _________________________________________________________________ Layer (type) Output Shape Param # ================================================================= input_1 (InputLayer) [(None, 224, 224, 3)] 0 _________________________________________________________________ block1_conv1 (Conv2D) (None, 224, 224, 64) 1792 _________________________________________________________________ block1_conv2 (Conv2D) (None, 224, 224, 64) 36928 _________________________________________________________________ block1_pool (MaxPooling2D) (None, 112, 112, 64) 0 _________________________________________________________________ block2_conv1 (Conv2D) (None, 112, 112, 128) 73856 _________________________________________________________________ block2_conv2 (Conv2D) (None, 112, 112, 128) 147584 _________________________________________________________________ block2_pool (MaxPooling2D) (None, 56, 56, 128) 0 _________________________________________________________________ block3_conv1 (Conv2D) (None, 56, 56, 256) 295168 _________________________________________________________________ block3_conv2 (Conv2D) (None, 56, 56, 256) 590080 _________________________________________________________________ block3_conv3 (Conv2D) (None, 56, 56, 256) 590080 _________________________________________________________________ block3_pool (MaxPooling2D) (None, 28, 28, 256) 0 _________________________________________________________________ block4_conv1 (Conv2D) (None, 28, 28, 512) 1180160 _________________________________________________________________ block4_conv2 (Conv2D) (None, 28, 28, 512) 2359808 _________________________________________________________________ block4_conv3 (Conv2D) (None, 28, 28, 512) 2359808 _________________________________________________________________ block4_pool (MaxPooling2D) (None, 14, 14, 512) 0 _________________________________________________________________ block5_conv1 (Conv2D) (None, 14, 14, 512) 2359808 _________________________________________________________________ block5_conv2 (Conv2D) (None, 14, 14, 512) 2359808 _________________________________________________________________ block5_conv3 (Conv2D) (None, 14, 14, 512) 2359808 _________________________________________________________________ block5_pool (MaxPooling2D) (None, 7, 7, 512) 0 _________________________________________________________________ flatten (Flatten) (None, 25088) 0 _________________________________________________________________ fc1 (Dense) (None, 4096) 102764544 _________________________________________________________________ fc2 (Dense) (None, 4096) 16781312 _________________________________________________________________ predictions (Dense) (None, 1000) 4097000 ================================================================= Total params: 138,357,544 Trainable params: 138,357,544 Non-trainable params: 0 _________________________________________________________________

    3. 網(wǎng)絡(luò)結(jié)構(gòu)圖

    關(guān)于卷積的相關(guān)知識可以參考文章:https://mtyjkh.blog.csdn.net/article/details/114278995

    結(jié)構(gòu)說明:

    • 13個卷積層(Convolutional Layer),分別用blockX_convX表示
    • 3個全連接層(Fully connected Layer),分別用fcX與predictions表示
    • 5個池化層(Pool layer),分別用blockX_pool表示

    VGG-16包含了16個隱藏層(13個卷積層和3個全連接層),故稱為VGG-16

    四、編譯

    在準(zhǔn)備對模型進行訓(xùn)練之前,還需要再對其進行一些設(shè)置。以下內(nèi)容是在模型的編譯步驟中添加的:

    • 損失函數(shù)(loss):用于衡量模型在訓(xùn)練期間的準(zhǔn)確率。
    • 優(yōu)化器(optimizer):決定模型如何根據(jù)其看到的數(shù)據(jù)和自身的損失函數(shù)進行更新。
    • 指標(biāo)(metrics):用于監(jiān)控訓(xùn)練和測試步驟。以下示例使用了準(zhǔn)確率,即被正確分類的圖像的比率。
    # 設(shè)置優(yōu)化器 opt = tf.keras.optimizers.Adam(learning_rate=1e-4)model.compile(optimizer=opt,loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),metrics=['accuracy'])

    五、訓(xùn)練模型

    epochs = 20history = model.fit(train_ds,validation_data=val_ds,epochs=epochs ) Epoch 1/20 16/16 [==============================] - 14s 461ms/step - loss: 4.5842 - accuracy: 0.1349 - val_loss: 6.8389 - val_accuracy: 0.1129 Epoch 2/20 16/16 [==============================] - 2s 146ms/step - loss: 2.1046 - accuracy: 0.1398 - val_loss: 6.7905 - val_accuracy: 0.2016 Epoch 3/20 16/16 [==============================] - 2s 144ms/step - loss: 1.7885 - accuracy: 0.3531 - val_loss: 6.7892 - val_accuracy: 0.2903 Epoch 4/20 16/16 [==============================] - 2s 145ms/step - loss: 1.2015 - accuracy: 0.6135 - val_loss: 6.7582 - val_accuracy: 0.2742 Epoch 5/20 16/16 [==============================] - 2s 148ms/step - loss: 1.1831 - accuracy: 0.6108 - val_loss: 6.7520 - val_accuracy: 0.4113 Epoch 6/20 16/16 [==============================] - 2s 143ms/step - loss: 0.5140 - accuracy: 0.8326 - val_loss: 6.7102 - val_accuracy: 0.5806 Epoch 7/20 16/16 [==============================] - 2s 150ms/step - loss: 0.2451 - accuracy: 0.9165 - val_loss: 6.6918 - val_accuracy: 0.7823 Epoch 8/20 16/16 [==============================] - 2s 147ms/step - loss: 0.2156 - accuracy: 0.9328 - val_loss: 6.7188 - val_accuracy: 0.4113 Epoch 9/20 16/16 [==============================] - 2s 143ms/step - loss: 0.1940 - accuracy: 0.9513 - val_loss: 6.6639 - val_accuracy: 0.5968 Epoch 10/20 16/16 [==============================] - 2s 143ms/step - loss: 0.0767 - accuracy: 0.9812 - val_loss: 6.6101 - val_accuracy: 0.7419 Epoch 11/20 16/16 [==============================] - 2s 146ms/step - loss: 0.0245 - accuracy: 0.9894 - val_loss: 6.5526 - val_accuracy: 0.8226 Epoch 12/20 16/16 [==============================] - 2s 149ms/step - loss: 0.0387 - accuracy: 0.9861 - val_loss: 6.5636 - val_accuracy: 0.6210 Epoch 13/20 16/16 [==============================] - 2s 152ms/step - loss: 0.2146 - accuracy: 0.9289 - val_loss: 6.7039 - val_accuracy: 0.4839 Epoch 14/20 16/16 [==============================] - 2s 152ms/step - loss: 0.2566 - accuracy: 0.9087 - val_loss: 6.6852 - val_accuracy: 0.6532 Epoch 15/20 16/16 [==============================] - 2s 149ms/step - loss: 0.0579 - accuracy: 0.9840 - val_loss: 6.5971 - val_accuracy: 0.6935 Epoch 16/20 16/16 [==============================] - 2s 152ms/step - loss: 0.0414 - accuracy: 0.9866 - val_loss: 6.6049 - val_accuracy: 0.7581 Epoch 17/20 16/16 [==============================] - 2s 146ms/step - loss: 0.0907 - accuracy: 0.9689 - val_loss: 6.6476 - val_accuracy: 0.6452 Epoch 18/20 16/16 [==============================] - 2s 147ms/step - loss: 0.0929 - accuracy: 0.9685 - val_loss: 6.6590 - val_accuracy: 0.7903 Epoch 19/20 16/16 [==============================] - 2s 146ms/step - loss: 0.0364 - accuracy: 0.9935 - val_loss: 6.5915 - val_accuracy: 0.6290 Epoch 20/20 16/16 [==============================] - 2s 151ms/step - loss: 0.1081 - accuracy: 0.9662 - val_loss: 6.6541 - val_accuracy: 0.6613

    六、模型評估

    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=(12, 4)) 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()

    為體現(xiàn)原汁原味的VGG-16,本文并未對模型參數(shù)進行修改,可依據(jù)實際情況修改模型中的相關(guān)性參數(shù),適應(yīng)實際情況以便提升分類效果。


    其他精彩內(nèi)容:

    • 深度學(xué)習(xí)100例-卷積神經(jīng)網(wǎng)絡(luò)(CNN)實現(xiàn)mnist手寫數(shù)字識別 | 第1天
    • 深度學(xué)習(xí)100例-卷積神經(jīng)網(wǎng)絡(luò)(CNN)彩色圖片分類 | 第2天
    • 深度學(xué)習(xí)100例-卷積神經(jīng)網(wǎng)絡(luò)(CNN)服裝圖像分類 | 第3天
    • 深度學(xué)習(xí)100例-卷積神經(jīng)網(wǎng)絡(luò)(CNN)花朵識別 | 第4天
    • 深度學(xué)習(xí)100例-卷積神經(jīng)網(wǎng)絡(luò)(CNN)天氣識別 | 第5天

    《深度學(xué)習(xí)100例》專欄直達:【傳送門】

    如果覺得本文對你有幫助記得 點個關(guān)注,給個贊,加個收藏

    總結(jié)

    以上是生活随笔為你收集整理的深度学习100例-卷积神经网络(VGG-16)识别海贼王草帽一伙 | 第6天的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。