Variants

SegResNet3D

18.8M

3D volumetric version from MONAI for 3D reservoir datasets. Residual blocks with GroupNorm throughout.

Conv: Conv3d
Norm: GroupNorm

SegResNet2D

6.3M

2D version adapted from MONAI for Cartesian grid datasets.

Conv: Conv2d
Norm: GroupNorm
Exact params: 6,325,008

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

Epochs: 200
Batch size: 32
Learning rate: 0.0001
Loss: MSEGradientLoss, CombinedGradientLoss

Arena feature sets

Flow Arena input channels vary by fault complexity. Current result records for this method include 3 feature-set definitions.

PORO PERMX SWAT_0 PRESSURE_0 MULTX MULTY DEPTH

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

Property
Fault
Control
Loss
24 results
Ā Ā Ā Ā Sat (frac)Pres (bar)Ā 
#DatasetModelLossEpochsrel-L²▲MREMAErel-L²MREMAEParams
1geostat_nf_rateSegResNetAbsLp(p=2)2000.15050.28500.0379360.03100.02645.82266318.8M
2geostat_nf_bhpSegResNetAbsLp(p=2)2000.15120.27080.0370700.02470.02115.40323418.8M
3geostat_nf_rateSegResNetMSE2000.16250.31860.0387000.03330.02786.03933118.8M
4geostat_nf_bhpSegResNetMSE2000.16440.33210.0393210.02590.02195.52508518.8M
5geostat_zt_rateSegResNetAbsLp(p=2)2000.19130.33800.0475660.05000.03889.18084018.8M
6channels_nf_bhpSegResNetAbsLp(p=2)2000.19400.40550.0526040.03070.02486.19924118.8M
7geostat_zt_rateSegResNetMSE2000.19460.36110.0478900.04960.03849.04761118.8M
8geostat_zt_bhpSegResNetAbsLp(p=2)2000.19580.33970.0468750.03180.02596.50671518.8M
9geostat_vt_rateSegResNetAbsLp(p=2)2000.19630.36730.0535040.04730.03628.37230729.4M
10geostat_vt_bhpSegResNetAbsLp(p=2)2000.19870.36460.0521610.03020.02396.01517829.4M
11geostat_vt_rateSegResNetMSE2000.20090.36890.0538850.04710.03618.34774229.4M
12geostat_zt_bhpSegResNetMSE2000.20100.35510.0464700.03270.02656.65769318.8M
13geostat_vt_bhpSegResNetMSE2000.20370.36790.0520450.03050.02456.11743429.4M
14channels_nf_bhpSegResNetMSE2000.20430.42170.0535700.03240.02636.56001718.8M
15channels_nf_rateSegResNetAbsLp(p=2)2000.21970.41430.0531260.04730.03828.30404918.8M
16channels_nf_rateSegResNetMSE2000.22910.42530.0544670.04600.03637.94726718.8M
17channels_zt_bhpSegResNetAbsLp(p=2)2000.25190.46420.0628310.03720.02957.33757618.8M
18channels_vt_bhpSegResNetMSE2000.25950.47970.0676400.03670.02807.05173329.4M
19channels_zt_bhpSegResNetMSE2000.25990.48370.0608520.03910.03047.61590518.8M
20channels_vt_bhpSegResNetAbsLp(p=2)2000.26140.52460.0707000.03730.02827.17567029.4M
21channels_vt_rateSegResNetAbsLp(p=2)2000.26610.51870.0732730.05640.043110.46421129.4M
22channels_zt_rateSegResNetAbsLp(p=2)2000.27120.49660.0667640.05890.044510.56458318.8M
23channels_vt_rateSegResNetMSE2000.27150.51650.0703100.05750.043810.46852829.4M
24channels_zt_rateSegResNetMSE2000.27500.50090.0634510.06080.046210.96862318.8M

Two-Phase Oil-Water

6 results
Ā Ā Ā Ā Pres (bar)Sat (frac)Ā 
#TargetModelLossEpochsrel-L²▲MREMAErel-L²MREMAEParams
1combinedSegResNet2DRelLp2000.03840.03365.6363610.03750.03070.01087814.2M
2pressureSegResNet2DRelLp2000.04540.04067.145418---6.3M
3combinedSegResNet2DRelLp2000.04830.04357.4309820.04010.03330.0113066.3M
4pressureSegResNet2DRelLp2000.05000.04657.779330---14.2M
5saturationSegResNet2DRelLp200---0.04360.03470.0118776.3M
6saturationSegResNet2DRelLp200---0.04070.03310.01149614.2M

CO2 Radial

3 results
Ā Ā Ā Ā Pres (bar)Sat (frac)Ā 
#TargetModelLossEpochsrel-L²▲MREMAErel-L²MREMAEParams
1pressureSegResNet2DRelLp5000.00320.00090.200384---14.2M
2combinedSegResNet2DRelLp5000.00420.00120.2712720.07177.00540.00195614.2M
3saturationSegResNet2DRelLp500---0.07116.71890.00159614.2M

CO2 Nested

1 results
Ā Ā Ā Pres (bar)Ā 
#ModelLossEpochsrel-L²▲MREMAEParams
1SegResNetRelLp2005.42e-51.75e-50.00385018.8M

Two-Phase 3D Channels

3 results
Ā Ā Ā Ā Pres (bar)Sat (frac)Ā 
#TargetModelLossEpochsrel-L²▲MREMAErel-L²MREMAEParams
1pressureSegResNetRelLp5000.00080.00060.180418---18.8M
2combinedSegResNetRelLp5000.00110.00080.2588670.14260.08670.01848418.8M
3saturationSegResNetRelLp500---0.14350.07790.01751318.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)
  )
)