機器學習 - Kaggle項目實踐(6)Dogs vs. Cats Redux: Kernels Edition 貓狗二分類

Dogs vs. Cats Redux: Kernels Edition | Kaggle

任務:給定貓狗圖像數據集 進行二分類。

Cats or Dogs - using CNN with Transfer Learning | Kaggle(參考)

Cats or Dogs | Kaggle (我的kaggle)

本文介紹了使用ResNet50預訓練模型進行貓狗圖像分類的完整流程。

數據預處理、模型構建、訓練評估和預測輸出,展示了遷移學習在圖像分類任務中的高效應用。

首先從Kaggle數據集解壓圖片并處理數據,將文件名轉換為獨熱標簽(貓[0,1],狗[1,0])。

然后構建ResNet50模型,移除原始分類層并改為二分類softmax輸出,使用ImageNet預訓練權重初始化。

模型在訓練集上訓練20個epoch后,在驗證集上準確率達到98%以上。

1. zip 圖片提取與 文件名標簽提取

從zip文件提取出 train 地址列表和 test 地址列表

import zipfile
import oswith zipfile.ZipFile('/kaggle/input/dogs-vs-cats-redux-kernels-edition/train.zip', 'r') as z:z.extractall('.') # 將ZIP文件中的所有內容解壓到當前目錄train_image_list = z.namelist() # 獲取名稱列表train_image_list = os.listdir("./train/") # 進一步解壓with zipfile.ZipFile('/kaggle/input/dogs-vs-cats-redux-kernels-edition/test.zip', 'r') as z:z.extractall('.')test_image_list = z.namelist()test_image_list = os.listdir("./test/")print(train_image_list[0],test_image_list[0]) # 文件名 train格式 類別+數字  test只有數字

把train文件夾地址和圖像文件名列表,拼湊出完整的地址;

cv2讀取出圖片;文件名提取出標簽 二分類概率 貓為[0,1] 狗為[1,0]

from random import shuffle
from tqdm import tqdm
import cv2
import numpy as np
import pandas as pdRANDOM_STATE = 2018
IMG_SIZE = 224
def process_data(data_image_list, DATA_FOLDER, isTrain):data_df = []for img in tqdm(data_image_list):if(isTrain):label = [1,0] if img.split('.')[0] == 'cat' else [0,1] # 根據文件名 轉換獨熱標簽else:label = img.split('.')[0]path = os.path.join(DATA_FOLDER,img) # 拼接為完整路徑img = cv2.imread(path,cv2.IMREAD_COLOR) # 讀取img = cv2.resize(img, (IMG_SIZE,IMG_SIZE)) # 設定大小data_df.append([np.array(img),np.array(label)]) # 拼在一起返回shuffle(data_df) # 打亂return data_dftrain = process_data(train_image_list, './train/', True)
test = process_data(test_image_list, './test/', False)

2. EDA 圖片探索 訓練集圖片展示

展示 5*5 張訓練集圖片和測試集圖片

def show_images(data, isTest=False):f, ax = plt.subplots(5,5, figsize=(15,15))for i,data in enumerate(data[:25]):img_data,img_num = data[0],data[1]label = np.argmax(img_num) # 獨熱向量 [0,1] 為狗 轉換為文字標簽if label == 1: str_label='Dog'elif label == 0: str_label='Cat'if(isTest):str_label="None"ax[i//5, i%5].imshow(img_data)ax[i//5, i%5].axis('off')ax[i//5, i%5].set_title("Label: {}".format(str_label))plt.show()show_images(train)
show_images(test,True)

3.?建立模型?ResNet

?殘差神經網絡ResNet預訓練參數 遷移學習

移除原始ResNet50最后的1000類分類層,改為softmax 激活函數二分類

使用在ImageNet上預訓練的權重(好的初始化快速收斂)允許訓練微調

from tensorflow.keras.applications import ResNet50
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Densemodel = Sequential()
model.add(ResNet50(include_top=False, # 移除原始ResNet50最后的1000類分類層pooling='max', # 在卷積特征上添加全局最大池化,將特征圖轉換為向量weights='imagenet' # 使用在ImageNet上預訓練的權重
))
model.add(Dense(2, activation='softmax')) # softmax 激活函數二分類model.layers[0].trainable = True # 允許訓練微調
model.compile(optimizer='sgd', loss='categorical_crossentropy', metrics=['accuracy'])
model.summary()

4. 準備數據并訓練

X = np.array([data[0] for data in train]).reshape(-1,IMG_SIZE,IMG_SIZE,3)
y = np.array([data[1] for data in train])
from sklearn.model_selection import train_test_split
X_train, X_val, y_train, y_val = train_test_split(X, y, test_size=0.25, random_state=RANDOM_STATE)
train_model = model.fit(X_train, y_train, batch_size=64, epochs=20, verbose=1, validation_data=(X_val, y_val))

