最近看了一下uNet的代码,发现了一些问题,再次记录一下,供大家参考和学习。
1)网上的代码有一些在网络输入位置为inputs=((C,w,h)),但是你在运行的过程中会报一些Tensor的尺寸存在问题的错误,这是因为别人的代码是使用了Channel_first,而你的后端的通道格式是Channel_last,所以会出现尺寸问题,这里请大家注意。怎么改,大家网上搜一下,无非就是,要么你把你的通道文件改成Channel_first的形式,要么你就把代码改了就可以了。
2)有的代码在网络的特征拼接位置和原始的论文不符。
下面是原始代码里的拼接部分。
conv4 = Conv2D(512, (3, 3), activation="relu", padding="same")(pool3)
conv4 = Conv2D(512, (3, 3), activation="relu", padding="same")(conv4)
pool4 = MaxPooling2D(pool_size=(2, 2))(conv4)
conv5 = Conv2D(1024, (3, 3), activation="relu", padding="same")(pool4)
conv5 = Conv2D(1024, (3, 3), activation="relu", padding="same")(conv5)
up6 = UpSampling2D(size(2,2))(conv5)
up6 = concatenate([up6,conv4])
这里将up6和conv4进行特征拼接,最后获得的通道数不是原文中的1024,因为他没有给up6降为到512,
这里拼接的时候是512+512,所以最后一层中的1024需要降维到512,但是论文中没有降维,只给长款做了升采样。
这里我直接给代码改成如下:
conv4 = Conv2D(512, (3, 3), activation="relu", padding="same")(pool3)
conv4 = Conv2D(512, (3, 3), activation="relu", padding="same")(conv4)
pool4 = MaxPooling2D(pool_size=(2, 2))(conv4)
conv5 = Conv2D(1024, (3, 3), activation="relu", padding="same")(pool4)
conv5 = Conv2D(1024, (3, 3), activation="relu", padding="same")(conv5)
up6 = Conv2DTranspose(512, (2, 2), strides=2, padding="same")(conv5)
up6 = concatenate([up6, conv4],axis=3)
这样就符合原文的内容了,这里参数axis也要注意,他是说你要选择那个轴作为拼接轴,如果你是channel_last格式就是axis=3,但是如果你是channel_first那么,axis=1。