第T8周:貓狗識別

● 語言環境:Python3.8.8
● 編譯器:Jupyter Lab
● 深度學習環境:TensorFlow2.4.1

貓狗識別

  • 一、前期工作
    • 1. 設置GPU
  • 二、數據預處理
    • 1. 加載數據
    • 2.再次檢查數據
    • 3.配置數據集
  • 三、構建VG-16網絡
  • 四、編譯
  • 五、訓練模型
  • 六、模型評估
  • 七、預測
  • 八、總結

一、前期工作

1. 設置GPU

import tensorflow as tfgpus = tf.config.list_physical_devices("GPU")if gpus:tf.config.experimental.set_memory_growth(gpus[0], True)  #設置GPU顯存用量按需使用tf.config.set_visible_devices([gpus[0]],"GPU")# 打印顯卡信息,確認GPU可用
print(gpus)

2.導入數據

import matplotlib.pyplot as plt
# 支持中文
plt.rcParams['font.sans-serif'] = ['SimHei']  # 用來正常顯示中文標簽
plt.rcParams['axes.unicode_minus'] = False  # 用來正常顯示負號import os,PIL,pathlib#隱藏警告
import warnings
warnings.filterwarnings('ignore')data_dir = "./365-7-data"
data_dir = pathlib.Path(data_dir)image_count = len(list(data_dir.glob('*/*')))print("圖片總數為:",image_count)

二、數據預處理

1. 加載數據

使用image_dataset_from_directory方法將磁盤中的數據加載到tf.data.Dataset中

batch_size = 8
img_height = 224
img_width = 224
"""
關于image_dataset_from_directory()的詳細介紹可以參考文章: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=12,image_size=(img_height, img_width),batch_size=batch_size)
"""
關于image_dataset_from_directory()的詳細介紹可以參考文章: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=12,image_size=(img_height, img_width),batch_size=batch_size)

我們可以通過class_names輸出數據集的標簽。標簽將按字母順序對應于目錄名稱。

class_names = train_ds.class_names
print(class_names)

2.再次檢查數據

for image_batch, labels_batch in train_ds:print(image_batch.shape)print(labels_batch.shape)break

● Image_batch是形狀的張量(8, 224, 224, 3)。這是一批形狀224x224x3的8張圖片(最后一維指的是彩色通道RGB)。
● Label_batch是形狀(8,)的張量,這些標簽對應8張圖片

3.配置數據集

● shuffle() : 打亂數據,關于此函數的詳細介紹可以參考:https://zhuanlan.zhihu.com/p/42417456
● prefetch() :預取數據,加速運行,其詳細介紹可以參考我前兩篇文章,里面都有講解。
● cache() :將數據集緩存到內存當中,加速運行

AUTOTUNE = tf.data.AUTOTUNEdef preprocess_image(image,label):return (image/255.0,label)# 歸一化處理
train_ds = train_ds.map(preprocess_image, num_parallel_calls=AUTOTUNE)
val_ds   = val_ds.map(preprocess_image, num_parallel_calls=AUTOTUNE)train_ds = train_ds.cache().shuffle(1000).prefetch(buffer_size=AUTOTUNE)
val_ds   = val_ds.cache().prefetch(buffer_size=AUTOTUNE)

在這里插入圖片描述

三、構建VG-16網絡

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.compile(optimizer="adam",loss     ='sparse_categorical_crossentropy',metrics  =['accuracy'])

五、訓練模型

