U-NET中每个Conv2D层上的输入大小和过滤器数量之间的关系

范思法兰

我有这个U-NET实现:

import numpy as np 
import os
import skimage.io as io
import skimage.transform as trans
import numpy as np
import tensorflow as tf
from tensorflow.python.keras.models import *
from tensorflow.python.keras.layers import *
from tensorflow.python.keras.optimizers import *
from tensorflow.python.keras.callbacks import ModelCheckpoint, LearningRateScheduler
from tensorflow.python.keras import backend as keras

def unet(pretrained_weights = None,input_size = (240, 240, 1)):
    inputs = Input(input_size)
    conv1 = Conv2D(64, 3, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(inputs)
    conv1 = Conv2D(64, 3, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(conv1)
    pool1 = MaxPooling2D(pool_size=(2, 2))(conv1)
    conv2 = Conv2D(128, 3, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(pool1)
    conv2 = Conv2D(128, 3, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(conv2)
    pool2 = MaxPooling2D(pool_size=(2, 2))(conv2)
    conv3 = Conv2D(256, 3, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(pool2)
    conv3 = Conv2D(256, 3, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(conv3)
    pool3 = MaxPooling2D(pool_size=(2, 2))(conv3)
    conv4 = Conv2D(512, 3, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(pool3)
    conv4 = Conv2D(512, 3, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(conv4)
    drop4 = Dropout(0.5)(conv4)
    pool4 = MaxPooling2D(pool_size=(2, 2))(drop4)

    conv5 = Conv2D(1024, 3, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(pool4)
    conv5 = Conv2D(1024, 3, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(conv5)
    drop5 = Dropout(0.5)(conv5)

    up6 = Conv2D(512, 2, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(UpSampling2D(size = (2,2))(drop5))
    merge6 = concatenate([drop4,up6], axis = 3)
    conv6 = Conv2D(512, 3, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(merge6)
    conv6 = Conv2D(512, 3, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(conv6)

    up7 = Conv2D(256, 2, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(UpSampling2D(size = (2,2))(conv6))
    merge7 = concatenate([conv3,up7], axis = 3)
    conv7 = Conv2D(256, 3, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(merge7)
    conv7 = Conv2D(256, 3, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(conv7)

    up8 = Conv2D(128, 2, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(UpSampling2D(size = (2,2))(conv7))
    merge8 = concatenate([conv2,up8], axis = 3)
    conv8 = Conv2D(128, 3, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(merge8)
    conv8 = Conv2D(128, 3, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(conv8)

    up9 = Conv2D(64, 2, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(UpSampling2D(size = (2,2))(conv8))
    merge9 = concatenate([conv1,up9], axis = 3)
    conv9 = Conv2D(64, 3, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(merge9)
    conv9 = Conv2D(64, 3, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(conv9)
    conv9 = Conv2D(2, 3, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(conv9)
    conv10 = Conv2D(1, 1, activation = 'sigmoid')(conv9)

    model = Model(inputs = inputs, outputs = conv10)

    model.compile(tf.keras.optimizers.Adam(lr = 1e-4), loss = 'binary_crossentropy', metrics = ['accuracy'])

    #model.summary()

    if(pretrained_weights):
        model.load_weights(pretrained_weights)

    return model

当我将其input_size参数更改(200, 200, 1)它失败时,出现以下错误:

A `Concatenate` layer requires inputs with matching shapes except for the concat axis. Got inputs shapes: [(None, 25, 25, 512), (None, 24, 24, 512)]

在这一行:

merge6 = concatenate([drop4,up6], axis = 3)

我认为问题与Conv2D图层中过滤器的大小有关

input_size在所有Conv2D图层中和过滤器大小之间是否存在任何关系

如果有任何关系,我可以解决我的问题。

马克·斯奈德

问题是与之间的相互作用MaxPooling2DUpSampling2D层,实际上。使用input_sizeof时(200, 200, 1),图层输出的边长从200-> 100-> 50-> 25->开始12,因为MaxPooling2D将尺寸向下舍入。使用时UpSampling2D(size = (2,2)),它只会将尺寸加倍并发送12-> 24,与兼容25

您需要做的是使用一个上采样层,该层将上采样到特定的形状,而不是按特定的因子。我这样做的方式是包裹tf.image.resizeLambda一层。

my_upsampling_layer = Lambda(lambda image: tf.image.resize(image,...
    tf.convert_to_tensor(enc_layer.shape[1:3])),output_shape=list(enc_layer.shape[1:]))

enc_layer 将是U形下坡上的相应图层,因为在上U形时需要匹配其大小。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么Conv2D在每一层中都有不同数量的过滤器

来自分类Dev

元素中的“ u”属性

来自分类Dev

在 Rust 中在 extprim::u128::u128 和原始 u128 之间转换?

来自分类Dev

使用`sort -u`和`sort |之间的区别 uniq -u`

来自分类Dev

如何将成功的Iterable [Try [U]]过滤器转换为Iterable [U]?

来自分类Dev

Neo4j errorMessages':{'无效的输入\'a \':预期的\'u / U \'}

来自分类Dev

Action <T,U>和'T->'U->单位转换

来自分类Dev

奇怪的\ U0000202a和\ U0000202c字符?

来自分类Dev

shell脚本:`set -u`和`$ *`

来自分类Dev

用Java字符串中的\ u替换\\ u

来自分类Dev

变量声明中的U后缀

来自分类Dev

在POSTMAN中添加Curl -u

来自分类Dev

从webscrape输出中删除'u

来自分类Dev

在json列表中删除u'

来自分类Dev

u8,u和U字符串文字背后的推理

来自分类Dev

给定“ T”和“ U”,其中“ T扩展了U”,如何返回“ U”

来自分类Dev

python中的U8,U16,U32表示形式

来自分类Dev

Tensorflow Keras Conv2D多个过滤器

来自分类Dev

u'string'和unicode(string)之间的区别

来自分类Dev

sudo -u和su -c之间的区别

来自分类Dev

C 編程 - 2U 和 1024U 的大小

来自分类Dev

git pull U,A和D标签:含义?

来自分类Dev

U和V在getU()中的含义

来自分类Dev

在Java2中正确转换\ u000D \ u000A

来自分类Dev

在Java2中正确转换\ u000D \ u000A

来自分类Dev

mknod中的u和c之间有区别吗

来自分类Dev

std :: string和std :: u16string(或u32string)之间的区别

来自分类Dev

u8,uint8_t,__ u8和__be8之间的区别

来自分类Dev

std :: string和std :: u16string(或u32string)之间的区别