මෙයකඩදාසි වලින් U-Net ආකෘතිය ක්රියාත්මක කිරීම, U-Net: ජෛව වෛද්ය රූප ඛණ්ඩනය සඳහා සංයුක්ත ජාල.
යූ-නෙට්ගිවිසුම්ගත මාර්ගයක් සහ පුළුල් මාර්ගයකින් සමන්විත වේ. හැකිලීමේ මාර්ගය යනු සංවහන ස්ථර සහ තටාක ස්ථර මාලාවක් වන අතර එහිදී විශේෂාංග සිතියමේ විභේදනය ක්රමයෙන් අඩු වේ. පුළුල් මාර්ගය ලක්ෂණය සිතියම යෝජනාව ක්රමයෙන් වැඩි ලක්වෙයි එහිදී දක්වා-නියැදීම් ස්ථර සහ සංවලිත ස්ථර මාලාවක් වේ.
පුළුල්කරන ලද මාවතේ සෑම පියවරකදීම වර්තමාන විශේෂාංග සිතියමට අනුකූල ගිවිසුම්ගත මාර්ගයෙන් අනුරූප විශේෂාංග සිතියම.
Carvana දත්ත කට්ටලය මත U-Net පුහුණු කරන අත්හදා බැලීමක් සඳහා පුහුණු කේතය මෙන්න.
27import torch
28import torchvision.transforms.functional
29from torch import nn
සංකෝචනමාර්ගය හා පුළුල් මාර්ගය එක් එක් පියවර RelU සක්රිය විසින් අනුගමනය convolutional ස්ථර දෙකක් ඇත.
යූ-නෙට්කඩදාසි වලදී ඔවුන් පෑඩින් භාවිතා කළ නමුත් අවසාන විශේෂාංග සිතියම කැපූ නොවන පරිදි අපි පෑඩින් භාවිතා කරමු.
32class DoubleConvolution(nn.Module):
in_channels
ආදාන නාලිකා ගණන out_channels
ප්රතිදාන නාලිකා ගණන වේ43 def __init__(self, in_channels: int, out_channels: int):
48 super().__init__()
පළමු සංවිච්ඡුා ස්ථරය
51 self.first = nn.Conv2d(in_channels, out_channels, kernel_size=3, padding=1)
52 self.act1 = nn.ReLU()
දෙවන කැටි ගැසුණු ස්ථරය
54 self.second = nn.Conv2d(out_channels, out_channels, kernel_size=3, padding=1)
55 self.act2 = nn.ReLU()
57 def forward(self, x: torch.Tensor):
කැටිගැසුණු ස්ථර දෙක සහ සක්රිය කිරීම් යොදන්න
59 x = self.first(x)
60 x = self.act1(x)
61 x = self.second(x)
62 return self.act2(x)
කොන්ත්රාත්මාර්ගයේ සෑම පියවරක්ම උපරිම තටාක තට්ටුවක් සහිත විශේෂාංග සිතියම පහළට සාම්පල කරයි.
65class DownSample(nn.Module):
73 def __init__(self):
74 super().__init__()
උපරිමතටාක ස්ථරය
76 self.pool = nn.MaxPool2d(2)
78 def forward(self, x: torch.Tensor):
79 return self.pool(x)
පුළුල්කිරීමේ මාවතේ සෑම පියවරක්ම සාම්පල මඟින් විශේෂාංග සිතියම දක්වා-කැටි ගැසුමකින් යුක්ත වේ.
82class UpSample(nn.Module):
89 def __init__(self, in_channels: int, out_channels: int):
90 super().__init__()
දක්වා-සංවහන
93 self.up = nn.ConvTranspose2d(in_channels, out_channels, kernel_size=2, stride=2)
95 def forward(self, x: torch.Tensor):
96 return self.up(x)
පුළුල්කරන ලද මාවතේ සෑම පියවරකදීම වර්තමාන විශේෂාංග සිතියමට අනුකූල ගිවිසුම්ගත මාර්ගයෙන් අනුරූප විශේෂාංග සිතියම.
99class CropAndConcat(nn.Module):
x
පුළුල් කිරීමේ මාවතේ වත්මන් විශේෂාංග සිතියම contracting_x
ගිවිසුම්ගත මාර්ගයෙන් අනුරූප විශේෂාංග සිතියම106 def forward(self, x: torch.Tensor, contracting_x: torch.Tensor):
කොන්ත්රාත්මාර්ගයේ සිට වර්තමාන විශේෂාංග සිතියමේ ප්රමාණය දක්වා විශේෂාංග සිතියම වගා කරන්න
113 contracting_x = torchvision.transforms.functional.center_crop(contracting_x, [x.shape[2], x.shape[3]])
විශේෂාංගසිතියම් සංයුක්ත කරන්න
115 x = torch.cat([x, contracting_x], dim=1)
117 return x
120class UNet(nn.Module):
in_channels
ආදාන රූපයේ නාලිකා ගණන out_channels
ප්රති result ල විශේෂාංග සිතියමේ නාලිකා ගණන124 def __init__(self, in_channels: int, out_channels: int):
129 super().__init__()
කොන්ත්රාත්මාර්ගය සඳහා ද්විත්ව කැටි ගැසීමේ ස්ථර. සිට ආරම්භ වන සෑම පියවරකදීම විශේෂාංග ගණන දෙගුණ වේ.
133 self.down_conv = nn.ModuleList([DoubleConvolution(i, o) for i, o in
134 [(in_channels, 64), (64, 128), (128, 256), (256, 512)]])
කොන්ත්රාත්මාර්ගය සඳහා නියැදි ස්ථර පහළට
136 self.down_sample = nn.ModuleList([DownSample() for _ in range(4)])
අවමවිභේදනයේ (U පතුලේ) කැටි ගැස්වීමේ ස්ථර දෙක.
139 self.middle_conv = DoubleConvolution(512, 1024)
පුළුල්මාර්ගය සඳහා නියැදි ස්ථර දක්වා. විශේෂාංග ගණන ඉහළට නියැදීමෙන් අඩකින් අඩු වේ.
143 self.up_sample = nn.ModuleList([UpSample(i, o) for i, o in
144 [(1024, 512), (512, 256), (256, 128), (128, 64)]])
පුළුල්මාර්ගය සඳහා ද්විත්ව කැටි ගැසුණු ස්ථර. ඔවුන්ගේ ආදානය වන්නේ වර්තමාන විශේෂාංග සිතියම සහ කොන්ත්රාත් මාර්ගයෙන් විශේෂාංග සිතියම සංයුක්ත කිරීමයි. එබැවින් ආදාන විශේෂාංග ගණන ඉහළ නියැදීම් වලින් විශේෂාංග ගණන දෙගුණයක් වේ.
149 self.up_conv = nn.ModuleList([DoubleConvolution(i, o) for i, o in
150 [(1024, 512), (512, 256), (256, 128), (128, 64)]])
පුළුල්මාර්ගය සඳහා බෝග හා concatenate ස්ථර.
152 self.concat = nn.ModuleList([CropAndConcat() for _ in range(4)])
ප්රතිදානයනිෂ්පාදනය කිරීම සඳහා අවසාන කැටි ගැසුණු ස්ථරය
154 self.final_conv = nn.Conv2d(64, out_channels, kernel_size=1)
x
ආදාන රූපය156 def forward(self, x: torch.Tensor):
පුළුල්කරන ලද මාර්ගය සමඟ පසුකාලීන සංකෝචනය සඳහා සංකෝචන මාර්ගයේ ප්රතිදානයන් එකතු කිරීම.
161 pass_through = []
කොන්ත්රාත්මාර්ගය
163 for i in range(len(self.down_conv)):
සංකීර්ණ ස්ථර දෙකක්
165 x = self.down_conv[i](x)
ප්රතිදානයඑකතු කරන්න
167 pass_through.append(x)
පහළ-නියැදිය
169 x = self.down_sample[i](x)
යූ-නෙට්පතුලේ සංයුක්ත ස්ථර දෙකක්
172 x = self.middle_conv(x)
පුළුල්මාර්ගය
175 for i in range(len(self.up_conv)):
ඉහළනියැදිය
177 x = self.up_sample[i](x)
කොන්ත්රාත්මාර්ගයේ ප්රතිදානය සංයුක්ත කරන්න
179 x = self.concat[i](x, pass_through.pop())
සංකීර්ණ ස්ථර දෙකක්
181 x = self.up_conv[i](x)
අවසාන කැටි ගැසුණු ස්ථරය
184 x = self.final_conv(x)
187 return x