在tensorflow2.0中用tf.keras重写ASPP

我正在尝试使用tensorflow2.0重写DeepLabV3 +中的ASPP,但是全局池存在一些问题。

我用tf.keras建立我的模型。我的模型的框架如下:

def EUnet2():
    inputs = tf.keras.Input(shape=(None,None,args.input_channels))
    pool = encoder(inputs)
    aspp = ASPP(pool[4])
    outputs = decoder(aspp,pool)
    model = tf.keras.Model(inputs,outputs)
    return model

ASPP中的全局池如下:

dims = tf.keras.backend.int_shape(pool[4])[1:3]
pooled = tf.keras.layers.AveragePooling2D(dims)(pool[4])
pooled = tf.keras.layers.Conv2D(256,1,activation='relu')(pooled)
pooled = tf.keras.layers.UpSampling2D(dims)(pooled)

然后,我遇到一个错误。

  

回溯(最近通话最近一次):

     

文件“”,第1行,在       运行文件('/home/kwc/TF2.0.0/building/FCN.py',wdir ='/ home / kwc / TF2.0.0 / building')

     

文件   “ /home/kwc/anaconda3/lib/python3.7/site-packages/spyder_kernels/customize/spydercustomize.py”,   运行文件中的第786行       execfile(文件名,命名空间)

     

文件   “ /home/kwc/anaconda3/lib/python3.7/site-packages/spyder_kernels/customize/spydercustomize.py”,   第110行,在execfile中       exec(compile(f.read(),文件名,'exec'),命名空间)

     

文件“ /home/kwc/TF2.0.0/building/FCN.py”,第26行,在       main_no_valid()

     

文件“ /home/kwc/TF2.0.0/building/FCN.py”,第14行,位于main_no_valid中       型号= net2.EUnet2()

     

EUnet2中的文件“ /home/kwc/TF2.0.0/building/net2.py”,第113行       池= tf.keras.layers.AveragePooling2D(dims)(pool [4])

     

文件   “ /home/kwc/anaconda3/lib/python3.7/site-packages/tensorflow_core/python/keras/layers/pooling.py”,   第378行,在 init 中       padding = padding,data_format = data_format,** kwargs)

     

文件   “ /home/kwc/anaconda3/lib/python3.7/site-packages/tensorflow_core/python/keras/layers/pooling.py”,   第230行,初始化       self.pool_size = conv_utils.normalize_tuple(pool_size,2,'pool_size')

     

文件   “ /home/kwc/anaconda3/lib/python3.7/site-packages/tensorflow_core/python/keras/utils/conv_utils.py”,   第85行,在normalize_tuple中       ''+ str(type(single_value)))

     

ValueError:pool_size参数必须是2个整数的元组。   收到:(无,无),包括元素

类型

我知道问题出在输入中。如果我将inputs = tf.keras.Input(shape=(None,args.input_channels))更改为inputs = tf.keras.Input(shape=(256,256,args.input_channels)),该错误消失了。但是我不想这样做,因为输入形状不是固定的。

在tensorflow 1.13中,它与

一起使用
reduce_mean = tf.keras.layers.Lambda(lambda x: tf.reduce_mean(x,[1,2],keep_dims=True))
upsample_bilinear = tf.keras.layers.Lambda(lambda x:tf.image.resize_bilinear(x,size=tf.shape(pool[4])[1:3]))
pooled = reduce_mean(pool[4])
pooled = tf.keras.layers.Conv2D(channels,activation='relu',kernel_regularizer=regularizers,bias_regularizer=regularizers)(pooled)
pooled = upsample_bilinear(pooled)

但是它不能在TF2.0中使用。而且我在https://github.com/bonlime/keras-deeplab-v3-plus/blob/master/model.py中看到了DeepLabv3 +的重写版本。全局池如下

# Image Feature branch
shape_before = tf.shape(x)
b4 = GlobalAveragePooling2D()(x)
# from (b_size,channels)->(b_size,channels)
b4 = Lambda(lambda x: K.expand_dims(x,1))(b4)
b4 = Lambda(lambda x: K.expand_dims(x,1))(b4)
b4 = Conv2D(256,(1,1),padding='same',use_bias=False,name='image_pooling')(b4)
b4 = BatchNormalization(name='image_pooling_BN',epsilon=1e-5)(b4)
b4 = activation('relu')(b4)
# upsample. have to use compat because of the option align_corners
size_before = tf.keras.backend.int_shape(x)
b4 = Lambda(lambda x: tf.compat.v1.image.resize(x,size_before[1:3],method='bilinear',align_corners=True))(b4)

此实现还需要知道输入形状。

那么,如果我想使用不固定的输入形状,该怎么办?

chinawangsir 回答:在tensorflow2.0中用tf.keras重写ASPP

暂时没有好的解决方案,如果你有好的解决方案,请发邮件至:iooj@foxmail.com
本文链接:https://www.f2er.com/3016541.html

大家都在问