Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 尝试执行转置卷积,但缺少一个像素_Python 3.x_Tensorflow_Keras_Tensor_Deconvolution - Fatal编程技术网

Python 3.x 尝试执行转置卷积,但缺少一个像素

Python 3.x 尝试执行转置卷积,但缺少一个像素,python-3.x,tensorflow,keras,tensor,deconvolution,Python 3.x,Tensorflow,Keras,Tensor,Deconvolution,我从这里为凯拉斯买了这个模型。我似乎得到了一个错误: def get_unet(input_img, n_filters=16, dropout=0.5, batchnorm=True): # contracting path c1 = conv2d_block(input_img, n_filters=n_filters * 1, kernel_size=3, batchnorm=batchnorm) p1 = MaxPooling2D((2, 2))(c1)

我从这里为凯拉斯买了这个模型。我似乎得到了一个错误:

def get_unet(input_img, n_filters=16, dropout=0.5, batchnorm=True):

    # contracting path
    c1 = conv2d_block(input_img, n_filters=n_filters * 1, kernel_size=3, batchnorm=batchnorm)
    p1 = MaxPooling2D((2, 2))(c1)
    p1 = Dropout(dropout * 0.5)(p1)

    c2 = conv2d_block(p1, n_filters=n_filters * 2, kernel_size=3, batchnorm=batchnorm)
    p2 = MaxPooling2D((2, 2))(c2)
    p2 = Dropout(dropout)(p2)

    c3 = conv2d_block(p2, n_filters=n_filters * 4, kernel_size=3, batchnorm=batchnorm)
    p3 = MaxPooling2D((2, 2))(c3)
    p3 = Dropout(dropout)(p3)

    c4 = conv2d_block(p3, n_filters=n_filters * 8, kernel_size=3, batchnorm=batchnorm)
    p4 = MaxPooling2D(pool_size=(2, 2))(c4)
    p4 = Dropout(dropout)(p4)

    c5 = conv2d_block(p4, n_filters=n_filters * 16, kernel_size=3, batchnorm=batchnorm)

    # expansive path
    u6 = Conv2DTranspose(n_filters * 8, (3, 3), strides=(2, 2), padding='same')(c5)
    u6 = concatenate([u6, c4])
    u6 = Dropout(dropout)(u6)
    c6 = conv2d_block(u6, n_filters=n_filters * 8, kernel_size=3, batchnorm=batchnorm)

    u7 = Conv2DTranspose(n_filters * 4, (3, 3), strides=(2, 2), padding='same')(c6)
    u7 = concatenate([u7, c3])
    u7 = Dropout(dropout)(u7)
    c7 = conv2d_block(u7, n_filters=n_filters * 4, kernel_size=3, batchnorm=batchnorm)

    u8 = Conv2DTranspose(n_filters * 2, (3, 3), strides=(2, 2), padding='same')(c7)
    u8 = concatenate([u8, c2])
    u8 = Dropout(dropout)(u8)
    c8 = conv2d_block(u8, n_filters=n_filters * 2, kernel_size=3, batchnorm=batchnorm)

    u9 = Conv2DTranspose(n_filters * 1, (3, 3), strides=(2, 2), padding='same')(c8)
    u9 = concatenate([u9, c1], axis=3)
    u9 = Dropout(dropout)(u9)
    c9 = conv2d_block(u9, n_filters=n_filters * 1, kernel_size=3, batchnorm=batchnorm)

    outputs = Conv2D(1, (1, 1), activation='sigmoid')(c9)
    model = Model(inputs=[input_img], outputs=[outputs])
    return model
所以我打印了每个张量的值,得到:

  File "train.py", line 87, in get_unet
  u8 = concatenate([u8, c2])
ValueError: A `Concatenate` layer requires inputs with matching shapes except for the concat axis. Got inputs shapes: [(None, 256, 184, 32), (None, 256, 185, 32)]
C2
发生了什么?为什么
u8
184的第二维度是,而
C2
的第二维度似乎是185。此外,
C3
s的第二维度似乎从184中最大化了2(可能是由于
floor
功能)


我该如何应对?我是否必须更改输入图像的大小,或者在进行转置卷积时必须设计一些东西?我需要为额外的一个像素执行插值吗

这是因为在C2层中,当你将第二维度除以2时,它不是偶数。
您将185最大化2倍,这将使您获得92.5->下限到92
但当你以另一种方式做这个运算时,你将92的采样率提高了2倍,得到184

为了避免这种情况,您可以简单地将zeropad U8与C2兼容,如下所示:

u8=Conv2DTranspose(n_过滤器*2,(3,3),跨步=(2,2),填充=(相同的))(c7)
u8=零填充2D(填充=((0,0)、(0,1)))(u8)
u8=连接([u8,c2])
如果不想置零,可以重塑输入图像的形状,使其具有与2的幂相对应的维度,或可以被两倍除而不给出奇数的维度,如224(在给出7之前可以被两倍除5次)


希望这对你有帮助

添加零填充后,我得到
ValueError:A
Concatenate`层需要输入匹配的形状,concat轴除外。得到输入形状:[(无,258,186,32),(无,256,185,32)]`仍然做了一些研究,我认为你的答案应该是:
u8=ZeroPadding2D(padding=((0,0),(0,1)))(u8)
是的,这是我的错,我写得太快了,没有想到这会填充你所有的图像。。你只需要获得一个像素,这样就对了。你能不能也讨论一下零填充与图像大小调整(在图像分割方面)相比的优缺点,我会接受你的答案!实际上,在你的例子中,只添加一个0像素对你的图像没有影响,它太小了,所以这是最简单的方法。当zeroppading更大并且开始修改图像的结构时,缺点就会出现。通过调整大小,您可以释放信息,但要保持它的结构,所以它将取决于问题
c1: Tensor("activation_2/Relu:0", shape=(?, 512, 370, 16), dtype=float32)
c2: Tensor("activation_4/Relu:0", shape=(?, 256, 185, 32), dtype=float32)
c3: Tensor("activation_6/Relu:0", shape=(?, 128, 92, 64), dtype=float32)
c4: Tensor("activation_8/Relu:0", shape=(?, 64, 46, 128), dtype=float32)
c5: Tensor("activation_10/Relu:0", shape=(?, 32, 23, 256), dtype=float32)
u6: Tensor("dropout_5/cond/Merge:0", shape=(?, 64, 46, 256), dtype=float32)
u7: Tensor("dropout_6/cond/Merge:0", shape=(?, 128, 92, 128), dtype=float32)
u8: Tensor("conv2d_transpose_3/BiasAdd:0", shape=(?, ?, ?, 32), dtype=float32)