from tqdm import tqdm
import tensorflow.keras.backend as Kepochs = 10
lr     = 1e-4# 記錄訓練數據,方便后面的分析
history_train_loss     = []
history_train_accuracy = []
history_val_loss       = []
history_val_accuracy   = []for epoch in range(epochs):train_total = len(train_ds)val_total   = len(val_ds)"""total:預期的迭代數目ncols:控制進度條寬度mininterval:進度更新最小間隔,以秒為單位(默認值:0.1)"""with tqdm(total=train_total, desc=f'Epoch {epoch + 1}/{epochs}',mininterval=1,ncols=100) as pbar:lr = lr*0.92K.set_value(model.optimizer.lr, lr)for image,label in train_ds:   """訓練模型,簡單理解train_on_batch就是:它是比model.fit()更高級的一個用法想詳細了解 train_on_batch 的同學,可以看看我的這篇文章:https://www.yuque.com/mingtian-fkmxf/hv4lcq/ztt4gy"""history = model.train_on_batch(image,label)train_loss     = history[0]train_accuracy = history[1]pbar.set_postfix({"loss": "%.4f"%train_loss,"accuracy":"%.4f"%train_accuracy,"lr": K.get_value(model.optimizer.lr)})pbar.update(1)history_train_loss.append(train_loss)history_train_accuracy.append(train_accuracy)print('開始驗證!')with tqdm(total=val_total, desc=f'Epoch {epoch + 1}/{epochs}',mininterval=0.3,ncols=100) as pbar:for image,label in val_ds:      history = model.test_on_batch(image,label)val_loss     = history[0]val_accuracy = history[1]pbar.set_postfix({"loss": "%.4f"%val_loss,"accuracy":"%.4f"%val_accuracy})pbar.update(1)history_val_loss.append(val_loss)history_val_accuracy.append(val_accuracy)print('結束驗證!')print("驗證loss為:%.4f"%val_loss)print("驗證準確率為:%.4f"%val_accuracy)

在這里插入圖片描述

六、模型評估

from datetime import datetime
current_time = datetime.now() # 獲取當前時間epochs_range = range(epochs)plt.figure(figsize=(12, 4))
plt.subplot(1, 2, 1)plt.plot(epochs_range, history_train_accuracy, label='Training Accuracy')
plt.plot(epochs_range, history_val_accuracy, label='Validation Accuracy')
plt.legend(loc='lower right')
plt.title('Training and Validation Accuracy')
plt.xlabel(current_time) # 打卡請帶上時間戳,否則代碼截圖無效plt.subplot(1, 2, 2)
plt.plot(epochs_range, history_train_loss, label='Training Loss')
plt.plot(epochs_range, history_val_loss, label='Validation Loss')
plt.legend(loc='upper right')
plt.title('Training and Validation Loss')
plt.show()

在這里插入圖片描述

七、預測

import numpy as np# 采用加載的模型(new_model)來看預測結果
plt.figure(figsize=(18, 3))  # 圖形的寬為18高為5
plt.suptitle("預測結果展示")for images, labels in val_ds.take(1):for i in range(8):ax = plt.subplot(1,8, i + 1)  # 顯示圖片plt.imshow(images[i].numpy())# 需要給圖片增加一個維度img_array = tf.expand_dims(images[i], 0) # 使用模型預測圖片中的人物predictions = model.predict(img_array)plt.title(class_names[np.argmax(predictions)])plt.axis("off")

在這里插入圖片描述

在這里插入圖片描述

八、總結

VGG優缺點分析:

● VGG優點

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

● VGG缺點

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

結構說明:

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

VGG的網絡結構比較統一,重復使用卷積層堆疊,然后接最大池化。池化層的窗口是2x2,步長2,這樣每次池化后特征圖尺寸減半。然后全連接層部分有三個,最后是softmax分類。VGG16和VGG19的區別在于卷積層的數量,比如在某個塊中使用2個還是3個卷積層,或者更后面塊中的數量不同。比如,VGG16的配置可能是:塊1有2個卷積層,塊2有2個,塊3有3個,塊4有3個,塊5有3個,然后全連接層。而VGG19可能在這些塊中多加一些卷積層,使得總層數達到19層。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/78193.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/78193.shtml
英文地址,請注明出處:http://en.pswp.cn/web/78193.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

主流微前端框架比較

主流微前端框架比較 以下表格列出了當前主流微前端框架的核心對比信息,包括基本介紹、核心特性、適用場景、技術棧兼容性、優缺點、社區維護情況和典型應用案例等: 框架基本介紹核心特性與機制適用場景技術棧兼容性優缺點社區維護情況典型應用案例qiankun螞蟻金服推出的生產…

