摘要:我們這次用的數(shù)據(jù)集不再是中內(nèi)置的數(shù)據(jù)集,而是自定義的數(shù)據(jù)集,我們先看一下我們的數(shù)據(jù)所有的數(shù)據(jù)都存儲(chǔ)在這個(gè)文件夾中文件夾中有與這兩個(gè)子文件夾分別存放的是飛機(jī)與湖泊的衛(wèi)星圖像目錄導(dǎo)入庫(kù)導(dǎo)入庫(kù)導(dǎo)入庫(kù)數(shù)據(jù)處理數(shù)據(jù)處理數(shù)據(jù)處理獲取
我們這次用的數(shù)據(jù)集不再是tensorflow中內(nèi)置的數(shù)據(jù)集,而是自定義的數(shù)據(jù)集,我們先看一下我們的數(shù)據(jù)??
所有的數(shù)據(jù)都存儲(chǔ)在2_class這個(gè)文件夾中
文件夾中有airplane與lake這兩個(gè)子文件夾
分別存放的是飛機(jī)與湖泊的衛(wèi)星圖像
目錄
4.1??創(chuàng)建圖片路徑數(shù)據(jù)集
4.3??創(chuàng)建標(biāo)簽數(shù)據(jù)集
4.4??創(chuàng)建圖片+標(biāo)簽數(shù)據(jù)集(總數(shù)據(jù)集)
我們這里首次用到了glob這個(gè)庫(kù),這個(gè)庫(kù)是python自帶的庫(kù),用于處理路徑中的文件的
random也是Python自帶的庫(kù),用于進(jìn)行一些隨機(jī)的操作
首先我們獲取所有的圖像
我們?cè)?_class中有兩個(gè)子文件夾,現(xiàn)在我們都要,所以我們用*表示,后面的*.jpg表示我們要所有的jpg文件
glob.glob的返回值是一個(gè)列表,我們打印出來(lái)看一下
我們可以發(fā)現(xiàn)all_iamge_path的前面都是飛機(jī),后面都是湖泊,所以我們?cè)谶@里要進(jìn)行亂序以達(dá)到更好的訓(xùn)練效果,此處我們使用ramdom.shuffle()
我們定義飛機(jī)的標(biāo)簽為0,湖泊的標(biāo)簽為1,我們先創(chuàng)建一個(gè)字典明確對(duì)應(yīng)關(guān)系
為了最終預(yù)測(cè)方便我們?cè)俣x反過(guò)來(lái)(索引對(duì)標(biāo)簽)的字典
定義之后我們要為所有的圖像添加標(biāo)簽,我們發(fā)現(xiàn)在路徑中,中間的子文件夾名稱(chēng)就是該圖片對(duì)應(yīng)的標(biāo)簽,所以我們現(xiàn)在把這個(gè)名稱(chēng)取出來(lái)
這里我們要用到str的內(nèi)置方法split,這個(gè)方法我在這個(gè)里面有介紹?python str基本用法_potato123232的博客-CSDN博客
我們打印出來(lái)看一下
tensorflow有內(nèi)置讀取文件的方法 tf.io.read_file()參數(shù)為文件路徑
我們現(xiàn)在讀取一個(gè)文件試一下這個(gè)方法
當(dāng)前的類(lèi)型是一堆二進(jìn)制的數(shù)據(jù),我們要將其解碼,使其變?yōu)閠ensor,我們使用tf.image.decode_jpeg()進(jìn)行解碼,第一個(gè)參數(shù)為要解碼的對(duì)象,第二個(gè)參數(shù)為通道格式,我們當(dāng)前為彩色圖像,所以為3
這個(gè)就是我們要用到的類(lèi)型,我們現(xiàn)在先看一下它的shape
前面兩個(gè)是寬高,第三個(gè)是通道(rgb三通道)
再看一下它的dtype
發(fā)現(xiàn)是uint8,我們訓(xùn)練中最好轉(zhuǎn)換為float,我們使用tensorflow的cast方法進(jìn)行類(lèi)型轉(zhuǎn)換
之后我們對(duì)圖像進(jìn)行歸一化,由于當(dāng)前圖像的取值范圍為(0-255)所以我們除255(一般的圖像取值范圍都是0到255)
我們?yōu)榱私窈蠓奖銓⑸厦娴倪^(guò)程封裝成一個(gè)函數(shù)
我們正好梳理一下流程
首先我們需要圖片的路徑,然后讀取該路徑的文件
之后解碼該文件
再之后我們需要加入一步操作,我們剛剛進(jìn)行的是單張的流程,所以不涉及到圖片大小不一的情況,我們?cè)谟?xùn)練的過(guò)程中,將圖片的大小統(tǒng)一會(huì)達(dá)到更好的效果,所以我們此處使用tf.image.resize改變圖像的大小
此處我們將其都改為(256,256)的圖像大小,之后將其類(lèi)型轉(zhuǎn)變?yōu)閒loat32,再之后歸一化
首先我們創(chuàng)建所有圖片路徑的數(shù)據(jù)集
我們看一下當(dāng)前的路徑集
我們從types可以看出來(lái),現(xiàn)在里面全都是字符串
然后我們將路徑集中的每個(gè)元素都執(zhí)行一遍load_img(),此處我們使用的是tensorflow中的map方法,這個(gè)方法與python內(nèi)置的map方法使用方式相似,我在這里有介紹?python內(nèi)建方法_potato123232的博客-CSDN博客
現(xiàn)在我們?cè)倏匆幌卢F(xiàn)在的圖片數(shù)據(jù)集
在這一步中我們要把剛剛的圖片數(shù)據(jù)集和標(biāo)簽數(shù)據(jù)集合為一個(gè)數(shù)據(jù)集,我們使用tf.data.Dataset.zip()將兩個(gè)數(shù)據(jù)集合并
我們?nèi)∩厦鎰?chuàng)建的數(shù)據(jù)集一部分作為訓(xùn)練集,另一部分作為測(cè)試集,我們先看一下一共有多少?gòu)垐D片
我們可以使用20%的數(shù)據(jù)進(jìn)行驗(yàn)證,其余圖片進(jìn)行訓(xùn)練,我們現(xiàn)在定義這兩個(gè)數(shù)值,這里由于乘0.2可能會(huì)出現(xiàn)小數(shù),我們的數(shù)量是不能有小數(shù)部分的,所以我們?nèi)≌尾糠?/p>
之后我們跳過(guò)總數(shù)據(jù)集的前test_count個(gè)數(shù)作為訓(xùn)練集,然后取前test_count作為測(cè)試集
首先我們定義BATCHSIZE為16,這個(gè)和cpu性能相關(guān),如果cpu性能好可適量增大,BATCHSIZE越大訓(xùn)練速度越快,BATCHSIZE對(duì)訓(xùn)練精度無(wú)影響
此處由于加入了重復(fù),所以隨機(jī)是有必要的(雖然我們上面對(duì)數(shù)據(jù)集加入了初始隨機(jī)),因?yàn)槿绻患尤腚S機(jī)我們每次傳入的圖片順序還是一樣的,對(duì)最終訓(xùn)練的結(jié)果有不好的影響
我們可以發(fā)現(xiàn)與上面的train_ds相比,train_ds加入了一個(gè)維度None,這個(gè)是因?yàn)槲覀兗尤肓薭atch,我們每加入一次batch就會(huì)多出一個(gè)維度,所以我們要注意添加batch的次數(shù)
我們給測(cè)試集也加上batch,測(cè)試集不用加shuffle因?yàn)闊o(wú)論是否亂序都要測(cè)試,而且測(cè)試的順序不影響最終的acc或loss,不用加shuffle就不用加repeat
我們使用的網(wǎng)絡(luò)為卷積神經(jīng)網(wǎng)絡(luò),我們的網(wǎng)絡(luò)是這樣的
我們看一下這個(gè)模型的summary
這里要注意下面幾點(diǎn)
我們卷積到最后圖像大小為(6,6),這個(gè)時(shí)候依然可以使用(3,3)的卷積核進(jìn)行卷積,但如果輸出的圖像大小小于卷積核大小,這個(gè)時(shí)候就不能繼續(xù)卷積了,如果繼續(xù)卷積會(huì)報(bào)錯(cuò)
二分類(lèi)我們最終輸出一個(gè)結(jié)果就可以了,我們可以設(shè)置一個(gè)閾值(一般為0.5),大于或等于閾值我們判定為飛機(jī),小于閾值我們判定為湖泊
我們這里沒(méi)有直接使用"adam"這個(gè)字符串,而是使用了tf.keras.optimizers.Adam(),我們使用后面的這種方法可以對(duì)優(yōu)化器添加參數(shù),如果使用前面的方式使用的就是默認(rèn)參數(shù),這里我們修改了學(xué)習(xí)速率,我們把學(xué)習(xí)速率搞小一點(diǎn)
我們的所有l(wèi)oss存放在tf.keras.losses中,上面我們用的是大寫(xiě)的BinaryCrossentropy,這個(gè)和咱們之前直接輸入字符串的效果相同,還有一種小寫(xiě)的,這個(gè)需要添加參數(shù),我們現(xiàn)在暫時(shí)不用這個(gè)
如果我們進(jìn)行多分類(lèi)任務(wù)的話(huà)損失就要改成CategoricalCrossentropy
CategoricalCrossentropy有個(gè)參數(shù)是from_logits,如果我們?cè)跇?gòu)建神經(jīng)網(wǎng)絡(luò)時(shí)最后一層沒(méi)有激活函數(shù),則from_logits就置為T(mén)rue,如果我們有激活函數(shù)就置為False
首先我們定義訓(xùn)練集與測(cè)試集的每一個(gè)epoch所進(jìn)行的批次數(shù)
之后我們使用fit()對(duì)神經(jīng)網(wǎng)絡(luò)進(jìn)行訓(xùn)練
訓(xùn)練之后我們將結(jié)果繪制成曲線看一下情況
發(fā)現(xiàn)準(zhǔn)確率已經(jīng)超過(guò)了0.95,這個(gè)在實(shí)際生活中的某些場(chǎng)合中已經(jīng)達(dá)到了可以使用的程度
像這種CNN的模型訓(xùn)練的時(shí)間比較漫長(zhǎng),所以我們此處先簡(jiǎn)單介紹一下如何保存模型,訓(xùn)練后我們對(duì)訓(xùn)練好的模型進(jìn)行保存,之后我們?cè)俅我褂玫竭@個(gè)模型的時(shí)候就不需要再訓(xùn)練了
運(yùn)行結(jié)束后會(huì)出現(xiàn)這樣一個(gè)文件夾
里面有這些文件,這個(gè)就不在這里多介紹了,后面會(huì)具體的提到如何保存模型
這個(gè)時(shí)候我們就再另一個(gè)新開(kāi)的py文件中讀取模型了
我們先從百度上找一張飛機(jī)的圖片與湖泊的衛(wèi)星圖片,當(dāng)然我們也可以直接使用數(shù)據(jù)集中的圖片,但是如果找原來(lái)的圖片意義不大,因?yàn)閺挠?xùn)練數(shù)據(jù)中找的圖不能驗(yàn)證模型的成果
我們訓(xùn)練的數(shù)據(jù)怎么處理的原數(shù)據(jù),在預(yù)測(cè)的時(shí)候也要對(duì)被預(yù)測(cè)圖片進(jìn)行一遍相同的處理,所以我們要再次使用一次上面定義的load_img()
首先定義load_img()
然后使用load_img()
我們看一下它的shape
發(fā)現(xiàn)shape是三維的,而我們訓(xùn)練時(shí)的圖像是四維的,我們需要再提升一個(gè)維度
現(xiàn)在我們就可以進(jìn)行預(yù)測(cè)了
我們發(fā)現(xiàn)得到了一個(gè)概率值,這個(gè)值越靠近1就是越像湖泊,越靠近0就越像飛機(jī),那我們現(xiàn)在就可以直接進(jìn)行判斷了
為了方便我們現(xiàn)在把預(yù)測(cè)的過(guò)程也封裝成一個(gè)函數(shù)
現(xiàn)在我們用這個(gè)函數(shù)預(yù)測(cè)一樣剛剛湖泊的圖片
如果想把圖片展示出來(lái),然后加上預(yù)測(cè)的文字,那么我們可以使用opencv,方法在這里可以找到?1.圖像基本操作_potato123232的博客-CSDN博客_圖像基本操作
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/122574.html
摘要:通過(guò)通信線路連入通信子網(wǎng)終端是用戶(hù)訪問(wèn)網(wǎng)絡(luò)的界面網(wǎng)絡(luò)操作系統(tǒng)是相對(duì)于主機(jī)操作系統(tǒng)而言的。接收方使用同一擴(kuò)頻碼進(jìn)行擴(kuò)解。 目錄 一、計(jì)算機(jī)網(wǎng)絡(luò) 1.計(jì)算機(jī)網(wǎng)絡(luò)技術(shù)概述 2.計(jì)算機(jī)網(wǎng)絡(luò)分類(lèi) 3.無(wú)線網(wǎng)絡(luò)分類(lèi) 二、無(wú)線通信和網(wǎng)絡(luò)仿真技術(shù)基礎(chǔ) 1.基本概念 2.調(diào)制 (1)、概述 (2)、常用方式 ...
摘要:故事中的下屬們,就是消息生產(chǎn)者角色,屋子右面墻根那塊地就是消息持久化,呂秀才就是消息調(diào)度中心,而你就是消息消費(fèi)者角色。下屬們匯報(bào)的消息,應(yīng)該疊放在哪里,這個(gè)消息又應(yīng)該在哪里才能找到,全靠呂秀才的驚人記憶力,才可以讓消息準(zhǔn)確的被投放以及消費(fèi)。 微信公眾號(hào):IT一刻鐘大型現(xiàn)實(shí)非嚴(yán)肅主義現(xiàn)場(chǎng)一刻鐘與你分享優(yōu)質(zhì)技術(shù)架構(gòu)與見(jiàn)聞,做一個(gè)有劇情的程序員關(guān)注可了解更多精彩內(nèi)容。問(wèn)題或建議,請(qǐng)公眾號(hào)留言...
摘要:故事中的下屬們,就是消息生產(chǎn)者角色,屋子右面墻根那塊地就是消息持久化,呂秀才就是消息調(diào)度中心,而你就是消息消費(fèi)者角色。下屬們匯報(bào)的消息,應(yīng)該疊放在哪里,這個(gè)消息又應(yīng)該在哪里才能找到,全靠呂秀才的驚人記憶力,才可以讓消息準(zhǔn)確的被投放以及消費(fèi)。 微信公眾號(hào):IT一刻鐘大型現(xiàn)實(shí)非嚴(yán)肅主義現(xiàn)場(chǎng)一刻鐘與你分享優(yōu)質(zhì)技術(shù)架構(gòu)與見(jiàn)聞,做一個(gè)有劇情的程序員關(guān)注可了解更多精彩內(nèi)容。問(wèn)題或建議,請(qǐng)公眾號(hào)留言...
摘要:人工智能概述簡(jiǎn)史應(yīng)用領(lǐng)域安防實(shí)時(shí)從視頻中檢測(cè)出行人和車(chē)輛。通過(guò)多張醫(yī)療影像重建出人體內(nèi)器官的三維模型,幫助醫(yī)生設(shè)計(jì)手術(shù),確保手術(shù)為我們每個(gè)人提供康建議和疾病風(fēng)險(xiǎn)預(yù)警,從而讓我們生活得更加健康。 showImg(https://segmentfault.com/img/remote/1460000015971504); 0 引言 本文是《人工智能基礎(chǔ)(高中版)》的讀書(shū)筆記,這本書(shū)的配圖非...
閱讀 1681·2021-11-23 09:51
閱讀 2691·2021-11-22 09:34
閱讀 1327·2021-10-14 09:43
閱讀 3667·2021-09-08 09:36
閱讀 3213·2019-08-30 12:57
閱讀 2035·2019-08-30 12:44
閱讀 2524·2019-08-29 17:15
閱讀 3020·2019-08-29 16:08