Я создаю unet для сегментации изображения - создаю наземные истины для зданий на аэрофотоснимке изображения города ((5000,5000,3), которое я уменьшил до (4992,4992,3), чтобы учесть более одногосэмплирование), и мой вывод - либо почти полностью пустое изображение, либо кадр случайного шума (в зависимости от того, как я изменяю количество слоев), но никогда не дает правильного решения
общие исправления, которые я вижу, гарантируют пикселинормализованы (они есть) и уменьшают слои - оба из которых не получили меня, где
мой unet определен как
def Unet():
input = keras.layers.Input((4992, 4992, 3))
p0 = input
c1,p1 = down_conv(p0,1)
c2,p2 = down_conv(p1,2)
c3,p3 = down_conv(p2,4)
c4,p4 = down_conv(p3,8)
bn = bottleneck(p4,16)
u1 = up_conv(bn,c4,8)
u2 = up_conv(u1,c3,4)
u3 = up_conv(u2,c2,2)
u4 = up_conv(u3,c1,1)
out = keras.layers.Conv2D(1,(1,1), padding = "same", activation = "sigmoid")(u4)
model = keras.models.Model(input,out)
return model
с функциями
def down_conv(x,filters,kernel_size=(3,3), padding = "same",strides = 1):
x = keras.layers.Conv2D(filters,kernel_size,padding=padding,strides=strides,activation="relu")(x)
x = keras.layers.Conv2D(filters,kernel_size,padding=padding,strides=strides,activation="relu")(x)
p = keras.layers.MaxPool2D((2,2),(2,2))(x)
return x,p
def up_conv(x,skip,filters,kernel_size=(3,3),padding = "same",strides = 1):
x = keras.layers.UpSampling2D((2,2))(x)
x = keras.layers.Concatenate()([x,skip])
x = keras.layers.Conv2D(filters,kernel_size,padding=padding,strides=strides,activation="relu")(x)
x = keras.layers.Conv2D(filters,kernel_size,padding=padding,strides=strides,activation="relu")(x)
return x
def bottleneck(x,filters,kernel_size=(3,3), padding = "same",strides = 1):
x = keras.layers.Conv2D(filters,kernel_size,padding=padding,strides=strides,activation="relu")(x)
x = keras.layers.Conv2D(filters,kernel_size,padding=padding,strides=strides,activation="relu")(x)
return x