Tensorflow 在Keras中按十进制因子进行上采样

Tensorflow 在Keras中按十进制因子进行上采样,tensorflow,deep-learning,keras,keras-layer,unet,Tensorflow,Deep Learning,Keras,Keras Layer,Unet,我想在keras中使用一个上采样2D层,以便将图像大小增加一个小数因子(在本例中,从[213213]增加到[640640640])。该层按预期进行编译,但当我想在真实图像上进行训练或预测时,它们只会按与输入因子最接近的整数进行上采样。有什么想法吗?详情如下: 网络: mp_size = (3,3) inputs = Input(input_data.shape[1:]) lay1 = Conv2D(32, (3,3), strides=(1,1), activation='relu', pad

我想在keras中使用一个上采样2D层,以便将图像大小增加一个小数因子(在本例中,从[213213]增加到[640640640])。该层按预期进行编译,但当我想在真实图像上进行训练或预测时,它们只会按与输入因子最接近的整数进行上采样。有什么想法吗?详情如下:

网络:

mp_size = (3,3)
inputs = Input(input_data.shape[1:]) 
lay1 = Conv2D(32, (3,3), strides=(1,1), activation='relu', padding='same', kernel_initializer='glorot_normal')(inputs)
lay2 = MaxPooling2D(pool_size=mp_size)(lay1)
lay3 = Conv2D(32, (3,3), strides=(1,1), activation='relu', padding='same', kernel_initializer='glorot_normal')(lay2)
size1=lay3.get_shape()[1:3]
size2=lay1.get_shape()[1:3]
us_size = size2[0].value/size1[0].value, size2[1].value/size1[1].value
lay4 = Concatenate(axis=-1)([UpSampling2D(size=us_size)(lay3),lay1])
lay5 = Conv2D(1, (1, 1), strides=(1,1), activation='sigmoid')(lay4)
model = Model(inputs=inputs, outputs=lay5)
使用
model.summary()时的网络摘要

培训网络时出错:

InvalidArgumentError: ConcatOp : Dimensions of inputs should match: shape[0] = [1,639,639,32] vs. shape[1] = [1,640,640,32]
     [[Node: concatenate_14/concat = ConcatV2[N=2, T=DT_FLOAT, Tidx=DT_INT32, _device="/job:localhost/replica:0/task:0/cpu:0"](up_sampling2d_14/ResizeNearestNeighbor, conv2d_58/Relu, concatenate_14/concat/axis)]]

可使用以下代码解决此问题:

from keras.layers import UpSampling2D
from keras.utils.generic_utils import transpose_shape
class UpSamplingUnet(UpSampling2D):
    def compute_output_shape(self, input_shape):
        size_all_dims = (1,) + self.size + (1,)
        spatial_axes = list(range(1, 1 + self.rank))
        size_all_dims = transpose_shape(size_all_dims,
                                        self.data_format,
                                        spatial_axes)
        output_shape = list(input_shape)
        for dim in range(len(output_shape)):
            if output_shape[dim] is not None:
                output_shape[dim] *= size_all_dims[dim]
                output_shape[dim]=int(output_shape[dim])
        return tuple(output_shape)
然后将
UpSampling2D(size=us\u size)
更改为
UpSamplingUnet(size=us\u size)

from keras.layers import UpSampling2D
from keras.utils.generic_utils import transpose_shape
class UpSamplingUnet(UpSampling2D):
    def compute_output_shape(self, input_shape):
        size_all_dims = (1,) + self.size + (1,)
        spatial_axes = list(range(1, 1 + self.rank))
        size_all_dims = transpose_shape(size_all_dims,
                                        self.data_format,
                                        spatial_axes)
        output_shape = list(input_shape)
        for dim in range(len(output_shape)):
            if output_shape[dim] is not None:
                output_shape[dim] *= size_all_dims[dim]
                output_shape[dim]=int(output_shape[dim])
        return tuple(output_shape)