SegResNet
Residual encoder-decoder from MONAI designed for volumetric medical image segmentation.
Variants
SegResNet3D
18.8M3D volumetric version from MONAI for 3D reservoir datasets. Residual blocks with GroupNorm throughout.
SegResNet2D
6.3M2D version adapted from MONAI for Cartesian grid datasets.
Training Provenance
These values are read from the generated benchmark result metadata, not from static method-page copy. When a model is retrained and the website data is regenerated, this section updates with the result records.
Arena training recipe
Arena feature sets
Flow Arena input channels vary by fault complexity. Current result records for this method include 3 feature-set definitions.
Strengths & Weaknesses
Strengths
- Deep residual paths enable learning complex feature transformations without degradation
- MONAI implementation is production-grade with extensive testing and optimization
- VAE regularization branch can improve generalization by smoothing the latent space
- Flexible architecture ā depth and width are easily configurable
- Good parameter efficiency relative to comparable encoder-decoder architectures
Weaknesses
- Originally designed for segmentation (discrete labels), not regression (continuous fields) ā may need tuning
- Deeper residual paths can slow convergence compared to wider architectures like U-Net
- MONAI dependency introduces an additional library requirement
- Less extensively studied for PDE surrogate modeling compared to U-Net and FNO
- VAE branch adds training overhead even though it is discarded at inference time
Results Across Benchmarks
All results for SegResNet variants across all benchmark families. Sorted by the first field's rel-L² error by default.
Flow Arena
| Ā | Ā | Ā | Ā | Sat (frac) | Pres (bar) | Ā | |||||
|---|---|---|---|---|---|---|---|---|---|---|---|
| # | Dataset | Model | Loss | Epochs | rel-L²Ⲡ| MRE | MAE | rel-L² | MRE | MAE | Params |
| 1 | geostat_nf_rate | SegResNet | AbsLp(p=2) | 200 | 0.1505 | 0.2850 | 0.037936 | 0.0310 | 0.0264 | 5.822663 | 18.8M |
| 2 | geostat_nf_bhp | SegResNet | AbsLp(p=2) | 200 | 0.1512 | 0.2708 | 0.037070 | 0.0247 | 0.0211 | 5.403234 | 18.8M |
| 3 | geostat_nf_rate | SegResNet | MSE | 200 | 0.1625 | 0.3186 | 0.038700 | 0.0333 | 0.0278 | 6.039331 | 18.8M |
| 4 | geostat_nf_bhp | SegResNet | MSE | 200 | 0.1644 | 0.3321 | 0.039321 | 0.0259 | 0.0219 | 5.525085 | 18.8M |
| 5 | geostat_zt_rate | SegResNet | AbsLp(p=2) | 200 | 0.1913 | 0.3380 | 0.047566 | 0.0500 | 0.0388 | 9.180840 | 18.8M |
| 6 | channels_nf_bhp | SegResNet | AbsLp(p=2) | 200 | 0.1940 | 0.4055 | 0.052604 | 0.0307 | 0.0248 | 6.199241 | 18.8M |
| 7 | geostat_zt_rate | SegResNet | MSE | 200 | 0.1946 | 0.3611 | 0.047890 | 0.0496 | 0.0384 | 9.047611 | 18.8M |
| 8 | geostat_zt_bhp | SegResNet | AbsLp(p=2) | 200 | 0.1958 | 0.3397 | 0.046875 | 0.0318 | 0.0259 | 6.506715 | 18.8M |
| 9 | geostat_vt_rate | SegResNet | AbsLp(p=2) | 200 | 0.1963 | 0.3673 | 0.053504 | 0.0473 | 0.0362 | 8.372307 | 29.4M |
| 10 | geostat_vt_bhp | SegResNet | AbsLp(p=2) | 200 | 0.1987 | 0.3646 | 0.052161 | 0.0302 | 0.0239 | 6.015178 | 29.4M |
| 11 | geostat_vt_rate | SegResNet | MSE | 200 | 0.2009 | 0.3689 | 0.053885 | 0.0471 | 0.0361 | 8.347742 | 29.4M |
| 12 | geostat_zt_bhp | SegResNet | MSE | 200 | 0.2010 | 0.3551 | 0.046470 | 0.0327 | 0.0265 | 6.657693 | 18.8M |
| 13 | geostat_vt_bhp | SegResNet | MSE | 200 | 0.2037 | 0.3679 | 0.052045 | 0.0305 | 0.0245 | 6.117434 | 29.4M |
| 14 | channels_nf_bhp | SegResNet | MSE | 200 | 0.2043 | 0.4217 | 0.053570 | 0.0324 | 0.0263 | 6.560017 | 18.8M |
| 15 | channels_nf_rate | SegResNet | AbsLp(p=2) | 200 | 0.2197 | 0.4143 | 0.053126 | 0.0473 | 0.0382 | 8.304049 | 18.8M |
| 16 | channels_nf_rate | SegResNet | MSE | 200 | 0.2291 | 0.4253 | 0.054467 | 0.0460 | 0.0363 | 7.947267 | 18.8M |
| 17 | channels_zt_bhp | SegResNet | AbsLp(p=2) | 200 | 0.2519 | 0.4642 | 0.062831 | 0.0372 | 0.0295 | 7.337576 | 18.8M |
| 18 | channels_vt_bhp | SegResNet | MSE | 200 | 0.2595 | 0.4797 | 0.067640 | 0.0367 | 0.0280 | 7.051733 | 29.4M |
| 19 | channels_zt_bhp | SegResNet | MSE | 200 | 0.2599 | 0.4837 | 0.060852 | 0.0391 | 0.0304 | 7.615905 | 18.8M |
| 20 | channels_vt_bhp | SegResNet | AbsLp(p=2) | 200 | 0.2614 | 0.5246 | 0.070700 | 0.0373 | 0.0282 | 7.175670 | 29.4M |
| 21 | channels_vt_rate | SegResNet | AbsLp(p=2) | 200 | 0.2661 | 0.5187 | 0.073273 | 0.0564 | 0.0431 | 10.464211 | 29.4M |
| 22 | channels_zt_rate | SegResNet | AbsLp(p=2) | 200 | 0.2712 | 0.4966 | 0.066764 | 0.0589 | 0.0445 | 10.564583 | 18.8M |
| 23 | channels_vt_rate | SegResNet | MSE | 200 | 0.2715 | 0.5165 | 0.070310 | 0.0575 | 0.0438 | 10.468528 | 29.4M |
| 24 | channels_zt_rate | SegResNet | MSE | 200 | 0.2750 | 0.5009 | 0.063451 | 0.0608 | 0.0462 | 10.968623 | 18.8M |
Two-Phase Oil-Water
| Ā | Ā | Ā | Ā | Pres (bar) | Sat (frac) | Ā | |||||
|---|---|---|---|---|---|---|---|---|---|---|---|
| # | Target | Model | Loss | Epochs | rel-L²Ⲡ| MRE | MAE | rel-L² | MRE | MAE | Params |
| 1 | combined | SegResNet2D | RelLp | 200 | 0.0384 | 0.0336 | 5.636361 | 0.0375 | 0.0307 | 0.010878 | 14.2M |
| 2 | pressure | SegResNet2D | RelLp | 200 | 0.0454 | 0.0406 | 7.145418 | - | - | - | 6.3M |
| 3 | combined | SegResNet2D | RelLp | 200 | 0.0483 | 0.0435 | 7.430982 | 0.0401 | 0.0333 | 0.011306 | 6.3M |
| 4 | pressure | SegResNet2D | RelLp | 200 | 0.0500 | 0.0465 | 7.779330 | - | - | - | 14.2M |
| 5 | saturation | SegResNet2D | RelLp | 200 | - | - | - | 0.0436 | 0.0347 | 0.011877 | 6.3M |
| 6 | saturation | SegResNet2D | RelLp | 200 | - | - | - | 0.0407 | 0.0331 | 0.011496 | 14.2M |
CO2 Radial
| Ā | Ā | Ā | Ā | Pres (bar) | Sat (frac) | Ā | |||||
|---|---|---|---|---|---|---|---|---|---|---|---|
| # | Target | Model | Loss | Epochs | rel-L²Ⲡ| MRE | MAE | rel-L² | MRE | MAE | Params |
| 1 | pressure | SegResNet2D | RelLp | 500 | 0.0032 | 0.0009 | 0.200384 | - | - | - | 14.2M |
| 2 | combined | SegResNet2D | RelLp | 500 | 0.0042 | 0.0012 | 0.271272 | 0.0717 | 7.0054 | 0.001956 | 14.2M |
| 3 | saturation | SegResNet2D | RelLp | 500 | - | - | - | 0.0711 | 6.7189 | 0.001596 | 14.2M |
CO2 Nested
| Ā | Ā | Ā | Pres (bar) | Ā | |||
|---|---|---|---|---|---|---|---|
| # | Model | Loss | Epochs | rel-L²Ⲡ| MRE | MAE | Params |
| 1 | SegResNet | RelLp | 200 | 5.42e-5 | 1.75e-5 | 0.003850 | 18.8M |
Training Curves
SegResNet - Flow Arena (channels_nf_bhp)
SegResNet - Flow Arena (channels_nf_rate)
SegResNet - Flow Arena (channels_vt_bhp)
SegResNet - Flow Arena (channels_vt_rate)
SegResNet - Flow Arena (channels_zt_bhp)
SegResNet - Flow Arena (channels_zt_rate)
SegResNet - Flow Arena (geostat_nf_bhp)
SegResNet - Flow Arena (geostat_nf_rate)
Architecture
SegResNet was introduced by Myronenko (2018) as part of the winning solution for the BraTS 2018 brain tumor segmentation challenge. It is a residual encoder-decoder architecture specifically designed for 3D volumetric data, featuring a compact design with residual connections throughout both the encoder and decoder pathways.
The architecture uses a variational autoencoder (VAE) regularization branch during training, which encourages the learned representations to be smooth and well-structured. The encoder consists of blocks of 3D convolutions with residual connections and downsampling via strided convolutions. The decoder mirrors the encoder with upsampling via transposed convolutions and skip connections from the encoder.
We use the MONAI (Medical Open Network for AI) library implementation, which provides both 2D and 3D variants with configurable depth, width, and normalization. MONAI's implementation is well-optimized for GPU training and includes features like deep supervision and flexible loss functions.
SegResNet occupies an interesting niche in our benchmark: it has similar parameter counts to U-Net but with a different architectural philosophy. Where U-Net uses a wider bottleneck with more channels, SegResNet uses deeper residual paths with fewer channels per block, potentially learning more abstract feature hierarchies.
Model Summary
SegResNet
SegResNetWrapper(
(model): SegResNet(
(act_mod): ReLU(inplace=True)
(convInit): Convolution(
(conv): Conv3d(5, 32, kernel_size=(3, 3, 3), stride=(1, 1, 1), padding=(1, 1, 1), bias=False)
)
(down_layers): ModuleList(
(0): Sequential(
(0): Identity()
(1): ResBlock(
(norm1): GroupNorm(8, 32, eps=1e-05, affine=True)
(norm2): GroupNorm(8, 32, eps=1e-05, affine=True)
(act): ReLU(inplace=True)
(conv1): Convolution(
(conv): Conv3d(32, 32, kernel_size=(3, 3, 3), stride=(1, 1, 1), padding=(1, 1, 1), bias=False)
)
(conv2): Convolution(
(conv): Conv3d(32, 32, kernel_size=(3, 3, 3), stride=(1, 1, 1), padding=(1, 1, 1), bias=False)
)
)
)
(1): Sequential(
(0): Convolution(
(conv): Conv3d(32, 64, kernel_size=(3, 3, 3), stride=(2, 2, 2), padding=(1, 1, 1), bias=False)
)
(1): ResBlock(
(norm1): GroupNorm(8, 64, eps=1e-05, affine=True)
(norm2): GroupNorm(8, 64, eps=1e-05, affine=True)
(act): ReLU(inplace=True)
(conv1): Convolution(
(conv): Conv3d(64, 64, kernel_size=(3, 3, 3), stride=(1, 1, 1), padding=(1, 1, 1), bias=False)
)
(conv2): Convolution(
(conv): Conv3d(64, 64, kernel_size=(3, 3, 3), stride=(1, 1, 1), padding=(1, 1, 1), bias=False)
)
)
(2): ResBlock(
(norm1): GroupNorm(8, 64, eps=1e-05, affine=True)
(norm2): GroupNorm(8, 64, eps=1e-05, affine=True)
(act): ReLU(inplace=True)
(conv1): Convolution(
(conv): Conv3d(64, 64, kernel_size=(3, 3, 3), stride=(1, 1, 1), padding=(1, 1, 1), bias=False)
)
(conv2): Convolution(
(conv): Conv3d(64, 64, kernel_size=(3, 3, 3), stride=(1, 1, 1), padding=(1, 1, 1), bias=False)
)
)
)
(2): Sequential(
(0): Convolution(
(conv): Conv3d(64, 128, kernel_size=(3, 3, 3), stride=(2, 2, 2), padding=(1, 1, 1), bias=False)
)
(1): ResBlock(
(norm1): GroupNorm(8, 128, eps=1e-05, affine=True)
(norm2): GroupNorm(8, 128, eps=1e-05, affine=True)
(act): ReLU(inplace=True)
(conv1): Convolution(
(conv): Conv3d(128, 128, kernel_size=(3, 3, 3), stride=(1, 1, 1), padding=(1, 1, 1), bias=False)
)
(conv2): Convolution(
(conv): Conv3d(128, 128, kernel_size=(3, 3, 3), stride=(1, 1, 1), padding=(1, 1, 1), bias=False)
)
)
(2): ResBlock(
(norm1): GroupNorm(8, 128, eps=1e-05, affine=True)
(norm2): GroupNorm(8, 128, eps=1e-05, affine=True)
(act): ReLU(inplace=True)
(conv1): Convolution(
(conv): Conv3d(128, 128, kernel_size=(3, 3, 3), stride=(1, 1, 1), padding=(1, 1, 1), bias=False)
)
(conv2): Convolution(
(conv): Conv3d(128, 128, kernel_size=(3, 3, 3), stride=(1, 1, 1), padding=(1, 1, 1), bias=False)
)
)
)
(3): Sequential(
(0): Convolution(
(conv): Conv3d(128, 256, kernel_size=(3, 3, 3), stride=(2, 2, 2), padding=(1, 1, 1), bias=False)
)
(1): ResBlock(
(norm1): GroupNorm(8, 256, eps=1e-05, affine=True)
(norm2): GroupNorm(8, 256, eps=1e-05, affine=True)
(act): ReLU(inplace=True)
(conv1): Convolution(
(conv): Conv3d(256, 256, kernel_size=(3, 3, 3), stride=(1, 1, 1), padding=(1, 1, 1), bias=False)
)
(conv2): Convolution(
(conv): Conv3d(256, 256, kernel_size=(3, 3, 3), stride=(1, 1, 1), padding=(1, 1, 1), bias=False)
)
)
(2): ResBlock(
(norm1): GroupNorm(8, 256, eps=1e-05, affine=True)
(norm2): GroupNorm(8, 256, eps=1e-05, affine=True)
(act): ReLU(inplace=True)
(conv1): Convolution(
(conv): Conv3d(256, 256, kernel_size=(3, 3, 3), stride=(1, 1, 1), padding=(1, 1, 1), bias=False)
)
(conv2): Convolution(
(conv): Conv3d(256, 256, kernel_size=(3, 3, 3), stride=(1, 1, 1), padding=(1, 1, 1), bias=False)
)
)
(3): ResBlock(
(norm1): GroupNorm(8, 256, eps=1e-05, affine=True)
(norm2): GroupNorm(8, 256, eps=1e-05, affine=True)
(act): ReLU(inplace=True)
(conv1): Convolution(
(conv): Conv3d(256, 256, kernel_size=(3, 3, 3), stride=(1, 1, 1), padding=(1, 1, 1), bias=False)
)
(conv2): Convolution(
(conv): Conv3d(256, 256, kernel_size=(3, 3, 3), stride=(1, 1, 1), padding=(1, 1, 1), bias=False)
)
)
(4): ResBlock(
(norm1): GroupNorm(8, 256, eps=1e-05, affine=True)
(norm2): GroupNorm(8, 256, eps=1e-05, affine=True)
(act): ReLU(inplace=True)
(conv1): Convolution(
(conv): Conv3d(256, 256, kernel_size=(3, 3, 3), stride=(1, 1, 1), padding=(1, 1, 1), bias=False)
)
(conv2): Convolution(
(conv): Conv3d(256, 256, kernel_size=(3, 3, 3), stride=(1, 1, 1), padding=(1, 1, 1), bias=False)
)
)
)
)
(up_layers): ModuleList(
(0): Sequential(
(0): ResBlock(
(norm1): GroupNorm(8, 128, eps=1e-05, affine=True)
(norm2): GroupNorm(8, 128, eps=1e-05, affine=True)
(act): ReLU(inplace=True)
(conv1): Convolution(
(conv): Conv3d(128, 128, kernel_size=(3, 3, 3), stride=(1, 1, 1), padding=(1, 1, 1), bias=False)
)
(conv2): Convolution(
(conv): Conv3d(128, 128, kernel_size=(3, 3, 3), stride=(1, 1, 1), padding=(1, 1, 1), bias=False)
)
)
)
(1): Sequential(
(0): ResBlock(
(norm1): GroupNorm(8, 64, eps=1e-05, affine=True)
(norm2): GroupNorm(8, 64, eps=1e-05, affine=True)
(act): ReLU(inplace=True)
(conv1): Convolution(
(conv): Conv3d(64, 64, kernel_size=(3, 3, 3), stride=(1, 1, 1), padding=(1, 1, 1), bias=False)
)
(conv2): Convolution(
(conv): Conv3d(64, 64, kernel_size=(3, 3, 3), stride=(1, 1, 1), padding=(1, 1, 1), bias=False)
)
)
)
(2): Sequential(
(0): ResBlock(
(norm1): GroupNorm(8, 32, eps=1e-05, affine=True)
(norm2): GroupNorm(8, 32, eps=1e-05, affine=True)
(act): ReLU(inplace=True)
(conv1): Convolution(
(conv): Conv3d(32, 32, kernel_size=(3, 3, 3), stride=(1, 1, 1), padding=(1, 1, 1), bias=False)
)
(conv2): Convolution(
(conv): Conv3d(32, 32, kernel_size=(3, 3, 3), stride=(1, 1, 1), padding=(1, 1, 1), bias=False)
)
)
)
)
(up_samples): ModuleList(
(0): Sequential(
(0): Convolution(
(conv): Conv3d(256, 128, kernel_size=(1, 1, 1), stride=(1, 1, 1), bias=False)
)
(1): UpSample(
(upsample_non_trainable): Upsample(scale_factor=(2.0, 2.0, 2.0), mode='trilinear')
)
)
(1): Sequential(
(0): Convolution(
(conv): Conv3d(128, 64, kernel_size=(1, 1, 1), stride=(1, 1, 1), bias=False)
)
(1): UpSample(
(upsample_non_trainable): Upsample(scale_factor=(2.0, 2.0, 2.0), mode='trilinear')
)
)
(2): Sequential(
(0): Convolution(
(conv): Conv3d(64, 32, kernel_size=(1, 1, 1), stride=(1, 1, 1), bias=False)
)
(1): UpSample(
(upsample_non_trainable): Upsample(scale_factor=(2.0, 2.0, 2.0), mode='trilinear')
)
)
)
(conv_final): Sequential(
(0): GroupNorm(8, 32, eps=1e-05, affine=True)
(1): ReLU(inplace=True)
(2): Convolution(
(conv): Conv3d(32, 40, kernel_size=(1, 1, 1), stride=(1, 1, 1))
)
)
(dropout): Dropout3d(p=0.0, inplace=False)
)
) SegResNet2D
SegResNet2DWrapper(
(model): SegResNet(
(act_mod): ReLU(inplace=True)
(convInit): Convolution(
(conv): Conv2d(84, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
)
(down_layers): ModuleList(
(0): Sequential(
(0): Identity()
(1): ResBlock(
(norm1): GroupNorm(8, 32, eps=1e-05, affine=True)
(norm2): GroupNorm(8, 32, eps=1e-05, affine=True)
(act): ReLU(inplace=True)
(conv1): Convolution(
(conv): Conv2d(32, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
)
(conv2): Convolution(
(conv): Conv2d(32, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
)
)
)
(1): Sequential(
(0): Convolution(
(conv): Conv2d(32, 64, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), bias=False)
)
(1): ResBlock(
(norm1): GroupNorm(8, 64, eps=1e-05, affine=True)
(norm2): GroupNorm(8, 64, eps=1e-05, affine=True)
(act): ReLU(inplace=True)
(conv1): Convolution(
(conv): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
)
(conv2): Convolution(
(conv): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
)
)
(2): ResBlock(
(norm1): GroupNorm(8, 64, eps=1e-05, affine=True)
(norm2): GroupNorm(8, 64, eps=1e-05, affine=True)
(act): ReLU(inplace=True)
(conv1): Convolution(
(conv): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
)
(conv2): Convolution(
(conv): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
)
)
)
(2): Sequential(
(0): Convolution(
(conv): Conv2d(64, 128, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), bias=False)
)
(1): ResBlock(
(norm1): GroupNorm(8, 128, eps=1e-05, affine=True)
(norm2): GroupNorm(8, 128, eps=1e-05, affine=True)
(act): ReLU(inplace=True)
(conv1): Convolution(
(conv): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
)
(conv2): Convolution(
(conv): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
)
)
(2): ResBlock(
(norm1): GroupNorm(8, 128, eps=1e-05, affine=True)
(norm2): GroupNorm(8, 128, eps=1e-05, affine=True)
(act): ReLU(inplace=True)
(conv1): Convolution(
(conv): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
)
(conv2): Convolution(
(conv): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
)
)
)
(3): Sequential(
(0): Convolution(
(conv): Conv2d(128, 256, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), bias=False)
)
(1): ResBlock(
(norm1): GroupNorm(8, 256, eps=1e-05, affine=True)
(norm2): GroupNorm(8, 256, eps=1e-05, affine=True)
(act): ReLU(inplace=True)
(conv1): Convolution(
(conv): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
)
(conv2): Convolution(
(conv): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
)
)
(2): ResBlock(
(norm1): GroupNorm(8, 256, eps=1e-05, affine=True)
(norm2): GroupNorm(8, 256, eps=1e-05, affine=True)
(act): ReLU(inplace=True)
(conv1): Convolution(
(conv): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
)
(conv2): Convolution(
(conv): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
)
)
(3): ResBlock(
(norm1): GroupNorm(8, 256, eps=1e-05, affine=True)
(norm2): GroupNorm(8, 256, eps=1e-05, affine=True)
(act): ReLU(inplace=True)
(conv1): Convolution(
(conv): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
)
(conv2): Convolution(
(conv): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
)
)
(4): ResBlock(
(norm1): GroupNorm(8, 256, eps=1e-05, affine=True)
(norm2): GroupNorm(8, 256, eps=1e-05, affine=True)
(act): ReLU(inplace=True)
(conv1): Convolution(
(conv): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
)
(conv2): Convolution(
(conv): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
)
)
)
)
(up_layers): ModuleList(
(0): Sequential(
(0): ResBlock(
(norm1): GroupNorm(8, 128, eps=1e-05, affine=True)
(norm2): GroupNorm(8, 128, eps=1e-05, affine=True)
(act): ReLU(inplace=True)
(conv1): Convolution(
(conv): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
)
(conv2): Convolution(
(conv): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
)
)
)
(1): Sequential(
(0): ResBlock(
(norm1): GroupNorm(8, 64, eps=1e-05, affine=True)
(norm2): GroupNorm(8, 64, eps=1e-05, affine=True)
(act): ReLU(inplace=True)
(conv1): Convolution(
(conv): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
)
(conv2): Convolution(
(conv): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
)
)
)
(2): Sequential(
(0): ResBlock(
(norm1): GroupNorm(8, 32, eps=1e-05, affine=True)
(norm2): GroupNorm(8, 32, eps=1e-05, affine=True)
(act): ReLU(inplace=True)
(conv1): Convolution(
(conv): Conv2d(32, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
)
(conv2): Convolution(
(conv): Conv2d(32, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
)
)
)
)
(up_samples): ModuleList(
(0): Sequential(
(0): Convolution(
(conv): Conv2d(256, 128, kernel_size=(1, 1), stride=(1, 1), bias=False)
)
(1): UpSample(
(upsample_non_trainable): Upsample(scale_factor=(2.0, 2.0), mode='bilinear')
)
)
(1): Sequential(
(0): Convolution(
(conv): Conv2d(128, 64, kernel_size=(1, 1), stride=(1, 1), bias=False)
)
(1): UpSample(
(upsample_non_trainable): Upsample(scale_factor=(2.0, 2.0), mode='bilinear')
)
)
(2): Sequential(
(0): Convolution(
(conv): Conv2d(64, 32, kernel_size=(1, 1), stride=(1, 1), bias=False)
)
(1): UpSample(
(upsample_non_trainable): Upsample(scale_factor=(2.0, 2.0), mode='bilinear')
)
)
)
(conv_final): Sequential(
(0): GroupNorm(8, 32, eps=1e-05, affine=True)
(1): ReLU(inplace=True)
(2): Convolution(
(conv): Conv2d(32, 80, kernel_size=(1, 1), stride=(1, 1))
)
)
(dropout): Dropout2d(p=0.0, inplace=False)
)
)