{
  "format": "tensorviz.graph",
  "version": 3,
  "exportedAt": "2026-09-17T06:39:54.901653+00:00",
  "status": "static",
  "warningCount": 0,
  "document": {
    "schemaVersion": 2,
    "semantic": {
      "graph_id": "snapshot",
      "name": "TinyGAN",
      "revision": 0,
      "nodes": [
        {
          "node_id": "input",
          "kind": "input",
          "op": "Input",
          "params": {
            "shape": "4,4"
          },
          "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": "generator",
          "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": "generator",
            "moduleTemplateId": "model::Generator",
            "isGroup": true,
            "moduleMembers": [
              "generator.hidden",
              "generator.relu",
              "generator.project"
            ],
            "moduleLayerCount": 3
          }
        },
        {
          "node_id": "discriminator",
          "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": "discriminator",
            "moduleTemplateId": "model::Discriminator",
            "isGroup": true,
            "moduleMembers": [
              "discriminator.hidden",
              "discriminator.relu",
              "discriminator.logit"
            ],
            "moduleLayerCount": 3
          }
        },
        {
          "node_id": "stack@TinyGAN#0",
          "kind": "layer",
          "op": "torch.stack",
          "params": {},
          "in_ports": [
            "x"
          ],
          "out_ports": [
            "y"
          ],
          "metadata": {
            "layerType": {
              "id": "stack",
              "name": "torch.stack",
              "displayName": "torch.stack",
              "description": "PyTorch stack operation",
              "icon": "Activity",
              "category": "tensor",
              "parameters": [
                {
                  "name": "dim",
                  "type": "string",
                  "defaultValue": "",
                  "required": false,
                  "description": "Dimension(s) to apply the operation on"
                }
              ]
            }
          }
        },
        {
          "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": "generator.hidden",
          "kind": "layer",
          "op": "Linear",
          "params": {
            "in_features": 4,
            "out_features": 8
          },
          "in_ports": [
            "x"
          ],
          "out_ports": [
            "y"
          ],
          "metadata": {
            "layerType": {
              "id": "linear",
              "name": "Linear",
              "displayName": "Linear",
              "description": "Fully Connected Layer",
              "icon": "Minus",
              "category": "linear",
              "parameters": [
                {
                  "name": "in_features",
                  "type": "number",
                  "defaultValue": 512,
                  "required": true,
                  "description": "Size of input features",
                  "min": 1
                },
                {
                  "name": "out_features",
                  "type": "number",
                  "defaultValue": 256,
                  "required": true,
                  "description": "Size of output features",
                  "min": 1
                },
                {
                  "name": "bias",
                  "type": "boolean",
                  "defaultValue": true,
                  "required": false,
                  "description": "If set to False, the layer will not learn an additive bias"
                }
              ]
            },
            "parentId": "generator"
          }
        },
        {
          "node_id": "generator.relu",
          "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": "generator"
          }
        },
        {
          "node_id": "generator.project",
          "kind": "layer",
          "op": "Linear",
          "params": {
            "in_features": 8,
            "out_features": 2
          },
          "in_ports": [
            "x"
          ],
          "out_ports": [
            "y"
          ],
          "metadata": {
            "layerType": {
              "id": "linear",
              "name": "Linear",
              "displayName": "Linear",
              "description": "Fully Connected Layer",
              "icon": "Minus",
              "category": "linear",
              "parameters": [
                {
                  "name": "in_features",
                  "type": "number",
                  "defaultValue": 512,
                  "required": true,
                  "description": "Size of input features",
                  "min": 1
                },
                {
                  "name": "out_features",
                  "type": "number",
                  "defaultValue": 256,
                  "required": true,
                  "description": "Size of output features",
                  "min": 1
                },
                {
                  "name": "bias",
                  "type": "boolean",
                  "defaultValue": true,
                  "required": false,
                  "description": "If set to False, the layer will not learn an additive bias"
                }
              ]
            },
            "parentId": "generator"
          }
        },
        {
          "node_id": "discriminator.hidden",
          "kind": "layer",
          "op": "Linear",
          "params": {
            "in_features": 2,
            "out_features": 8
          },
          "in_ports": [
            "x"
          ],
          "out_ports": [
            "y"
          ],
          "metadata": {
            "layerType": {
              "id": "linear",
              "name": "Linear",
              "displayName": "Linear",
              "description": "Fully Connected Layer",
              "icon": "Minus",
              "category": "linear",
              "parameters": [
                {
                  "name": "in_features",
                  "type": "number",
                  "defaultValue": 512,
                  "required": true,
                  "description": "Size of input features",
                  "min": 1
                },
                {
                  "name": "out_features",
                  "type": "number",
                  "defaultValue": 256,
                  "required": true,
                  "description": "Size of output features",
                  "min": 1
                },
                {
                  "name": "bias",
                  "type": "boolean",
                  "defaultValue": true,
                  "required": false,
                  "description": "If set to False, the layer will not learn an additive bias"
                }
              ]
            },
            "parentId": "discriminator"
          }
        },
        {
          "node_id": "discriminator.relu",
          "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": "discriminator"
          }
        },
        {
          "node_id": "discriminator.logit",
          "kind": "layer",
          "op": "Linear",
          "params": {
            "in_features": 8,
            "out_features": 1
          },
          "in_ports": [
            "x"
          ],
          "out_ports": [
            "y"
          ],
          "metadata": {
            "layerType": {
              "id": "linear",
              "name": "Linear",
              "displayName": "Linear",
              "description": "Fully Connected Layer",
              "icon": "Minus",
              "category": "linear",
              "parameters": [
                {
                  "name": "in_features",
                  "type": "number",
                  "defaultValue": 512,
                  "required": true,
                  "description": "Size of input features",
                  "min": 1
                },
                {
                  "name": "out_features",
                  "type": "number",
                  "defaultValue": 256,
                  "required": true,
                  "description": "Size of output features",
                  "min": 1
                },
                {
                  "name": "bias",
                  "type": "boolean",
                  "defaultValue": true,
                  "required": false,
                  "description": "If set to False, the layer will not learn an additive bias"
                }
              ]
            },
            "parentId": "discriminator"
          }
        }
      ],
      "edges": [
        {
          "edge_id": "edge-1",
          "source_node_id": "generator.hidden",
          "target_node_id": "generator.relu",
          "source_port": "y",
          "target_port": "x",
          "metadata": {}
        },
        {
          "edge_id": "edge-2",
          "source_node_id": "generator.relu",
          "target_node_id": "generator.project",
          "source_port": "y",
          "target_port": "x",
          "metadata": {}
        },
        {
          "edge_id": "edge-3",
          "source_node_id": "discriminator.hidden",
          "target_node_id": "discriminator.relu",
          "source_port": "y",
          "target_port": "x",
          "metadata": {}
        },
        {
          "edge_id": "edge-4",
          "source_node_id": "discriminator.relu",
          "target_node_id": "discriminator.logit",
          "source_port": "y",
          "target_port": "x",
          "metadata": {}
        },
        {
          "edge_id": "edge-5",
          "source_node_id": "input",
          "target_node_id": "generator.hidden",
          "source_port": "y",
          "target_port": "x",
          "metadata": {}
        },
        {
          "edge_id": "edge-6",
          "source_node_id": "input",
          "target_node_id": "generator",
          "source_port": "y",
          "target_port": "x",
          "metadata": {}
        },
        {
          "edge_id": "edge-7",
          "source_node_id": "input",
          "target_node_id": "discriminator.hidden",
          "source_port": "y",
          "target_port": "x",
          "metadata": {}
        },
        {
          "edge_id": "edge-8",
          "source_node_id": "input",
          "target_node_id": "discriminator",
          "source_port": "y",
          "target_port": "x",
          "metadata": {}
        },
        {
          "edge_id": "edge-9",
          "source_node_id": "generator.project",
          "target_node_id": "discriminator.hidden",
          "source_port": "y",
          "target_port": "x",
          "metadata": {}
        },
        {
          "edge_id": "edge-10",
          "source_node_id": "generator",
          "target_node_id": "discriminator",
          "source_port": "y",
          "target_port": "x",
          "metadata": {}
        },
        {
          "edge_id": "edge-11",
          "source_node_id": "discriminator.logit",
          "target_node_id": "stack@TinyGAN#0",
          "source_port": "y",
          "target_port": "x",
          "metadata": {}
        },
        {
          "edge_id": "edge-12",
          "source_node_id": "discriminator",
          "target_node_id": "stack@TinyGAN#0",
          "source_port": "y",
          "target_port": "x",
          "metadata": {}
        },
        {
          "edge_id": "edge-13",
          "source_node_id": "stack@TinyGAN#0",
          "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": 160
        },
        "generator": {
          "x": 340,
          "y": 160
        },
        "discriminator": {
          "x": 680,
          "y": 160
        },
        "stack@TinyGAN#0": {
          "x": 1020,
          "y": 160
        },
        "output": {
          "x": 1360,
          "y": 160
        },
        "generator.hidden": {
          "x": 24,
          "y": 214
        },
        "generator.relu": {
          "x": 24,
          "y": 364
        },
        "generator.project": {
          "x": 24,
          "y": 514
        },
        "discriminator.hidden": {
          "x": 24,
          "y": 214
        },
        "discriminator.relu": {
          "x": 24,
          "y": 364
        },
        "discriminator.logit": {
          "x": 24,
          "y": 514
        }
      },
      "collapsed_modules": [
        "generator",
        "discriminator"
      ],
      "selection": [],
      "layout": {}
    }
  },
  "snapshotId": "snapshot-d070dc3a51bfd628",
  "collaboration": {
    "walkthrough": {
      "title": "Train a generator against a discriminator",
      "steps": [
        {
          "id": "generate",
          "title": "Map noise into candidate samples",
          "note": "Each four-feature noise vector becomes a two-dimensional point. The generated point is differentiable with respect to G's parameters, allowing the later adversarial loss to update the generator.",
          "view": {
            "camera": {
              "x": 118.84615384615381,
              "y": -86.82517482517483,
              "z": 0.8746177370030581
            },
            "nodePositions": {
              "input": {
                "x": 0,
                "y": 160
              },
              "generator": {
                "x": 340,
                "y": 160
              },
              "discriminator": {
                "x": 680,
                "y": 160
              },
              "stack@TinyGAN#0": {
                "x": 1020,
                "y": 160
              },
              "output": {
                "x": 1360,
                "y": 160
              },
              "generator.hidden": {
                "x": 24,
                "y": 214
              },
              "generator.relu": {
                "x": 24,
                "y": 364
              },
              "generator.project": {
                "x": 24,
                "y": 514
              },
              "discriminator.hidden": {
                "x": 24,
                "y": 214
              },
              "discriminator.relu": {
                "x": 24,
                "y": 364
              },
              "discriminator.logit": {
                "x": 24,
                "y": 514
              }
            },
            "expandedModuleIds": [
              "generator"
            ],
            "selectedNodeIds": [
              "generator"
            ],
            "viewport": {
              "width": 1100,
              "height": 700
            }
          },
          "anchors": [
            {
              "target": {
                "kind": "node",
                "nodeId": "generator"
              },
              "snapshotId": "snapshot-d070dc3a51bfd628",
              "exportedAt": "2026-09-17T06:39:54.901653+00:00",
              "modelName": "TinyGAN",
              "context": "{\"connections\":[\"{\\\"kind\\\":\\\"edge\\\",\\\"source\\\":\\\"generator\\\",\\\"sourcePort\\\":\\\"y\\\",\\\"target\\\":\\\"discriminator\\\",\\\"targetPort\\\":\\\"x\\\"}\",\"{\\\"kind\\\":\\\"edge\\\",\\\"source\\\":\\\"generator.hidden\\\",\\\"sourcePort\\\":\\\"y\\\",\\\"target\\\":\\\"generator.relu\\\",\\\"targetPort\\\":\\\"x\\\"}\",\"{\\\"kind\\\":\\\"edge\\\",\\\"source\\\":\\\"generator.project\\\",\\\"sourcePort\\\":\\\"y\\\",\\\"target\\\":\\\"discriminator.hidden\\\",\\\"targetPort\\\":\\\"x\\\"}\",\"{\\\"kind\\\":\\\"edge\\\",\\\"source\\\":\\\"generator.relu\\\",\\\"sourcePort\\\":\\\"y\\\",\\\"target\\\":\\\"generator.project\\\",\\\"targetPort\\\":\\\"x\\\"}\",\"{\\\"kind\\\":\\\"edge\\\",\\\"source\\\":\\\"input\\\",\\\"sourcePort\\\":\\\"y\\\",\\\"target\\\":\\\"generator\\\",\\\"targetPort\\\":\\\"x\\\"}\",\"{\\\"kind\\\":\\\"edge\\\",\\\"source\\\":\\\"input\\\",\\\"sourcePort\\\":\\\"y\\\",\\\"target\\\":\\\"generator.hidden\\\",\\\"targetPort\\\":\\\"x\\\"}\"],\"contents\":[\"{\\\"id\\\":\\\"generator.hidden\\\",\\\"kind\\\":\\\"layer\\\",\\\"op\\\":\\\"Linear\\\",\\\"params\\\":{\\\"in_features\\\":4,\\\"out_features\\\":8},\\\"parent\\\":\\\"generator\\\"}\",\"{\\\"id\\\":\\\"generator.project\\\",\\\"kind\\\":\\\"layer\\\",\\\"op\\\":\\\"Linear\\\",\\\"params\\\":{\\\"in_features\\\":8,\\\"out_features\\\":2},\\\"parent\\\":\\\"generator\\\"}\",\"{\\\"id\\\":\\\"generator.relu\\\",\\\"kind\\\":\\\"layer\\\",\\\"op\\\":\\\"ReLU\\\",\\\"params\\\":{},\\\"parent\\\":\\\"generator\\\"}\"],\"node\":{\"id\":\"generator\",\"kind\":\"module\",\"op\":\"Module\",\"params\":{}}}"
            }
          ]
        },
        {
          "id": "judge",
          "title": "Use the same discriminator for real and generated points",
          "note": "D returns one logit for every point, using shared weights for both populations. Sigmoid converts a logit into the real-data probability used in the comparison panel.",
          "view": {
            "camera": {
              "x": -221.1538461538462,
              "y": -86.82517482517483,
              "z": 0.8746177370030581
            },
            "nodePositions": {
              "input": {
                "x": 0,
                "y": 160
              },
              "generator": {
                "x": 340,
                "y": 160
              },
              "discriminator": {
                "x": 680,
                "y": 160
              },
              "stack@TinyGAN#0": {
                "x": 1020,
                "y": 160
              },
              "output": {
                "x": 1360,
                "y": 160
              },
              "generator.hidden": {
                "x": 24,
                "y": 214
              },
              "generator.relu": {
                "x": 24,
                "y": 364
              },
              "generator.project": {
                "x": 24,
                "y": 514
              },
              "discriminator.hidden": {
                "x": 24,
                "y": 214
              },
              "discriminator.relu": {
                "x": 24,
                "y": 364
              },
              "discriminator.logit": {
                "x": 24,
                "y": 514
              }
            },
            "expandedModuleIds": [
              "discriminator"
            ],
            "selectedNodeIds": [
              "discriminator"
            ],
            "viewport": {
              "width": 1100,
              "height": 700
            }
          },
          "anchors": [
            {
              "target": {
                "kind": "node",
                "nodeId": "discriminator"
              },
              "snapshotId": "snapshot-d070dc3a51bfd628",
              "exportedAt": "2026-09-17T06:39:54.901653+00:00",
              "modelName": "TinyGAN",
              "context": "{\"connections\":[\"{\\\"kind\\\":\\\"edge\\\",\\\"source\\\":\\\"discriminator\\\",\\\"sourcePort\\\":\\\"y\\\",\\\"target\\\":\\\"stack@TinyGAN#0\\\",\\\"targetPort\\\":\\\"x\\\"}\",\"{\\\"kind\\\":\\\"edge\\\",\\\"source\\\":\\\"discriminator.hidden\\\",\\\"sourcePort\\\":\\\"y\\\",\\\"target\\\":\\\"discriminator.relu\\\",\\\"targetPort\\\":\\\"x\\\"}\",\"{\\\"kind\\\":\\\"edge\\\",\\\"source\\\":\\\"discriminator.logit\\\",\\\"sourcePort\\\":\\\"y\\\",\\\"target\\\":\\\"stack@TinyGAN#0\\\",\\\"targetPort\\\":\\\"x\\\"}\",\"{\\\"kind\\\":\\\"edge\\\",\\\"source\\\":\\\"discriminator.relu\\\",\\\"sourcePort\\\":\\\"y\\\",\\\"target\\\":\\\"discriminator.logit\\\",\\\"targetPort\\\":\\\"x\\\"}\",\"{\\\"kind\\\":\\\"edge\\\",\\\"source\\\":\\\"generator\\\",\\\"sourcePort\\\":\\\"y\\\",\\\"target\\\":\\\"discriminator\\\",\\\"targetPort\\\":\\\"x\\\"}\",\"{\\\"kind\\\":\\\"edge\\\",\\\"source\\\":\\\"generator.project\\\",\\\"sourcePort\\\":\\\"y\\\",\\\"target\\\":\\\"discriminator.hidden\\\",\\\"targetPort\\\":\\\"x\\\"}\",\"{\\\"kind\\\":\\\"edge\\\",\\\"source\\\":\\\"input\\\",\\\"sourcePort\\\":\\\"y\\\",\\\"target\\\":\\\"discriminator\\\",\\\"targetPort\\\":\\\"x\\\"}\",\"{\\\"kind\\\":\\\"edge\\\",\\\"source\\\":\\\"input\\\",\\\"sourcePort\\\":\\\"y\\\",\\\"target\\\":\\\"discriminator.hidden\\\",\\\"targetPort\\\":\\\"x\\\"}\"],\"contents\":[\"{\\\"id\\\":\\\"discriminator.hidden\\\",\\\"kind\\\":\\\"layer\\\",\\\"op\\\":\\\"Linear\\\",\\\"params\\\":{\\\"in_features\\\":2,\\\"out_features\\\":8},\\\"parent\\\":\\\"discriminator\\\"}\",\"{\\\"id\\\":\\\"discriminator.logit\\\",\\\"kind\\\":\\\"layer\\\",\\\"op\\\":\\\"Linear\\\",\\\"params\\\":{\\\"in_features\\\":8,\\\"out_features\\\":1},\\\"parent\\\":\\\"discriminator\\\"}\",\"{\\\"id\\\":\\\"discriminator.relu\\\",\\\"kind\\\":\\\"layer\\\",\\\"op\\\":\\\"ReLU\\\",\\\"params\\\":{},\\\"parent\\\":\\\"discriminator\\\"}\"],\"node\":{\"id\":\"discriminator\",\"kind\":\"module\",\"op\":\"Module\",\"params\":{}}}"
            }
          ]
        },
        {
          "id": "train-d",
          "title": "Update D with generated samples detached",
          "note": "The discriminator step minimizes −log D(real) − log(1−D(fake)). Detaching fake samples prevents this update from reaching G. The recorded stage verifies that generated coordinates stay unchanged.",
          "view": {
            "camera": {
              "x": 308.5,
              "y": -294,
              "z": 1.25
            },
            "nodePositions": {
              "input": {
                "x": 0,
                "y": 160
              },
              "generator": {
                "x": 340,
                "y": 160
              },
              "discriminator": {
                "x": 680,
                "y": 160
              },
              "stack@TinyGAN#0": {
                "x": 1020,
                "y": 160
              },
              "output": {
                "x": 1360,
                "y": 160
              },
              "generator.hidden": {
                "x": 24,
                "y": 214
              },
              "generator.relu": {
                "x": 24,
                "y": 364
              },
              "generator.project": {
                "x": 24,
                "y": 514
              },
              "discriminator.hidden": {
                "x": 24,
                "y": 214
              },
              "discriminator.relu": {
                "x": 24,
                "y": 364
              },
              "discriminator.logit": {
                "x": 24,
                "y": 514
              }
            },
            "expandedModuleIds": [
              "discriminator"
            ],
            "selectedNodeIds": [
              "discriminator.logit"
            ],
            "viewport": {
              "width": 1100,
              "height": 700
            }
          },
          "anchors": [
            {
              "target": {
                "kind": "node",
                "nodeId": "discriminator.logit"
              },
              "snapshotId": "snapshot-d070dc3a51bfd628",
              "exportedAt": "2026-09-17T06:39:54.901653+00:00",
              "modelName": "TinyGAN",
              "context": "{\"connections\":[\"{\\\"kind\\\":\\\"edge\\\",\\\"source\\\":\\\"discriminator.logit\\\",\\\"sourcePort\\\":\\\"y\\\",\\\"target\\\":\\\"stack@TinyGAN#0\\\",\\\"targetPort\\\":\\\"x\\\"}\",\"{\\\"kind\\\":\\\"edge\\\",\\\"source\\\":\\\"discriminator.relu\\\",\\\"sourcePort\\\":\\\"y\\\",\\\"target\\\":\\\"discriminator.logit\\\",\\\"targetPort\\\":\\\"x\\\"}\"],\"contents\":[],\"node\":{\"id\":\"discriminator.logit\",\"kind\":\"layer\",\"op\":\"Linear\",\"params\":{\"in_features\":8,\"out_features\":1},\"parent\":\"discriminator\"}}"
            }
          ]
        },
        {
          "id": "train-g",
          "title": "Freeze D's weights and update G through its signal",
          "note": "The generator step minimizes −log D(G(z)), the original paper's practical non-saturating alternative. Gradients pass through D into G while D's weights stay fixed. Compare the gradient case to the original minimax objective.",
          "view": {
            "camera": {
              "x": 308.5,
              "y": -294,
              "z": 1.25
            },
            "nodePositions": {
              "input": {
                "x": 0,
                "y": 160
              },
              "generator": {
                "x": 340,
                "y": 160
              },
              "discriminator": {
                "x": 680,
                "y": 160
              },
              "stack@TinyGAN#0": {
                "x": 1020,
                "y": 160
              },
              "output": {
                "x": 1360,
                "y": 160
              },
              "generator.hidden": {
                "x": 24,
                "y": 214
              },
              "generator.relu": {
                "x": 24,
                "y": 364
              },
              "generator.project": {
                "x": 24,
                "y": 514
              },
              "discriminator.hidden": {
                "x": 24,
                "y": 214
              },
              "discriminator.relu": {
                "x": 24,
                "y": 364
              },
              "discriminator.logit": {
                "x": 24,
                "y": 514
              }
            },
            "expandedModuleIds": [
              "generator"
            ],
            "selectedNodeIds": [
              "generator.project"
            ],
            "viewport": {
              "width": 1100,
              "height": 700
            }
          },
          "anchors": [
            {
              "target": {
                "kind": "node",
                "nodeId": "generator.project"
              },
              "snapshotId": "snapshot-d070dc3a51bfd628",
              "exportedAt": "2026-09-17T06:39:54.901653+00:00",
              "modelName": "TinyGAN",
              "context": "{\"connections\":[\"{\\\"kind\\\":\\\"edge\\\",\\\"source\\\":\\\"generator.project\\\",\\\"sourcePort\\\":\\\"y\\\",\\\"target\\\":\\\"discriminator.hidden\\\",\\\"targetPort\\\":\\\"x\\\"}\",\"{\\\"kind\\\":\\\"edge\\\",\\\"source\\\":\\\"generator.relu\\\",\\\"sourcePort\\\":\\\"y\\\",\\\"target\\\":\\\"generator.project\\\",\\\"targetPort\\\":\\\"x\\\"}\"],\"contents\":[],\"node\":{\"id\":\"generator.project\",\"kind\":\"layer\",\"op\":\"Linear\",\"params\":{\"in_features\":8,\"out_features\":2},\"parent\":\"generator\"}}"
            }
          ]
        }
      ]
    },
    "threads": [],
    "savedViews": [
      {
        "id": "judge",
        "title": "Use the same discriminator for real and generated points",
        "note": "D returns one logit for every point, using shared weights for both populations. Sigmoid converts a logit into the real-data probability used in the comparison panel.",
        "view": {
          "camera": {
            "x": -221.1538461538462,
            "y": -86.82517482517483,
            "z": 0.8746177370030581
          },
          "nodePositions": {
            "input": {
              "x": 0,
              "y": 160
            },
            "generator": {
              "x": 340,
              "y": 160
            },
            "discriminator": {
              "x": 680,
              "y": 160
            },
            "stack@TinyGAN#0": {
              "x": 1020,
              "y": 160
            },
            "output": {
              "x": 1360,
              "y": 160
            },
            "generator.hidden": {
              "x": 24,
              "y": 214
            },
            "generator.relu": {
              "x": 24,
              "y": 364
            },
            "generator.project": {
              "x": 24,
              "y": 514
            },
            "discriminator.hidden": {
              "x": 24,
              "y": 214
            },
            "discriminator.relu": {
              "x": 24,
              "y": 364
            },
            "discriminator.logit": {
              "x": 24,
              "y": 514
            }
          },
          "expandedModuleIds": [
            "discriminator"
          ],
          "selectedNodeIds": [
            "discriminator"
          ],
          "viewport": {
            "width": 1100,
            "height": 700
          }
        },
        "anchors": [
          {
            "target": {
              "kind": "node",
              "nodeId": "discriminator"
            },
            "snapshotId": "snapshot-d070dc3a51bfd628",
            "exportedAt": "2026-09-17T06:39:54.901653+00:00",
            "modelName": "TinyGAN",
            "context": "{\"connections\":[\"{\\\"kind\\\":\\\"edge\\\",\\\"source\\\":\\\"discriminator\\\",\\\"sourcePort\\\":\\\"y\\\",\\\"target\\\":\\\"stack@TinyGAN#0\\\",\\\"targetPort\\\":\\\"x\\\"}\",\"{\\\"kind\\\":\\\"edge\\\",\\\"source\\\":\\\"discriminator.hidden\\\",\\\"sourcePort\\\":\\\"y\\\",\\\"target\\\":\\\"discriminator.relu\\\",\\\"targetPort\\\":\\\"x\\\"}\",\"{\\\"kind\\\":\\\"edge\\\",\\\"source\\\":\\\"discriminator.logit\\\",\\\"sourcePort\\\":\\\"y\\\",\\\"target\\\":\\\"stack@TinyGAN#0\\\",\\\"targetPort\\\":\\\"x\\\"}\",\"{\\\"kind\\\":\\\"edge\\\",\\\"source\\\":\\\"discriminator.relu\\\",\\\"sourcePort\\\":\\\"y\\\",\\\"target\\\":\\\"discriminator.logit\\\",\\\"targetPort\\\":\\\"x\\\"}\",\"{\\\"kind\\\":\\\"edge\\\",\\\"source\\\":\\\"generator\\\",\\\"sourcePort\\\":\\\"y\\\",\\\"target\\\":\\\"discriminator\\\",\\\"targetPort\\\":\\\"x\\\"}\",\"{\\\"kind\\\":\\\"edge\\\",\\\"source\\\":\\\"generator.project\\\",\\\"sourcePort\\\":\\\"y\\\",\\\"target\\\":\\\"discriminator.hidden\\\",\\\"targetPort\\\":\\\"x\\\"}\",\"{\\\"kind\\\":\\\"edge\\\",\\\"source\\\":\\\"input\\\",\\\"sourcePort\\\":\\\"y\\\",\\\"target\\\":\\\"discriminator\\\",\\\"targetPort\\\":\\\"x\\\"}\",\"{\\\"kind\\\":\\\"edge\\\",\\\"source\\\":\\\"input\\\",\\\"sourcePort\\\":\\\"y\\\",\\\"target\\\":\\\"discriminator.hidden\\\",\\\"targetPort\\\":\\\"x\\\"}\"],\"contents\":[\"{\\\"id\\\":\\\"discriminator.hidden\\\",\\\"kind\\\":\\\"layer\\\",\\\"op\\\":\\\"Linear\\\",\\\"params\\\":{\\\"in_features\\\":2,\\\"out_features\\\":8},\\\"parent\\\":\\\"discriminator\\\"}\",\"{\\\"id\\\":\\\"discriminator.logit\\\",\\\"kind\\\":\\\"layer\\\",\\\"op\\\":\\\"Linear\\\",\\\"params\\\":{\\\"in_features\\\":8,\\\"out_features\\\":1},\\\"parent\\\":\\\"discriminator\\\"}\",\"{\\\"id\\\":\\\"discriminator.relu\\\",\\\"kind\\\":\\\"layer\\\",\\\"op\\\":\\\"ReLU\\\",\\\"params\\\":{},\\\"parent\\\":\\\"discriminator\\\"}\"],\"node\":{\"id\":\"discriminator\",\"kind\":\"module\",\"op\":\"Module\",\"params\":{}}}"
          }
        ]
      }
    ],
    "openingViewId": "judge"
  }
}