大學生入學審核系統設計與實現【基于SpringBoot + Vue 前后端分離技術】

一、項目概述 1.1 項目背景 隨著高校的不斷擴招,傳統的入學審核管理模式已不能滿足大規模學生數據的處理需求。人工管理不僅效率低下,還容易出現疏漏。本系統通過信息化手段,提升入學審核過程中的數據管理和審批效率。 1.2 系統目標 系統…

云計算-容器云-服務網格Bookinfo

服務網格:創建 Ingress Gateway 將 Bookinfo 應用部署到 default 命名空間下,請為 Bookinfo 應用創建一個網 關,使外部可以訪問 Bookinfo 應用。 上傳ServiceMesh.tar.gz包 [rootk8s-master-node1 ~]# tar -zxvf ServiceMesh.tar.gz [rootk…

Spring 分批處理 + 冷熱數據分離:歷史訂單高效遷移與數據清理實戰

在實際業務中,隨著時間推移,訂單量持續增長,若未及時進行數據治理,會造成數據庫膨脹、查詢緩慢、性能下降等問題。為了實現數據分層管理和系統高性能運行,我們在項目中采用了“冷熱數據分離 分批遷移 數據清理”的綜…

新手SEO優化核心步驟

內容概要 對于SEO新手而言,建立系統化的優化框架是突破入門瓶頸的關鍵。SEO的核心在于通過技術手段與內容策略的結合,提升網站在搜索引擎中的可見性與用戶價值。具體而言,新手需優先掌握關鍵詞研究,明確目標用戶的搜索意圖&#…

C++ 之 【list的簡介、list 的構造函數、iterator、容量操作、元素訪問、增刪查改與迭代器失效】

目錄 1.list的介紹 2.list的使用 2.1 構造函數 2.2 iterator 的使用 2.3 容量操作 2.4 元素訪問 2.5 增刪查改 2.5.1頭插頭刪與尾插尾刪 2.5.2 insert 、erase 函數 2.5.3 clear、swap函數 2.5.4 關于find函數 3.迭代器失效 1.list的介紹 (1)list的底層通常實現為帶…

Laravel Octane 項目加速與靜態資源優化指南

Laravel Octane 項目加速與靜態資源優化指南 一、Octane 核心加速配置 擴展安裝與環境配置 composer require laravel/octane # 安裝核心擴展?php artisan octane:install # 生成配置文件(選擇 Swoole/RoadRunner 等服務器)?服務器參數調優? …

高露潔牙膏是哪個國家的品牌?高露潔牙膏哪一款最好?

高露潔是來自于美國一個比較有知名度的品牌,在1806年的時候創立。總部是在美國紐約公園大道,在1873年時,高露潔就已經開始銷售罐裝牙膏。 在1896年時期推出可折疊管牙膏,在口腔護理產品發展的過程中擁有著不容忽視的地位。在1992…

【Python爬蟲詳解】第八篇:突破反爬體系的工程實踐

當矛與盾的較量進入白熱化,突破反爬需要的不只是技巧,更是一套完整的工程化解決方案——本文將揭示對抗現代反爬體系的九大核心戰術。 一、JavaScript混淆的深度破解 1. AST(抽象語法樹)解混淆 案例:某電商平臺商品價…

【Linux調整FTP端口】

Linux調整FTP端口 一、確保新端口未被占用在修改端口之前,可以使用以下命令檢查端口是否被占用: 二、修改vsftpd配置文件1. 打開vsftpd配置文件2. 找到并修改端口配置3. 保存并退出4. 重啟vsftpd服務 三、配置防火墻 在Linux系統中修改FTP端口&#xff0…

npm打包內存不足- JavaScript heap out of memory

直接貼出報錯信息 <--- Last few GCs --->[30904:0000010F60FE58E0] 22090 ms: Scavenge 2037.4 (2069.4) -> 2036.4 (2074.2) MB, 2.5 / 0.0 ms (average mu 0.228, current mu 0.216) allocation failure [30904:0000010F60FE58E0] 22101 ms: Scavenge 2…

