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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

TensorFlow系列专题(十四): 手把手带你搭建卷积神经网络实现冰山图像分类

發布時間:2023/12/13 综合教程 30 生活家
生活随笔 收集整理的這篇文章主要介紹了 TensorFlow系列专题(十四): 手把手带你搭建卷积神经网络实现冰山图像分类 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄:

冰山圖片識別背景

數據介紹

數據預處理

模型搭建

結果分析

總結

一、冰山圖片識別背景

這里我們要解決的任務是來自于Kaggle上的一道賽題(https://www.kaggle.com/c/statoil-iceberg-classifier-challenge),簡單介紹一下賽題的背景:在加拿大的東海岸經常會有漂流的冰山,這對航行在該海域的船舶造成了很大的威脅。挪威國家石油公司(Statoil)是一家在全球運營的國際能源公司,該公司曾與C-CORE等公司合作,C-CORE基于其衛星數據和計算機視覺技術建立了一個監控系統。Statoil發布該賽題的目的是希望利用機器學習的技術,更準確的及早發現和識別出威脅船舶航行的冰山。

二、數據介紹

賽題提供了兩個數據文件“train.json”和“test.json”,其中“test.json”是比賽中用來對模型驚醒評分的,沒有類標,這里我們只需要使用“train.json”文件。該數據集中有1604個打標過的訓練數據,單個樣本的數據格式如下:

字段名

字段說明

id

圖像的id。

band_1,band_2

衛星圖像數據,band_1和band_2是以特定入射角下不同極化方式產生的雷達后向散射為特征的信號,分別對應HH(水平發射/水平接收)和HV(水平發射/垂直接收)兩種極化方式的數據,其大小均為。

inc_angle

獲得該數據時的入射角度。該字段部分缺少數據,標記為“na”。

is_iceberg

類標,0:船只,1:冰山。

我們將數據可視化后進行觀察,如圖1所示。圖像上方是冰山圖像的可視化效果,三幅圖分別對應“HH”計劃方式、“HV”計劃方式以及兩者結合后的數據。圖像下方是船只圖像的可視化效果。

圖1訓練數據可視化效果

圖1中的冰山和船只,通過觀察可以較為容易的區分出來,但是還有很多如圖2所示的數據,即使仔細觀察也很難區分開來。

圖2 訓練數據可視化效果

三、數據預處理

首先我們導入需要的包:

接下來我們定義一個數據預處理的函數:

“data_preprocess”函數接受兩個參數,“path”為訓練數據“train.json”的文件路徑,“more_data”為布爾類型,當其為“true”時,會調用函數“create_more_data”進行訓練數據的擴充(即數據增強)。

第11行到第17行代碼中,我們對樣本數據進行了處理,除了原有的“band_1”和“band_2”,我們增加了“band_3”,band_3=band_1+band_2。最后我們使用numpy的“dstack”將三種數據進行堆疊,因此我們單個樣本的數據維度為75x75x3。

第20行代碼是調用“create_more_data”函數對訓練數據進行擴充,第26行代碼是對訓練集的類標數據進行擴充,因為“create_more_data”函數將訓練數據擴充為了原來的6倍,因此這里對應的也要將類標擴充為原來的6倍。

“create_more_data”函數的實現如下:

在“create_more_data”函數中我們通過對圖像進行旋轉和翻轉來擴充數據集,雖然旋轉前后的圖像是同一張,但是由于特征的位置發生了變化,因此對于模型來說就是不同的數據,旋轉或翻轉操作是擴充圖像數據集的一個簡單有效的方法。在31至35行代碼中,我們定義了5個列表,用來保存擴充的數據集,對應的操作分別是逆時針旋轉90度、逆時針旋轉180度、逆時針旋轉270度、左右翻轉和上下翻轉。具體實現如下:

上面的代碼中,我們使用numpy的“rot90”和“flip”函數對圖像進行旋轉和翻轉操作。“flip”函數的第二個參數控制翻轉的方式,“0”為左右翻轉,“1”為上下翻轉。第78行代碼中,使用numpy的“concatenate”函數將擴充的數據預原數據進行拼接。

四、模型搭建

接下來我們實現模型部分,這里我們使用TensorFlow的高級API來搭建網絡。

在84行代碼中,我們使用“tf.keras.Sequential()”創建一個序貫模型,序貫模型是多個網絡層的線性堆疊,我們使用“tf.keras.Sequential().add()”方法逐層添加網絡結構。第87到90行代碼是第一個卷積塊,這里的卷積層我們使用了128個大小為3x3的卷積核,使用了relu激活函數。在卷積層后面是一個池化層,采用最大池化,池化窗口的大小為3x3,橫向和縱向的步長都為2。在池化層的后面我們使用了Dropout,丟棄了20%的神經元,防止參數過多導致過擬合。接下來是三個類似的卷積塊。

在第109行代碼中,我們使用“Flatten()”將前一層網絡的輸出轉換為了一維的數據,這是為了接下來的全連接操作。第112行代碼是第一個全連接層,有256個神經元,全連接層后面接relu激活函數,同樣使用了Dropout。第117至119是類似的一個全連接部分。

由于是二分類問題,在122行代碼中我們使用了一個只有一個神經元的全連接層,并使用了Sigmoid激活函數,得到最終的輸出。

第126至128行使用“compile”編譯模型,其中“loss='binary_crossentropy'”指明使用的是對數損失函數,通過“optimizer”參數設置使用Adam優化器,學習率設置為0.0001。“metrics” 列表包含評估模型在訓練和測試時的性能的指標,我們設置了“metrics=['accuracy']”,則在訓練的過程中,訓練集和驗證集上的準確率都會打印出來。

第130行使用了“summary()”函數,訓練開始后終端會打印出模型的概況信息,如圖3所示,其中包含了網絡的結構,以及每層的參數數量等信息。其中最后一行顯示我們總的訓練數據為7699條,驗證集的數據量為1925條。

圖3 模型的概況信息

五、結果分析

接下來我們讀取數據,并訓練模型:

第134行代碼中我們調用“data_preprocess”函數獲取預處理后的訓練數據,設置“more_data”為“true”進行數據擴充。第140行代碼中,我們調用“fit”方法開始模型的訓練,通過“batch_size”設置每個批次訓練25條數據,通過“epochs”設置訓練的總回合數為“100”。通過設置“verbose”為1,在終端上顯示訓練的進度。通過設置“validation_split”為0.2,將訓練集一分為二,其中80%作為訓練集,20%作為驗證集。

模型的訓練過程和結果如圖4所示:

圖4 模型的訓練過程和結果

六、總結

在前面幾節內容里我們介紹了卷積神經網絡的基本結構和原理,在這一節里我們使用TensorFlow搭建了一個簡單的卷積神經網絡,實現圖像分類的任務。

通過前幾章的學習,我們深入理解了CNN中卷積,池化等典型結構的原理,以及CNN實際相關的圖片識別比賽。相信大家對于CNN會有更深層次的認識。后邊會接著這里開始介紹運用CNN技術來預測的典型3個項目。

歡迎關注磐創博客資源匯總站:
http://docs.panchuang.net/

歡迎關注PyTorch官方中文教程站:
http://pytorch.panchuang.net/

總結

以上是生活随笔為你收集整理的TensorFlow系列专题(十四): 手把手带你搭建卷积神经网络实现冰山图像分类的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。