我尝试在我的u-net中实现残留块。
执行以下操作:
inputs = Input((IMG_HEIGHT, IMG_WIDTH, IMG_CHANNELS))
s = Lambda(lambda x: x / 255) (inputs)
c1 = layers.Conv2D(8, (3, 3), activation='relu', padding='same') (s)
c1 = layers.Conv2D(8, (3, 3), activation='relu', padding='same') (c1)
res1 = layers.Conv2D(8, kernel_size=(3, 3), strides = (2,2), padding='same')(c1)
res1 = layers.BatchNormalization()(res1)
res1 = layers.LeakyReLU()(res1)
res1 = layers.Conv2D(8, kernel_size=(1, 1), strides=(1, 1), padding='same')(res1)
res1 = layers.BatchNormalization()(res1)
res1 = concatenate([c1, res1])
我想知道自己最后是否可以使用串联。那么,它仍然是一个残余块吗? 但是,从上面运行代码时,我遇到以下错误:
A `Concatenate` layer requires inputs with matching shapes except for
the concat axis. Got inputs shapes: [(None, 224, 224, 8), (None, 112,
112, 8)]
有人可以帮我吗?
答案 0 :(得分:0)
问题是结果的大小不同,这是由计算c1
和res1
时的步幅不同引起的:
res1 = layers.Conv2D(8, kernel_size=(3, 3), strides = (2,2), padding='same')(c1)
^^^^^
如果将其更改为(1,1)
,则这两层将产生相同大小的输出,并且您可以将它们连接起来得到(None, 224, 224, 16)
。
这是否可以,要看情况,但这对我来说并不是一个好主意。