Keras Unet上采样块执行时间:TransposeConv vs.Upsample+;Conv2d

Keras Unet上采样块执行时间:TransposeConv vs.Upsample+;Conv2d,keras,convolution,unity3d-unet,semantic-segmentation,Keras,Convolution,Unity3d Unet,Semantic Segmentation,我正在尝试在keras中使用unet实现一个二进制分割模型。以下是我的网络的上采样块 在一个模型中,我使用正常的转置卷积,而在第二个模型中,我使用调整双线性+conv2d的大小 # Convolution block with Transpose Convolution def deconv_block(tensor, nfilters, size=3, padding='same', kernel_initializer = 'he_normal'): y = Conv2DTrans

我正在尝试在keras中使用unet实现一个二进制分割模型。以下是我的网络的上采样块

在一个模型中,我使用正常的转置卷积,而在第二个模型中,我使用调整双线性+conv2d的大小

# Convolution block with Transpose Convolution
def deconv_block(tensor, nfilters, size=3, padding='same', kernel_initializer = 'he_normal'):

    y = Conv2DTranspose(filters=nfilters, kernel_size=size, strides=2, padding = padding, kernel_initializer = kernel_initializer)(tensor)
    y = BatchNormalization()(y)
    y = Dropout(0.5)(y)
    y = Activation("relu")(y)


    return y

# Convolution block with Upsampling+Conv2D
def deconv_block_rez(tensor, nfilters, size=3, padding='same', kernel_initializer = 'he_normal'):
    y = UpSampling2D(size = (2,2),interpolation='bilinear')(tensor)
    y = Conv2D(filters=nfilters, kernel_size=(size,size), padding = 'same', kernel_initializer = kernel_initializer)(y)
    y = BatchNormalization()(y)
    y = Dropout(0.5)(y)
    y = Activation("relu")(y)


    return y
它们在质量和执行时间方面是否相等? 从质量上看,它们几乎相同(我使用128*128输入);但就执行时间而言,它们是不同的。我在一篇博客中读到,upsampling+conv2d不会遇到棋盘工件的问题;但这是以牺牲执行时间为代价的吗

这是我的网络中的一个典型区块

上采样:-

上采样2D(上采样2D)(无、16、16、800)0
连接_1[0][0]
__________________________________________________________________________________________________批次规格化2(Conv2D)(无、16、16、256)1843456
向上采样2D_2[0][0]
__________________________________________________________________________________________________辍学2(辍学)(无、16、16、256)0
批量标准化\u 2[0][0]
__________________________________________________________________________________________________激活2(激活)(无、16、16、256)0
辍学2[0][0]

转置conv:-

conv2d_转置_2(Conv2DTrans(None,16,16,256)1843456
连接_1[0][0]
__________________________________________________________________________________________________批处理规范化(BatchNor(None,16,16,256)1024
conv2d_转置_2[0][0]
__________________________________________________________________________________________________辍学2(辍学)(无、16、16、256)0
批量标准化\u 2[0][0]
__________________________________________________________________________________________________激活2(激活)(无、16、16、256)0
辍学2[0][0]

即使它们具有几乎相同的参数;upsample+conv2d的块有更多的执行时间(调整双线性所需的时间可以忽略不计),即conv vs.transpose conv=>154ms vs.35ms)

显然,conv2d在resize+normal conv块中有跨步1,而transpose conv有跨步2;但两者都使用3x3内核。最近,人们开始使用resize+conv块而不是普通的转置卷积

这种速度差异是否总是会发生,或者我们是否可以使用upsample+conv2d的任何变体(例如,步长2或内核1x1),以使执行时间相同(质量也不应该降低),或者这是我的代码中的任何错误