{
  "format": "tensorviz.graph",
  "version": 3,
  "exportedAt": "2026-09-17T06:18:45.955001+00:00",
  "status": "static",
  "warningCount": 0,
  "document": {
    "schemaVersion": 2,
    "semantic": {
      "graph_id": "snapshot",
      "name": "TinyUNet",
      "revision": 0,
      "nodes": [
        {
          "node_id": "input",
          "kind": "input",
          "op": "Input",
          "params": {
            "shape": "1,1,96,96"
          },
          "in_ports": [],
          "out_ports": [
            "y"
          ],
          "metadata": {
            "layerType": {
              "id": "input",
              "name": "Input",
              "displayName": "Input",
              "description": "Model input node",
              "icon": "ArrowRight",
              "category": "io",
              "parameters": [
                {
                  "name": "shape",
                  "type": "string",
                  "defaultValue": "1,3,224,224",
                  "required": true,
                  "description": "Input tensor shape (comma-separated, e.g., 1,3,224,224)"
                },
                {
                  "name": "name",
                  "type": "string",
                  "defaultValue": "input",
                  "required": false,
                  "description": "Name for this input"
                }
              ]
            }
          }
        },
        {
          "node_id": "encoder1",
          "kind": "module",
          "op": "Module",
          "params": {
            "arg_0": 1,
            "arg_1": 4
          },
          "in_ports": [
            "x"
          ],
          "out_ports": [
            "y"
          ],
          "metadata": {
            "layerType": {
              "id": "module",
              "name": "Module",
              "displayName": "Module",
              "description": "Custom module group (nn.Module)",
              "icon": "Package",
              "category": "module",
              "parameters": [
                {
                  "name": "name",
                  "type": "string",
                  "defaultValue": "CustomModule",
                  "required": true,
                  "description": "Module class name"
                },
                {
                  "name": "description",
                  "type": "string",
                  "defaultValue": "",
                  "required": false,
                  "description": "Module description"
                }
              ]
            },
            "moduleInstanceId": "encoder1",
            "moduleTemplateId": "model::DoubleConv",
            "isGroup": true,
            "moduleMembers": [
              "encoder1.conv1",
              "encoder1.relu1",
              "encoder1.conv2",
              "encoder1.relu2"
            ],
            "moduleLayerCount": 4
          }
        },
        {
          "node_id": "pool1",
          "kind": "layer",
          "op": "MaxPool2d",
          "params": {
            "kernel_size": 2
          },
          "in_ports": [
            "x"
          ],
          "out_ports": [
            "y"
          ],
          "metadata": {
            "layerType": {
              "id": "maxpool2d",
              "name": "MaxPool2d",
              "displayName": "MaxPool2D",
              "description": "2D Max Pooling",
              "icon": "Square",
              "category": "pool",
              "parameters": [
                {
                  "name": "kernel_size",
                  "type": "number",
                  "defaultValue": 2,
                  "required": true,
                  "description": "Size of the window to take a max over",
                  "min": 1
                },
                {
                  "name": "stride",
                  "type": "number",
                  "defaultValue": 2,
                  "required": false,
                  "description": "Stride of the window",
                  "min": 1
                },
                {
                  "name": "padding",
                  "type": "number",
                  "defaultValue": 0,
                  "required": false,
                  "description": "Implicit zero padding to be added",
                  "min": 0
                }
              ]
            }
          }
        },
        {
          "node_id": "encoder2",
          "kind": "module",
          "op": "Module",
          "params": {
            "arg_0": 4,
            "arg_1": 8
          },
          "in_ports": [
            "x"
          ],
          "out_ports": [
            "y"
          ],
          "metadata": {
            "layerType": {
              "id": "module",
              "name": "Module",
              "displayName": "Module",
              "description": "Custom module group (nn.Module)",
              "icon": "Package",
              "category": "module",
              "parameters": [
                {
                  "name": "name",
                  "type": "string",
                  "defaultValue": "CustomModule",
                  "required": true,
                  "description": "Module class name"
                },
                {
                  "name": "description",
                  "type": "string",
                  "defaultValue": "",
                  "required": false,
                  "description": "Module description"
                }
              ]
            },
            "moduleInstanceId": "encoder2",
            "moduleTemplateId": "model::DoubleConv",
            "isGroup": true,
            "moduleMembers": [
              "encoder2.conv1",
              "encoder2.relu1",
              "encoder2.conv2",
              "encoder2.relu2"
            ],
            "moduleLayerCount": 4
          }
        },
        {
          "node_id": "pool2",
          "kind": "layer",
          "op": "MaxPool2d",
          "params": {
            "kernel_size": 2
          },
          "in_ports": [
            "x"
          ],
          "out_ports": [
            "y"
          ],
          "metadata": {
            "layerType": {
              "id": "maxpool2d",
              "name": "MaxPool2d",
              "displayName": "MaxPool2D",
              "description": "2D Max Pooling",
              "icon": "Square",
              "category": "pool",
              "parameters": [
                {
                  "name": "kernel_size",
                  "type": "number",
                  "defaultValue": 2,
                  "required": true,
                  "description": "Size of the window to take a max over",
                  "min": 1
                },
                {
                  "name": "stride",
                  "type": "number",
                  "defaultValue": 2,
                  "required": false,
                  "description": "Stride of the window",
                  "min": 1
                },
                {
                  "name": "padding",
                  "type": "number",
                  "defaultValue": 0,
                  "required": false,
                  "description": "Implicit zero padding to be added",
                  "min": 0
                }
              ]
            }
          }
        },
        {
          "node_id": "bottleneck",
          "kind": "module",
          "op": "Module",
          "params": {
            "arg_0": 8,
            "arg_1": 16
          },
          "in_ports": [
            "x"
          ],
          "out_ports": [
            "y"
          ],
          "metadata": {
            "layerType": {
              "id": "module",
              "name": "Module",
              "displayName": "Module",
              "description": "Custom module group (nn.Module)",
              "icon": "Package",
              "category": "module",
              "parameters": [
                {
                  "name": "name",
                  "type": "string",
                  "defaultValue": "CustomModule",
                  "required": true,
                  "description": "Module class name"
                },
                {
                  "name": "description",
                  "type": "string",
                  "defaultValue": "",
                  "required": false,
                  "description": "Module description"
                }
              ]
            },
            "moduleInstanceId": "bottleneck",
            "moduleTemplateId": "model::DoubleConv",
            "isGroup": true,
            "moduleMembers": [
              "bottleneck.conv1",
              "bottleneck.relu1",
              "bottleneck.conv2",
              "bottleneck.relu2"
            ],
            "moduleLayerCount": 4
          }
        },
        {
          "node_id": "up2",
          "kind": "layer",
          "op": "ConvTranspose2d",
          "params": {
            "in_channels": 16,
            "out_channels": 8,
            "kernel_size": 2,
            "stride": 2
          },
          "in_ports": [
            "x"
          ],
          "out_ports": [
            "y"
          ],
          "metadata": {
            "layerType": {
              "id": "convtranspose2d",
              "name": "ConvTranspose2d",
              "displayName": "ConvTranspose2D",
              "description": "2D Transposed Convolutional Layer",
              "icon": "ChevronsRight",
              "category": "conv",
              "parameters": [
                {
                  "name": "in_channels",
                  "type": "number",
                  "defaultValue": 64,
                  "required": true,
                  "description": "Number of input channels",
                  "min": 1
                },
                {
                  "name": "out_channels",
                  "type": "number",
                  "defaultValue": 32,
                  "required": true,
                  "description": "Number of output channels",
                  "min": 1
                },
                {
                  "name": "kernel_size",
                  "type": "number",
                  "defaultValue": 3,
                  "required": true,
                  "description": "Size of the convolving kernel",
                  "min": 1
                },
                {
                  "name": "stride",
                  "type": "number",
                  "defaultValue": 1,
                  "required": false,
                  "description": "Stride of the convolution",
                  "min": 1
                },
                {
                  "name": "padding",
                  "type": "number",
                  "defaultValue": 0,
                  "required": false,
                  "description": "Zero-padding added to input",
                  "min": 0
                },
                {
                  "name": "output_padding",
                  "type": "number",
                  "defaultValue": 0,
                  "required": false,
                  "description": "Additional size added to one side of the output shape",
                  "min": 0
                },
                {
                  "name": "groups",
                  "type": "number",
                  "defaultValue": 1,
                  "required": false,
                  "description": "Number of blocked connections",
                  "min": 1
                },
                {
                  "name": "bias",
                  "type": "boolean",
                  "defaultValue": true,
                  "required": false,
                  "description": "If True, adds a learnable bias"
                }
              ]
            }
          }
        },
        {
          "node_id": "join2",
          "kind": "module",
          "op": "Module",
          "params": {},
          "in_ports": [
            "x"
          ],
          "out_ports": [
            "y"
          ],
          "metadata": {
            "layerType": {
              "id": "module",
              "name": "Module",
              "displayName": "Module",
              "description": "Custom module group (nn.Module)",
              "icon": "Package",
              "category": "module",
              "parameters": [
                {
                  "name": "name",
                  "type": "string",
                  "defaultValue": "CustomModule",
                  "required": true,
                  "description": "Module class name"
                },
                {
                  "name": "description",
                  "type": "string",
                  "defaultValue": "",
                  "required": false,
                  "description": "Module description"
                }
              ]
            },
            "moduleInstanceId": "join2",
            "moduleTemplateId": "model::CropAndJoin",
            "isGroup": true,
            "moduleMembers": [
              "cat@join2#0"
            ],
            "moduleLayerCount": 1
          }
        },
        {
          "node_id": "decoder2",
          "kind": "module",
          "op": "Module",
          "params": {
            "arg_0": 16,
            "arg_1": 8
          },
          "in_ports": [
            "x"
          ],
          "out_ports": [
            "y"
          ],
          "metadata": {
            "layerType": {
              "id": "module",
              "name": "Module",
              "displayName": "Module",
              "description": "Custom module group (nn.Module)",
              "icon": "Package",
              "category": "module",
              "parameters": [
                {
                  "name": "name",
                  "type": "string",
                  "defaultValue": "CustomModule",
                  "required": true,
                  "description": "Module class name"
                },
                {
                  "name": "description",
                  "type": "string",
                  "defaultValue": "",
                  "required": false,
                  "description": "Module description"
                }
              ]
            },
            "moduleInstanceId": "decoder2",
            "moduleTemplateId": "model::DoubleConv",
            "isGroup": true,
            "moduleMembers": [
              "decoder2.conv1",
              "decoder2.relu1",
              "decoder2.conv2",
              "decoder2.relu2"
            ],
            "moduleLayerCount": 4
          }
        },
        {
          "node_id": "up1",
          "kind": "layer",
          "op": "ConvTranspose2d",
          "params": {
            "in_channels": 8,
            "out_channels": 4,
            "kernel_size": 2,
            "stride": 2
          },
          "in_ports": [
            "x"
          ],
          "out_ports": [
            "y"
          ],
          "metadata": {
            "layerType": {
              "id": "convtranspose2d",
              "name": "ConvTranspose2d",
              "displayName": "ConvTranspose2D",
              "description": "2D Transposed Convolutional Layer",
              "icon": "ChevronsRight",
              "category": "conv",
              "parameters": [
                {
                  "name": "in_channels",
                  "type": "number",
                  "defaultValue": 64,
                  "required": true,
                  "description": "Number of input channels",
                  "min": 1
                },
                {
                  "name": "out_channels",
                  "type": "number",
                  "defaultValue": 32,
                  "required": true,
                  "description": "Number of output channels",
                  "min": 1
                },
                {
                  "name": "kernel_size",
                  "type": "number",
                  "defaultValue": 3,
                  "required": true,
                  "description": "Size of the convolving kernel",
                  "min": 1
                },
                {
                  "name": "stride",
                  "type": "number",
                  "defaultValue": 1,
                  "required": false,
                  "description": "Stride of the convolution",
                  "min": 1
                },
                {
                  "name": "padding",
                  "type": "number",
                  "defaultValue": 0,
                  "required": false,
                  "description": "Zero-padding added to input",
                  "min": 0
                },
                {
                  "name": "output_padding",
                  "type": "number",
                  "defaultValue": 0,
                  "required": false,
                  "description": "Additional size added to one side of the output shape",
                  "min": 0
                },
                {
                  "name": "groups",
                  "type": "number",
                  "defaultValue": 1,
                  "required": false,
                  "description": "Number of blocked connections",
                  "min": 1
                },
                {
                  "name": "bias",
                  "type": "boolean",
                  "defaultValue": true,
                  "required": false,
                  "description": "If True, adds a learnable bias"
                }
              ]
            }
          }
        },
        {
          "node_id": "join1",
          "kind": "module",
          "op": "Module",
          "params": {},
          "in_ports": [
            "x"
          ],
          "out_ports": [
            "y"
          ],
          "metadata": {
            "layerType": {
              "id": "module",
              "name": "Module",
              "displayName": "Module",
              "description": "Custom module group (nn.Module)",
              "icon": "Package",
              "category": "module",
              "parameters": [
                {
                  "name": "name",
                  "type": "string",
                  "defaultValue": "CustomModule",
                  "required": true,
                  "description": "Module class name"
                },
                {
                  "name": "description",
                  "type": "string",
                  "defaultValue": "",
                  "required": false,
                  "description": "Module description"
                }
              ]
            },
            "moduleInstanceId": "join1",
            "moduleTemplateId": "model::CropAndJoin",
            "isGroup": true,
            "moduleMembers": [
              "cat@join1#0"
            ],
            "moduleLayerCount": 1
          }
        },
        {
          "node_id": "decoder1",
          "kind": "module",
          "op": "Module",
          "params": {
            "arg_0": 8,
            "arg_1": 4
          },
          "in_ports": [
            "x"
          ],
          "out_ports": [
            "y"
          ],
          "metadata": {
            "layerType": {
              "id": "module",
              "name": "Module",
              "displayName": "Module",
              "description": "Custom module group (nn.Module)",
              "icon": "Package",
              "category": "module",
              "parameters": [
                {
                  "name": "name",
                  "type": "string",
                  "defaultValue": "CustomModule",
                  "required": true,
                  "description": "Module class name"
                },
                {
                  "name": "description",
                  "type": "string",
                  "defaultValue": "",
                  "required": false,
                  "description": "Module description"
                }
              ]
            },
            "moduleInstanceId": "decoder1",
            "moduleTemplateId": "model::DoubleConv",
            "isGroup": true,
            "moduleMembers": [
              "decoder1.conv1",
              "decoder1.relu1",
              "decoder1.conv2",
              "decoder1.relu2"
            ],
            "moduleLayerCount": 4
          }
        },
        {
          "node_id": "mask_head",
          "kind": "layer",
          "op": "Conv2d",
          "params": {
            "in_channels": 4,
            "out_channels": 2,
            "kernel_size": 1
          },
          "in_ports": [
            "x"
          ],
          "out_ports": [
            "y"
          ],
          "metadata": {
            "layerType": {
              "id": "conv2d",
              "name": "Conv2d",
              "displayName": "Conv2D",
              "description": "2D Convolutional Layer",
              "icon": "Grid3X3",
              "category": "conv",
              "parameters": [
                {
                  "name": "in_channels",
                  "type": "number",
                  "defaultValue": 3,
                  "required": true,
                  "description": "Number of input channels",
                  "min": 1
                },
                {
                  "name": "out_channels",
                  "type": "number",
                  "defaultValue": 64,
                  "required": true,
                  "description": "Number of output channels",
                  "min": 1
                },
                {
                  "name": "kernel_size",
                  "type": "number",
                  "defaultValue": 3,
                  "required": true,
                  "description": "Size of the convolving kernel",
                  "min": 1
                },
                {
                  "name": "stride",
                  "type": "number",
                  "defaultValue": 1,
                  "required": false,
                  "description": "Stride of the convolution",
                  "min": 1
                },
                {
                  "name": "padding",
                  "type": "number",
                  "defaultValue": 0,
                  "required": false,
                  "description": "Zero-padding added to both sides",
                  "min": 0
                },
                {
                  "name": "dilation",
                  "type": "number",
                  "defaultValue": 1,
                  "required": false,
                  "description": "Spacing between kernel elements",
                  "min": 1
                },
                {
                  "name": "groups",
                  "type": "number",
                  "defaultValue": 1,
                  "required": false,
                  "description": "Number of blocked connections from input to output channels",
                  "min": 1
                },
                {
                  "name": "bias",
                  "type": "boolean",
                  "defaultValue": true,
                  "required": false,
                  "description": "If True, adds a learnable bias"
                }
              ]
            }
          }
        },
        {
          "node_id": "output",
          "kind": "output",
          "op": "Output",
          "params": {},
          "in_ports": [
            "x"
          ],
          "out_ports": [],
          "metadata": {
            "layerType": {
              "id": "output",
              "name": "Output",
              "displayName": "Output",
              "description": "Model output node",
              "icon": "ArrowLeft",
              "category": "io",
              "parameters": [
                {
                  "name": "name",
                  "type": "string",
                  "defaultValue": "output",
                  "required": false,
                  "description": "Name for this output"
                }
              ]
            }
          }
        },
        {
          "node_id": "encoder1.conv1",
          "kind": "layer",
          "op": "Conv2d",
          "params": {
            "kernel_size": 3
          },
          "in_ports": [
            "x"
          ],
          "out_ports": [
            "y"
          ],
          "metadata": {
            "layerType": {
              "id": "conv2d",
              "name": "Conv2d",
              "displayName": "Conv2D",
              "description": "2D Convolutional Layer",
              "icon": "Grid3X3",
              "category": "conv",
              "parameters": [
                {
                  "name": "in_channels",
                  "type": "number",
                  "defaultValue": 3,
                  "required": true,
                  "description": "Number of input channels",
                  "min": 1
                },
                {
                  "name": "out_channels",
                  "type": "number",
                  "defaultValue": 64,
                  "required": true,
                  "description": "Number of output channels",
                  "min": 1
                },
                {
                  "name": "kernel_size",
                  "type": "number",
                  "defaultValue": 3,
                  "required": true,
                  "description": "Size of the convolving kernel",
                  "min": 1
                },
                {
                  "name": "stride",
                  "type": "number",
                  "defaultValue": 1,
                  "required": false,
                  "description": "Stride of the convolution",
                  "min": 1
                },
                {
                  "name": "padding",
                  "type": "number",
                  "defaultValue": 0,
                  "required": false,
                  "description": "Zero-padding added to both sides",
                  "min": 0
                },
                {
                  "name": "dilation",
                  "type": "number",
                  "defaultValue": 1,
                  "required": false,
                  "description": "Spacing between kernel elements",
                  "min": 1
                },
                {
                  "name": "groups",
                  "type": "number",
                  "defaultValue": 1,
                  "required": false,
                  "description": "Number of blocked connections from input to output channels",
                  "min": 1
                },
                {
                  "name": "bias",
                  "type": "boolean",
                  "defaultValue": true,
                  "required": false,
                  "description": "If True, adds a learnable bias"
                }
              ]
            },
            "parentId": "encoder1"
          }
        },
        {
          "node_id": "encoder1.relu1",
          "kind": "layer",
          "op": "ReLU",
          "params": {},
          "in_ports": [
            "x"
          ],
          "out_ports": [
            "y"
          ],
          "metadata": {
            "layerType": {
              "id": "relu",
              "name": "ReLU",
              "displayName": "ReLU",
              "description": "Rectified Linear Unit",
              "icon": "TrendingUp",
              "category": "activation",
              "parameters": [
                {
                  "name": "inplace",
                  "type": "boolean",
                  "defaultValue": false,
                  "required": false,
                  "description": "Can optionally do the operation in-place"
                }
              ]
            },
            "parentId": "encoder1"
          }
        },
        {
          "node_id": "encoder1.conv2",
          "kind": "layer",
          "op": "Conv2d",
          "params": {
            "kernel_size": 3
          },
          "in_ports": [
            "x"
          ],
          "out_ports": [
            "y"
          ],
          "metadata": {
            "layerType": {
              "id": "conv2d",
              "name": "Conv2d",
              "displayName": "Conv2D",
              "description": "2D Convolutional Layer",
              "icon": "Grid3X3",
              "category": "conv",
              "parameters": [
                {
                  "name": "in_channels",
                  "type": "number",
                  "defaultValue": 3,
                  "required": true,
                  "description": "Number of input channels",
                  "min": 1
                },
                {
                  "name": "out_channels",
                  "type": "number",
                  "defaultValue": 64,
                  "required": true,
                  "description": "Number of output channels",
                  "min": 1
                },
                {
                  "name": "kernel_size",
                  "type": "number",
                  "defaultValue": 3,
                  "required": true,
                  "description": "Size of the convolving kernel",
                  "min": 1
                },
                {
                  "name": "stride",
                  "type": "number",
                  "defaultValue": 1,
                  "required": false,
                  "description": "Stride of the convolution",
                  "min": 1
                },
                {
                  "name": "padding",
                  "type": "number",
                  "defaultValue": 0,
                  "required": false,
                  "description": "Zero-padding added to both sides",
                  "min": 0
                },
                {
                  "name": "dilation",
                  "type": "number",
                  "defaultValue": 1,
                  "required": false,
                  "description": "Spacing between kernel elements",
                  "min": 1
                },
                {
                  "name": "groups",
                  "type": "number",
                  "defaultValue": 1,
                  "required": false,
                  "description": "Number of blocked connections from input to output channels",
                  "min": 1
                },
                {
                  "name": "bias",
                  "type": "boolean",
                  "defaultValue": true,
                  "required": false,
                  "description": "If True, adds a learnable bias"
                }
              ]
            },
            "parentId": "encoder1"
          }
        },
        {
          "node_id": "encoder1.relu2",
          "kind": "layer",
          "op": "ReLU",
          "params": {},
          "in_ports": [
            "x"
          ],
          "out_ports": [
            "y"
          ],
          "metadata": {
            "layerType": {
              "id": "relu",
              "name": "ReLU",
              "displayName": "ReLU",
              "description": "Rectified Linear Unit",
              "icon": "TrendingUp",
              "category": "activation",
              "parameters": [
                {
                  "name": "inplace",
                  "type": "boolean",
                  "defaultValue": false,
                  "required": false,
                  "description": "Can optionally do the operation in-place"
                }
              ]
            },
            "parentId": "encoder1"
          }
        },
        {
          "node_id": "encoder2.conv1",
          "kind": "layer",
          "op": "Conv2d",
          "params": {
            "kernel_size": 3
          },
          "in_ports": [
            "x"
          ],
          "out_ports": [
            "y"
          ],
          "metadata": {
            "layerType": {
              "id": "conv2d",
              "name": "Conv2d",
              "displayName": "Conv2D",
              "description": "2D Convolutional Layer",
              "icon": "Grid3X3",
              "category": "conv",
              "parameters": [
                {
                  "name": "in_channels",
                  "type": "number",
                  "defaultValue": 3,
                  "required": true,
                  "description": "Number of input channels",
                  "min": 1
                },
                {
                  "name": "out_channels",
                  "type": "number",
                  "defaultValue": 64,
                  "required": true,
                  "description": "Number of output channels",
                  "min": 1
                },
                {
                  "name": "kernel_size",
                  "type": "number",
                  "defaultValue": 3,
                  "required": true,
                  "description": "Size of the convolving kernel",
                  "min": 1
                },
                {
                  "name": "stride",
                  "type": "number",
                  "defaultValue": 1,
                  "required": false,
                  "description": "Stride of the convolution",
                  "min": 1
                },
                {
                  "name": "padding",
                  "type": "number",
                  "defaultValue": 0,
                  "required": false,
                  "description": "Zero-padding added to both sides",
                  "min": 0
                },
                {
                  "name": "dilation",
                  "type": "number",
                  "defaultValue": 1,
                  "required": false,
                  "description": "Spacing between kernel elements",
                  "min": 1
                },
                {
                  "name": "groups",
                  "type": "number",
                  "defaultValue": 1,
                  "required": false,
                  "description": "Number of blocked connections from input to output channels",
                  "min": 1
                },
                {
                  "name": "bias",
                  "type": "boolean",
                  "defaultValue": true,
                  "required": false,
                  "description": "If True, adds a learnable bias"
                }
              ]
            },
            "parentId": "encoder2"
          }
        },
        {
          "node_id": "encoder2.relu1",
          "kind": "layer",
          "op": "ReLU",
          "params": {},
          "in_ports": [
            "x"
          ],
          "out_ports": [
            "y"
          ],
          "metadata": {
            "layerType": {
              "id": "relu",
              "name": "ReLU",
              "displayName": "ReLU",
              "description": "Rectified Linear Unit",
              "icon": "TrendingUp",
              "category": "activation",
              "parameters": [
                {
                  "name": "inplace",
                  "type": "boolean",
                  "defaultValue": false,
                  "required": false,
                  "description": "Can optionally do the operation in-place"
                }
              ]
            },
            "parentId": "encoder2"
          }
        },
        {
          "node_id": "encoder2.conv2",
          "kind": "layer",
          "op": "Conv2d",
          "params": {
            "kernel_size": 3
          },
          "in_ports": [
            "x"
          ],
          "out_ports": [
            "y"
          ],
          "metadata": {
            "layerType": {
              "id": "conv2d",
              "name": "Conv2d",
              "displayName": "Conv2D",
              "description": "2D Convolutional Layer",
              "icon": "Grid3X3",
              "category": "conv",
              "parameters": [
                {
                  "name": "in_channels",
                  "type": "number",
                  "defaultValue": 3,
                  "required": true,
                  "description": "Number of input channels",
                  "min": 1
                },
                {
                  "name": "out_channels",
                  "type": "number",
                  "defaultValue": 64,
                  "required": true,
                  "description": "Number of output channels",
                  "min": 1
                },
                {
                  "name": "kernel_size",
                  "type": "number",
                  "defaultValue": 3,
                  "required": true,
                  "description": "Size of the convolving kernel",
                  "min": 1
                },
                {
                  "name": "stride",
                  "type": "number",
                  "defaultValue": 1,
                  "required": false,
                  "description": "Stride of the convolution",
                  "min": 1
                },
                {
                  "name": "padding",
                  "type": "number",
                  "defaultValue": 0,
                  "required": false,
                  "description": "Zero-padding added to both sides",
                  "min": 0
                },
                {
                  "name": "dilation",
                  "type": "number",
                  "defaultValue": 1,
                  "required": false,
                  "description": "Spacing between kernel elements",
                  "min": 1
                },
                {
                  "name": "groups",
                  "type": "number",
                  "defaultValue": 1,
                  "required": false,
                  "description": "Number of blocked connections from input to output channels",
                  "min": 1
                },
                {
                  "name": "bias",
                  "type": "boolean",
                  "defaultValue": true,
                  "required": false,
                  "description": "If True, adds a learnable bias"
                }
              ]
            },
            "parentId": "encoder2"
          }
        },
        {
          "node_id": "encoder2.relu2",
          "kind": "layer",
          "op": "ReLU",
          "params": {},
          "in_ports": [
            "x"
          ],
          "out_ports": [
            "y"
          ],
          "metadata": {
            "layerType": {
              "id": "relu",
              "name": "ReLU",
              "displayName": "ReLU",
              "description": "Rectified Linear Unit",
              "icon": "TrendingUp",
              "category": "activation",
              "parameters": [
                {
                  "name": "inplace",
                  "type": "boolean",
                  "defaultValue": false,
                  "required": false,
                  "description": "Can optionally do the operation in-place"
                }
              ]
            },
            "parentId": "encoder2"
          }
        },
        {
          "node_id": "bottleneck.conv1",
          "kind": "layer",
          "op": "Conv2d",
          "params": {
            "kernel_size": 3
          },
          "in_ports": [
            "x"
          ],
          "out_ports": [
            "y"
          ],
          "metadata": {
            "layerType": {
              "id": "conv2d",
              "name": "Conv2d",
              "displayName": "Conv2D",
              "description": "2D Convolutional Layer",
              "icon": "Grid3X3",
              "category": "conv",
              "parameters": [
                {
                  "name": "in_channels",
                  "type": "number",
                  "defaultValue": 3,
                  "required": true,
                  "description": "Number of input channels",
                  "min": 1
                },
                {
                  "name": "out_channels",
                  "type": "number",
                  "defaultValue": 64,
                  "required": true,
                  "description": "Number of output channels",
                  "min": 1
                },
                {
                  "name": "kernel_size",
                  "type": "number",
                  "defaultValue": 3,
                  "required": true,
                  "description": "Size of the convolving kernel",
                  "min": 1
                },
                {
                  "name": "stride",
                  "type": "number",
                  "defaultValue": 1,
                  "required": false,
                  "description": "Stride of the convolution",
                  "min": 1
                },
                {
                  "name": "padding",
                  "type": "number",
                  "defaultValue": 0,
                  "required": false,
                  "description": "Zero-padding added to both sides",
                  "min": 0
                },
                {
                  "name": "dilation",
                  "type": "number",
                  "defaultValue": 1,
                  "required": false,
                  "description": "Spacing between kernel elements",
                  "min": 1
                },
                {
                  "name": "groups",
                  "type": "number",
                  "defaultValue": 1,
                  "required": false,
                  "description": "Number of blocked connections from input to output channels",
                  "min": 1
                },
                {
                  "name": "bias",
                  "type": "boolean",
                  "defaultValue": true,
                  "required": false,
                  "description": "If True, adds a learnable bias"
                }
              ]
            },
            "parentId": "bottleneck"
          }
        },
        {
          "node_id": "bottleneck.relu1",
          "kind": "layer",
          "op": "ReLU",
          "params": {},
          "in_ports": [
            "x"
          ],
          "out_ports": [
            "y"
          ],
          "metadata": {
            "layerType": {
              "id": "relu",
              "name": "ReLU",
              "displayName": "ReLU",
              "description": "Rectified Linear Unit",
              "icon": "TrendingUp",
              "category": "activation",
              "parameters": [
                {
                  "name": "inplace",
                  "type": "boolean",
                  "defaultValue": false,
                  "required": false,
                  "description": "Can optionally do the operation in-place"
                }
              ]
            },
            "parentId": "bottleneck"
          }
        },
        {
          "node_id": "bottleneck.conv2",
          "kind": "layer",
          "op": "Conv2d",
          "params": {
            "kernel_size": 3
          },
          "in_ports": [
            "x"
          ],
          "out_ports": [
            "y"
          ],
          "metadata": {
            "layerType": {
              "id": "conv2d",
              "name": "Conv2d",
              "displayName": "Conv2D",
              "description": "2D Convolutional Layer",
              "icon": "Grid3X3",
              "category": "conv",
              "parameters": [
                {
                  "name": "in_channels",
                  "type": "number",
                  "defaultValue": 3,
                  "required": true,
                  "description": "Number of input channels",
                  "min": 1
                },
                {
                  "name": "out_channels",
                  "type": "number",
                  "defaultValue": 64,
                  "required": true,
                  "description": "Number of output channels",
                  "min": 1
                },
                {
                  "name": "kernel_size",
                  "type": "number",
                  "defaultValue": 3,
                  "required": true,
                  "description": "Size of the convolving kernel",
                  "min": 1
                },
                {
                  "name": "stride",
                  "type": "number",
                  "defaultValue": 1,
                  "required": false,
                  "description": "Stride of the convolution",
                  "min": 1
                },
                {
                  "name": "padding",
                  "type": "number",
                  "defaultValue": 0,
                  "required": false,
                  "description": "Zero-padding added to both sides",
                  "min": 0
                },
                {
                  "name": "dilation",
                  "type": "number",
                  "defaultValue": 1,
                  "required": false,
                  "description": "Spacing between kernel elements",
                  "min": 1
                },
                {
                  "name": "groups",
                  "type": "number",
                  "defaultValue": 1,
                  "required": false,
                  "description": "Number of blocked connections from input to output channels",
                  "min": 1
                },
                {
                  "name": "bias",
                  "type": "boolean",
                  "defaultValue": true,
                  "required": false,
                  "description": "If True, adds a learnable bias"
                }
              ]
            },
            "parentId": "bottleneck"
          }
        },
        {
          "node_id": "bottleneck.relu2",
          "kind": "layer",
          "op": "ReLU",
          "params": {},
          "in_ports": [
            "x"
          ],
          "out_ports": [
            "y"
          ],
          "metadata": {
            "layerType": {
              "id": "relu",
              "name": "ReLU",
              "displayName": "ReLU",
              "description": "Rectified Linear Unit",
              "icon": "TrendingUp",
              "category": "activation",
              "parameters": [
                {
                  "name": "inplace",
                  "type": "boolean",
                  "defaultValue": false,
                  "required": false,
                  "description": "Can optionally do the operation in-place"
                }
              ]
            },
            "parentId": "bottleneck"
          }
        },
        {
          "node_id": "cat@join2#0",
          "kind": "layer",
          "op": "torch.cat",
          "params": {
            "dim": 1
          },
          "in_ports": [
            "x"
          ],
          "out_ports": [
            "y"
          ],
          "metadata": {
            "layerType": {
              "id": "cat",
              "name": "torch.cat",
              "displayName": "torch.cat",
              "description": "PyTorch cat operation",
              "icon": "Activity",
              "category": "tensor",
              "parameters": [
                {
                  "name": "dim",
                  "type": "string",
                  "defaultValue": "",
                  "required": false,
                  "description": "Dimension(s) to apply the operation on"
                }
              ]
            },
            "parentId": "join2"
          }
        },
        {
          "node_id": "decoder2.conv1",
          "kind": "layer",
          "op": "Conv2d",
          "params": {
            "kernel_size": 3
          },
          "in_ports": [
            "x"
          ],
          "out_ports": [
            "y"
          ],
          "metadata": {
            "layerType": {
              "id": "conv2d",
              "name": "Conv2d",
              "displayName": "Conv2D",
              "description": "2D Convolutional Layer",
              "icon": "Grid3X3",
              "category": "conv",
              "parameters": [
                {
                  "name": "in_channels",
                  "type": "number",
                  "defaultValue": 3,
                  "required": true,
                  "description": "Number of input channels",
                  "min": 1
                },
                {
                  "name": "out_channels",
                  "type": "number",
                  "defaultValue": 64,
                  "required": true,
                  "description": "Number of output channels",
                  "min": 1
                },
                {
                  "name": "kernel_size",
                  "type": "number",
                  "defaultValue": 3,
                  "required": true,
                  "description": "Size of the convolving kernel",
                  "min": 1
                },
                {
                  "name": "stride",
                  "type": "number",
                  "defaultValue": 1,
                  "required": false,
                  "description": "Stride of the convolution",
                  "min": 1
                },
                {
                  "name": "padding",
                  "type": "number",
                  "defaultValue": 0,
                  "required": false,
                  "description": "Zero-padding added to both sides",
                  "min": 0
                },
                {
                  "name": "dilation",
                  "type": "number",
                  "defaultValue": 1,
                  "required": false,
                  "description": "Spacing between kernel elements",
                  "min": 1
                },
                {
                  "name": "groups",
                  "type": "number",
                  "defaultValue": 1,
                  "required": false,
                  "description": "Number of blocked connections from input to output channels",
                  "min": 1
                },
                {
                  "name": "bias",
                  "type": "boolean",
                  "defaultValue": true,
                  "required": false,
                  "description": "If True, adds a learnable bias"
                }
              ]
            },
            "parentId": "decoder2"
          }
        },
        {
          "node_id": "decoder2.relu1",
          "kind": "layer",
          "op": "ReLU",
          "params": {},
          "in_ports": [
            "x"
          ],
          "out_ports": [
            "y"
          ],
          "metadata": {
            "layerType": {
              "id": "relu",
              "name": "ReLU",
              "displayName": "ReLU",
              "description": "Rectified Linear Unit",
              "icon": "TrendingUp",
              "category": "activation",
              "parameters": [
                {
                  "name": "inplace",
                  "type": "boolean",
                  "defaultValue": false,
                  "required": false,
                  "description": "Can optionally do the operation in-place"
                }
              ]
            },
            "parentId": "decoder2"
          }
        },
        {
          "node_id": "decoder2.conv2",
          "kind": "layer",
          "op": "Conv2d",
          "params": {
            "kernel_size": 3
          },
          "in_ports": [
            "x"
          ],
          "out_ports": [
            "y"
          ],
          "metadata": {
            "layerType": {
              "id": "conv2d",
              "name": "Conv2d",
              "displayName": "Conv2D",
              "description": "2D Convolutional Layer",
              "icon": "Grid3X3",
              "category": "conv",
              "parameters": [
                {
                  "name": "in_channels",
                  "type": "number",
                  "defaultValue": 3,
                  "required": true,
                  "description": "Number of input channels",
                  "min": 1
                },
                {
                  "name": "out_channels",
                  "type": "number",
                  "defaultValue": 64,
                  "required": true,
                  "description": "Number of output channels",
                  "min": 1
                },
                {
                  "name": "kernel_size",
                  "type": "number",
                  "defaultValue": 3,
                  "required": true,
                  "description": "Size of the convolving kernel",
                  "min": 1
                },
                {
                  "name": "stride",
                  "type": "number",
                  "defaultValue": 1,
                  "required": false,
                  "description": "Stride of the convolution",
                  "min": 1
                },
                {
                  "name": "padding",
                  "type": "number",
                  "defaultValue": 0,
                  "required": false,
                  "description": "Zero-padding added to both sides",
                  "min": 0
                },
                {
                  "name": "dilation",
                  "type": "number",
                  "defaultValue": 1,
                  "required": false,
                  "description": "Spacing between kernel elements",
                  "min": 1
                },
                {
                  "name": "groups",
                  "type": "number",
                  "defaultValue": 1,
                  "required": false,
                  "description": "Number of blocked connections from input to output channels",
                  "min": 1
                },
                {
                  "name": "bias",
                  "type": "boolean",
                  "defaultValue": true,
                  "required": false,
                  "description": "If True, adds a learnable bias"
                }
              ]
            },
            "parentId": "decoder2"
          }
        },
        {
          "node_id": "decoder2.relu2",
          "kind": "layer",
          "op": "ReLU",
          "params": {},
          "in_ports": [
            "x"
          ],
          "out_ports": [
            "y"
          ],
          "metadata": {
            "layerType": {
              "id": "relu",
              "name": "ReLU",
              "displayName": "ReLU",
              "description": "Rectified Linear Unit",
              "icon": "TrendingUp",
              "category": "activation",
              "parameters": [
                {
                  "name": "inplace",
                  "type": "boolean",
                  "defaultValue": false,
                  "required": false,
                  "description": "Can optionally do the operation in-place"
                }
              ]
            },
            "parentId": "decoder2"
          }
        },
        {
          "node_id": "cat@join1#0",
          "kind": "layer",
          "op": "torch.cat",
          "params": {
            "dim": 1
          },
          "in_ports": [
            "x"
          ],
          "out_ports": [
            "y"
          ],
          "metadata": {
            "layerType": {
              "id": "cat",
              "name": "torch.cat",
              "displayName": "torch.cat",
              "description": "PyTorch cat operation",
              "icon": "Activity",
              "category": "tensor",
              "parameters": [
                {
                  "name": "dim",
                  "type": "string",
                  "defaultValue": "",
                  "required": false,
                  "description": "Dimension(s) to apply the operation on"
                }
              ]
            },
            "parentId": "join1"
          }
        },
        {
          "node_id": "decoder1.conv1",
          "kind": "layer",
          "op": "Conv2d",
          "params": {
            "kernel_size": 3
          },
          "in_ports": [
            "x"
          ],
          "out_ports": [
            "y"
          ],
          "metadata": {
            "layerType": {
              "id": "conv2d",
              "name": "Conv2d",
              "displayName": "Conv2D",
              "description": "2D Convolutional Layer",
              "icon": "Grid3X3",
              "category": "conv",
              "parameters": [
                {
                  "name": "in_channels",
                  "type": "number",
                  "defaultValue": 3,
                  "required": true,
                  "description": "Number of input channels",
                  "min": 1
                },
                {
                  "name": "out_channels",
                  "type": "number",
                  "defaultValue": 64,
                  "required": true,
                  "description": "Number of output channels",
                  "min": 1
                },
                {
                  "name": "kernel_size",
                  "type": "number",
                  "defaultValue": 3,
                  "required": true,
                  "description": "Size of the convolving kernel",
                  "min": 1
                },
                {
                  "name": "stride",
                  "type": "number",
                  "defaultValue": 1,
                  "required": false,
                  "description": "Stride of the convolution",
                  "min": 1
                },
                {
                  "name": "padding",
                  "type": "number",
                  "defaultValue": 0,
                  "required": false,
                  "description": "Zero-padding added to both sides",
                  "min": 0
                },
                {
                  "name": "dilation",
                  "type": "number",
                  "defaultValue": 1,
                  "required": false,
                  "description": "Spacing between kernel elements",
                  "min": 1
                },
                {
                  "name": "groups",
                  "type": "number",
                  "defaultValue": 1,
                  "required": false,
                  "description": "Number of blocked connections from input to output channels",
                  "min": 1
                },
                {
                  "name": "bias",
                  "type": "boolean",
                  "defaultValue": true,
                  "required": false,
                  "description": "If True, adds a learnable bias"
                }
              ]
            },
            "parentId": "decoder1"
          }
        },
        {
          "node_id": "decoder1.relu1",
          "kind": "layer",
          "op": "ReLU",
          "params": {},
          "in_ports": [
            "x"
          ],
          "out_ports": [
            "y"
          ],
          "metadata": {
            "layerType": {
              "id": "relu",
              "name": "ReLU",
              "displayName": "ReLU",
              "description": "Rectified Linear Unit",
              "icon": "TrendingUp",
              "category": "activation",
              "parameters": [
                {
                  "name": "inplace",
                  "type": "boolean",
                  "defaultValue": false,
                  "required": false,
                  "description": "Can optionally do the operation in-place"
                }
              ]
            },
            "parentId": "decoder1"
          }
        },
        {
          "node_id": "decoder1.conv2",
          "kind": "layer",
          "op": "Conv2d",
          "params": {
            "kernel_size": 3
          },
          "in_ports": [
            "x"
          ],
          "out_ports": [
            "y"
          ],
          "metadata": {
            "layerType": {
              "id": "conv2d",
              "name": "Conv2d",
              "displayName": "Conv2D",
              "description": "2D Convolutional Layer",
              "icon": "Grid3X3",
              "category": "conv",
              "parameters": [
                {
                  "name": "in_channels",
                  "type": "number",
                  "defaultValue": 3,
                  "required": true,
                  "description": "Number of input channels",
                  "min": 1
                },
                {
                  "name": "out_channels",
                  "type": "number",
                  "defaultValue": 64,
                  "required": true,
                  "description": "Number of output channels",
                  "min": 1
                },
                {
                  "name": "kernel_size",
                  "type": "number",
                  "defaultValue": 3,
                  "required": true,
                  "description": "Size of the convolving kernel",
                  "min": 1
                },
                {
                  "name": "stride",
                  "type": "number",
                  "defaultValue": 1,
                  "required": false,
                  "description": "Stride of the convolution",
                  "min": 1
                },
                {
                  "name": "padding",
                  "type": "number",
                  "defaultValue": 0,
                  "required": false,
                  "description": "Zero-padding added to both sides",
                  "min": 0
                },
                {
                  "name": "dilation",
                  "type": "number",
                  "defaultValue": 1,
                  "required": false,
                  "description": "Spacing between kernel elements",
                  "min": 1
                },
                {
                  "name": "groups",
                  "type": "number",
                  "defaultValue": 1,
                  "required": false,
                  "description": "Number of blocked connections from input to output channels",
                  "min": 1
                },
                {
                  "name": "bias",
                  "type": "boolean",
                  "defaultValue": true,
                  "required": false,
                  "description": "If True, adds a learnable bias"
                }
              ]
            },
            "parentId": "decoder1"
          }
        },
        {
          "node_id": "decoder1.relu2",
          "kind": "layer",
          "op": "ReLU",
          "params": {},
          "in_ports": [
            "x"
          ],
          "out_ports": [
            "y"
          ],
          "metadata": {
            "layerType": {
              "id": "relu",
              "name": "ReLU",
              "displayName": "ReLU",
              "description": "Rectified Linear Unit",
              "icon": "TrendingUp",
              "category": "activation",
              "parameters": [
                {
                  "name": "inplace",
                  "type": "boolean",
                  "defaultValue": false,
                  "required": false,
                  "description": "Can optionally do the operation in-place"
                }
              ]
            },
            "parentId": "decoder1"
          }
        }
      ],
      "edges": [
        {
          "edge_id": "edge-1",
          "source_node_id": "encoder1.conv1",
          "target_node_id": "encoder1.relu1",
          "source_port": "y",
          "target_port": "x",
          "metadata": {}
        },
        {
          "edge_id": "edge-2",
          "source_node_id": "encoder1.relu1",
          "target_node_id": "encoder1.conv2",
          "source_port": "y",
          "target_port": "x",
          "metadata": {}
        },
        {
          "edge_id": "edge-3",
          "source_node_id": "encoder1.conv2",
          "target_node_id": "encoder1.relu2",
          "source_port": "y",
          "target_port": "x",
          "metadata": {}
        },
        {
          "edge_id": "edge-4",
          "source_node_id": "encoder2.conv1",
          "target_node_id": "encoder2.relu1",
          "source_port": "y",
          "target_port": "x",
          "metadata": {}
        },
        {
          "edge_id": "edge-5",
          "source_node_id": "encoder2.relu1",
          "target_node_id": "encoder2.conv2",
          "source_port": "y",
          "target_port": "x",
          "metadata": {}
        },
        {
          "edge_id": "edge-6",
          "source_node_id": "encoder2.conv2",
          "target_node_id": "encoder2.relu2",
          "source_port": "y",
          "target_port": "x",
          "metadata": {}
        },
        {
          "edge_id": "edge-7",
          "source_node_id": "bottleneck.conv1",
          "target_node_id": "bottleneck.relu1",
          "source_port": "y",
          "target_port": "x",
          "metadata": {}
        },
        {
          "edge_id": "edge-8",
          "source_node_id": "bottleneck.relu1",
          "target_node_id": "bottleneck.conv2",
          "source_port": "y",
          "target_port": "x",
          "metadata": {}
        },
        {
          "edge_id": "edge-9",
          "source_node_id": "bottleneck.conv2",
          "target_node_id": "bottleneck.relu2",
          "source_port": "y",
          "target_port": "x",
          "metadata": {}
        },
        {
          "edge_id": "edge-10",
          "source_node_id": "decoder2.conv1",
          "target_node_id": "decoder2.relu1",
          "source_port": "y",
          "target_port": "x",
          "metadata": {}
        },
        {
          "edge_id": "edge-11",
          "source_node_id": "decoder2.relu1",
          "target_node_id": "decoder2.conv2",
          "source_port": "y",
          "target_port": "x",
          "metadata": {}
        },
        {
          "edge_id": "edge-12",
          "source_node_id": "decoder2.conv2",
          "target_node_id": "decoder2.relu2",
          "source_port": "y",
          "target_port": "x",
          "metadata": {}
        },
        {
          "edge_id": "edge-13",
          "source_node_id": "decoder1.conv1",
          "target_node_id": "decoder1.relu1",
          "source_port": "y",
          "target_port": "x",
          "metadata": {}
        },
        {
          "edge_id": "edge-14",
          "source_node_id": "decoder1.relu1",
          "target_node_id": "decoder1.conv2",
          "source_port": "y",
          "target_port": "x",
          "metadata": {}
        },
        {
          "edge_id": "edge-15",
          "source_node_id": "decoder1.conv2",
          "target_node_id": "decoder1.relu2",
          "source_port": "y",
          "target_port": "x",
          "metadata": {}
        },
        {
          "edge_id": "edge-16",
          "source_node_id": "input",
          "target_node_id": "encoder1.conv1",
          "source_port": "y",
          "target_port": "x",
          "metadata": {}
        },
        {
          "edge_id": "edge-17",
          "source_node_id": "input",
          "target_node_id": "encoder1",
          "source_port": "y",
          "target_port": "x",
          "metadata": {}
        },
        {
          "edge_id": "edge-18",
          "source_node_id": "encoder1.relu2",
          "target_node_id": "pool1",
          "source_port": "y",
          "target_port": "x",
          "metadata": {}
        },
        {
          "edge_id": "edge-19",
          "source_node_id": "encoder1",
          "target_node_id": "pool1",
          "source_port": "y",
          "target_port": "x",
          "metadata": {}
        },
        {
          "edge_id": "edge-20",
          "source_node_id": "pool1",
          "target_node_id": "encoder2.conv1",
          "source_port": "y",
          "target_port": "x",
          "metadata": {}
        },
        {
          "edge_id": "edge-21",
          "source_node_id": "pool1",
          "target_node_id": "encoder2",
          "source_port": "y",
          "target_port": "x",
          "metadata": {}
        },
        {
          "edge_id": "edge-22",
          "source_node_id": "encoder2.relu2",
          "target_node_id": "pool2",
          "source_port": "y",
          "target_port": "x",
          "metadata": {}
        },
        {
          "edge_id": "edge-23",
          "source_node_id": "encoder2",
          "target_node_id": "pool2",
          "source_port": "y",
          "target_port": "x",
          "metadata": {}
        },
        {
          "edge_id": "edge-24",
          "source_node_id": "pool2",
          "target_node_id": "bottleneck.conv1",
          "source_port": "y",
          "target_port": "x",
          "metadata": {}
        },
        {
          "edge_id": "edge-25",
          "source_node_id": "pool2",
          "target_node_id": "bottleneck",
          "source_port": "y",
          "target_port": "x",
          "metadata": {}
        },
        {
          "edge_id": "edge-26",
          "source_node_id": "bottleneck.relu2",
          "target_node_id": "up2",
          "source_port": "y",
          "target_port": "x",
          "metadata": {}
        },
        {
          "edge_id": "edge-27",
          "source_node_id": "bottleneck",
          "target_node_id": "up2",
          "source_port": "y",
          "target_port": "x",
          "metadata": {}
        },
        {
          "edge_id": "edge-28",
          "source_node_id": "up2",
          "target_node_id": "cat@join2#0",
          "source_port": "y",
          "target_port": "x",
          "metadata": {}
        },
        {
          "edge_id": "edge-29",
          "source_node_id": "up2",
          "target_node_id": "join2",
          "source_port": "y",
          "target_port": "x",
          "metadata": {}
        },
        {
          "edge_id": "edge-30",
          "source_node_id": "encoder2.relu2",
          "target_node_id": "cat@join2#0",
          "source_port": "y",
          "target_port": "x",
          "metadata": {}
        },
        {
          "edge_id": "edge-31",
          "source_node_id": "encoder2",
          "target_node_id": "join2",
          "source_port": "y",
          "target_port": "x",
          "metadata": {}
        },
        {
          "edge_id": "edge-32",
          "source_node_id": "cat@join2#0",
          "target_node_id": "decoder2.conv1",
          "source_port": "y",
          "target_port": "x",
          "metadata": {}
        },
        {
          "edge_id": "edge-33",
          "source_node_id": "join2",
          "target_node_id": "decoder2",
          "source_port": "y",
          "target_port": "x",
          "metadata": {}
        },
        {
          "edge_id": "edge-34",
          "source_node_id": "decoder2.relu2",
          "target_node_id": "up1",
          "source_port": "y",
          "target_port": "x",
          "metadata": {}
        },
        {
          "edge_id": "edge-35",
          "source_node_id": "decoder2",
          "target_node_id": "up1",
          "source_port": "y",
          "target_port": "x",
          "metadata": {}
        },
        {
          "edge_id": "edge-36",
          "source_node_id": "up1",
          "target_node_id": "cat@join1#0",
          "source_port": "y",
          "target_port": "x",
          "metadata": {}
        },
        {
          "edge_id": "edge-37",
          "source_node_id": "up1",
          "target_node_id": "join1",
          "source_port": "y",
          "target_port": "x",
          "metadata": {}
        },
        {
          "edge_id": "edge-38",
          "source_node_id": "encoder1.relu2",
          "target_node_id": "cat@join1#0",
          "source_port": "y",
          "target_port": "x",
          "metadata": {}
        },
        {
          "edge_id": "edge-39",
          "source_node_id": "encoder1",
          "target_node_id": "join1",
          "source_port": "y",
          "target_port": "x",
          "metadata": {}
        },
        {
          "edge_id": "edge-40",
          "source_node_id": "cat@join1#0",
          "target_node_id": "decoder1.conv1",
          "source_port": "y",
          "target_port": "x",
          "metadata": {}
        },
        {
          "edge_id": "edge-41",
          "source_node_id": "join1",
          "target_node_id": "decoder1",
          "source_port": "y",
          "target_port": "x",
          "metadata": {}
        },
        {
          "edge_id": "edge-42",
          "source_node_id": "decoder1.relu2",
          "target_node_id": "mask_head",
          "source_port": "y",
          "target_port": "x",
          "metadata": {}
        },
        {
          "edge_id": "edge-43",
          "source_node_id": "decoder1",
          "target_node_id": "mask_head",
          "source_port": "y",
          "target_port": "x",
          "metadata": {}
        },
        {
          "edge_id": "edge-44",
          "source_node_id": "mask_head",
          "target_node_id": "output",
          "source_port": "y",
          "target_port": "x",
          "metadata": {}
        }
      ],
      "inputs": [],
      "modules": [],
      "operations": [],
      "metadata": {}
    },
    "view": {
      "graph_id": "snapshot",
      "node_positions": {
        "input": {
          "x": 0,
          "y": 0
        },
        "encoder1": {
          "x": 340,
          "y": 0
        },
        "pool1": {
          "x": 340,
          "y": 320
        },
        "encoder2": {
          "x": 340,
          "y": 640
        },
        "pool2": {
          "x": 340,
          "y": 960
        },
        "bottleneck": {
          "x": 800,
          "y": 1280
        },
        "up2": {
          "x": 1260,
          "y": 960
        },
        "join2": {
          "x": 1260,
          "y": 640
        },
        "decoder2": {
          "x": 1600,
          "y": 640
        },
        "up1": {
          "x": 1600,
          "y": 320
        },
        "join1": {
          "x": 1600,
          "y": 0
        },
        "decoder1": {
          "x": 1940,
          "y": 0
        },
        "mask_head": {
          "x": 2280,
          "y": 0
        },
        "output": {
          "x": 2620,
          "y": 0
        },
        "encoder1.conv1": {
          "x": 24,
          "y": 214
        },
        "encoder1.relu1": {
          "x": 24,
          "y": 364
        },
        "encoder1.conv2": {
          "x": 24,
          "y": 514
        },
        "encoder1.relu2": {
          "x": 24,
          "y": 664
        },
        "encoder2.conv1": {
          "x": 24,
          "y": 214
        },
        "encoder2.relu1": {
          "x": 24,
          "y": 364
        },
        "encoder2.conv2": {
          "x": 24,
          "y": 514
        },
        "encoder2.relu2": {
          "x": 24,
          "y": 664
        },
        "bottleneck.conv1": {
          "x": 24,
          "y": 214
        },
        "bottleneck.relu1": {
          "x": 24,
          "y": 364
        },
        "bottleneck.conv2": {
          "x": 24,
          "y": 514
        },
        "bottleneck.relu2": {
          "x": 24,
          "y": 664
        },
        "cat@join2#0": {
          "x": 24,
          "y": 214
        },
        "decoder2.conv1": {
          "x": 24,
          "y": 214
        },
        "decoder2.relu1": {
          "x": 24,
          "y": 364
        },
        "decoder2.conv2": {
          "x": 24,
          "y": 514
        },
        "decoder2.relu2": {
          "x": 24,
          "y": 664
        },
        "cat@join1#0": {
          "x": 24,
          "y": 214
        },
        "decoder1.conv1": {
          "x": 24,
          "y": 214
        },
        "decoder1.relu1": {
          "x": 24,
          "y": 364
        },
        "decoder1.conv2": {
          "x": 24,
          "y": 514
        },
        "decoder1.relu2": {
          "x": 24,
          "y": 664
        }
      },
      "collapsed_modules": [
        "encoder1",
        "encoder2",
        "bottleneck",
        "join2",
        "decoder2",
        "join1",
        "decoder1"
      ],
      "selection": [],
      "layout": {}
    }
  },
  "snapshotId": "snapshot-5cccc7c57ae7c503",
  "collaboration": {
    "walkthrough": {
      "title": "Bring spatial detail back into the decoder",
      "steps": [
        {
          "id": "contract",
          "title": "Contract spatial resolution",
          "note": "Two valid convolutions first shrink the input from 96 to 92 pixels. A 2×2 max pool halves that width to 46. The encoder retains its 92×92 features for the later high-resolution skip.",
          "view": {
            "camera": {
              "x": -7.5,
              "y": -100,
              "z": 1.25
            },
            "nodePositions": {
              "input": {
                "x": 0,
                "y": 0
              },
              "encoder1": {
                "x": 340,
                "y": 0
              },
              "pool1": {
                "x": 340,
                "y": 320
              },
              "encoder2": {
                "x": 340,
                "y": 640
              },
              "pool2": {
                "x": 340,
                "y": 960
              },
              "bottleneck": {
                "x": 800,
                "y": 1280
              },
              "up2": {
                "x": 1260,
                "y": 960
              },
              "join2": {
                "x": 1260,
                "y": 640
              },
              "decoder2": {
                "x": 1600,
                "y": 640
              },
              "up1": {
                "x": 1600,
                "y": 320
              },
              "join1": {
                "x": 1600,
                "y": 0
              },
              "decoder1": {
                "x": 1940,
                "y": 0
              },
              "mask_head": {
                "x": 2280,
                "y": 0
              },
              "output": {
                "x": 2620,
                "y": 0
              },
              "encoder1.conv1": {
                "x": 24,
                "y": 214
              },
              "encoder1.relu1": {
                "x": 24,
                "y": 364
              },
              "encoder1.conv2": {
                "x": 24,
                "y": 514
              },
              "encoder1.relu2": {
                "x": 24,
                "y": 664
              },
              "encoder2.conv1": {
                "x": 24,
                "y": 214
              },
              "encoder2.relu1": {
                "x": 24,
                "y": 364
              },
              "encoder2.conv2": {
                "x": 24,
                "y": 514
              },
              "encoder2.relu2": {
                "x": 24,
                "y": 664
              },
              "bottleneck.conv1": {
                "x": 24,
                "y": 214
              },
              "bottleneck.relu1": {
                "x": 24,
                "y": 364
              },
              "bottleneck.conv2": {
                "x": 24,
                "y": 514
              },
              "bottleneck.relu2": {
                "x": 24,
                "y": 664
              },
              "cat@join2#0": {
                "x": 24,
                "y": 214
              },
              "decoder2.conv1": {
                "x": 24,
                "y": 214
              },
              "decoder2.relu1": {
                "x": 24,
                "y": 364
              },
              "decoder2.conv2": {
                "x": 24,
                "y": 514
              },
              "decoder2.relu2": {
                "x": 24,
                "y": 664
              },
              "cat@join1#0": {
                "x": 24,
                "y": 214
              },
              "decoder1.conv1": {
                "x": 24,
                "y": 214
              },
              "decoder1.relu1": {
                "x": 24,
                "y": 364
              },
              "decoder1.conv2": {
                "x": 24,
                "y": 514
              },
              "decoder1.relu2": {
                "x": 24,
                "y": 664
              }
            },
            "expandedModuleIds": [],
            "selectedNodeIds": [
              "pool1"
            ],
            "viewport": {
              "width": 1100,
              "height": 700
            }
          },
          "anchors": [
            {
              "target": {
                "kind": "node",
                "nodeId": "pool1"
              },
              "snapshotId": "snapshot-5cccc7c57ae7c503",
              "exportedAt": "2026-09-17T06:18:45.955001+00:00",
              "modelName": "TinyUNet",
              "context": "{\"connections\":[\"{\\\"kind\\\":\\\"edge\\\",\\\"source\\\":\\\"encoder1\\\",\\\"sourcePort\\\":\\\"y\\\",\\\"target\\\":\\\"pool1\\\",\\\"targetPort\\\":\\\"x\\\"}\",\"{\\\"kind\\\":\\\"edge\\\",\\\"source\\\":\\\"encoder1.relu2\\\",\\\"sourcePort\\\":\\\"y\\\",\\\"target\\\":\\\"pool1\\\",\\\"targetPort\\\":\\\"x\\\"}\",\"{\\\"kind\\\":\\\"edge\\\",\\\"source\\\":\\\"pool1\\\",\\\"sourcePort\\\":\\\"y\\\",\\\"target\\\":\\\"encoder2\\\",\\\"targetPort\\\":\\\"x\\\"}\",\"{\\\"kind\\\":\\\"edge\\\",\\\"source\\\":\\\"pool1\\\",\\\"sourcePort\\\":\\\"y\\\",\\\"target\\\":\\\"encoder2.conv1\\\",\\\"targetPort\\\":\\\"x\\\"}\"],\"contents\":[],\"node\":{\"id\":\"pool1\",\"kind\":\"layer\",\"op\":\"MaxPool2d\",\"params\":{\"kernel_size\":2}}}"
            }
          ]
        },
        {
          "id": "bridge",
          "title": "Build context at the lowest resolution",
          "note": "After another encoder and pooling stage, the bottleneck has 16 channels at 17×17. Upsampling doubles the width to 34 before it meets the first cropped skip.",
          "view": {
            "camera": {
              "x": -196.9230769230769,
              "y": -1190.041958041958,
              "z": 0.7114427860696517
            },
            "nodePositions": {
              "input": {
                "x": 0,
                "y": 0
              },
              "encoder1": {
                "x": 340,
                "y": 0
              },
              "pool1": {
                "x": 340,
                "y": 320
              },
              "encoder2": {
                "x": 340,
                "y": 640
              },
              "pool2": {
                "x": 340,
                "y": 960
              },
              "bottleneck": {
                "x": 800,
                "y": 1280
              },
              "up2": {
                "x": 1260,
                "y": 960
              },
              "join2": {
                "x": 1260,
                "y": 640
              },
              "decoder2": {
                "x": 1600,
                "y": 640
              },
              "up1": {
                "x": 1600,
                "y": 320
              },
              "join1": {
                "x": 1600,
                "y": 0
              },
              "decoder1": {
                "x": 1940,
                "y": 0
              },
              "mask_head": {
                "x": 2280,
                "y": 0
              },
              "output": {
                "x": 2620,
                "y": 0
              },
              "encoder1.conv1": {
                "x": 24,
                "y": 214
              },
              "encoder1.relu1": {
                "x": 24,
                "y": 364
              },
              "encoder1.conv2": {
                "x": 24,
                "y": 514
              },
              "encoder1.relu2": {
                "x": 24,
                "y": 664
              },
              "encoder2.conv1": {
                "x": 24,
                "y": 214
              },
              "encoder2.relu1": {
                "x": 24,
                "y": 364
              },
              "encoder2.conv2": {
                "x": 24,
                "y": 514
              },
              "encoder2.relu2": {
                "x": 24,
                "y": 664
              },
              "bottleneck.conv1": {
                "x": 24,
                "y": 214
              },
              "bottleneck.relu1": {
                "x": 24,
                "y": 364
              },
              "bottleneck.conv2": {
                "x": 24,
                "y": 514
              },
              "bottleneck.relu2": {
                "x": 24,
                "y": 664
              },
              "cat@join2#0": {
                "x": 24,
                "y": 214
              },
              "decoder2.conv1": {
                "x": 24,
                "y": 214
              },
              "decoder2.relu1": {
                "x": 24,
                "y": 364
              },
              "decoder2.conv2": {
                "x": 24,
                "y": 514
              },
              "decoder2.relu2": {
                "x": 24,
                "y": 664
              },
              "cat@join1#0": {
                "x": 24,
                "y": 214
              },
              "decoder1.conv1": {
                "x": 24,
                "y": 214
              },
              "decoder1.relu1": {
                "x": 24,
                "y": 364
              },
              "decoder1.conv2": {
                "x": 24,
                "y": 514
              },
              "decoder1.relu2": {
                "x": 24,
                "y": 664
              }
            },
            "expandedModuleIds": [
              "bottleneck"
            ],
            "selectedNodeIds": [
              "bottleneck"
            ],
            "viewport": {
              "width": 1100,
              "height": 700
            }
          },
          "anchors": [
            {
              "target": {
                "kind": "node",
                "nodeId": "bottleneck"
              },
              "snapshotId": "snapshot-5cccc7c57ae7c503",
              "exportedAt": "2026-09-17T06:18:45.955001+00:00",
              "modelName": "TinyUNet",
              "context": "{\"connections\":[\"{\\\"kind\\\":\\\"edge\\\",\\\"source\\\":\\\"bottleneck\\\",\\\"sourcePort\\\":\\\"y\\\",\\\"target\\\":\\\"up2\\\",\\\"targetPort\\\":\\\"x\\\"}\",\"{\\\"kind\\\":\\\"edge\\\",\\\"source\\\":\\\"bottleneck.conv1\\\",\\\"sourcePort\\\":\\\"y\\\",\\\"target\\\":\\\"bottleneck.relu1\\\",\\\"targetPort\\\":\\\"x\\\"}\",\"{\\\"kind\\\":\\\"edge\\\",\\\"source\\\":\\\"bottleneck.conv2\\\",\\\"sourcePort\\\":\\\"y\\\",\\\"target\\\":\\\"bottleneck.relu2\\\",\\\"targetPort\\\":\\\"x\\\"}\",\"{\\\"kind\\\":\\\"edge\\\",\\\"source\\\":\\\"bottleneck.relu1\\\",\\\"sourcePort\\\":\\\"y\\\",\\\"target\\\":\\\"bottleneck.conv2\\\",\\\"targetPort\\\":\\\"x\\\"}\",\"{\\\"kind\\\":\\\"edge\\\",\\\"source\\\":\\\"bottleneck.relu2\\\",\\\"sourcePort\\\":\\\"y\\\",\\\"target\\\":\\\"up2\\\",\\\"targetPort\\\":\\\"x\\\"}\",\"{\\\"kind\\\":\\\"edge\\\",\\\"source\\\":\\\"pool2\\\",\\\"sourcePort\\\":\\\"y\\\",\\\"target\\\":\\\"bottleneck\\\",\\\"targetPort\\\":\\\"x\\\"}\",\"{\\\"kind\\\":\\\"edge\\\",\\\"source\\\":\\\"pool2\\\",\\\"sourcePort\\\":\\\"y\\\",\\\"target\\\":\\\"bottleneck.conv1\\\",\\\"targetPort\\\":\\\"x\\\"}\"],\"contents\":[\"{\\\"id\\\":\\\"bottleneck.conv1\\\",\\\"kind\\\":\\\"layer\\\",\\\"op\\\":\\\"Conv2d\\\",\\\"params\\\":{\\\"kernel_size\\\":3},\\\"parent\\\":\\\"bottleneck\\\"}\",\"{\\\"id\\\":\\\"bottleneck.conv2\\\",\\\"kind\\\":\\\"layer\\\",\\\"op\\\":\\\"Conv2d\\\",\\\"params\\\":{\\\"kernel_size\\\":3},\\\"parent\\\":\\\"bottleneck\\\"}\",\"{\\\"id\\\":\\\"bottleneck.relu1\\\",\\\"kind\\\":\\\"layer\\\",\\\"op\\\":\\\"ReLU\\\",\\\"params\\\":{},\\\"parent\\\":\\\"bottleneck\\\"}\",\"{\\\"id\\\":\\\"bottleneck.relu2\\\",\\\"kind\\\":\\\"layer\\\",\\\"op\\\":\\\"ReLU\\\",\\\"params\\\":{},\\\"parent\\\":\\\"bottleneck\\\"}\"],\"node\":{\"id\":\"bottleneck\",\"kind\":\"module\",\"op\":\"Module\",\"params\":{\"arg_0\":8,\"arg_1\":16}}}"
            }
          ]
        },
        {
          "id": "skip",
          "title": "Crop and concatenate the encoder features",
          "note": "The encoder's 42×42 skip is cropped to its central 34×34 region. Concatenating eight skip and eight decoder channels gives 16 channels. This preserves two feature sets; it is not residual addition.",
          "view": {
            "camera": {
              "x": -990,
              "y": -537,
              "z": 1.25
            },
            "nodePositions": {
              "input": {
                "x": 0,
                "y": 0
              },
              "encoder1": {
                "x": 340,
                "y": 0
              },
              "pool1": {
                "x": 340,
                "y": 320
              },
              "encoder2": {
                "x": 340,
                "y": 640
              },
              "pool2": {
                "x": 340,
                "y": 960
              },
              "bottleneck": {
                "x": 800,
                "y": 1280
              },
              "up2": {
                "x": 1260,
                "y": 960
              },
              "join2": {
                "x": 1260,
                "y": 640
              },
              "decoder2": {
                "x": 1600,
                "y": 640
              },
              "up1": {
                "x": 1600,
                "y": 320
              },
              "join1": {
                "x": 1600,
                "y": 0
              },
              "decoder1": {
                "x": 1940,
                "y": 0
              },
              "mask_head": {
                "x": 2280,
                "y": 0
              },
              "output": {
                "x": 2620,
                "y": 0
              },
              "encoder1.conv1": {
                "x": 24,
                "y": 214
              },
              "encoder1.relu1": {
                "x": 24,
                "y": 364
              },
              "encoder1.conv2": {
                "x": 24,
                "y": 514
              },
              "encoder1.relu2": {
                "x": 24,
                "y": 664
              },
              "encoder2.conv1": {
                "x": 24,
                "y": 214
              },
              "encoder2.relu1": {
                "x": 24,
                "y": 364
              },
              "encoder2.conv2": {
                "x": 24,
                "y": 514
              },
              "encoder2.relu2": {
                "x": 24,
                "y": 664
              },
              "bottleneck.conv1": {
                "x": 24,
                "y": 214
              },
              "bottleneck.relu1": {
                "x": 24,
                "y": 364
              },
              "bottleneck.conv2": {
                "x": 24,
                "y": 514
              },
              "bottleneck.relu2": {
                "x": 24,
                "y": 664
              },
              "cat@join2#0": {
                "x": 24,
                "y": 214
              },
              "decoder2.conv1": {
                "x": 24,
                "y": 214
              },
              "decoder2.relu1": {
                "x": 24,
                "y": 364
              },
              "decoder2.conv2": {
                "x": 24,
                "y": 514
              },
              "decoder2.relu2": {
                "x": 24,
                "y": 664
              },
              "cat@join1#0": {
                "x": 24,
                "y": 214
              },
              "decoder1.conv1": {
                "x": 24,
                "y": 214
              },
              "decoder1.relu1": {
                "x": 24,
                "y": 364
              },
              "decoder1.conv2": {
                "x": 24,
                "y": 514
              },
              "decoder1.relu2": {
                "x": 24,
                "y": 664
              }
            },
            "expandedModuleIds": [
              "join2"
            ],
            "selectedNodeIds": [
              "join2"
            ],
            "viewport": {
              "width": 1100,
              "height": 700
            }
          },
          "anchors": [
            {
              "target": {
                "kind": "node",
                "nodeId": "join2"
              },
              "snapshotId": "snapshot-5cccc7c57ae7c503",
              "exportedAt": "2026-09-17T06:18:45.955001+00:00",
              "modelName": "TinyUNet",
              "context": "{\"connections\":[\"{\\\"kind\\\":\\\"edge\\\",\\\"source\\\":\\\"cat@join2#0\\\",\\\"sourcePort\\\":\\\"y\\\",\\\"target\\\":\\\"decoder2.conv1\\\",\\\"targetPort\\\":\\\"x\\\"}\",\"{\\\"kind\\\":\\\"edge\\\",\\\"source\\\":\\\"encoder2\\\",\\\"sourcePort\\\":\\\"y\\\",\\\"target\\\":\\\"join2\\\",\\\"targetPort\\\":\\\"x\\\"}\",\"{\\\"kind\\\":\\\"edge\\\",\\\"source\\\":\\\"encoder2.relu2\\\",\\\"sourcePort\\\":\\\"y\\\",\\\"target\\\":\\\"cat@join2#0\\\",\\\"targetPort\\\":\\\"x\\\"}\",\"{\\\"kind\\\":\\\"edge\\\",\\\"source\\\":\\\"join2\\\",\\\"sourcePort\\\":\\\"y\\\",\\\"target\\\":\\\"decoder2\\\",\\\"targetPort\\\":\\\"x\\\"}\",\"{\\\"kind\\\":\\\"edge\\\",\\\"source\\\":\\\"up2\\\",\\\"sourcePort\\\":\\\"y\\\",\\\"target\\\":\\\"cat@join2#0\\\",\\\"targetPort\\\":\\\"x\\\"}\",\"{\\\"kind\\\":\\\"edge\\\",\\\"source\\\":\\\"up2\\\",\\\"sourcePort\\\":\\\"y\\\",\\\"target\\\":\\\"join2\\\",\\\"targetPort\\\":\\\"x\\\"}\"],\"contents\":[\"{\\\"id\\\":\\\"cat@join2#0\\\",\\\"kind\\\":\\\"layer\\\",\\\"op\\\":\\\"torch.cat\\\",\\\"params\\\":{\\\"dim\\\":1},\\\"parent\\\":\\\"join2\\\"}\"],\"node\":{\"id\":\"join2\",\"kind\":\"module\",\"op\":\"Module\",\"params\":{}}}"
            }
          ]
        },
        {
          "id": "mask",
          "title": "Make a decision at every output pixel",
          "note": "A second upsample/cropped-skip stage leads to four 56×56 feature maps. A 1×1 convolution produces two logits per output pixel. Valid convolutions explain why the output is smaller than the input.",
          "view": {
            "camera": {
              "x": -1947.5,
              "y": 216.5,
              "z": 1.25
            },
            "nodePositions": {
              "input": {
                "x": 0,
                "y": 0
              },
              "encoder1": {
                "x": 340,
                "y": 0
              },
              "pool1": {
                "x": 340,
                "y": 320
              },
              "encoder2": {
                "x": 340,
                "y": 640
              },
              "pool2": {
                "x": 340,
                "y": 960
              },
              "bottleneck": {
                "x": 800,
                "y": 1280
              },
              "up2": {
                "x": 1260,
                "y": 960
              },
              "join2": {
                "x": 1260,
                "y": 640
              },
              "decoder2": {
                "x": 1600,
                "y": 640
              },
              "up1": {
                "x": 1600,
                "y": 320
              },
              "join1": {
                "x": 1600,
                "y": 0
              },
              "decoder1": {
                "x": 1940,
                "y": 0
              },
              "mask_head": {
                "x": 2280,
                "y": 0
              },
              "output": {
                "x": 2620,
                "y": 0
              },
              "encoder1.conv1": {
                "x": 24,
                "y": 214
              },
              "encoder1.relu1": {
                "x": 24,
                "y": 364
              },
              "encoder1.conv2": {
                "x": 24,
                "y": 514
              },
              "encoder1.relu2": {
                "x": 24,
                "y": 664
              },
              "encoder2.conv1": {
                "x": 24,
                "y": 214
              },
              "encoder2.relu1": {
                "x": 24,
                "y": 364
              },
              "encoder2.conv2": {
                "x": 24,
                "y": 514
              },
              "encoder2.relu2": {
                "x": 24,
                "y": 664
              },
              "bottleneck.conv1": {
                "x": 24,
                "y": 214
              },
              "bottleneck.relu1": {
                "x": 24,
                "y": 364
              },
              "bottleneck.conv2": {
                "x": 24,
                "y": 514
              },
              "bottleneck.relu2": {
                "x": 24,
                "y": 664
              },
              "cat@join2#0": {
                "x": 24,
                "y": 214
              },
              "decoder2.conv1": {
                "x": 24,
                "y": 214
              },
              "decoder2.relu1": {
                "x": 24,
                "y": 364
              },
              "decoder2.conv2": {
                "x": 24,
                "y": 514
              },
              "decoder2.relu2": {
                "x": 24,
                "y": 664
              },
              "cat@join1#0": {
                "x": 24,
                "y": 214
              },
              "decoder1.conv1": {
                "x": 24,
                "y": 214
              },
              "decoder1.relu1": {
                "x": 24,
                "y": 364
              },
              "decoder1.conv2": {
                "x": 24,
                "y": 514
              },
              "decoder1.relu2": {
                "x": 24,
                "y": 664
              }
            },
            "expandedModuleIds": [],
            "selectedNodeIds": [
              "mask_head"
            ],
            "viewport": {
              "width": 1100,
              "height": 700
            }
          },
          "anchors": [
            {
              "target": {
                "kind": "node",
                "nodeId": "mask_head"
              },
              "snapshotId": "snapshot-5cccc7c57ae7c503",
              "exportedAt": "2026-09-17T06:18:45.955001+00:00",
              "modelName": "TinyUNet",
              "context": "{\"connections\":[\"{\\\"kind\\\":\\\"edge\\\",\\\"source\\\":\\\"decoder1\\\",\\\"sourcePort\\\":\\\"y\\\",\\\"target\\\":\\\"mask_head\\\",\\\"targetPort\\\":\\\"x\\\"}\",\"{\\\"kind\\\":\\\"edge\\\",\\\"source\\\":\\\"decoder1.relu2\\\",\\\"sourcePort\\\":\\\"y\\\",\\\"target\\\":\\\"mask_head\\\",\\\"targetPort\\\":\\\"x\\\"}\",\"{\\\"kind\\\":\\\"edge\\\",\\\"source\\\":\\\"mask_head\\\",\\\"sourcePort\\\":\\\"y\\\",\\\"target\\\":\\\"output\\\",\\\"targetPort\\\":\\\"x\\\"}\"],\"contents\":[],\"node\":{\"id\":\"mask_head\",\"kind\":\"layer\",\"op\":\"Conv2d\",\"params\":{\"in_channels\":4,\"kernel_size\":1,\"out_channels\":2}}}"
            }
          ]
        }
      ]
    },
    "threads": [],
    "savedViews": [
      {
        "id": "skip",
        "title": "Crop and concatenate the encoder features",
        "note": "The encoder's 42×42 skip is cropped to its central 34×34 region. Concatenating eight skip and eight decoder channels gives 16 channels. This preserves two feature sets; it is not residual addition.",
        "view": {
          "camera": {
            "x": -990,
            "y": -537,
            "z": 1.25
          },
          "nodePositions": {
            "input": {
              "x": 0,
              "y": 0
            },
            "encoder1": {
              "x": 340,
              "y": 0
            },
            "pool1": {
              "x": 340,
              "y": 320
            },
            "encoder2": {
              "x": 340,
              "y": 640
            },
            "pool2": {
              "x": 340,
              "y": 960
            },
            "bottleneck": {
              "x": 800,
              "y": 1280
            },
            "up2": {
              "x": 1260,
              "y": 960
            },
            "join2": {
              "x": 1260,
              "y": 640
            },
            "decoder2": {
              "x": 1600,
              "y": 640
            },
            "up1": {
              "x": 1600,
              "y": 320
            },
            "join1": {
              "x": 1600,
              "y": 0
            },
            "decoder1": {
              "x": 1940,
              "y": 0
            },
            "mask_head": {
              "x": 2280,
              "y": 0
            },
            "output": {
              "x": 2620,
              "y": 0
            },
            "encoder1.conv1": {
              "x": 24,
              "y": 214
            },
            "encoder1.relu1": {
              "x": 24,
              "y": 364
            },
            "encoder1.conv2": {
              "x": 24,
              "y": 514
            },
            "encoder1.relu2": {
              "x": 24,
              "y": 664
            },
            "encoder2.conv1": {
              "x": 24,
              "y": 214
            },
            "encoder2.relu1": {
              "x": 24,
              "y": 364
            },
            "encoder2.conv2": {
              "x": 24,
              "y": 514
            },
            "encoder2.relu2": {
              "x": 24,
              "y": 664
            },
            "bottleneck.conv1": {
              "x": 24,
              "y": 214
            },
            "bottleneck.relu1": {
              "x": 24,
              "y": 364
            },
            "bottleneck.conv2": {
              "x": 24,
              "y": 514
            },
            "bottleneck.relu2": {
              "x": 24,
              "y": 664
            },
            "cat@join2#0": {
              "x": 24,
              "y": 214
            },
            "decoder2.conv1": {
              "x": 24,
              "y": 214
            },
            "decoder2.relu1": {
              "x": 24,
              "y": 364
            },
            "decoder2.conv2": {
              "x": 24,
              "y": 514
            },
            "decoder2.relu2": {
              "x": 24,
              "y": 664
            },
            "cat@join1#0": {
              "x": 24,
              "y": 214
            },
            "decoder1.conv1": {
              "x": 24,
              "y": 214
            },
            "decoder1.relu1": {
              "x": 24,
              "y": 364
            },
            "decoder1.conv2": {
              "x": 24,
              "y": 514
            },
            "decoder1.relu2": {
              "x": 24,
              "y": 664
            }
          },
          "expandedModuleIds": [
            "join2"
          ],
          "selectedNodeIds": [
            "join2"
          ],
          "viewport": {
            "width": 1100,
            "height": 700
          }
        },
        "anchors": [
          {
            "target": {
              "kind": "node",
              "nodeId": "join2"
            },
            "snapshotId": "snapshot-5cccc7c57ae7c503",
            "exportedAt": "2026-09-17T06:18:45.955001+00:00",
            "modelName": "TinyUNet",
            "context": "{\"connections\":[\"{\\\"kind\\\":\\\"edge\\\",\\\"source\\\":\\\"cat@join2#0\\\",\\\"sourcePort\\\":\\\"y\\\",\\\"target\\\":\\\"decoder2.conv1\\\",\\\"targetPort\\\":\\\"x\\\"}\",\"{\\\"kind\\\":\\\"edge\\\",\\\"source\\\":\\\"encoder2\\\",\\\"sourcePort\\\":\\\"y\\\",\\\"target\\\":\\\"join2\\\",\\\"targetPort\\\":\\\"x\\\"}\",\"{\\\"kind\\\":\\\"edge\\\",\\\"source\\\":\\\"encoder2.relu2\\\",\\\"sourcePort\\\":\\\"y\\\",\\\"target\\\":\\\"cat@join2#0\\\",\\\"targetPort\\\":\\\"x\\\"}\",\"{\\\"kind\\\":\\\"edge\\\",\\\"source\\\":\\\"join2\\\",\\\"sourcePort\\\":\\\"y\\\",\\\"target\\\":\\\"decoder2\\\",\\\"targetPort\\\":\\\"x\\\"}\",\"{\\\"kind\\\":\\\"edge\\\",\\\"source\\\":\\\"up2\\\",\\\"sourcePort\\\":\\\"y\\\",\\\"target\\\":\\\"cat@join2#0\\\",\\\"targetPort\\\":\\\"x\\\"}\",\"{\\\"kind\\\":\\\"edge\\\",\\\"source\\\":\\\"up2\\\",\\\"sourcePort\\\":\\\"y\\\",\\\"target\\\":\\\"join2\\\",\\\"targetPort\\\":\\\"x\\\"}\"],\"contents\":[\"{\\\"id\\\":\\\"cat@join2#0\\\",\\\"kind\\\":\\\"layer\\\",\\\"op\\\":\\\"torch.cat\\\",\\\"params\\\":{\\\"dim\\\":1},\\\"parent\\\":\\\"join2\\\"}\"],\"node\":{\"id\":\"join2\",\"kind\":\"module\",\"op\":\"Module\",\"params\":{}}}"
          }
        ]
      }
    ],
    "openingViewId": "skip"
  }
}
