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路徑中。