Anonymous
Несогласованность слоев кодера и декодера в нейронной сети для задачи сегментации
Сообщение
Anonymous » 14 ноя 2024, 21:20
В моей нейронной сети после узкого слоя она отказывается принимать значение и выдает ошибку:
Код: Выделить всё
invalid output_size 'torch.Size(\[16, 16\])' (dim 0 must be between 16 and 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
1731608413
Anonymous
В моей нейронной сети после узкого слоя она отказывается принимать значение и выдает ошибку: [code]invalid output_size 'torch.Size(\[16, 16\])' (dim 0 must be between 16 and 18). [/code] Вот код моей модели: [code]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 [/code] Я уже решал множество подобных проблем, когда значения не подходили, но не знаю, как с этим бороться. Подробнее здесь: [url]https://stackoverflow.com/questions/79188395/inconsistency-of-encoder-and-decoder-layers-in-a-neural-network-for-a-segmentati[/url]