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