研一刚开始,最近要用到FCN的网络结构,所以决定先跑通Unet代码,其中发现了各种各样的错误,踩了超级多的坑。此贴记录下第一次运行的过程,并且希望后来者能避免一些错误。
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,运行。
将main.py中#os.environ["CUDA_VISIBLE_DEVICES"] = "0"
去掉#
原因可能是因为我的笔记本有集显和独显
UserWarning: Update your Model call to the Keras 2 API: Model(inputs=[
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])
此时还有一个错误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.
运行main.py,再次报错如下
OSError: broken data stream when reading image file
修正这个错误,在data.py中
最开头导入包的位置加上
from PIL import Image,ImageFile
ImageFile.LOAD_TRUNCATED_IMAGES=True
在我的电脑上只发生了这几处错误,再次运行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 [===============>.....]
出现了错误如下
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
路径中。