Unet代码试运行

研一刚开始,最近要用到FCN的网络结构,所以决定先跑通Unet代码,其中发现了各种各样的错误,踩了超级多的坑。此贴记录下第一次运行的过程,并且希望后来者能避免一些错误。

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,ImageFileImageFile.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路径中。

  • 7
    点赞
  • 94
    收藏
    觉得还不错? 一键收藏
  • 27
    评论
这里提供一个简单的UNet代码示例,用于图像分割任务: ```python import torch import torch.nn as nn import torch.nn.functional as F class DoubleConv(nn.Module): def __init__(self, in_channels, out_channels): super(DoubleConv, self).__init__() self.conv = nn.Sequential( nn.Conv2d(in_channels, out_channels, 3, padding=1), nn.BatchNorm2d(out_channels), nn.ReLU(inplace=True), nn.Conv2d(out_channels, out_channels, 3, padding=1), nn.BatchNorm2d(out_channels), nn.ReLU(inplace=True) ) def forward(self, x): return self.conv(x) class UNet(nn.Module): def __init__(self, in_channels=3, out_channels=1, features=[64, 128, 256, 512]): super(UNet, self).__init__() self.ups = nn.ModuleList() self.downs = nn.ModuleList() self.pool = nn.MaxPool2d(kernel_size=2, stride=2) # Down part of UNet for feature in features: self.downs.append(DoubleConv(in_channels, feature)) in_channels = feature # Up part of UNet for feature in reversed(features): self.ups.append(nn.ConvTranspose2d(feature*2, feature, kernel_size=2, stride=2)) self.ups.append(DoubleConv(feature*2, feature)) self.bottleneck = DoubleConv(features[-1], features[-1]*2) self.final_conv = nn.Conv2d(features[0], out_channels, kernel_size=1) def forward(self, x): skip_connections = [] for down in self.downs: x = down(x) skip_connections.append(x) x = self.pool(x) x = self.bottleneck(x) skip_connections = skip_connections[::-1] for idx in range(0, len(self.ups), 2): x = self.ups[idx](x) skip_connection = skip_connections[idx//2] if x.shape != skip_connection.shape: x = F.interpolate(x, size=skip_connection.shape[2:], mode='bilinear', align_corners=True) concat_skip = torch.cat((skip_connection, x), dim=1) x = self.ups[idx+1](concat_skip) return self.final_conv(x) ``` 这里的代码实现了一个简单的UNet模型,其中包含了双卷积层和上采样层,用于图像分割任务。在构建模型时,可以根据任务需要自行修改输入、输出通道数以及特征层数组`features`。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 27
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值