概述
本人做深度学习图像分割,想把任意大小的三维图像不crop直接输入神经网络中,我采用的是3D-Unet,这里以512*512*295为例,只有第三维为奇数,若其它维度出现奇数,同理。
在下采样时,295/2 = 142 ,上采样回去时若不进行处理,则142*2 = 294 不能复原,有以下两种方法可解决这个问题。
一、反卷积(transpose)
# 在contact之前需要判断两个向量的维度是否一致 if(deconv1_1.get_shape() != conv4_2.get_shape()): print("解卷积...") filter = deconv1_1.get_shape()[4] deconv1_1 = conv3d_transpose(input=deconv1_1, filter=filter, kernel_size=[1, 1, 2], stride=1, name='deconv1_1_1') concat_1 = tf.concat([deconv1_1, conv4_2], axis=concat_dim, name='concat_1') print("concat " ,concat_1)
其中conv3d_transpose函数如下:
def conv3d_transpose(input,filter,kernel_size,stride, name): with tf.variable_scope(name): conv = tf.layers.conv3d_transpose(inputs=input,filters=filter, kernel_size=kernel_size, strides=stride,padding='valid',data_format='channels_last') return conv
关于 tf.layers.conv3d_transpose的具体用法可以去查tensorflow的官方API,这里不再详细解释。
至此,问题完美解决!
But...在计算损失函数的时候,我用的是边缘联合损失函数,也就是辅助损失函数,如下所示:
# ========= dice loss self.main_dice_loss = self.dice_loss_fun(self.pred_prob, self.input_gt) # auxiliary loss self.aux0_dice_loss = self.dice_loss_fun(self.aux0_prob, self.input_gt) self.aux1_dice_loss = self.dice_loss_fun(self.aux1_prob, self.input_gt) self.aux2_dice_loss = self.dice_loss_fun(self.aux2_prob, self.input_gt) self.total_dice_loss = self.main_dice_loss + 0.2 * self.aux0_dice_loss + 0.4 * self.aux1_dice_loss + 0.8 * self.aux2_dice_loss # ========= class-weighted cross-entropy loss self.main_wght_loss = self.softmax_weighted_loss(self.pred_prob, self.input_gt) self.aux0_wght_loss = self.softmax_weighted_loss(self.aux0_prob, self.input_gt) self.aux1_wght_loss = self.softmax_weighted_loss(self.aux1_prob, self.input_gt) self.aux2_wght_loss = self.softmax_weighted_loss(self.aux2_prob, self.input_gt) self.total_wght_loss = self.main_wght_loss + 0.3 * self.aux0_wght_loss + 0.6 * self.aux1_wght_loss + 0.9 * self.aux2_wght_loss
这样一来就要求 self.aux0_prob这些解卷积后需要完全与输入维度匹配,这时,难道要再用一次解卷积吗?内心崩溃,于是干脆换了一种思路——在一开始下采样时就将奇数维度padding成偶数,就不存在这个问题了。
二、padding
这个思路来源于FCN的源码,GitHub:https://github.com/luogongning/acdc_segmenter/blob/master/model_zoo.py
# 在一开始就把奇数处理成偶数 height, width, depth = inputI.shape inputI_padded = tf.pad(inputI, [[0, 0], [0, 0], [0, 0], [depth, depth], [0, 0]], 'CONSTANT')
上述两种方法亲测有效,解决了我的问题,望对读者也有所帮助!
最后
以上就是诚心小蝴蝶为你收集整理的两种方式处理上下采样维度不匹配的问题的全部内容,希望文章能够帮你解决两种方式处理上下采样维度不匹配的问题所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复