AI大語言模型破譯“未知未知”的密鑰:開源情報、被動收入與智能體協作的深層機理與實踐

在人類認識世界的漫長征程中&#xff0c;信息與知識的獲取和運用一直是核心驅動力。我們從“一無所知”的狀態&#xff0c;逐漸積累“已知已知”&#xff0c;并在此基礎上識別“已知未知”&#xff0c;設定目標去探索解答。然而&#xff0c;真正能夠帶來范式轉變、顛覆現有格局…

kubelet 清理資源以緩解磁盤壓力

kubelet 資源清理緩解磁盤壓力指南 在 Kubernetes 集群中&#xff0c;當節點磁盤壓力過大時&#xff0c;可通過以下幾種方式利用 kubelet 清理資源&#xff0c;從而緩解磁盤壓力。 一、鏡像垃圾回收 自動回收 kubelet 內置了鏡像垃圾回收機制&#xff0c;其行為由配置參數控…

SPOJ 11576 TRIP2 - A Famous King’s Trip 【Tarjan+歐拉回路】

自我吐槽 &#xff08;哭 題目傳送門 SPOJ 洛谷 題目大意 讓你在簡單無向圖上刪去2條邊&#xff0c;使該圖聯通并存在歐拉回路 輸出字典序最小的一對邊 思路 考慮到存在歐拉回路的充要條件&#xff0c;即 i n x ≡ 0 ( m o d 2 ) ? i ( 1 ≤ i ≤ n ) in_x\equiv 0 (\m…

藏文情感分析器入門學習實踐

&#x1f3af; 項目目標&#xff1a; 輸入一段藏文短句。自動分析這句話的情感傾向&#xff1a;積極&#xff08;正面&#xff09;/消極&#xff08;負面&#xff09;/中立。 &#x1f50d; 技術原理簡介 情感分析是什么&#xff1f; 情感分析&#xff08;Sentiment Analysi…

雙指針(5)——有效三角形個數

題目&#xff1a; 這道題我們首先可能會想到暴力解法&#xff0c;三個for循環然后進行check&#xff08;&#xff09;。時間復雜度肯定是不允許的。 同時&#xff0c;驗證可以組成三角形的條件是任意兩邊之和大于第三邊&#xff0c;這就意味著我們每組要進行三次比較。但也有捷…

書生實戰營之沐曦專場

一&#xff1a;實驗環境進入和啟動實驗容器(D.run平臺) 1.1首先進入平臺進行注冊 D.run平臺https://console.d.run/ 注冊和登錄環節就跳過了。 1.2 啟動實驗容器--詳細步驟如下 1.2.1選擇容器的名稱、區域、鏡像&#xff08;注意鏡像必須選擇Dlinfer&#xff09; 1.2.2可以選…

內置類型成員變量的初始化詳解

在 C 中&#xff0c;內置類型&#xff08;如 int、float、double、char、指針等&#xff09;的初始化方式與類類型&#xff08;如 std::string、自定義類&#xff09;不同。由于內置類型沒有構造函數&#xff0c;它們的初始化行為由編譯器直接處理。以下是詳細解析&#xff1a;…

對第三方軟件開展安全測評,如何保障其安全使用?

對第三方軟件開展安全測評&#xff0c;能夠精準找出軟件存在的各類安全隱患&#xff0c;進而為軟件的安全使用給予保障。此次會從漏洞發現、風險評估、測試環境等多個方面進行具體說明。 漏洞發現情況 在測評過程中&#xff0c;我們借助專業技術與工具&#xff0c;對第三方軟…

11.Spring Boot 3.1.5 中使用 SpringDoc OpenAPI(替代 Swagger)生成 API 文檔

Spring Boot 3.1.5 中使用 SpringDoc OpenAPI&#xff08;替代 Swagger&#xff09;生成 API 文檔 1. 項目結構 假設項目名為 springboot-openapi-demo&#xff0c;以下是項目的基本結構&#xff1a; springboot-openapi-demo/ ├── src/ │ ├── main/ │ │ ├─…