我正在尝试使用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)
此实现还需要知道输入形状。
那么,如果我想使用不固定的输入形状,该怎么办?