{
  "cells": [
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "917fd4da"
      },
      "source": [
        "### 1. 准备工具：什么是 Python 和 PyTorch？\n",
        "\n",
        "*   **Python**：你可以把它想象成一种和电脑沟通的语言。它的语法非常接近英语，适合新手。\n",
        "*   **PyTorch**：这是一个专门用来搞“人工智能”的工具箱。它帮我们处理复杂的数学计算，让我们像搭积木一样盖起神经网络。\n",
        "\n",
        "**下面的代码是在告诉电脑：** “请帮我把这些工具准备好，并看看有没有显卡（GPU）来加速计算。”"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 10,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "f3254149",
        "outputId": "6c030ba5-e16c-4277-d049-4d156aeec038"
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "当前使用的设备是: cpu\n"
          ]
        }
      ],
      "source": [
        "import torch\n",
        "import torch.nn as nn\n",
        "import torch.optim as optim\n",
        "from torchvision import datasets, transforms\n",
        "from torch.utils.data import DataLoader\n",
        "import matplotlib.pyplot as plt\n",
        "\n",
        "# 检查是否有显卡（GPU）可以加速\n",
        "device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')\n",
        "print(f'当前使用的设备是: {device}')"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "a4ce0675"
      },
      "source": [
        "### 2. 数据准备：给电脑看的“教科书”\n",
        "\n",
        "我们要解决的任务是**手写数字识别**。数据集叫 **MNIST**，它包含了 7 万张从 0 到 9 的手写数字图片。\n",
        "\n",
        "*   **标准化 (Normalize)**：就像洗照片一样，把图片调整到统一的亮度分布，让模型更好学。\n",
        "*   **DataLoader (加载器)**：电脑一次看几万张图会累死，我们把它分成一小包一小包（比如每包 64 张），这就是 `batch_size`。"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 11,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 192
        },
        "id": "516665ff",
        "outputId": "38ff8ae3-6dfe-4d0a-c373-8852c73c934d"
      },
      "outputs": [
        {
          "data": {
            "image/png": "iVBORw0KGgoAAAANSUhEUgAAAxsAAACvCAYAAACVbcM3AAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAGu1JREFUeJzt3X10zfcdwPHPlRgJJlFiFZJOPQ7nqGoQj62tmNRhI6nN2Flop+WoUQdryqpFR2iV0nYeqnQpGo9TbdeytZEE89AyWk8ZejaSKJp6iMhvf1gz9/f9cm9u7jf3/m7er3N2zr6ffe/vft1+duXTXz6/j8uyLEsAAAAAwM+qBfoAAAAAAEITxQYAAAAAIyg2AAAAABhBsQEAAADACIoNAAAAAEZQbAAAAAAwgmIDAAAAgBEUGwAAAACMoNgAAAAAYESVLzby8vLE5XLJ3Llz/XbNHTt2iMvlkh07dvjtmghN5B8CifxDoJGDCCTyr3I4sthYsWKFuFwu2bNnT6CPYsQXX3wh48ePl8TERKlZs6a4XC7Jy8sL9LHwP6Gef+vXr5c+ffpIo0aNpEaNGtK4cWMZPHiwHDx4MNBHg4R+/omIZGRkSIcOHaRmzZrSoEEDSU1NlYKCgkAfC/9TFXLwr3/9qzz44INSv359iYqKkoSEBHnrrbcCfSxI6OdfZmampKSkSNOmTSUyMlJatmwpEyZMkAsXLgT6aD5zZLER6rKzs2XBggXyzTffSOvWrQN9HFQxn3/+uURHR8u4cePk1VdfldGjR8u+ffskISFBDhw4EOjjIcQtXrxYhg4dKvXq1ZN58+bJqFGjJCMjQ3r37i1Xr14N9PFQBWzatEkefvhhKS4ulunTp8sLL7wgERERMnz4cJk/f36gj4cQ99hjj8nhw4dl2LBhsmDBAunbt68sXLhQunTpIleuXAn08XwSHugDQDVgwAC5cOGC1KlTR+bOnSv79+8P9JFQhTz77LNKbOTIkdK4cWNZvHixLFmyJACnQlVQXFwsU6dOlR49esiHH34oLpdLREQSExPlkUcekTfeeEPGjh0b4FMi1C1cuFDuvvtu+fjjj6VGjRoiIvL4449Lq1atZMWKFTJ+/PgAnxChbN26ddKrVy+32P333y8jRoyQ1atXy8iRIwNzsAoI2TsbxcXF8uyzz8r9998vdevWlVq1akn37t1l+/btt33N/PnzJT4+XiIiIqRnz57aXxs5cuSIDB48WOrVqyc1a9aUjh07yqZNmzye5/Lly3LkyBGvfhWgXr16UqdOHY/7ELycnH86MTExEhkZ6ejbuFWJU/Pv4MGDcuHCBUlJSSkrNEREkpKSpHbt2pKRkeHxvRAcnJqDIiKXLl2S6OjoskJDRCQ8PFzq168vERERHl+PwHNy/tkLDRGRQYMGiYjI4cOHPb4+GIVssXHp0iX505/+JL169ZIXX3xRpk+fLvn5+dKnTx/tnYKVK1fKggUL5Mknn5QpU6bIwYMH5aGHHpKzZ8+W7Tl06JB07txZDh8+LJMnT5b09HSpVauWDBw4UNavX3/H8+zatUtat24tCxcu9PcfFUEoFPLvwoULkp+fL59//rmMHDlSLl26JL179/b69Qgcp+bftWvXRES0P9BFRETIvn37pLS01ItPAIHm1BwUufnD3qFDhyQtLU2OHTsmx48flxkzZsiePXtk0qRJ5f4sUPmcnH86//nPf0REpH79+j69PuAsB1q+fLklItbu3btvu6ekpMS6du2aW+zrr7+2GjZsaP3mN78pi508edISESsiIsI6c+ZMWTw3N9cSEWv8+PFlsd69e1vt2rWzrl69WhYrLS21EhMTrebNm5fFtm/fbomItX37diU2bdq0cv1Z58yZY4mIdfLkyXK9DuZUlfxr2bKlJSKWiFi1a9e2nnnmGevGjRtevx5mhHL+5efnWy6Xy0pNTXWLHzlypCwXCwoK7ngNmBfKOWhZllVUVGQlJydbLperLO8iIyOtDRs2eHwtzAv1/NNJTU21wsLCrC+//NKn1wdayN7ZCAsLk+9973siIlJaWirnz5+XkpIS6dixo+zdu1fZP3DgQImNjS1bJyQkSKdOnWTr1q0iInL+/Hn5+OOPJTk5Wb755hspKCiQgoICKSwslD59+sjRo0flq6++uu15evXqJZZlyfTp0/37B0VQCoX8W758uWzbtk1effVVad26tVy5ckVu3Ljh9esROE7Nv/r160tycrK8+eabkp6eLidOnJBPPvlEUlJSpHr16iIijm2QrGqcmoMiIjVq1JAWLVrI4MGD5c9//rOsWrVKOnbsKMOGDZOcnJxyfhIIBCfnn93bb78tS5culQkTJkjz5s3L/fpgENIN4t/9hXXkyBG5fv16WfyHP/yhslf3D7BFixayZs0aERE5duyYWJYlaWlpkpaWpn2/c+fOuSUrqjan51+XLl3K/vujjz5a9mQ0fz6PHOY4Nf9ee+01uXLlikycOFEmTpwoIiLDhg2Te++9VzIzM6V27doVfg9UDqfm4JgxYyQnJ0f27t0r1ard/HeyycnJ0qZNGxk3bpzk5uZW+D1gnlPz71affPKJpKamSp8+feSFF17w67UrU8gWG6tWrZJf//rXMnDgQHn66aclJiZGwsLCZNasWXL8+PFyX++73xOeOHGi9OnTR7unWbNmFTozQkeo5V90dLQ89NBDsnr1aooNB3By/tWtW1c2btwop06dkry8PImPj5f4+HhJTEyUBg0aSFRUlF/eB2Y5NQeLi4tl6dKlMmnSpLJCQ0SkevXq0q9fP1m4cKEUFxeX/VtzBCen5t+tDhw4IAMGDJC2bdvKunXrJDzcuT+yO/fkHqxbt06aNm0qmZmZbk81mTZtmnb/0aNHldiXX34p99xzj4iING3aVERufuH8+Mc/9v+BEVJCMf+uXLkiFy9eDMh7o3xCIf/i4uIkLi5ORG4+rOAf//iH/PznP6+U90bFOTUHCwsLpaSkRPsro9evX5fS0lJ+ndQBnJp/3zl+/Lj07dtXYmJiZOvWrY6/oxvSPRsiIpZllcVyc3MlOztbu3/Dhg1uv2+3a9cuyc3NlX79+onIzUd/9urVS1577TX597//rbw+Pz//juep6KNH4SxOzr9z584psby8PPnoo4+kY8eOHl+PwHNy/ulMmTJFSkpKmG/gIE7NwZiYGImKipL169dLcXFxWbyoqEg2b94srVq14vG3DuDU/BO5+eSphx9+WKpVqybvv/++NGjQwONrgp2j72wsW7ZMtm3bpsTHjRsnSUlJkpmZKYMGDZL+/fvLyZMnZcmSJfKjH/1IioqKlNc0a9ZMunXrJqNHj5Zr167JSy+9JHfddZfbY+4WLVok3bp1k3bt2smoUaOkadOmcvbsWcnOzpYzZ87ccbryrl275MEHH5Rp06Z5bBC6ePGivPLKKyIikpWVJSI3hwxFRUVJVFSUjBkzxpuPB4aFav61a9dOevfuLe3bt5fo6Gg5evSoLF26VK5fvy6zZ8/2/gOCUaGaf7Nnz5aDBw9Kp06dJDw8XDZs2CAffPCBPP/88/LAAw94/wHBuFDMwbCwMJk4caI888wz0rlzZxk+fLjcuHFDli5dKmfOnJFVq1aV70OCMaGYfyIiffv2lRMnTsikSZPk008/lU8//bTsf2vYsKH85Cc/8eLTCTIBeAJWhX332LPb/ef06dNWaWmpNXPmTCs+Pt6qUaOGdd9991lbtmyxRowYYcXHx5dd67vHns2ZM8dKT0+3mjRpYtWoUcPq3r27deDAAeW9jx8/bg0fPtz6wQ9+YFWvXt2KjY21kpKSrHXr1pXtqehjz747k+4/t54dgRHq+Tdt2jSrY8eOVnR0tBUeHm41atTIevTRR63PPvusIh8b/CTU82/Lli1WQkKCVadOHSsyMtLq3LmztWbNmop8ZPCzUM9By7Ks1atXWwkJCVZUVJQVERFhderUye09EDihnn93+rP17NmzAp9c4Lgs65Z7TAAAAADgJyHbswEAAAAgsCg2AAAAABhBsQEAAADACIoNAAAAAEZQbAAAAAAwgmIDAAAAgBFeD/W7ddw78J3KenIy+QedynxyNzkIHb4DEUjkHwLJ2/zjzgYAAAAAIyg2AAAAABhBsQEAAADACIoNAAAAAEZQbAAAAAAwgmIDAAAAgBEUGwAAAACMoNgAAAAAYATFBgAAAAAjKDYAAAAAGEGxAQAAAMAIig0AAAAARlBsAAAAADCCYgMAAACAERQbAAAAAIyg2AAAAABgBMUGAAAAACMoNgAAAAAYER7oAwBVQZMmTZRYVlaWxz06p0+fVmLz58/3KgYAVUVsbKzbetasWcqeX/3qV0osLy9PibVv395tffHixQqdDZWrVatWSuypp55yW7du3dqra82cOVOJvf/++z6dq6rgzgYAAAAAIyg2AAAAABhBsQEAAADACIoNAAAAAEa4LMuyvNrocpk+i6OtWbNGiQ0ZMsRtXVpaquwJCwszdqbK4GX6VJjT8+/UqVNKzNuGcF/ZG8mTk5OVPTk5OUbPYFpl5Z+I83MQZvAdGBz69++vxJYsWeK2btSokc/Xf+WVV9zW9ubiQCH/vLN7924l1qFDB7e17rPU/bl1+xYsWKDE7I3kBQUFHs/pNN7mH3c2AAAAABhBsQEAAADACIoNAAAAAEZQbAAAAAAwggniPujcubMSS0hIUGL2hnBdgzhCT3p6uhLzphk8OztbiZ05c0aJ6fJPd317THf9Ll26KDGnN40DCB26Bt2VK1cqMfuEbxGR8HD3H3GeeOIJZc+UKVOUmP3hGiIiX3zxxZ2OiSD3wAMP+PS63//+90ps5MiRSkz3wIBvv/3WbZ2WlubTGUIBdzYAAAAAGEGxAQAAAMAIig0AAAAARjDUzwf2YX0iIhkZGUrM/pnpPurc3Fwlphu+pvvd/WDAQCGV7jPR/Q5w165dPe6piPHjx7ut582b59W54uLi/HoOkxjq51/2nBER+dnPfqbEdP1nx44d87jv73//u7KnWjX133lt2bJFiRUWFiqxYMB3oFnLli1TYiNGjFBi27ZtU2K//e1v3da677tmzZopsa+//lqJkX9VM/90unXrpsT+9re/KTH7Pxvdz47r16/338ECgKF+AAAAAAKKYgMAAACAERQbAAAAAIyg2AAAAABgBA3iPsjKylJiuqF+9sZHXVOlrjlS1yD+7rvvlueIlYbmNJVu6F4wDMrbuXOnEtMN9XPSZ02DeMXYB1E999xzyp7atWsrsWvXrikx3edjj1WvXt2rc+kaebdu3eq2HjNmjLLnxo0bXl3fn/gO9J/ExEQl9pe//EWJnTx5UonpHmSQl5fnl3OJiNSpU8dtrRvi9v3vf1+JPf300347gw75FxxmzJihxKZOneq2Hj16tLLn9ddfN3amykCDOAAAAICAotgAAAAAYATFBgAAAAAjKDYAAAAAGBEe6AMEu3feeUeJ6ZpqdU0y9oYqXTO4N02VcJZANIPrHipgb2DU5S2qjvr16yuxtLQ0t7WuGXzu3LlKbM6cOUqsbt26Hs/wyCOPKLGkpCQl1rZtWyX2+OOPu62LioqUPaabceFftWrVclu/+OKLyp5f/OIXSuy9994zdiYRkYYNGyoxe6P6fffdp+y5fPmyEiMnq4YNGzYosSlTplT+QYIUdzYAAAAAGEGxAQAAAMAIig0AAAAARlBsAAAAADCCBnEPdI3fupg308G9nSBemVORETyaNGmixGJjY5VYdna2V9ezT2Feu3atskfXWA7ni4yMVGKbN29WYtHR0W7rWbNmKXvsTeQi+u+y/Px8j+eaP3++V7E1a9YosSFDhrit7733Xo/vh+BmnyivmyCumxbuK90DEEaNGqXEdE3p7du3d1vv3LlT2bNnzx7fD4eQw8N+/o87GwAAAACMoNgAAAAAYATFBgAAAAAjKDYAAAAAGEGDuAfeTvj2Zjq4bs+6deuU2LvvvlueIyKAdE3duknd9mneOi+99JJX75mSkqLEdA21qLrsk5lFRDp16qTErl696rbWPURA1wzuT/YmYRGRu+++W4nZH5zRuXNnZU+bNm2U2KFDhypwOphUUlLitj5w4IDP1+rQoYMS69evn9t67Nixyp4GDRooscLCQiU2YsQIt/Xq1avLe0SEsNatWysxHvbzf9zZAAAAAGAExQYAAAAAIyg2AAAAABhBz8YtdL8DrPs9Z1+H+qWnpyt7MjMzy3NEBJl33nlHiel6NnSD+HS/H+8N+jPgiW4omY59oN7+/fsNnObOlixZosS6du3q8XV169ZVYjExMUqMno3gVVRU5LZ+4403lD26QZO6v2/79u2rxGrWrOm21v3dnZqaqsQ++ugjJWYfkgrcaurUqUqMoX7/x50NAAAAAEZQbAAAAAAwgmIDAAAAgBEUGwAAAACMoEH8FroBbbqYr0P9du3apezJyckpzxERZHQD9rKyspSYrmlcF/OGrild17xob/7VDZCk6TE0RUZGerXPPtTP3+zfi2PGjFH2JCcne3Wtw4cPu60nT56s7Nm+fXs5TodAs+fpT3/6U2WPLqaTn5+vxF5//XW39caNG5U9O3bs8Or6wJ20bNlSidkfSFCVHwjEnQ0AAAAARlBsAAAAADCCYgMAAACAERQbAAAAAIygQdwDbyaDe7tPN70UzqZrsI6Li1NiuibY2NhYt3Xjxo2VPboHFOgm3ev2zZs3747r28UmTJigxOAsFy5c8Gqfbgq3N6KiopRY27ZtlZh9qq5uyrPuu3PRokVKbPr06W7rwsJCD6dEsPvDH/7gtva2Gfz5559XYsuWLVNip06dclvzdzD8oUGDBkpM9+Ag+wMKrly5ouyJj49XYv/6178qcLrgxJ0NAAAAAEZQbAAAAAAwgmIDAAAAgBEUGwAAAACMcFledkzpml+czj6JeciQIcoe3cej+yy82adrEtZNdXaSymq4C8X88yddbnXq1MltrctvXWP52rVrvbp+MKjMhk8n5aCugfHs2bNKrLi42G29e/dur64fExOjxJo3b+7l6dzZG79FRJ577jmfrhUIfAeqdPlhf1iAiMjYsWN9uv6KFSuUWGpqqk/Xcjryz6wePXoosfT0dCXWoUMHJWafaq97qMVdd92lxPbt26fE1q9f77a2N58Hirf5x50NAAAAAEZQbAAAAAAwgmIDAAAAgBEUGwAAAACMqDITxHVTl+0NtLpGFyaIwwnWrFnjMaabDD5+/Hglppsqbm8Q170fgkdRUZESmz17thKbOHGi27pr167GziQiMnnyZCU2Z84co++Jyvfhhx8qMd2E+f3797utt2zZouxp0aKFV9cCyqtWrVpu65UrVyp7Bg0apMR0P8tdvnxZiZ0+fdptXVBQoOx5+eWXPZ4zFHBnAwAAAIARFBsAAAAAjKDYAAAAAGBESA710/Vn7Ny5U4nZ/+i+Duu73T77wL6UlBT1sA7HQKHQc+rUKY974uLiKuEknjHUr2Ls35W6YYC6gY6//OUvlZju95Htw/kWLlxY3iMGvar+HbhhwwYllpSUpMT27t2rxPr37++2tg9BExEJCwtTYsOGDVNib7755p2OGbKqev5VxIwZM9zWU6ZMUfZ4+/OebmiufRBfKGKoHwAAAICAotgAAAAAYATFBgAAAAAjKDYAAAAAGBGSDeIZGRlKTNe8Yx/E5+uwvtvt6969u9s6JydHPazD0ZwWenQD++z//wmWfx40iPuXrkH8xIkTSsw+DEtEP7Dvj3/8o38OFsSq+negboDfV199pcQmTZqkxM6dO+fTe0ZFRSkxe7O5iMjq1at9ur6TVPX80/H2++mpp57y6VqZmZlKbPDgwd4dLsTQIA4AAAAgoCg2AAAAABhBsQEAAADACIoNAAAAAEaEB/oAJugamXQxe6O3N3tut2/o0KFKLBQbwhFa7BOkbxeza9KkiRI7ffq0X86EwFm0aJES0zVI6qZGz5kzx8SREER0E5YPHjyoxDZt2qTEfG0G19HlZIsWLfx2fTjboEGDlJgud5944gmPe06dOqXEhg8fXoHTVU3c2QAAAABgBMUGAAAAACMoNgAAAAAYQbEBAAAAwIiQbBDXTTTUxXydIK5r/KYZHIGUnJysxGJjY93W9ingIiJdunTx6f1oBg8N9onhPXr0UPZ8++23Smz58uVKrDKnuSMwpk6dqsS2bt2qxHbu3Gn0HAMGDFBiERERRt8TzvHWW28pMd3PcvYJ4pGRkcqefv36KbHLly/7frgqijsbAAAAAIyg2AAAAABgBMUGAAAAACNCsmfD9FC/7t27V+B0wE32Pgt7j4WIvqdCN3RPN2TPV9nZ2UosJSXFb9dH8HjyySfd1jExMcqe6dOnK7HNmzebOhKC2GeffabEEhMTlVjPnj2VWFZWlk/v2aZNGyU2a9YsJZaWlubT9RF6dP0Zup6yli1buq1/97vfKXuOHDniv4NVYdzZAAAAAGAExQYAAAAAIyg2AAAAABhBsQEAAADAiJBsEDc91A9Vg70ROy4uTtkzePBgJda4cWMl5uvwPG/pmrrtzpw5o8TmzZunxBhQWXU89thjHvdkZmZWwkngBBs3blRiumbt9957z2/vqWvQnTFjhhJ7++23/faecA7dd5i3P8u9/PLLd1zDf7izAQAAAMAIig0AAAAARlBsAAAAADCCYgMAAACAESHZIO7tBPGhQ4e6rXUNtAg9ugncukZpb5q6165dq8R0DeK66+fm5nq8vo6uGfz06dM+XQtVR6tWrZRYnTp13NarVq1S9vzzn/80diY4i66Btnr16kps6tSpSuzEiRNKbN++fW5r3XdzSUmJEtN9BxYWFioxhD7dAywWL17s1b6ZM2caORNU3NkAAAAAYATFBgAAAAAjKDYAAAAAGEGxAQAAAMAIl6Ubra3bqGmwDga6hrKMjAwlpmugpUG84rxMnwoL1vxDYFVW/ok4PweTkpKU2KZNm9zWffv2VfZ88MEHxs4UCvgORCCRfwgkb/OPOxsAAAAAjKDYAAAAAGAExQYAAAAAIyg2AAAAABjh+AniOTk5Suyee+6p/IMAAAAAcMOdDQAAAABGUGwAAAAAMIJiAwAAAIARju/ZAAB4lpWVpcTOnz8fgJMAAKoS7mwAAAAAMIJiAwAAAIARFBsAAAAAjKDYAAAAAGCEy7Isy6uNLpfps8CBvEyfCiP/oFNZ+SdCDkKP70AEEvmHQPI2/7izAQAAAMAIig0AAAAARlBsAAAAADCCYgMAAACAEV43iAMAAABAeXBnAwAAAIARFBsAAAAAjKDYAAAAAGAExQYAAAAAIyg2AAAAABhBsQEAAADACIoNAAAAAEZQbAAAAAAwgmIDAAAAgBH/BW6IInkcjkP2AAAAAElFTkSuQmCC",
            "text/plain": [
              "<Figure size 1000x200 with 5 Axes>"
            ]
          },
          "metadata": {},
          "output_type": "display_data"
        }
      ],
      "source": [
        "# 定义“洗照片”的规则\n",
        "transform = transforms.Compose([\n",
        "    transforms.ToTensor(),\n",
        "    transforms.Normalize((0.1307,), (0.3081,))\n",
        "])\n",
        "\n",
        "# 下载练习题（训练集）和考试题（测试集）\n",
        "train_dataset = datasets.MNIST(root='./data', train=True, download=True, transform=transform)\n",
        "test_dataset = datasets.MNIST(root='./data', train=False, download=True, transform=transform)\n",
        "\n",
        "# 分装成小包，方便电脑阅读\n",
        "train_loader = DataLoader(train_dataset, batch_size=64, shuffle=True)\n",
        "test_loader = DataLoader(test_dataset, batch_size=1000, shuffle=False)\n",
        "\n",
        "# 展示一下我们要识别的数字长什么样\n",
        "examples = next(iter(train_loader))\n",
        "plt.figure(figsize=(10, 2))\n",
        "for i in range(5):\n",
        "    plt.subplot(1, 5, i+1)\n",
        "    plt.imshow(examples[0][i][0], cmap='gray')\n",
        "    plt.title(f'Label: {examples[1][i]}')\n",
        "    plt.axis('off')\n",
        "plt.show()"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "682b13a2"
      },
      "source": [
        "### 3. 搭建神经网络 (CNN)：电脑的“大脑结构”\n",
        "\n",
        "卷积神经网络（CNN）模仿了人类的视觉。想象你在看一张数字 `8` 的图片：\n",
        "1.  **卷积层 (Conv2d)**：就像放大镜，专门盯着图片的边缘、线条看。\n",
        "2.  **池化层 (MaxPool2d)**：把图片缩小，只保留最关键的信息，防止被细节淹没。\n",
        "3.  **全连接层 (Linear)**：最后把看到的特征拼在一起，猜这张图到底是几。"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 12,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "d0337c02",
        "outputId": "53b79fed-965a-4c07-a5cd-3c1a83f18f6b"
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "模型结构已定义！\n"
          ]
        }
      ],
      "source": [
        "class SimpleCNN(nn.Module):\n",
        "    def __init__(self):\n",
        "        super(SimpleCNN, self).__init__()\n",
        "        # 第一层：抓取基础特征（线段、圆弧）\n",
        "        self.conv1 = nn.Conv2d(1, 32, kernel_size=3, padding=1)\n",
        "        # 第二层：组合复杂特征（圆圈、交叉）\n",
        "        self.conv2 = nn.Conv2d(32, 64, kernel_size=3, padding=1)\n",
        "        self.pool = nn.MaxPool2d(2, 2)\n",
        "        self.relu = nn.ReLU() # 激活函数：让大脑变得“灵活”\n",
        "        self.fc1 = nn.Linear(64 * 7 * 7, 128)\n",
        "        self.fc2 = nn.Linear(128, 10)\n",
        "\n",
        "    def forward(self, x):\n",
        "        x = self.pool(self.relu(self.conv1(x)))\n",
        "        x = self.pool(self.relu(self.conv2(x)))\n",
        "        x = x.view(-1, 64 * 7 * 7) # 展平：把图片摊开变成一排数字\n",
        "        x = self.relu(self.fc1(x))\n",
        "        x = self.fc2(x)\n",
        "        return x\n",
        "\n",
        "model = SimpleCNN().to(device)\n",
        "print(\"模型结构已定义！\")"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "3e1d811c"
      },
      "source": [
        "### 4. 训练：让模型“通过错误学习”\n",
        "\n",
        "模型刚开始是瞎猜的。我们需要两个助手：\n",
        "*   **损失函数 (Loss)**：告诉模型它错得有多离谱。\n",
        "*   **优化器 (Optimizer)**：告诉模型该怎么修改自己的参数，下次才能猜得更准。"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 13,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "aadafede",
        "outputId": "2aa84cb9-3075-48dc-f3f8-9d2cfcd47b50"
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "训练轮次 1: 进度 0/60000 Loss: 2.3244\n",
            "训练轮次 1: 进度 19200/60000 Loss: 0.1229\n",
            "训练轮次 1: 进度 38400/60000 Loss: 0.0435\n",
            "训练轮次 1: 进度 57600/60000 Loss: 0.0223\n",
            "训练轮次 2: 进度 0/60000 Loss: 0.0854\n",
            "训练轮次 2: 进度 19200/60000 Loss: 0.0468\n",
            "训练轮次 2: 进度 38400/60000 Loss: 0.0616\n",
            "训练轮次 2: 进度 57600/60000 Loss: 0.1472\n",
            "训练完成！\n"
          ]
        }
      ],
      "source": [
        "criterion = nn.CrossEntropyLoss()\n",
        "optimizer = optim.Adam(model.parameters(), lr=0.001)\n",
        "\n",
        "def train_one_epoch(epoch):\n",
        "    model.train()\n",
        "    for batch_idx, (data, target) in enumerate(train_loader):\n",
        "        data, target = data.to(device), target.to(device)\n",
        "        optimizer.zero_grad()    # 清空上次的错误记忆\n",
        "        output = model(data)     # 电脑给出的预测结果\n",
        "        loss = criterion(output, target) # 计算损失（离标准答案差多少）\n",
        "        loss.backward()          # 反向寻找变强的方法\n",
        "        optimizer.step()         # 真正更新参数，实现进化\n",
        "\n",
        "        if batch_idx % 300 == 0:\n",
        "            print(f'训练轮次 {epoch}: 进度 {batch_idx * len(data)}/{len(train_loader.dataset)} Loss: {loss.item():.4f}')\n",
        "\n",
        "# 开始训练 2 轮\n",
        "for epoch in range(1, 3):\n",
        "    train_one_epoch(epoch)\n",
        "print('训练完成！')"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "f2e51ea6"
      },
      "source": [
        "### 5. 评估：模型考得怎么样？\n",
        "\n",
        "训练完后，我们要用模型没见过的图片（测试集）来考考它。准确率（Accuracy）越高，说明模型越聪明。"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 14,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "4c0c828e",
        "outputId": "c9be6054-cb4b-4405-f8ed-ffceda9758f7"
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "\n",
            "测试集结果: 平均 Loss: 0.0000, 准确率: 9900/10000 (99.00%)\n",
            "\n"
          ]
        }
      ],
      "source": [
        "def test():\n",
        "    model.eval() # 开启评估模式\n",
        "    test_loss = 0\n",
        "    correct = 0\n",
        "    with torch.no_grad(): # 考试时不需要寻找变强的方法，所以关闭梯度计算\n",
        "        for data, target in test_loader:\n",
        "            data, target = data.to(device), target.to(device)\n",
        "            output = model(data)\n",
        "            test_loss += criterion(output, target).item()\n",
        "            pred = output.argmax(dim=1, keepdim=True) # 找到概率最大的那个数字\n",
        "            correct += pred.eq(target.view_as(pred)).sum().item()\n",
        "\n",
        "    test_loss /= len(test_loader.dataset)\n",
        "    print(f'\\n测试集结果: 平均 Loss: {test_loss:.4f}, 准确率: {correct}/{len(test_loader.dataset)} ({100. * correct / len(test_loader.dataset):.2f}%)\\n')\n",
        "\n",
        "test()"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "90ec1283"
      },
      "source": [
        "### 6. 进阶可视化：混淆矩阵\n",
        "\n",
        "**混淆矩阵**是一个非常有用的工具。它可以告诉我们：模型是不是经常把 `4` 看成 `9`？或者把 `5` 看成 `6`？\n",
        "\n",
        "*   **横轴**：模型预测的结果。\n",
        "*   **纵轴**：真实的数字。\n",
        "*   **对角线**：颜色越深，说明猜对的越多。"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 18,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 856
        },
        "id": "c5e13015",
        "outputId": "6bdfed02-6209-4682-e883-449e64f6fb7f"
      },
      "outputs": [
        {
          "data": {
            "image/png": "iVBORw0KGgoAAAANSUhEUgAAA5wAAANXCAYAAABZnVCmAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAArGhJREFUeJzs3Xd4FFXfxvF7U0iQGhNClxIggBCIlEAA6SpNAiIivSMiKIgF6ViiiEgv0qSjICAWioCVElRKUHoRBUXYhE4IkOzzR2RxTRYmbIbN8nw/7zXX9XL2zOyZm4kPv5yzZy02m80mAAAAAAAymJe7BwAAAAAAuDdRcAIAAAAATEHBCQAAAAAwBQUnAAAAAMAUFJwAAAAAAFNQcAIAAAAATEHBCQAAAAAwBQUnAAAAAMAUFJwAAAAAAFNQcALINA4ePKhHHnlEuXLlksVi0cqVKzP0+r/99pssFos+/PDDDL2uJ6tTp47q1KmTodf8448/5O/vr02bNmXodTMzi8WiESNG2P/84YcfymKx6Lfffrur4yhatKg6d+58V9/zXrdnzx75+Pjol19+cfdQAMAjUXACcHD48GH16tVLxYsXl7+/v3LmzKkaNWpo/PjxSkhIMPW9O3XqpN27d+vNN9/U/PnzVblyZVPf727q3LmzLBaLcubMmWaOBw8elMVikcVi0ZgxY9J9/T///FMjRozQzp07M2C0rhk1apQiIiJUo0YNe9uN+w8LC5PNZkt1jsVi0XPPPXc3hwlJZ8+elb+/vywWi/bu3evu4WRKZcuWVZMmTTRs2DB3DwUAPBIFJwC7L774QuXLl9fHH3+sZs2aaeLEiYqOjtYDDzygl156Sc8//7xp752QkKAtW7aoW7dueu6559S+fXsVKlQoQ9+jSJEiSkhIUIcOHTL0ukb5+Pjo8uXL+uyzz1K9tnDhQvn7+9/xtf/880+NHDky3QXnunXrtG7dujt+3/86ffq05s6dq2eeeSbN13fv3q3ly5dn2PtlVh06dFBCQoKKFCni7qHc0tKlS2WxWJQvXz4tXLjQ3cPJtJ555hmtWLFChw8fdvdQAMDjUHACkCQdPXpUbdq0UZEiRbRnzx6NHz9ePXr0UJ8+fbR48WLt2bNHDz74oGnvf/r0aUlS7ty5TXsPi8Uif39/eXt7m/Yet+Ln56f69etr8eLFqV5btGiRmjRpctfGcvnyZUlSlixZlCVLlgy77oIFC+Tj46NmzZqlei1r1qwqVaqURo0aleYsZ0a5fv26rl69atr1jfD29rbPHGZmCxYsUOPGjfX0009r0aJF7h6OU1euXFFycrLb3r9BgwYKCAjQ3Llz3TYGAPBUFJwAJEmjR4/WxYsXNWvWLOXPnz/V6yVKlHCY4bx+/bpef/11hYSEyM/PT0WLFtVrr72mxMREh/OKFi2qpk2b6ocfflDVqlXl7++v4sWLa968efY+I0aMsM8EvfTSS7JYLCpatKiklKWYN/7/fxsxYkSqf8x/9dVXqlmzpnLnzq3s2bMrNDRUr732mv11Z5/h3Lhxo2rVqqVs2bIpd+7cat68earlhTfe79ChQ+rcubNy586tXLlyqUuXLvbizYi2bdtq9erVOnv2rL3txx9/1MGDB9W2bdtU/ePj4zVw4ECVL19e2bNnV86cOdWoUSPt2rXL3uebb75RlSpVJEldunSxL829cZ916tRRuXLl9PPPP+vhhx/WfffdZ8/lv5/h7NSpk/z9/VPd/6OPPqqAgAD9+eeft7y/lStXKiIiQtmzZ0/1mpeXl4YMGaLY2FitWLHilteRpFOnTqlbt27Kmzev/P39VaFChVT/4L/xdzpmzBiNGzfO/jzu2bPH/nd24MABtW/fXrly5VKePHk0dOhQ2Ww2/fHHH2revLly5sypfPny6b333nO49tWrVzVs2DBVqlRJuXLlUrZs2VSrVi19/fXXtx37fz/DeWMsaR3//sxlcnKyxo0bpwcffFD+/v7KmzevevXqpTNnzjhc32az6Y033lChQoV03333qW7duvr1119vO65/+/333/X999+rTZs2atOmjY4eParNmzen2XfBggWqWrWq7rvvPgUEBOjhhx9ONTO+evVq1a5dWzly5FDOnDlVpUoVhyLW2edL//sMfvPNN7JYLFqyZImGDBmiggUL6r777tP58+cN/TzccOXKFY0YMUKlSpWSv7+/8ufPr5YtW+rw4cOy2WwqWrSomjdvnuZ5uXLlUq9evextvr6+qlOnjj799NPbxQoA+A8fdw8AQObw2WefqXjx4oqMjDTUv3v37po7d65atWqlF198UTExMYqOjtbevXtTFROHDh1Sq1at1K1bN3Xq1EmzZ89W586dValSJT344INq2bKlcufOrf79++vpp59W48aN0yxYbuXXX39V06ZNFRYWplGjRsnPz0+HDh267cY169evV6NGjVS8eHGNGDFCCQkJmjhxomrUqKHt27enKnZbt26tYsWKKTo6Wtu3b9fMmTMVHBysd955x9A4W7ZsqWeeeUbLly9X165dJaXMbpYuXVoPPfRQqv5HjhzRypUr9eSTT6pYsWL6+++/NX36dNWuXVt79uxRgQIFVKZMGY0aNUrDhg1Tz549VatWLUly+LuMi4tTo0aN1KZNG7Vv31558+ZNc3zjx4/Xxo0b1alTJ23ZskXe3t6aPn261q1bp/nz56tAgQJO7+3atWv68ccf1bt3b6d92rZtq9dff12jRo1SixYtnM4AJiQkqE6dOjp06JCee+45FStWTEuXLlXnzp119uzZVMu758yZoytXrqhnz57y8/PT/fffb3/tqaeeUpkyZfT222/riy++0BtvvKH7779f06dPV7169fTOO+9o4cKFGjhwoKpUqaKHH35YknT+/HnNnDlTTz/9tHr06KELFy5o1qxZevTRR7Vt2zZVrFjR6X3+V8uWLVWiRAmHtp9//lnjxo1TcHCwva1Xr1768MMP1aVLF/Xr109Hjx7VpEmTtGPHDm3atEm+vr6SpGHDhumNN95Q48aN1bhxY23fvl2PPPJIumZ2Fy9erGzZsqlp06bKmjWrQkJCtHDhwlT/DRg5cqRGjBihyMhIjRo1SlmyZFFMTIw2btyoRx55RFJKgd21a1c9+OCDGjRokHLnzq0dO3ZozZo1af4ixYjXX39dWbJk0cCBA5WYmKgsWbJoz549t/15kKSkpCQ1bdpUGzZsUJs2bfT888/rwoUL+uqrr/TLL78oJCRE7du31+jRoxUfH+/wvHz22Wc6f/682rdv7zCeSpUq6dNPP9X58+eVM2fOO7onAPi/ZAPwf+/cuXM2SbbmzZsb6r9z506bJFv37t0d2gcOHGiTZNu4caO9rUiRIjZJtu+++87edurUKZufn5/txRdftLcdPXrUJsn27rvvOlyzU6dOtiJFiqQaw/Dhw23//k/Y+++/b5NkO336tNNx33iPOXPm2NsqVqxoCw4OtsXFxdnbdu3aZfPy8rJ17Ngx1ft17drV4ZotWrSwBQYGOn3Pf99HtmzZbDabzdaqVStb/fr1bTabzZaUlGTLly+fbeTIkWlmcOXKFVtSUlKq+/Dz87ONGjXK3vbjjz+murcbateubZNkmzZtWpqv1a5d26Ft7dq1Nkm2N954w3bkyBFb9uzZbVFRUbe9x0OHDtkk2SZOnHjL+587d65Nkm358uX21yXZ+vTpY//zuHHjbJJsCxYssLddvXrVVr16dVv27Nlt58+ft2chyZYzZ07bqVOnHN7zxt9Zz5497W3Xr1+3FSpUyGaxWGxvv/22vf3MmTO2rFmz2jp16uTQNzEx0eGaZ86cseXNmzfVcyDJNnz4cPuf58yZY5NkO3r0aJpZnT592vbAAw/Yypcvb7t48aLNZrPZvv/+e5sk28KFCx36rlmzxqH91KlTtixZstiaNGliS05Otvd77bXXbJIc7uFWypcvb2vXrp3D+UFBQbZr167Z2w4ePGjz8vKytWjRItVzeOO9z549a8uRI4ctIiLClpCQkGYfmy3lvwVpje2/z+DXX39tk2QrXry47fLlyw59jf48zJ492ybJNnbs2FTvd2NM+/fvt0myTZ061eH1xx9/3Fa0aFGHsdtsNtuiRYtskmwxMTGprgkAcI4ltQB0/vx5SVKOHDkM9f/yyy8lSQMGDHBof/HFFyWlbD70b2XLlrXPuklSnjx5FBoaqiNHjtzxmP/rxmc/P/30U8Of9frrr7+0c+dOde7c2WGGIywsTA0bNrTf57/9dzOcWrVqKS4uzp6hEW3bttU333yjkydPauPGjTp58qTTWSA/Pz95eaX8pzopKUlxcXH25cLbt283/J5+fn7q0qWLob6PPPKIevXqpVGjRqlly5by9/fX9OnTb3teXFycJCkgIOCW/dq1a6eSJUve8rOcX375pfLly6enn37a3ubr66t+/frp4sWL+vbbbx36P/HEE8qTJ0+a1+revbv9//f29lblypVls9nUrVs3e3vu3LlTPZPe3t72z7cmJycrPj5e169fV+XKldOV/X8lJSXp6aef1oULF7RixQply5ZNUsoGPrly5VLDhg1ltVrtR6VKlZQ9e3b7Ut7169fr6tWr6tu3r8MM8QsvvGB4DLGxsdq9e7dDvk8//bSsVqvWrl1rb1u5cqWSk5M1bNgw+3N4w433/uqrr3ThwgW9+uqrqTa+cuUzrJ06dVLWrFkd2oz+PHzyyScKCgpS3759U133xphKlSqliIgIh82S4uPjtXr1arVr1y7V2G8811ar9Y7vCQD+H1FwArAvD7tw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c1SnTh0NHTpUo0ePvuX5zZs31+DBgw19dYS3t7cGDx6c5mZGPXv21PTp09W5c2f9/PPPKlq0qJYtW2afgTK6wZUrmjZtquXLl6tFixZq0qSJjh49qmnTpqls2bLpXnI6cuRI7dmzR0OGDEk1oxsSEqLq1aurdu3a6tWrl6Kjo7Vz50498sgj8vX11cGDB7V06VKNHz9erVq1Up48eTRw4EBFR0eradOmaty4sXbs2KHVq1ffdrlnYmKiPvnkEzVs2DDVBj83PP744xo/frxOnTqlEiVKaPDgwXr99ddVq1YttWzZUn5+fvrxxx9VoEABRUdHK2fOnHr//ffVvXt3ValSRW3btlVAQIB27dqly5cv2787tXv37lq2bJkee+wxtW7dWocPH9aCBQscPsd6O0Z/Hjp27Kh58+ZpwIAB2rZtm2rVqqVLly5p/fr1evbZZx2+f7NJkyYKDAzU0qVL1ahRozQ/r3zt2jV9++23evbZZw2PFQDwj7u/MS6AzOzAgQO2Hj162IoWLWrLkiWLLUeOHLYaNWrYJk6caLty5Yq937Vr12wjR460FStWzObr62srXLiwbdCgQQ59bLaUr0Jo0qRJqvf571chOPtaFJvNZlu3bp2tXLlytixZsthCQ0NtCxYsSPW1KBs2bLA1b97cVqBAAVuWLFlsBQoUsD399NO2AwcOpHqP/351yPr16201atSwZc2a1ZYzZ05bs2bNbHv27HHoc+P9/vu1K7f7+osb/v21IM44+1qUF1980ZY/f35b1qxZbTVq1LBt2bIlza8z+fTTT21ly5a1+fj4ONxn7dq1bQ8++GCa7/nv65w/f95WpEgR20MPPeTw1Rg2m83Wv39/m5eXl23Lli23vIe///7b5uPjY5s/f76h+7927ZotJCQk1dei3LhWly5dbEFBQbYsWbLYypcvn+rv7lbPjbO/M2dj+W9OycnJtrfeestWpEgRm5+fny08PNz2+eefp/lVPbrN16J06tTJJinN479fFfLBBx/YKlWqZMuaNastR44ctvLly9tefvll259//mnvk5SUZBs5cqT9uahTp47tl19+cfrVIzd88sknNkm2WbNmOe3zzTff2CTZxo8fb2+bPXu2LTw83Obn52cLCAiw1a5d2/bVV185nLdq1SpbZGSk/eeoatWqtsWLFzv0ee+992wFCxa0+fn52WrU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aFH5+/srIiJC27Ztu2X/s2fPqk+fPsqfP7/8/PxUqlQpffnll+l6T5bUAgAAAIAT98rXonz00UcaMGCApk2bpoiICI0bN06PPvqo9u/fr+Dg4FT9r169qoYNGyo4OFjLli1TwYIFdezYMeXOnTtd70vBCQAAAAD3uLFjx6pHjx7q0qWLJGnatGn64osvNHv2bL366qup+s+ePVvx8fHavHmzfH19JUlFixZN9/uypBYAAAAAPExiYqLOnz/vcCQmJqbZ9+rVq/r555/VoEEDe5uXl5caNGigLVu2pHnOqlWrVL16dfXp00d58+ZVuXLl9NZbbykpKSld46TgBAAAAAAnLJbMeURHRytXrlwOR3R0dJr3YLValZSUpLx58zq0582bVydPnkzznCNHjmjZsmVKSkrSl19+qaFDh+q9997TG2+8ka78WFILGHCPLN033ZltE9w9BI8RUOU5dw/BI5z5cZK7hwAAQKY0aNAgDRgwwKHNz88vw66fnJys4OBgffDBB/L29lalSpV04sQJvfvuuxo+fLjh61BwAgAAAICH8fPzM1xgBgUFydvbW3///bdD+99//618+fKleU7+/Pnl6+srb29ve1uZMmV08uRJXb16VVmyZDH03iypBQAAAAAnLJn0/9IjS5YsqlSpkjZs2GBvS05O1oYNG1S9evU0z6lRo4YOHTqk5ORke9uBAweUP39+w8WmRMEJAAAAAPe8AQMGaMaMGZo7d6727t2r3r1769KlS/Zdazt27KhBgwbZ+/fu3Vvx8fF6/vnndeDAAX3xxRd666231KdPn3S9L0tqAQAAAOAe99RTT+n06dMaNmyYTp48qYoVK2rNmjX2jYR+//13eXndnI8sXLiw1q5dq/79+yssLEwFCxbU888/r1deeSVd72ux2Wy2DL2TTODKdXePAABujU2DjGHTIAC4N/h78DTX4x/86O4hpGlVzyruHoIhLKkFAAAAAJiCghMAAAAAYAoPntwGAAAAAHNZ+EJ2lzDDCQAAAAAwBQUnAAAAAMAULKkFAAAAACdYUesaZjgBAAAAAKag4AQAAAAAmIIltQAAAADghBdral3CDCcAAAAAwBQUnAAAAAAAU7CkFgAAAACcYEWta5jhBAAAAACYgoITAAAAAGAKltQCAAAAgBMW1tS6hBlOAAAAAIApKDgBAAAAAKZgSS0AAAAA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ivr27auyZcvynsrDzJkz1aVLF5UrV06enp6qW7euOnTooC1btri6NNzGaDhNFBQUJE9PTx0/ftxh/Pjx4ypdurSLqkJh0LNnTy1evFirVq1S+fLlXV2OW/L29rb/RrdevXratGmT3n77bb377rsursx9bNmyRSdOnFDdunXtYzk5OVq1apWSkpKUlZUlT09PF1bovu666y7de++92r9/v6tLcStlypTJ9Uud6tWra8GCBS6qyP39/PPP+uabb/T555+7uhS39PLLL2vgwIF66qmnJEm1atXSzz//rMTERBrOPNxzzz1auXKlMjIydPbsWZUpU0bt27fX3Xff7erScBvjM5wm8vb2Vr169ZScnGwfs1qtSk5O5rNkuCE2m009e/bUwoUL9e2336pKlSquLqnAsFqtysrKcnUZbqVZs2basWOHUlJS7I+IiAjFxsYqJSWFZvMa0tPTdeDAAZUpU8bVpbiVRo0a5fpTTXv37lWlSpVcVJH7mzZtmkqVKuVwkxdccf78eXl4OP5z1dPTU1ar1UUVFQxFihRRmTJldPr0aS1btkytWrVydUm4jbHCabKEhATFxcUpIiJCDRo00IQJE5SRkaHOnTu7ujS3kp6e7rBScPDgQaWkpKhEiRKqWLGiCytzL/Hx8ZozZ46++OIL+fv769ixY5KkYsWKyc/Pz8XVuY9BgwapRYsWqlixos6dO6c5c+ZoxYoVWrZsmatLcyv+/v65Pv9bpEgRBQYG8rngv+jfv79atmypSpUq6ciRIxo6dKg8PT3VoUMHV5fmVvr166fo6Gi98cYbevLJJ7Vx40a99957eu+991xdmluyWq2aNm2a4uLi5OXFP8ny0rJlS40aNUoVK1ZUzZo19f333+vf//63unTp4urS3NKyZctks9kUEhKi/fv36+WXX1ZoaCj/7oRr2WC6SZMm2SpWrGjz9va2NWjQwLZ+/XpXl+R2vvvuO5ukXI+4uDhXl+ZW8spIkm3atGmuLs2tdOnSxVapUiWbt7e3rWTJkrZmzZrZ/vvf/7q6rAKhcePGtj59+ri6DLfTvn17W5kyZWze3t62cuXK2dq3b2/bv3+/q8tyS//5z39s9913n83Hx8cWGhpqe++991xdkttatmyZTZJtz549ri7FbZ09e9bWp08fW8WKFW2+vr62u+++2/avf/3LlpWV5erS3NK8efNsd999t83b29tWunRpW3x8vO333393dVm4zfF3OAEAAAAApuAznAAAAAAAU9BwAgAAAABMQcMJAAAAADAFDScAAAAAwBQ0nAAAAAAAU9BwAgAAAABMQcMJAAAAADAFDScAAAAAwBQ0nACAG9KpUye1bt3a/vWDDz6ovn373vI6VqxYIYvFot9//9201/jrtd6IW1EnAADuhoYTAAqRTp06yWKxyGKxyNvbW1WrVtXrr7+uS5cumf7an3/+uUaMGGFo7q1uvipXrqwJEybcktcCAABXeLm6AADAzfXII49o2rRpysrK0pIlSxQfH6877rhDgwYNyjU3Oztb3t7eN+V1S5QocVPOAwAACg9WOAGgkPHx8VHp0qVVqVIlde/eXTExMfryyy8lXdkaOmrUKJUtW1YhISGSpF9++UVPPvmk7rrrLpUoUUKtWrXSoUOH7OfMyclRQkKC7rrrLgUGBmrAgAGy2WwOr/vXLbVZWVl65ZVXVKFCBfn4+Khq1ar68MMPdejQITVp0kSSVLx4cVksFnXq1EmSZLValZiYqCpVqsjPz09hYWGaP3++w+ssWbJE9957r/z8/NSkSROHOm9ETk6Ounbtan/NkJAQvf3223nOHT58uEqWLKmAgAC9+OKLys7Otj9npHYAAG43rHACQCHn5+entLQ0+9fJyckKCAjQ8uXLJUkXL15U8+bNFRUVpdWrV8vLy0sjR47UI488ou3bt8vb21vjx4/X9OnT9dFHH6l69eoaP368Fi5cqKZNmzp93Y4dO2rdunWaOHGiwsLCdPDgQaWmpqpChQpasGCBHn/8ce3Zs0cBAQHy8/OTJCUmJmrWrFmaOnWqqlWrplWrVumZZ55RyZIl1bhxY/3yyy9q27at4uPj9cILL2jz5s166aWX8pWP1WpV+fLl9dlnnykwMFBr167VCy+8oDJlyujJJ590yM3X11crVqzQoUOH1LlzZwUGBmrUqFGGagcA4LZkAwAUGnFxcbZWrVrZbDabzWq12pYvX27z8fGx9e/f3/58cHCwLSsry37MzJkzbSEhITar1Wofy8rKsvn5+dmWLVtms9lstjJlytjGjh1rf/7ixYu28uXL21/LZrPZGjdubOvTp4/NZrPZ9uzZY5NkW758eZ51fvfddzZJttOnT9vHLly4YLvzzjtta9eudZjbtWtXW4cOHWw2m802aNAgW40aNRyef+WVV3Kd668qVapke+utt5w+/1fx8fG2xx9/3P51XFycrUSJEraMjAz72JQpU2xFixa15eTkGKo9r2sGAKCwY4UTAAqZxYsXq2jRorp48aKsVquefvppDRs2zP58rVq1HD63uW3bNu3fv1/+/v4O57lw4YIOHDigM2fO6OjRo4qMjLQ/5+XlpYiIiFzbav+UkpIiT0/P61rZ279/v86fP6+HHnrIYTw7O1t16tSRJP34448OdUhSVFSU4ddwZvLkyfroo490+PBhZWZmKjs7W+Hh4Q5zwsLCdOeddzq8bnp6un755Relp6f/be0AANyOaDgBoJBp0qSJpkyZIm9vb5UtW1ZeXo4/6osUKeLwdXp6uurVq6fZs2fnOlfJkiVvqIY/t8hej/T0dEnSV199pXLlyjk85+Pjc0N1GDF37lz1799f48ePV1RUlPz9/fXmm29qw4YNhs/hqtoBAHB3NJwAUMgUKVJEVatWNTy/bt26mjdvnkqVKqWAgIA855QpU0YbNmzQAw88IEm6dOmStmzZorp16+Y5v1atWrJarVq5cqViYmJyPf/nCmtOTo59rEaNGvLx8dHhw4edroxWr17dfgOkP61fv/7vL/Ia1qxZo+joaPXo0cM+duDAgVzztm3bpszMTHszvX79ehUtWlQVKlRQiRIl/rZ2AABuR9ylFgBuc7GxsQoKClKrVq20evVqHTx4UCtWrFDv3r3166+/SpL69Omj0aNHa9GiRdq9e7d69Ohxzb+hWblyZcXFxalLly5atGiR/ZyffvqpJKlSpUqyWCxavHixTp48qfT0dPn7+6t///7q16+fZsyYoQMHDmjr1q2aNGmSZsyYIUl68cUXtW/fPr388svas2eP5syZo+nTpxu6zt9++00pKSkOj9OnT6tatWravHmzli1bpr179+q1117Tpk2bch2fnZ2trl276ocfftCSJUs0dOhQ9ezZUx4eHoZqBwDgdkTDCQC3uTvvvFOrVq1SxYoV1bZtW1WvXl1du3bVhQsX7CueL730kp599lnFxcXZt522adPmmuedMmWK2rVrpx49eig0NFTPP/+8MjIyJEnlypXT8OHDNXDgQAUHB6tnz56SpBEjRui1115TYmKiqlevrkceeURfffWVqlSpIkmqWLGiFixYoEWLFiksLExTp07VG2+8Yeg6x40bpzp16jg8vvrqK3Xr1k1t27ZV+/btFRkZqbS0NIfVzj81a9ZM1apV0wMPPKD27dvrn//8p8NnY/+udgAAbkcWm7M7PgAAAAAAkA+scAIAAAAATEHDCQAAAAAwBQ0nAAAAAMAUNJwAAAAAAFPQcAIAAAAATEHDCQAAAAAwBQ0nAAAAAMAUNJwAAAAAAFPQcAIAAAAATEHDCQAAAAAwBQ0nAAAAAMAU/w85gqTvfQQ2iAAAAABJRU5ErkJggg==",
            "text/plain": [
              "<Figure size 1200x1000 with 2 Axes>"
            ]
          },
          "metadata": {},
          "output_type": "display_data"
        }
      ],
      "source": [
        "from sklearn.metrics import confusion_matrix\n",
        "import seaborn as sns\n",
        "import numpy as np\n",
        "\n",
        "def plot_confusion_matrix_normalized():\n",
        "    all_preds = []\n",
        "    all_targets = []\n",
        "    model.eval()\n",
        "    with torch.no_grad():\n",
        "        for data, target in test_loader:\n",
        "            data = data.to(device)\n",
        "            output = model(data)\n",
        "            pred = output.argmax(dim=1)\n",
        "            all_preds.extend(pred.cpu().numpy())\n",
        "            all_targets.extend(target.numpy())\n",
        "\n",
        "    # 使用 normalize='true' 让每一行（真实标签）的比例之和为 1\n",
        "    cm = confusion_matrix(all_targets, all_preds, normalize='true')\n",
        "\n",
        "    plt.figure(figsize=(12, 10))\n",
        "    # 使用英文标签避免中文字体缺失导致的警告\n",
        "    sns.heatmap(cm, annot=True, fmt='.2f', cmap='Blues')\n",
        "    plt.xlabel('Predicted Label')\n",
        "    plt.ylabel('Actual Label')\n",
        "    plt.title('Confusion Matrix (Normalized Accuracy)')\n",
        "    plt.show()\n",
        "\n",
        "plot_confusion_matrix_normalized()"
      ]
    }
  ],
  "metadata": {
    "colab": {
      "provenance": []
    },
    "kernelspec": {
      "display_name": "Python 3",
      "name": "python3"
    },
    "language_info": {
      "name": "python"
    }
  },
  "nbformat": 4,
  "nbformat_minor": 0
}
