wordpress 4.0百度seo搜索引擎優(yōu)化方案
????????最近放假在超星總部河北燕郊園區(qū)實(shí)習(xí),本來(lái)是搞前后端開(kāi)發(fā)崗位的,然后帶我的副總老大哥比較關(guān)照我,了解我的情況后得知我大三選的方向是大數(shù)據(jù),于是建議我學(xué)學(xué)python、Hadoop,Hadoop我看了一下內(nèi)容比較多,而且我現(xiàn)在大二暑假不著急這么快學(xué)完,公司暫時(shí)也沒(méi)這個(gè)項(xiàng)目可以給我學(xué),于是我就先學(xué)了兩天python,把基礎(chǔ)python學(xué)完了。
? ? ? ? 然后副總老大哥來(lái)問(wèn)我學(xué)完了Python是吧,直接給我一個(gè)項(xiàng)目好好了解一下,然后我看了這個(gè)項(xiàng)目的文檔,PyTorch??是啥??
這給我搞迷糊了,他跟我解釋這是一個(gè)ai深度學(xué)習(xí)的框架語(yǔ)言,于是我又開(kāi)始了新的學(xué)習(xí),這里以這篇文章開(kāi)始記錄我對(duì)PyTorch的學(xué)習(xí)。
一、PyTorch是啥?
本人語(yǔ)言能力較差,也只是小白,所以這里直接用權(quán)威的百度百科簡(jiǎn)單介紹:
簡(jiǎn)單來(lái)說(shuō)就是基于Python語(yǔ)言編寫(xiě)的深度學(xué)習(xí)框架,現(xiàn)如今學(xué)習(xí)人工智能就是學(xué)深度學(xué)習(xí),而深度學(xué)習(xí)單純用python來(lái)寫(xiě)要寫(xiě)巨海量的代碼,我們這些小卡拉米根本沒(méi)這個(gè)能力,所以就需要一個(gè)深度學(xué)習(xí)框架幫我們省去很多代碼,就像前端后端都需要框架語(yǔ)言一樣,下面是百度百科:
二、安裝與配置
1、安裝ANACONDA
ANACONDA是一個(gè)工具庫(kù),里面有很多我們后面學(xué)習(xí)需要的工具包,就像你的java后端maven里可以下載大量依賴包、pycharm可以下載大量依賴包一樣,ANACONDA就是這么個(gè)玩意。
最新版下載官方地址(不能選版本):Anaconda | The Operating System for AI
(可選舊版本的下載地址):Anaconda Installers and Packages
(1)第一個(gè)最新版下載地址的下載步驟
下載步驟是:(當(dāng)然這個(gè)版本不太穩(wěn)定,但是沒(méi)辦法,我本人已經(jīng)安裝了最新版python......只好對(duì)應(yīng)安裝最新版anaconda)
(2)可選舊版本的下載步驟:
當(dāng)然有的人用的是舊版本的Python,可能舊版本的Python就需要舊的的anaconda支持,所以你們需要根據(jù)自己的python版本來(lái)找對(duì)應(yīng)的anaconda版本
查看python版本可以直接cmd,輸入python
下面是一些對(duì)應(yīng)關(guān)系的表:
Anaconda版本與Python版本對(duì)應(yīng)關(guān)系_conda22.9.0是什么版本-CSDN博客
然后下載步驟:
也可以直接點(diǎn)這個(gè)網(wǎng)址:Index of /
然后選擇你要的版本點(diǎn)擊下載
(3)安裝步驟:
......省略后面,一直next就行了
然后彈出這個(gè),爽!當(dāng)然我這是最新版的安裝,就版本大差不差,基本就是你只要改一下默認(rèn)安裝路徑,然后其他的就直接點(diǎn)【next】【skip】【finish】一直往下就ok了,全都默認(rèn)就行
這里他還提醒我還有一個(gè)新版本可以更新,我現(xiàn)在只想用它,就懶得更新了,直接No,然后開(kāi)始使用吧
最后,檢查安裝,點(diǎn)擊桌面【開(kāi)始】看看有沒(méi)有Anaconda Prompt這個(gè)應(yīng)用,點(diǎn)擊只會(huì)正常彈出黑框,就大功告成
最后最后,進(jìn)去應(yīng)用里登陸一下就行,沒(méi)賬號(hào)的就先注冊(cè),這個(gè)Anaconda就先告一段落
2、(可選,非必選)安裝英偉達(dá)NVIDIA
這個(gè)玩意吧就是加快機(jī)器深度學(xué)習(xí)效率的顯卡,打游戲的屌絲們肯定不陌生,那么不安裝也不影響深度學(xué)習(xí),自己看著來(lái)吧,我是拯救者r8000,電腦自帶NVIDIA,所以我這就懶得再做安裝演示了
如何檢查自己有沒(méi)有NVIDIA驅(qū)動(dòng)?
打開(kāi)任務(wù)管理器——>性能——>GPU,能看到NVIDIA就ok
3、利用conda管理、切換Python、PyTorch版本
就跟我們前端的NVM一樣,conda來(lái)自于Anaconda工具包,它的作用就是控制管理我們多個(gè)Python、PyTorch版本之間的切換。如果你不這樣弄,你如果有一個(gè)項(xiàng)目需要用python 1.2,而你的是別的版本,那只能在本地環(huán)境中卸載原版本,再安裝python 1.2,很麻煩
原理就是你的電腦依舊有兩個(gè)版本的Python或者PyTorch,但是也對(duì)應(yīng)存在了兩個(gè)環(huán)境,默認(rèn)本地的原環(huán)境是【base】,當(dāng)你要切換到比如Python 1.0版本,那么我們直接切換一個(gè)環(huán)境到適用于這個(gè)版本的一個(gè)環(huán)境。
打比方:你娶了兩個(gè)妻子,但正房跟二房?jī)蓚€(gè)水火不容、爭(zhēng)風(fēng)吃醋,那你今晚想跟1號(hào)妻子睡你就到她住的那個(gè)房子里睡,明晚你想跟2號(hào)妻子睡你就換到她的房子里睡......
那么前面我也說(shuō)了,公司里的老大哥給我的項(xiàng)目就需要python 3.8,而我的是3.12,雖然都版本3,但是我還是盡量按照他的要求來(lái),切換成python 3.8的
點(diǎn)擊打開(kāi)Anaconda Prompt
/
輸入:conda create -n 這個(gè)版本的環(huán)境別名 python=要切換的版本號(hào)
。
然后會(huì)問(wèn)你是否安裝以上依賴,默認(rèn)輸入【y】表示確認(rèn)
。
然后安裝完畢,會(huì)詢問(wèn)你:“是否想激活切換到這個(gè)版本”
是的話我們輸入:【conda? activate? 剛剛給這個(gè)版本起的環(huán)境別名】
然后就能發(fā)現(xiàn)環(huán)境以及切換了
4、安裝PyTorch
輸入:【pip list】可以看到我們這個(gè)Python環(huán)境下,Python安裝的所有依賴包
那么可以發(fā)現(xiàn),我們并沒(méi)有PyTorch,那么終于來(lái)到這一步,安裝PyTorch
PyTorch安裝官網(wǎng):PyTorch
依舊是兩種安裝:
(1)新版本安裝:
如果你沒(méi)有特別要求,那么你安裝新版本就行了
進(jìn)入官網(wǎng),往下拉找到這個(gè)地方
,
如果下載安裝得很慢的話,可以去這個(gè)鏈接下載這兩個(gè)程序:
https://pan.baidu.com/s/1CvTIjuXT4tMonG0WltF-vQ?pwd=jnnp 提取碼:?jnnp
復(fù)制粘貼到anacondas的安裝路徑下的pkgs這個(gè)路徑
然后再重新執(zhí)行剛才的安裝命令就會(huì)變快了
,
?最后輸入:【pip list】檢查是否存在【torch】這個(gè)依賴包,有就成功了;沒(méi)有就重新安裝一遍
/
最后最后最后
輸入【python】切換到python環(huán)境,然后輸入【import torch】,如果沒(méi)有報(bào)錯(cuò)就無(wú)敵!成功!完美!
(2)舊版本安裝:
還是得選老版本,因?yàn)槲乙侠洗蟾绲沫h(huán)境要求
還是這個(gè)地方,找到上面一段文字里紅色的鏈接,選舊版本就點(diǎn)他
/
然后找到你要的版本,按照?qǐng)D片這樣選擇要執(zhí)行的命令,復(fù)制到Anaconda Prompt執(zhí)行
最后輸入:【pip list】檢查是否存在【torch】這個(gè)依賴包,有就成功了;沒(méi)有就重新安裝一遍
?/
最后最后最后
輸入【python】切換到python環(huán)境,然后輸入【import torch】,如果沒(méi)有報(bào)錯(cuò)就無(wú)敵!成功!完美!
另外,輸入【torch.cuda.is_available()】顯示True的話,就說(shuō)明PyTorch可以使用我們電腦的GPU
5、Python編輯器安裝
你得有這個(gè)你才能寫(xiě)代碼,那么我不打算將這一塊,因?yàn)槲沂窍葘W(xué)的python再學(xué)PyTorch,而且這玩意安裝簡(jiǎn)直是小腦癱、唐人都可以無(wú)腦安裝的,你甚至進(jìn)了官網(wǎng)點(diǎn)下載然后安裝一直亂點(diǎn)下去都能安裝好,那我就不講了,自己查。
三、創(chuàng)建適合PyTorch環(huán)境的Python項(xiàng)目
我這里用的是PyCharm這款編譯器,那么這個(gè)最新版的PyCharm來(lái)創(chuàng)建配置Condas環(huán)境的python項(xiàng)目各種各樣,方法很多,可以參考下面這兩個(gè),也可以跟著我的文章來(lái)都行。
其他博主的最新版配置教學(xué)視頻:【2024最新版】保姆級(jí)Anaconda安裝+PyCharm安裝和基本使用,Python編程環(huán)境安裝_嗶哩嗶哩_bilibili
最新版配置教學(xué)文章:Pycharm配置conda環(huán)境(解決新版本無(wú)法識(shí)別可執(zhí)行文件問(wèn)題)_conda可執(zhí)行文件-CSDN博客
1、那么下面是我的個(gè)人安裝步驟:?
我之前用它寫(xiě)過(guò)一些代碼,用的是python 3.12版本(沒(méi)有PyTorch的),那么就要切換到我們配置了PyTorch的Python環(huán)境中,點(diǎn)擊左上角【文件】,點(diǎn)擊【新建項(xiàng)目】重新新建一個(gè)項(xiàng)目
。
如果是新用戶剛剛第一次打開(kāi),也是一樣,點(diǎn)擊【新建項(xiàng)目】
。
給你的項(xiàng)目定一個(gè)路徑,切記,不可以有中文或奇怪符號(hào)
。
然后第一次用的用戶,【解析器類型】這選擇【基礎(chǔ)condas】,然后會(huì)有個(gè)黃色提示,點(diǎn)擊在這個(gè)提示右邊的【選擇路徑】
然后這里選擇我們剛剛【用Anacondas管理安裝的含有PyTorch的這個(gè)Python.exe程序】。
具體路徑在【你安裝Anacondas的路徑的?\?envs?\?你起的python環(huán)境別名的包?\?python.exe】
。
然后就進(jìn)入到項(xiàng)目界面,到這還沒(méi)完,你會(huì)發(fā)現(xiàn)你的項(xiàng)目是個(gè)空文件夾,連展開(kāi)的那個(gè)小箭頭都沒(méi)有,這里是因?yàn)槲覀冞€需要手動(dòng)導(dǎo)入【系統(tǒng)解釋器】,相當(dāng)于我們spring boot項(xiàng)目需要導(dǎo)入maven管理、JSP要引入web一樣,你有這玩意他才知道 “噢你是condas老大的罩的python”,不然就會(huì)把你這個(gè)python項(xiàng)目當(dāng)成 “沒(méi)人理的流浪漢”。
點(diǎn)擊右上角的【文件】,點(diǎn)擊【設(shè)置】
。
然后選中【項(xiàng)目:xxxx...】(版本控制下面)—>【Python解釋器】
然后點(diǎn)擊【添加解釋器】
/
這里有兩種路徑來(lái)配置這個(gè)condas的環(huán)境:
(1)第一種:選擇【Conda環(huán)境】,然后導(dǎo)入Anacondas安裝路徑下的【Scripts】的【condas.exe】
(我沒(méi)試過(guò),我用的是第二種)
給
(2)第二種:選擇【系統(tǒng)解釋器】,不是上一個(gè)“Condas環(huán)境”!!
然后手動(dòng)還是把剛剛新建項(xiàng)目時(shí)我們導(dǎo)入的Anacondas安裝路徑下的envs的“環(huán)境別名”的python.exe
/
然后返回【設(shè)置】,點(diǎn)【應(yīng)用】【確定】,OK,等待配置掃描安裝......
2、終端驗(yàn)證項(xiàng)目是否成功的報(bào)錯(cuò)解決方案
然后我們就可以打開(kāi)右下角的終端,檢查這個(gè)condas環(huán)境的python項(xiàng)目搭建好了沒(méi)
但當(dāng)時(shí)我一打開(kāi)給我報(bào)了這么個(gè)錯(cuò),如果有遇到相同情況的朋友,跟著我做,包不會(huì)錯(cuò),很簡(jiǎn)單
看了別的博主文章才知道:是因?yàn)槲覀冎把bjava的環(huán)境的時(shí)候,java的環(huán)境變量在path的配置那里有誤,【%JAVA_HOME%\bin】和【%JAVA_HOME%\jre\bin】不能兩個(gè)兩個(gè)連起來(lái)寫(xiě),要分開(kāi)
conda 啟動(dòng)報(bào)錯(cuò) Invoke-Expression_windows10 conda invoke-expression : 所在位置 行:1 字符: 1-CSDN博客
切記!!切記!!!修改完系統(tǒng)變量后,PyCharm這邊是不會(huì)自動(dòng)更新的,要整個(gè)軟件關(guān)掉、再打開(kāi),否則你再試個(gè)一百遍都是報(bào)錯(cuò)
關(guān)掉之后再打開(kāi),終端顯示正常了:
3、最終驗(yàn)證是否成功
最后我們到(終端上兩個(gè),也就是第一個(gè)按鈕)【Python 控制臺(tái)】
再輸入一次:【import torch】【torch.cuda.is_available()】,都沒(méi)報(bào)錯(cuò)的話就大功告成!完美!!!!
輸入一些python語(yǔ)法也正常運(yùn)行
四、什么是數(shù)據(jù)集,以及初始Dataset
1、數(shù)據(jù)集
看了別的文章是這么說(shuō)
這是一篇較詳細(xì)的文章:什么是數(shù)據(jù)集?-CSDN博客
那么鄙人的粗淺見(jiàn)識(shí)認(rèn)為:就是一堆給機(jī)器學(xué)習(xí)用的數(shù)據(jù)的集合,把人比做機(jī)器,那么數(shù)據(jù)集就是我們從出生到老死一直在聽(tīng)的、看的、吃的的一切的一切,我們看到藍(lán)天知道天空是藍(lán)色,我們聞到屎知道屎是香的,我們吃過(guò)老八秘制小漢堡才知道這玩意賊好吃......這一切的一切,都叫數(shù)據(jù)集,是這一切讓我們有了我們?nèi)祟惖囊惶姿伎歼壿?、判斷邏輯、理解邏?..當(dāng)然這些還可以細(xì)分成各個(gè)領(lǐng)域,比如情感認(rèn)知、學(xué)術(shù)知識(shí)、游戲體驗(yàn)......
那么這里提供一個(gè)數(shù)據(jù)集文件,以供我們后面學(xué)習(xí)用,大家可以自行下載
鏈接: https://pan.baidu.com/s/1JHnA4d0EU77r2ljeZlkCow?pwd=hrd4 提取碼: hrd4
那么看這個(gè)文件下,就能大概知道這是干啥的
就是一些根據(jù)圖片、文本label來(lái)“喂”給機(jī)器學(xué)習(xí)的數(shù)據(jù)集,一些資料
2、Dataset簡(jiǎn)單解釋
那么Dataset又是什么?
我們把上面那個(gè)文件夾的文件當(dāng)成你剛從畢業(yè)學(xué)長(zhǎng)學(xué)姐那撿回來(lái)的一堆書(shū)、或者你從夸克上下載的一萬(wàn)部小電影,nei叫一個(gè)爽,但是,你也不是什么都學(xué)、什么都看吧?那堆書(shū)里有《厚黑學(xué)》、《圣經(jīng)》、《c語(yǔ)言》、《計(jì)算機(jī)組成原理》.......夸克磁盤(pán)里有“獵奇”、“戶外”、“直播錄屏”、“獸..”、“歐美”...你不能一鍋亂燉亂看吧?總得分個(gè)類吧?
那么Dataset就是這么個(gè)工具,幫機(jī)器把這對(duì)雜亂無(wú)章的數(shù)據(jù)分類整理,獲取每個(gè)數(shù)據(jù)的label,并告訴機(jī)器一共有多少數(shù)據(jù)。
另外,我剛剛例子里說(shuō)的那些:《厚黑學(xué)》、《圣經(jīng)》、《c語(yǔ)言》、《計(jì)算機(jī)組成原理》.......“獵奇”、“戶外”、“直播錄屏”、“獸..”、“歐美”......這些就是數(shù)據(jù)集對(duì)應(yīng)的【label】
五、初用Dataset
1、準(zhǔn)備好數(shù)據(jù)集
把剛剛數(shù)據(jù)集里的【hymenopter_data.zip】解壓
然后復(fù)制這個(gè)文件夾,直接粘貼到你的PyTorch的python項(xiàng)目里去,最好再新建一個(gè)目錄叫“dataset”,專門用來(lái)放你的數(shù)據(jù)集的
2、學(xué)會(huì)python的獲取圖片資源
接下來(lái)我們簡(jiǎn)單了解一下python怎么獲取圖片,使用圖片
(1)首先要用到Image這個(gè)工具包,導(dǎo)入Image包
# 首先導(dǎo)入Image包
from PIL import Image
(2)然后用一個(gè)變量獲取某個(gè)圖片的路徑,絕對(duì)路徑、相對(duì)路徑都行,看你喜歡
# 然后用一個(gè)變量代替圖片路徑
imgPath = "你的圖片路徑"
這里可以直接右鍵復(fù)制文件的路徑
別忘了粘貼時(shí)這個(gè)【/】符號(hào)可能會(huì)自動(dòng)變錯(cuò),我們自己手動(dòng)調(diào)回來(lái)
(3)然后調(diào)用Image這個(gè)工具的open函數(shù),里面?zhèn)魅雸D片路徑的作為參數(shù),就可以用這個(gè)圖片了
# 然后調(diào)用Image的open函數(shù)把圖片解析,比用一個(gè)變量接收
img = Image.open(imgPath)
(4)我們可以利用這個(gè)圖片變量,調(diào)用它的屬性、函數(shù)
比如打印大小
顯示圖片
(5)另外:如果我們不知道它有哪些屬性、函數(shù)可以調(diào)用,那么我們可以在【Python控制臺(tái)】將剛才的python代碼再寫(xiě)一遍,右邊可以顯示對(duì)應(yīng)的屬性、函數(shù),方便我們查看
(我有寫(xiě)import PIL import Image,只是控制臺(tái)隱藏了)
完整代碼:
# 首先導(dǎo)入Image包
from PIL import Image# 然后用一個(gè)變量代替圖片路徑
imgPath = "F:/MyPythonProject/PyTrochProject1/dataset/train/ants/0013035.jpg"# 然后調(diào)用Image的open函數(shù)把圖片解析,比用一個(gè)變量接收
img = Image.open(imgPath)print(img.size)
img.show()
3、利用os庫(kù)工具獲取所有圖片
當(dāng)然剛剛的Image只能對(duì)一個(gè)圖片進(jìn)行專門的處理,而要想獲取所有圖片資源,就得用到os這個(gè)工具包
1、導(dǎo)入os包
# 導(dǎo)入os包,獲取存放所有圖片的這個(gè)包
import os
2、用一個(gè)變量接收【存放所有圖片的這個(gè)包】的【路徑】(絕對(duì)相對(duì)都行,這里我用相對(duì))
# 用一個(gè)變量接收存放所有圖片的這個(gè)包的路徑
imgListPath = "你放所有圖片的包的路徑"
3、然后調(diào)用os的listdir函數(shù)解析獲取這個(gè)包,并把存放所有圖片的包的路徑作為參數(shù)傳入
# 然后調(diào)用os的listdir函數(shù)解析獲取這個(gè)包
imgList = os.listdir(imgListPath)
4、如果我們把代碼寫(xiě)到【python控制臺(tái)】,就能看到獲取到所有圖片,變成一個(gè)列表數(shù)據(jù)?
完整代碼:
# 導(dǎo)入os包,獲取存放所有圖片的這個(gè)包
import os# 用一個(gè)變量接收存放所有圖片的這個(gè)包的路徑
imgListPath = "dataset/train/ants"# 然后調(diào)用os的listdir函數(shù)解析獲取這個(gè)包
imgList = os.listdir(imgListPath)print(imgList)
print(type(imgList))
4、利用Dataset,把所有圖片整合成一個(gè)數(shù)據(jù)集并分類
(1)在這之前補(bǔ)充一下幾個(gè)知識(shí)點(diǎn)
python的類里面可以不用定義成員變量,在函數(shù)里想用到的時(shí)候【self.成員變量】,就自動(dòng)加上了
class myClass:def createName(self):# 并沒(méi)有定義name這個(gè)變量,但是我直接在函數(shù)里加一個(gè)self.name = "KOBE"classA = myClass()
print(classA.name) #照樣打印出來(lái)
?然后【__init__】是構(gòu)造函數(shù)
# 構(gòu)造方法
def __init__(self, name=None, age=None, sex=None, phone=None):self.name = nameself.age = ageself.sex = sexself.phone = phoneif name is not None and age is not None and sex is not None and phone is not None:print("構(gòu)建一個(gè)完整對(duì)象完畢\n")else:print("構(gòu)建一個(gè)空對(duì)象完畢\n")
【__setitem__函數(shù)】、【__getitem__函數(shù)】
【__setitem__函數(shù)】允許外界根據(jù)【索引】設(shè)置構(gòu)造函數(shù)里【數(shù)據(jù)容器】類型成員變量的值
【__getitem__函數(shù)】提供索引,允許外界根據(jù)【索引】或【切片】形式獲取【數(shù)據(jù)容器】類型成員變量的某個(gè)位置值
class myClass:# 構(gòu)造函數(shù)并沒(méi)有傳參,也即是一個(gè)空參函數(shù)# 而items也并不是在函數(shù)外定義的一個(gè)類的成員變量,而且是【數(shù)據(jù)容器】類型(列表、元組、字典...)# 那就沒(méi)有辦法根據(jù)索引給這個(gè)items某個(gè)位值設(shè)置值def __init__(self):self.items = []my_class = myClass()
my_class.items = [1, 2, 3, 4, 5]
my_class.items[1] = 23 # 報(bào)錯(cuò),不允許根據(jù)索引設(shè)置構(gòu)造函數(shù)里設(shè)置的成員變量list#####################################################
class myClass:def __init__(self):self.items = []def __getitem__(self, index):return self.items[index]# 利用__setitem__方法,提供給外界允許根據(jù)【索引】設(shè)置構(gòu)造函數(shù)里定義的【數(shù)據(jù)容器】值的權(quán)限def __setitem__(self, index, value):self.items[index] = valuemy_class = myClass()
my_class.items = [1, 2, 3, 4, 5]# 使用索引方式設(shè)置元素
my_class.items[1] = 10 # 成功
print(my_list.items) # 輸出: [1, 10, 3, 4, 5]
【__len__】是魔法函數(shù)里的求長(zhǎng)度函數(shù)
# __len__魔術(shù)方法:返回長(zhǎng)度
def __len__(self):return len(self.name)
(2)正式寫(xiě)Dataset代碼
首先,導(dǎo)入Dataset的包
from torch.utils.data import Dataset
然后別忘了導(dǎo)入Image和os包,獲取圖片
# 導(dǎo)入Image包
from PIL import Image
# 導(dǎo)入os包,獲取存放所有圖片的這個(gè)包
import os
然后,現(xiàn)在我們就可以創(chuàng)建一個(gè)專門管理數(shù)據(jù)集的類了,只需要在創(chuàng)建普通類的基礎(chǔ)上,加一個(gè)括號(hào),里面?zhèn)魅隓ataset這個(gè)參數(shù),這就是一個(gè)Dataset的類了
接下來(lái)我們細(xì)細(xì)分析一下我們所需要的東西
【獲取所有文件的路徑】
。
【其中這兩個(gè)文件夾名字就是我們要的label】
一個(gè)表示“螞蟻”,一個(gè)表示“蜜蜂”
‘
【我們確切要拿到的每一個(gè)數(shù)據(jù)】
那么我們就可以理清一下思路:
1、首先我們要獲取到存放所有文件的目錄的路徑
2、這個(gè)路徑還不能直接直接固定死,要分開(kāi),因?yàn)槲覀円獑为?dú)取出裝有兩類不同文件的文件夾的名字,作為數(shù)據(jù)集的【label】
3、我們要把“螞蟻”、“蜜蜂”這兩個(gè)數(shù)據(jù)分類里的所有文件,分別存到兩個(gè)數(shù)據(jù)列表;然后在外界我們可以根據(jù)索引,單獨(dú)取出列表中的其中一個(gè)圖片資源
4、最后,我們要把兩個(gè)數(shù)據(jù)分類整合成一個(gè)數(shù)據(jù)集,交由Dataset來(lái)管理即可
那么第一步就是創(chuàng)建一個(gè)Dataset類,然后在類里面處理好獲取所有數(shù)據(jù)的邏輯,然后一個(gè)代表【螞蟻】,一個(gè)代表【蜜蜂】,在外界根據(jù)傳入不同的路徑參數(shù)來(lái)獲取不同的數(shù)據(jù),最后整合到一起。
ok,來(lái)寫(xiě)代碼!
完整代碼:
#導(dǎo)入Dataset
from torch.utils.data import Dataset
# 導(dǎo)入Image包
from PIL import Image
# 導(dǎo)入os包,獲取存放所有圖片的這個(gè)包
import osclass myData(Dataset):def __init__(self, rootPath, labelPath):# 用變量接收外界傳入的路徑參數(shù),其中l(wèi)abelPath是對(duì)應(yīng)【螞蟻】或【蜜蜂】self.rootPath = rootPathself.labelPath = labelPath# 利用os的.path.join()函數(shù),把路徑拼接起來(lái)(比如xxx和aaa,會(huì)自動(dòng)在中間加一個(gè)"/",變“xxx/aaa”)self.path = os.path.join(self.rootPath, self.labelPath)# 最后利用os的listdir解析這個(gè)包路徑下所有文件,并用一個(gè)數(shù)據(jù)列表接收self.imgListPath = os.listdir(self.path)print(self.imgListPath) #輸出對(duì)應(yīng)label路徑下的所有圖片的list# 根據(jù)索引獲取到單獨(dú)某個(gè)圖片資源、圖片名、圖片labeldef __getitem__(self, index):# 獲取當(dāng)前index位置的圖片名、以及解析圖片資源# 這里注意:完整的圖片路徑是【存放所有圖片的包路徑(rootPath + labelPath)】+【單個(gè)圖片的路徑】imgName = self.imgListPath[index]# imgPath = self.imgListPath[index]imgPath = os.path.join(self.rootPath, self.labelPath, imgName)img = Image.open(imgPath)# 取出它屬于哪個(gè)labellabel = self.labelPathreturn img, label# 利用__len__函數(shù),返回當(dāng)前這個(gè)label分類的圖片列表一共有多少條數(shù)據(jù)def __len__(self):return len(self.imgListPath)rootPath = "dataset/train"
labelPath1 = "ants"
labelPath2 = "bees"
# 傳入不同的label的路徑,獲取創(chuàng)建兩個(gè)數(shù)據(jù)集(【螞蟻】和【蜜蜂】)
ants_dataset = myData(rootPath, labelPath1)
bees_dataset = myData(rootPath, labelPath2)
# 用多返回值就用多變量接收
ant_img, ant_label = ants_dataset[1]
bee_img, bee_label = bees_dataset[1]
# 調(diào)用測(cè)試一下能不能顯示一張螞蟻和一張蜜蜂的照片
ant_img.show()
bee_img.show()# 最后,Dataset的整合數(shù)據(jù)集的大絕招:兩個(gè)數(shù)據(jù)集(Dataset類)相加
train_dataset = ants_dataset + bees_dataset
# 驗(yàn)證一下,分別輸出兩個(gè)數(shù)據(jù)集有幾條數(shù)據(jù),再看一下整個(gè)數(shù)據(jù)集有幾個(gè)數(shù)據(jù)
print(len(ants_dataset)) # 124
print(len(bees_dataset)) # 121
print(len(train_dataset)) # 245 = 124 + 121
這里我感覺(jué)我的注釋足夠清晰,我覺(jué)得我再多余寫(xiě)過(guò)多的文字反而不如看代碼來(lái)得清晰,所以我在過(guò)多闡述......
那么到這,我們就算完成了初步的一個(gè)用Dataset整合機(jī)器學(xué)習(xí)所需要的數(shù)據(jù)集了
那么其實(shí)通常情況下,我們還會(huì)專門區(qū)分圖片是圖片,label是label,專門有一個(gè)label文件夾,里面存放所有對(duì)應(yīng)每一張圖片名的txt文件,而里面的內(nèi)容就是它這個(gè)數(shù)據(jù)所歸屬的label名
這種形式的數(shù)據(jù)集又需要重新編寫(xiě)代碼,請(qǐng)各位自己寫(xiě),我累了...