verbose=1 訓練進度展示

5. 預測+評估

模型評估:model.evaluate 評估分數; 驗證集真實和預測 分類報告

score = model.evaluate(X_val, y_val, verbose=0) # 評估分數
print('Validation loss:', score[0])
print('Validation accuracy:', score[1])predicted_classes = model.predict_classes(X_val) # 預測
y_true = np.argmax(y_val,axis=1) # 實際from sklearn.metrics import classification_report # 分類報告
print(classification_report(y_true, predicted_classes, target_names=["Cat", "Dog"]))

這三個指標均達到 98%以上

還可以 可視化部分驗證集結果(人眼看是否差不多分類正確)

f, ax = plt.subplots(5, 5, figsize=(15, 15))for i, (img_data, _) in enumerate(test[:25]):prediction = model.predict(img_data.reshape(-1, IMG_SIZE, IMG_SIZE, 3))[0]label = 'Dog' if np.argmax(prediction) == 1 else 'Cat'ax[i//5, i%5].imshow(img_data)ax[i//5, i%5].axis('off')ax[i//5, i%5].set_title(f"Predicted: {label}")plt.show()

預測并保存結果

pred_list = []
img_list = []
for img in tqdm(test):data = img[0].reshape(-1,IMG_SIZE,IMG_SIZE,3)pred_list.append(model.predict([data])[0][1])img_list.append(img_idx[1])submission = pd.DataFrame({'id':img_list , 'label':pred_list})
submission.to_csv("submission.csv", index=False)

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

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

相關文章

基礎的匯編指令

目錄 1、接上一個csdn特殊功能寄存器 1.1CPSR寄存器 1.2SPSR寄存器 1.3CPSR寄存器的高四位和第四位 ?編輯 2、匯編指令的分類 3、匯編指令的基本格式 4、數據搬移指令(賦值指令) 4.1指令碼 4.2指令格式 4.3測試代碼 4.5立即數 4.6ldr偽指令 …

Docker實戰避坑指南:從入門到精通

摘要:文人結合自身微服務實踐,系統梳理從安裝適配、鏡像拉取,到運行配置、構建優化、多容器編排、數據持久化、監控運維等 Docker 全流程高頻踩坑點,給出可落地的解決方案,幫助讀者快速規避同類問題并提升容器化效率。…

《Bishop PRML》10.1. Variational Inference(2)理解VAE

通過VAE與AE理解變分分布的變量 如何理解變分推斷公式中,Z和X的含義是什么? 知乎 變分自編碼器VAE的數學原理。 csdn 變分自編碼器(VAE)的數學原理以及實現 Loss functions in Variational Autoencoders (VAEs) 一文解釋 VAE+ELBO AE的編碼和解碼是確定性的。VAE的解碼過程…

函數調用中的初始化與賦值——深入理解C++對象的生命周期

技術博客:函數調用中的初始化與賦值——深入理解C對象的生命周期引言在C編程中,理解函數調用過程中參數傳遞、對象創建和返回值處理的細節對于編寫高效且無誤的代碼至關重要。本文將通過一個具體的例子來探討函數調用時實參到形參的轉換過程,…

矩陣微積分的鏈式法則(chain rule)

矩陣微積分的鏈式法則(chain rule)與標量情況一樣,用于求復合函數的導數,但由于涉及矩陣和向量的求導,維度匹配和布局約定(numerator-layout vs. denominator-layout)必須格外小心。下面給出常見…

網絡編程4-并發服務器、阻塞與非阻塞IO、信號驅動模型、IO多路復用..

一、并發服務器1、單循環服務器(順序處理) 一次只能處理一個客戶端連接,只有當前客戶端斷開連接后,才能接受新的客戶端連接2、多進程/多線程并發服務器while(1) {connfd accept(listenfd);pid fork(); // 或 pthread_cr…

在 WSL2-NVIDIA-Workbench 中安裝Anaconda、CUDA 13.0、cuDNN 9.12 及 PyTorch(含完整環境驗證)

在 WSL-NVIDIA-Workbench(NVIDIA AI Workbench & Ubuntu 22.04)中 安裝 Anaconda、CUDA 13.0、cuDNN 9.12 及 PyTorch 步驟也可參閱: 在WSL2-Ubuntu中安裝Anaconda、CUDA13.0、cuDNN9.12及PyTorch(含完整環境驗證&#xf…

Shell編程核心入門:參數傳遞、運算符與流程控制全解析

Shell編程核心入門:參數傳遞、運算符與流程控制全解析 在Linux/Unix系統中,Shell作為命令解釋器和腳本語言,是自動化運維、批量處理任務的核心工具。掌握Shell腳本的參數傳遞、運算符使用和流程控制,能讓你從“手動執行命令”升級…

如何用 Kotlin 在 Android 手機開發一個應用程序獲取網絡時間

使用 NTP 協議獲取網絡時間在 build.gradle 文件中添加以下依賴:implementation commons-net:commons-net:3.6創建 NTP 時間獲取工具類:import org.apache.commons.net.ntp.NTPUDPClient import org.apache.commons.net.ntp.TimeInfo import java.net.In…

python智慧交通數據分析可視化系統 車流實時檢測分析 深度學習 車流量實時檢測跟蹤 軌跡跟蹤 畢業設計?

博主介紹:?全網粉絲50W,前互聯網大廠軟件研發、集結碩博英豪成立軟件開發工作室,專注于計算機相關專業項目實戰6年之久,累計開發項目作品上萬套。憑借豐富的經驗與專業實力,已幫助成千上萬的學生順利畢業,…

計算機視覺第一課opencv(四)保姆級教學

目錄 簡介 一、輪廓檢測 1.查找輪廓的API 2.代碼分析 2.1.圖像二值化處理 2.2輪廓檢測 2.3輪廓繪制 2.4輪廓面積計算 2.5輪廓周長計算 2.6篩選特定面積的輪廓 2.7查找最大面積的輪廓 2.8繪制輪廓的外接圓 2.9繪制輪廓的外接矩形 二、輪廓的近似 三、模板匹配 簡…

基于Vue2+elementUi實現樹形 橫向 合并 table不規則表格

1、實現效果 共N行&#xff0c;但是每一列對應的單元格列數固定&#xff0c;行數不固定2、實現方式說明&#xff1a;使用的是vue2 elementUI表格組件 js實現<template><div class"table-container" ><el-table height"100%" :span-metho…

深度學習在計算機視覺中的應用:對象檢測

引言 對象檢測是計算機視覺領域中的一項基礎任務&#xff0c;目標是在圖像或視頻幀中識別和定位感興趣的對象。隨著深度學習技術的發展&#xff0c;對象檢測的準確性和效率都有了顯著提升。本文將詳細介紹如何使用深度學習進行對象檢測&#xff0c;并提供一個實踐案例。 環境準…

node.js 安裝步驟

在Node.js中安裝包通常通過npm(Node Package Manager)來完成,這是Node.js的包管理工具。以下是安裝Node.js和通過npm安裝包的基本步驟: 1. 安裝Node.js 方法一:使用nvm(Node Version Manager) 推薦使用nvm來安裝Node.js,因為它允許你安裝多個Node.js版本,并輕松地在…

面試-故障案例解析

一、NFS故障&#xff0c;造成系統cpu使用率低而負載極高。故障概述: 公司使用NFS為web節點提供共享存儲服務,某一天下午發現web節點CPU使用率低,而負載極高.登錄web節點服務器排查發現后段NFS服務器故障. 影響范圍: 網站看不到圖片了。 處理流程: 通過ssh登錄NFS服務…

醫療AI時代的生物醫學Go編程:高性能計算與精準醫療的案例分析(一)

摘要: 隨著高通量測序、醫學影像和電子病歷等生物醫學數據的爆炸式增長,對高效、可靠、可擴展的計算工具需求日益迫切。Go語言憑借其原生并發模型、卓越的性能、簡潔的語法和強大的標準庫,在生物醫學信息學領域展現出獨特優勢。本文以“生物醫學Go編程探析”為主題,通過三個…

針對 “TCP 連接建立階段” 的攻擊

針對 “TCP 連接建立階段” 的攻擊一、定義二、共性防御思路三、攻擊手段3.1、SYN 洪水攻擊&#xff08;SYN Flood&#xff09;3.2、Land 攻擊&#xff08;Land Attack&#xff09;一、定義 什么是針對 “TCP 連接建立階段” 的攻擊&#xff1f;核心特征是利用 TCP “三次握手…

聊一聊 單體分布式 和 微服務分布式

微服務 與 單體架構對比維度單體架構微服務架構??架構本質??一個單一的、功能齊全的應用程序一組??小型、獨立??的服務集合??開發??團隊工作在同一個代碼庫&#xff0c;易產生沖突。技術棧統一。每個服務可以由?? 獨立的小團隊 ??負責&#xff0c;允許使用??…

【C++八股文】計算機網絡篇

網絡協議核心知識點詳解 TCP頭部結構 TCP頭部包含多個關鍵字段&#xff0c;每個字段都有其特定作用&#xff1a; 16位源端口&#xff1a;標識發送方應用程序的端口號16位目的端口&#xff1a;標識接收方應用程序的端口號32位序號&#xff1a;保證數據包有序傳輸的唯一標識32…

小迪Web自用筆記7

游戲一般不走http https協議&#xff0c;一般的抓包工具抓不到。科來&#xff0c;這個工具是從網卡抓包。你一旦打怪數據就會多起來↓但不是很專業。可以抓到https。wep↑這個西東是全部協議都做流量包&#xff0c;你不知道他是從哪兒來的&#xff0c;他全都抓&#xff08;專業…