U-net在自己電腦上運行踩坑

Unet代碼試運行

研一剛開始,最近要用到FCN的網絡結構,所以決定先跑通Unet代碼,其中發(fā)現(xiàn)了各種各樣的錯誤,踩了超級多的坑。此貼記錄下第一次運行的過程,并且希望后來者能避免一些錯誤。

GitHub代碼下載

GitHub下載地址https://github.com/zhixuhao/unet

解壓壓縮包的內容

data/membrane/train是訓練集;

data/membrane/test是測試集,因為是運行過預測代碼的結果,所以該文件夾里的0_predict是預測出來的結果。

data.py里定義了加載數據的函數,model.py定義了unet模型結構,main.py是主文件訓練并且預測把預測結果保存下來。

試運行

在spyder中打開data.py,運行;

打開model.py,運行;

打開main.py,運行。

出錯及錯誤修正

1

將main.py中#os.environ["CUDA_VISIBLE_DEVICES"] = "0"去掉#

原因可能是因為我的筆記本有集顯和獨顯

2

UserWarning: Update your Model call to the Keras 2 API: Model(inputs=[<tf.Tenso..., outputs=[<tf.Tenso...) model = Model(output = [conv10],inputs = [input_s])

原因是我電腦上裝的keras版本是2.0,源代碼是早期的版本,將model.py中的

model = Model(input = input_s,output = conv10)改為

model = Model(output = [conv10],inputs = [input_s])

3

此時還有一個錯誤merge will be removed after 2017/03大概是這樣具體忘記了,這出錯誤是因為keras2.0中修改了API,解決方法是在model.py中將

merge6 = merge([drop4,up6], mode = 'concat', concat_axis = 3)改為

merge6 = concatenate([drop4,up6],axis = 3),同理將代碼中的所有merge的格式改寫。

保存,再次運行model.py.

4

運行main.py,再次報錯如下

OSError: broken data stream when reading image file

修正這個錯誤,在data.py中

最開頭導入包的位置加上

from PIL import Image,ImageFile``ImageFile.LOAD_TRUNCATED_IMAGES=True

在我的電腦上只發(fā)生了這幾處錯誤,再次運行main.py就開始訓練過程了。

運行

在訓練的過程中,訓練了幾輪后,loss在0.5左右,acc在0.7左右,以很慢的速度下降,訓練了239/300的時候

239/300 [======================>.......] - ETA: 777s - loss: 0.3776 - acc: 0.8164

249/300 [=======================>......] - ETA: 649s - loss: 0.3752 - acc: 0.8185

269/300 [==========================>...] - ETA: 368s - loss: 0.3702 - acc: 0.8227

279/300 [==========================>...] - ETA: 266s - loss: 0.3686 - acc: 0.8240

289/300 [===========================>..] - ETA: 139s - loss: 0.3663 - acc: 0.8261

299/300 [============================>.] - ETA: 12s - loss: 0.3638 - acc: 0.8280

在預測的過程中

1/30 [===============>.....]

12/30 [===============>.....]

20/30 [===============>.....]運行正常

21/30 [===============>.....]出現(xiàn)了錯誤如下

exception in thread Thread-63

意思是內存溢出,應該是我的內存太小只能放下預測出的20張預測結果的數據,第21張放不下了。

修改main.py文件中的results = model.predict_generator(testGene,30,verbose=1),將30改為20。

運行成功,保存成功。

代碼解析

詳解main.py中的代碼

os.environ["CUDA_VISIBLE_DEVICES"] = "0"

調用英偉達獨顯,我的電腦有集顯和獨顯兩塊顯卡。

訓練部分

data_gen_args = dict(rotation_range=0.2, width_shift_range=0.05, height_shift_range=0.05, shear_range=0.05, zoom_range=0.05, horizontal_flip=True, fill_mode='nearest')

不知道什么意思。

myGene = trainGenerator(2,'data/membrane/train','image','label',data_gen_args,save_to_dir = None)

myGene是訓練數據,'data/membrane/train'文件夾下,image文件夾存放訓練圖片,label文件夾存放訓練圖片的標簽(也是圖片形式),本示例中的圖片形式都是.png

model = unet()載入模型結構

model_checkpoint = ModelCheckpoint('unet_membrane.hdf5', monitor='loss',verbose=1, save_best_only=True)

這一行是載入他人訓練得到的模型及權重,這是keras的斷點訓練屬性,unet_membrane.hdf5是他人保存的模型及權重,他人用model.save('unet_membrane.hdf5')保存得到該文件。

model.fit_generator(myGene,steps_per_epoch=300,epochs=1,callbacks=[model_checkpoint])

將訓練集放到載入預權重的模型訓練,steps_per_epoch=300表示一共分為300份,epochs=1表示一次訓練1份。

預測部分

testGene = testGenerator("data/membrane/test")讀入測試集原始圖像。

results = model.predict_generator(testGene,20,verbose=1) 使用模型預測,在test文件夾中有編號0--29的30張圖像,代碼中20的意思是預測0--19這20張圖像。

saveResult("data/membrane/test",results) 將結果保存到data/membrane/test路徑中。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容