Несогласованность слоев кодера и декодера в нейронной сети для задачи сегментацииPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Несогласованность слоев кодера и декодера в нейронной сети для задачи сегментации

Сообщение Anonymous »

В моей нейронной сети после слоя с узким местом она отказывается принимать значение и выдает ошибку: «invalid output_size 'torch.Size([16, 16])» (dim 0 должен быть между 16 и 18). "
Вот код моей модели, если понадобится еще что-то, пришлю. Заранее большое спасибо!

Код: Выделить всё

class SegNet(nn.Module):
def __init__(self):
super().__init__()

self.enc_conv0 = nn.Conv2d(in_channels=3, out_channels=32, kernel_size=3, stride=2, padding=2)
self.enc_conv1 = nn.Conv2d(in_channels=32, out_channels=64, kernel_size=3, stride=2, padding=2)
self.enc_conv2 = nn.Conv2d(in_channels=64, out_channels=128, kernel_size=3, stride=2, padding=2)
self.enc_conv3 = nn.Conv2d(in_channels=128, out_channels=256, kernel_size=3, stride=2, padding=2)

self.pool0 = nn.MaxPool2d(kernel_size=2, stride=1, return_indices=True)  # 256 -> 128
self.pool1 = nn.MaxPool2d(kernel_size=2, stride=1, return_indices=True) # 128 -> 64
self.pool2 = nn.MaxPool2d(kernel_size=2, stride=1, return_indices=True) # 64 -> 32
self.pool3 = nn.MaxPool2d(kernel_size=2, stride=1, return_indices=True) # 32 -> 16

# bottleneck
self.bottleneck_conv = nn.Conv2d(in_channels=256, out_channels=256, kernel_size=1, stride=1)

# decoder (upsampling)

self.dec_conv0 = nn.Conv2d(in_channels=256, out_channels=128, kernel_size=3, stride=2, padding=2)
self.dec_conv1 = nn.Conv2d(in_channels=128, out_channels=64, kernel_size=3, stride=2, padding=2)
self.dec_conv2 = nn.Conv2d(in_channels=64, out_channels=32, kernel_size=3, stride=2, padding=2)
self.dec_conv3 = nn.Conv2d(in_channels=32, out_channels=2, kernel_size=3, stride=2, padding=2)

self.upsample0 = nn.MaxUnpool2d(kernel_size=2, stride=1) # 16 -> 32
self.upsample1 = nn.MaxUnpool2d(kernel_size=2, stride=1) # 32 -> 64
self.upsample2 = nn.MaxUnpool2d(kernel_size=2, stride=1)  # 64 -> 128
self.upsample3 = nn.MaxUnpool2d(kernel_size=2, stride=1)  # 128 -> 256

def forward(self, x):
# encoder
print(f'x = {x.size()}')
e0, indices0 = self.pool0(F.relu(self.enc_conv0(x)))
print(f'e0 = {e0.size()}')
e1, indices1 = self.pool1(F.relu(self.enc_conv1(e0)))
print(f'e1 = {e1.size()}')
e2, indices2 = self.pool2(F.relu(self.enc_conv2(e1)))
print(f'e2 = {e2.size()}')
e3, indices3 = self.pool3(F.relu(self.enc_conv3(e2)))
print(f'e3 = {e3.size()}')

# bottleneck
b = self.bottleneck_conv(e3)
print(b.size())

# decoder
d0 = F.relu(self.dec_conv0(self.upsample0(b, indices3, output_size=e3.size()))) #self.upsample0(F.relu(self.dec_conv0(b)), indices3)
print(f'd0 = {d0.size()}')
d1 = F.relu(self.dec_conv1(self.upsample1(d0, indices2, output_size=e2.size())))
print(f'd1 = {d1.size()}')
d2 = F.relu(self.dec_conv2(self.upsample2(d1, indices1, output_size=e1.size())))
print(f'd2 = {d2.size()}')
d3 = self.dec_conv3(self.upsample3(d2, indices0, output_size=e0.size())) # no activation
print(f'd3 = {d3.size()}')
return d3
Я уже решал множество подобных проблем, когда значения не подходили, но не знаю, как с этим бороться.

Подробнее здесь: https://stackoverflow.com/questions/791 ... segmentati
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»