Моя карта результатов сегментации изображения содержит черную решетку в белом пятне - PullRequest
0 голосов
/ 03 июля 2018

enter image description here Я делаю сегментацию изображения с помощью UNet-подобной архитектуры CNN с помощью Pytorch 0.4.0. В конечном результате сегментации помечаю передний план как 1, а задний - как 0. -тренировал экстрактор функций VGG в качестве моего кодировщика, поэтому мне нужно повышать частоту дискретизации выходного сигнала кодера много раз. Но результат показывает странную решетчатую часть в результате, подобном этому:

Я подозреваю, что эти различные формы черного фона были вызваны деконволюционными слоями. Говорят, что слой deconv добавляет нули (s-1) между входным пикселем в официальной документации. Гиперпараметр деконволюционного слоя приведен ниже:

kernel_size = 3, шаг = 2, обивка = 1, output_padding = 1

(output_padding используется для соответствия размеру элемента пропуска соединения, например, с размером ввода 40 * 30, я хочу, чтобы его размер увеличился вдвое в одном деконволюционном слое, по моим расчетам по формуле: out = s (in-1) + k-2p, я должен использовать отступы 1 и отступы 1, чтобы сохранить размер, или может быть другой лучший выбор, который я не знаю.)

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

среда: Ubuntu 16.04, Pytorch 0.4.0, GTX 1080Ti, архитектура повышающей дискретизации состоит из трех уровней deconv, они расположены один за другим.

Обновление

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

kernel_size = 4, шаг = 2, обивка = 1

Таким образом, чтобы избежать заполнения выходных данных и удовлетворить размер. Но после 100 эпох я столкнулся с аналогичной проблемой.

после следующих 30-ти эпохальных тренировок, похоже, что enter image description here

черные точки просто рассеялись. Кажется, эти черные точки просто меняют свою часть и переходят в другую, я не знаю, почему это происходит. Я не знаю, как изменить свой сетевой гиперпараметр.
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`
...