Карта результатов сегментации моего изображения содержит черную решетку в белом пятне

введите описание изображения здесьЯ выполняю сегментацию изображения с помощью UNet-подобной архитектуры CNN с помощью Pytorch 0.4.0. Он помечает передний план как 1, а фон как 0 в конечном результате сегментации. Я использую предварительный -тренированный экстрактор признаков VGG в качестве моего кодировщика, поэтому мне нужно много раз повышать дискретизацию вывода кодировщика. Но результат показывает странную решетчатую часть в результате, например: /LBvH7.jpg" alt="">

I suspect these different shape of black parttern were caused by the deconvolutional layers.It's said that deconv layer add (s-1) zeros between the input pixel in the official documentation.the deconvolutional layer's hyperparameter are listed below:

kernel_size=3,шаг=2,заполнение=1,output_padding=1

(the output_padding is used to fit the skip connection feature size, for instance, with a input size 40*30,I want it size enlarge twice in one deconvolutional layer,under my calculation with the formula:out=s(in-1)+k-2p,I must use padding 1 and output-padding 1 to keep size,or there might be other better choice I don’t know.)

Меня интересует причина, по которой создается черная решетка. Они выглядят как сетка или квадратная часть. И как это решить. Кроме того, мне нужно настроить все гиперпараметры слоя деконвации на одну униформу или изменить их отдельно?

среда:Ubuntu 16.04,Pytorch 0.4.0,GTX 1080Ti,архитектура апсэмплинга это три слоя деконв,они идут друг за другом.

Обновлять

после того, как я изменил гиперпараметр deconv (вдохновленный шумом в результате сегментации изображения, используйте

kernel_size=4,шаг=2,заполнение=1

таким образом, чтобы избежать заполнения вывода и удовлетворить размер. Но после 100 эпох я столкнулся с аналогичной проблемой. src="https://i.stack.imgur.com/nyvIU.jpg" alt="">

после еще 30-этапного обучения это выглядит так: введите описание изображения здесь

the black points just scattered,It seems these black points just change their parttern and jump into another parttern,I don't know why it occurs.I'm don't know how to modify my network hyperparameter.
self.conv1=Basic(1024,512,kernel_size=3,stride=1,padding=1)
        self.conv2=Basic(512,512,kernel_size=3,stride=1,padding=1)
        self.deconv1=Basic(512,256,kernel_size=4,stride=2,conv=False,padding=1)
        self.deconv2=Basic(256,128,kernel_size=4,stride=2,conv=False,padding=1)
        self.deconv3=Basic(128,64,kernel_size=4,stride=2,conv=False,padding=1)
        #output  480*640 segmap
        self.conv4=Basic(64,2,kernel_size=1,stride=1)
        # self.avgpool=nn.AvgPool2d(kernel_size=2,stride=2)

    def forward(self, input):
        input=self.conv1(input)
        input=self.conv2(input)
        input=self.deconv1(input)
        input=self.deconv2(input)
        input=self.deconv3(input)
        input=self.conv4(input)
        # print(input.shape)
        #a channel-wise probability map
        raw=input
        return raw`

person Kevin    schedule 03.07.2018    source источник
comment
Применяете ли вы какую-либо операцию после последнего слоя сети? Можем ли мы увидеть код?   -  person Manuel Lagunas    schedule 03.07.2018
comment
да, спасибо за помощь! Я не знаю, как добавить картинку в комментарий, поэтому прикрепляю код декодера внизу описания вопроса. Базовый блок представляет собой оператор conv+batchNorm+Relu. Я повышаю дискретизацию из вывода уровня 3 VGG, поэтому мне нужно три операции деконверсии для восстановления размера ввода.   -  person Kevin    schedule 03.07.2018
comment
В редакторе StackOverflow есть возможность добавлять код в виде текста, это сделает его более читабельным. Что если добавить в конце input = F.sigmoid(input). Таким образом, мы ограничиваем пиксели диапазоном 0-1. Затем, поскольку вы хотите выполнить бинарную сегментацию, добавьте input = input>0.5. Таким образом, мы устанавливаем пиксели со значением выше 0,5 равными 1, а те, которые меньше 0,5, равными 0. Если F не удается, выполните import torch.nn.functional as F. Отпишите потом результат :)   -  person Manuel Lagunas    schedule 03.07.2018
comment
да, я делаю softmax и argmax, чтобы преобразовать цифру по каналу в вероятность. И выполняю операцию argmax, чтобы получить вывод. Я думаю, что эта операция не является неправильной. Но я думаю, что deconv или сетевая архитектура, которая вызывает эти части.   -  person Kevin    schedule 03.07.2018
comment
Лучше обновите пост :)   -  person Manuel Lagunas    schedule 03.07.2018
comment
Да, уже обновите вопрос, просто игнорируйте комментарии в блоке кода, потому что результат сегментации - это всего лишь часть моей сети.   -  person Kevin    schedule 03.07.2018
comment
Вы пытались добавить то, что я упомянул в конце прямого метода?   -  person Manuel Lagunas    schedule 03.07.2018
comment
Давайте продолжим обсуждение в чате.   -  person Kevin    schedule 03.07.2018