From c162bd97282e464d7c6157377ea0e0478f8330c4 Mon Sep 17 00:00:00 2001 From: wolves Date: Sun, 16 Mar 2025 20:29:33 +0800 Subject: [PATCH] 250316 --- lab/8_FC-MNIST.ipynb | 4 +- lab/9_CNN-MNIST.ipynb | 279 +++++++++++++++++++++++++++++++++++++++++- 2 files changed, 279 insertions(+), 4 deletions(-) diff --git a/lab/8_FC-MNIST.ipynb b/lab/8_FC-MNIST.ipynb index e9277a7..1e3ac03 100644 --- a/lab/8_FC-MNIST.ipynb +++ b/lab/8_FC-MNIST.ipynb @@ -500,9 +500,7 @@ "# 导入数据\n", "trainset = datasets.MNIST(root='./data',train=True,download=True,transform=transform)\n", "trainloader = torch.utils.data.DataLoader(trainset,batch_size=64,shuffle=True)\n", - "\n", - "trainset = datasets.MNIST(root='./data',train=True,download=True,transform=transform)\n", - "testloader = torch.utils.data.DataLoader(trainset,batch_size=64,shuffle=True)\n", + "testloader = torch.utils.data.DataLoader(trainset,batch_size=64,shuffle=False)\n", "\n", "# 定义模型\n", "class SimpleNet(nn.Module):\n", diff --git a/lab/9_CNN-MNIST.ipynb b/lab/9_CNN-MNIST.ipynb index a291974..d0c3262 100644 --- a/lab/9_CNN-MNIST.ipynb +++ b/lab/9_CNN-MNIST.ipynb @@ -4,7 +4,16 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# CNN实现MNIST手写数字识别" + "# CNN实现MNIST手写数字识别\n", + "\n", + "## 模型结构\n", + "- 32个卷积核,大小为3x3\n", + "- 池化核大小为2x2\n", + "- 64个卷积核,大小为3x3\n", + "- 池化核大小为2x2\n", + "- 展平\n", + "- 全连接层,64个神经元\n", + "- 全连接层,10个神经元" ] }, { @@ -299,6 +308,274 @@ "predicted_class = tf.argmax(predictions, axis=1).numpy()[0]\n", "print(f\"预测结果:{predicted_class}\")" ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# CNN实现MNIST手写数字识别 - torch" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Epoch 1/10: 100%|██████████| 938/938 [00:26<00:00, 35.81batch/s, Loss=0.1387, Accuracy=95.90]\n", + "Epoch 2/10: 100%|██████████| 938/938 [00:26<00:00, 34.93batch/s, Loss=0.0491, Accuracy=98.49]\n", + "Epoch 3/10: 100%|██████████| 938/938 [00:26<00:00, 35.87batch/s, Loss=0.0362, Accuracy=98.86]\n", + "Epoch 4/10: 100%|██████████| 938/938 [00:26<00:00, 35.98batch/s, Loss=0.0297, Accuracy=99.08]\n", + "Epoch 5/10: 100%|██████████| 938/938 [00:26<00:00, 35.63batch/s, Loss=0.0218, Accuracy=99.30]\n", + "Epoch 6/10: 100%|██████████| 938/938 [00:26<00:00, 35.56batch/s, Loss=0.0198, Accuracy=99.36]\n", + "Epoch 7/10: 100%|██████████| 938/938 [00:26<00:00, 35.84batch/s, Loss=0.0159, Accuracy=99.46]\n", + "Epoch 8/10: 100%|██████████| 938/938 [00:27<00:00, 34.09batch/s, Loss=0.0125, Accuracy=99.58]\n", + "Epoch 9/10: 100%|██████████| 938/938 [00:26<00:00, 35.21batch/s, Loss=0.0125, Accuracy=99.57]\n", + "Epoch 10/10: 100%|██████████| 938/938 [00:27<00:00, 34.48batch/s, Loss=0.0125, Accuracy=99.58]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Test Loss: 0.0438, Test Accuracy: 98.95%\n", + "模型已保存 ./models/mnist_model_cnn_torch.pth\n" + ] + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAABKUAAAHqCAYAAADVi/1VAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy80BEi2AAAACXBIWXMAAA9hAAAPYQGoP6dpAACdEUlEQVR4nOzdd3hUZfrG8XsmPSGFkh5IaBJK6F0ElUgRlaYUC0XQdRWVRfmtuBYUFURAFFyxAUoRFkXsIKKICEiXUKQJhHQQUgkpM/P7I2Q0JKGEJCfl+7muucicOfPOcwZCTp553/uYbDabTQAAAAAAAEA5MhtdAAAAAAAAAKofmlIAAAAAAAAodzSlAAAAAAAAUO5oSgEAAAAAAKDc0ZQCAAAAAABAuaMpBQAAAAAAgHJHUwoAAAAAAADljqYUAAAAAAAAyh1NKQAAAAAAAJQ7mlIAKpVRo0YpLCysRM+dPHmyTCZT6RYEAABQBjjnAVAd0JQCUCpMJtMV3davX290qYYYNWqUatSoYXQZAADgGnHOc+WGDBkik8mkf//730aXAqCCMtlsNpvRRQCo/BYvXlzg/kcffaS1a9dq0aJFBbbfcsst8vf3L/Hr5OTkyGq1ysXF5aqfm5ubq9zcXLm6upb49Utq1KhR+uSTT5Senl7urw0AAEoP5zxXJjU1Vf7+/goICJDFYtGJEyeYvQWgEEejCwBQNdx7770F7m/ZskVr164ttP1i586dk7u7+xW/jpOTU4nqkyRHR0c5OvLfHgAAKDnOea7Mp59+KovFovnz5+vmm2/Whg0b1KNHD0NrKorNZtP58+fl5uZmdClAtcTyPQDl5sYbb1SLFi20Y8cOde/eXe7u7nr66aclSZ9//rn69eunoKAgubi4qGHDhpoyZYosFkuBMS7OVzh+/LhMJpNmzJihd999Vw0bNpSLi4s6dOigbdu2FXhuUfkKJpNJ48aN06pVq9SiRQu5uLioefPmWr16daH6169fr/bt28vV1VUNGzbUO++8U+qZDStWrFC7du3k5uamOnXq6N5771VsbGyBfRISEjR69GiFhITIxcVFgYGB6t+/v44fP27fZ/v27erdu7fq1KkjNzc31a9fX/fff3+p1QkAAIrHOY+0ZMkS3XLLLbrpppvUtGlTLVmypMj9fv/9dw0ZMkS+vr5yc3NTkyZN9J///KfAPrGxsRozZoz9Patfv77++c9/Kjs7u9jjlaSFCxfKZDIVOEcKCwvTbbfdpjVr1qh9+/Zyc3PTO++8I0lasGCBbr75Zvn5+cnFxUXNmjXT22+/XWTd3377rXr06CFPT095eXmpQ4cOWrp0qSTp+eefl5OTk06dOlXoeQ8++KB8fHx0/vz5y7+JQDXAlAEA5erPP/9U3759NWzYMN177732ae0LFy5UjRo1NGHCBNWoUUM//PCDnnvuOaWmpuq111677LhLly5VWlqa/vGPf8hkMmn69OkaNGiQ/vjjj8t+0rhx40atXLlSDz/8sDw9PfXmm29q8ODBio6OVu3atSVJu3btUp8+fRQYGKgXXnhBFotFL774onx9fa/9Tblg4cKFGj16tDp06KCpU6cqMTFRb7zxhn755Rft2rVLPj4+kqTBgwdr3759evTRRxUWFqakpCStXbtW0dHR9vu9evWSr6+vnnrqKfn4+Oj48eNauXJlqdUKAAAurTqf88TFxenHH3/Uhx9+KEkaPny4Xn/9dc2dO1fOzs72/fbs2aMbbrhBTk5OevDBBxUWFqajR4/qyy+/1Msvv2wfq2PHjkpOTtaDDz6o8PBwxcbG6pNPPtG5c+cKjHelDh48qOHDh+sf//iHHnjgATVp0kSS9Pbbb6t58+a644475OjoqC+//FIPP/ywrFarHnnkEfvzFy5cqPvvv1/NmzfXpEmT5OPjo127dmn16tW6++67dd999+nFF1/U8uXLNW7cOPvzsrOz9cknn2jw4MGGLq0EKhQbAJSBRx55xHbxfzE9evSwSbLNmzev0P7nzp0rtO0f//iHzd3d3Xb+/Hn7tpEjR9pCQ0Pt948dO2aTZKtdu7btzJkz9u2ff/65TZLtyy+/tG97/vnnC9Ukyebs7Gw7cuSIfdtvv/1mk2SbM2eOfdvtt99uc3d3t8XGxtq3HT582Obo6FhozKKMHDnS5uHhUezj2dnZNj8/P1uLFi1smZmZ9u1fffWVTZLtueees9lsNtvZs2dtkmyvvfZasWN99tlnNkm2bdu2XbYuAABwbTjnKWzGjBk2Nzc3W2pqqs1ms9kOHTpkk2T77LPPCuzXvXt3m6enp+3EiRMFtlutVvvXI0aMsJnN5iLPa/L3K+p4bTabbcGCBTZJtmPHjtm3hYaG2iTZVq9eXWj/ov5uevfubWvQoIH9fnJyss3T09PWqVOnAudsF9fdpUsXW6dOnQo8vnLlSpsk248//ljodYDqiuV7AMqVi4uLRo8eXWj739fxp6Wl6fTp07rhhht07tw5/f7775cdd+jQoapZs6b9/g033CBJ+uOPPy773MjISDVs2NB+v2XLlvLy8rI/12Kx6Pvvv9eAAQMUFBRk369Ro0bq27fvZce/Etu3b1dSUpIefvjhAp+c9evXT+Hh4fr6668l5b1Pzs7OWr9+vc6ePVvkWPkzqr766ivl5OSUSn0AAODqVOdzniVLlqhfv37y9PSUJDVu3Fjt2rUrsITv1KlT2rBhg+6//37Vq1evwPPzl+JZrVatWrVKt99+u9q3b1/odUoaoVC/fn317t270Pa//92kpKTo9OnT6tGjh/744w+lpKRIktauXau0tDQ99dRThWY7/b2eESNG6Ndff9XRo0ft25YsWaK6detWyGwtwCg0pQCUq+Dg4CKnWe/bt08DBw6Ut7e3vLy85Ovraw8MzT8JuJSLT2byT9aKa9xc6rn5z89/blJSkjIzM9WoUaNC+xW1rSROnDghSfbp438XHh5uf9zFxUWvvvqqvv32W/n7+6t79+6aPn26EhIS7Pv36NFDgwcP1gsvvKA6deqof//+WrBggbKyskqlVgAAcHnV9ZznwIED2rVrl66//nodOXLEfrvxxhv11VdfKTU1VdJfTbQWLVoUO9apU6eUmpp6yX1Kon79+kVu/+WXXxQZGSkPDw/5+PjI19fXngWW/3eT32S6XE1Dhw6Vi4uLvRGXkpKir776Svfccw9XIQT+hqYUgHJV1JVNkpOT1aNHD/3222968cUX9eWXX2rt2rV69dVXJeV9SnY5Dg4ORW632Wxl+lwjjB8/XocOHdLUqVPl6uqqZ599Vk2bNtWuXbsk5X1K98knn2jz5s0aN26cYmNjdf/996tdu3ZKT083uHoAAKqH6nrOs3jxYknSv/71LzVu3Nh+mzlzps6fP69PP/201F4rX3FNnovD4/MV9Xdz9OhR9ezZU6dPn9asWbP09ddfa+3atfrXv/4l6cr+bv6uZs2auu222+xNqU8++URZWVmXvUojUN0QdA7AcOvXr9eff/6plStXqnv37vbtx44dM7Cqv/j5+cnV1VVHjhwp9FhR20oiNDRUUl7w5s0331zgsYMHD9ofz9ewYUM98cQTeuKJJ3T48GG1bt1aM2fOtJ8ISlLnzp3VuXNnvfzyy1q6dKnuueceLVu2TGPHji2VmgEAwNWp6uc8NptNS5cu1U033aSHH3640ONTpkzRkiVLNHr0aDVo0ECStHfv3mLH8/X1lZeX1yX3kf6aLZacnGyPMZD+mol+Jb788ktlZWXpiy++KDCj7McffyywX/7yx71791529tiIESPUv39/bdu2TUuWLFGbNm3UvHnzK64JqA6YKQXAcPmf2v39U7rs7Gz997//NaqkAhwcHBQZGalVq1YpLi7Ovv3IkSP69ttvS+U12rdvLz8/P82bN6/AMrtvv/1WBw4cUL9+/SRJ586dK3QJ4YYNG8rT09P+vLNnzxb6xLN169aSxBI+AAAMVNXPeX755RcdP35co0eP1p133lnoNnToUP3444+Ki4uTr6+vunfvrvnz5ys6OrrAOPnvj9ls1oABA/Tll19q+/bthV4vf7/8RtGGDRvsj2VkZNiv/nelx/73MaW8JXcLFiwosF+vXr3k6empqVOnFjonu/j8q2/fvqpTp45effVV/fTTT8ySAorATCkAhuvatatq1qypkSNH6rHHHpPJZNKiRYsq1PK5yZMn67vvvtP111+vf/7zn7JYLJo7d65atGih3bt3X9EYOTk5eumllwptr1Wrlh5++GG9+uqrGj16tHr06KHhw4crMTFRb7zxhsLCwuxTxw8dOqSePXtqyJAhatasmRwdHfXZZ58pMTFRw4YNkyR9+OGH+u9//6uBAweqYcOGSktL03vvvScvLy/deuutpfaeAACAq1PVz3mWLFkiBwcH+4dpF7vjjjv0n//8R8uWLdOECRP05ptvqlu3bmrbtq0efPBB1a9fX8ePH9fXX39tf61XXnlF3333nXr06KEHH3xQTZs2VXx8vFasWKGNGzfKx8dHvXr1Ur169TRmzBhNnDhRDg4Omj9/vnx9fQs1vIrTq1cvOTs76/bbb9c//vEPpaen67333pOfn5/i4+Pt+3l5een111/X2LFj1aFDB919992qWbOmfvvtN507d65AI8zJyUnDhg3T3Llz5eDgoOHDh19RLUB1QlMKgOFq166tr776Sk888YSeeeYZ1axZU/fee6969uxZ5JVRjNCuXTt9++23evLJJ/Xss8+qbt26evHFF3XgwIErulKOlPdJ6LPPPltoe8OGDfXwww9r1KhR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avvrT4tNFmsR260Xtlv+up970f0C+xUYr+jtuVZrsbOILBf2K412mtkke9OnQDPIwSwXJwe5FNkkyt/HQS5O5gKNJJeLGkl54/x9H4dC++bv5+hQ8WPEDW1KSdK4ceOKncp88Q+fsLCwq86CqGg/wBr41pC7s4POZVv0x6l0Nfb3NLokAMA1MJlMpbYMqCL55ZdfNGrUKA0cOFBS3uyP48ePl2sNTZs2teff/L2u6667zr4k39HRUZGRkYqMjNTzzz8vHx8f/fDDDxo0aJBMJpOuv/56XX/99XruuecUGhqqzz77TBMmTCjX40DR+N4puT///FOff/65li1bpubNm9u3WywWdevWTd9995369OmjsLAwrVu3TjfddFOhMVq2bKmYmBgdOnSoyNlSvr6+SkhIkM1msy9r2b1792Vr+/333/Xnn39q2rRpqlu3riRp+/bthV77ww8/VE5OTrGzpcaOHavhw4crJCREDRs21PXXX3/Z1wZQujKzLdoTk6yd0cnaceKsdp88q9Pphds2AV6uahvqo7b1aqptaE01D/KSi6Px0TlFsVptstj+1ri60KwqrtH1V5MrryFmk/7WJCq6UVQZGkEVSdU7E6jgHMwmNQ/y0rbjZ7UnJoWmFACgQmrcuLFWrlyp22+/XSaTSc8++2yZzXg6depUoV92AwMD9cQTT6hDhw6aMmWKhg4dqs2bN2vu3Ln673//K0n66quv9Mcff6h79+6qWbOmvvnmG1mtVjVp0kS//vqr1q1bp169esnPz0+//vqrTp06paZNm5bJMZS3tLQ0Pfvss/rss8+UlJSkNm3a6I033rDnBSUmJurf//63vvvuOyUnJ6t79+6aM2eOGjduXOyYCxcutEco5HNxcdH58+fL9FiqmvL43lm0aJFq166tIUOGFMpBufXWW/XBBx+oT58+mjx5sh566CH5+fnZQ81/+eUXPfroo+rRo4e6d++uwYMHa9asWWrUqJF+//13mUwm9enTRzfeeKNOnTql6dOn684779Tq1av17bffysvr0rkj9erVk7Ozs+bMmaOHHnpIe/fu1ZQpUwrsM27cOM2ZM0fDhg3TpEmT5O3trS1btqhjx472K/j17t1bXl5eeumll/Tiiy+W6vsHoDCbzaaYs5kXZkGd1c7oZB2IT1XuRVOLnBxMah7kfaEB5WOfDVVZmM0mmWVS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AIArVaKfmidPnlRMTIz9/tatWzV+/Hi9++67VzxGnTp15ODgUOjSyImJiQoICCjyOQEBAZfcPzMzU08//bRmzZql22+/XS1bttS4ceM0dOhQzZgxo9ha8q+Ek387efLkFR9HZUXYOQAA5evxxx9X/fr1lZSUJHd3d+3bt08bNmxQ+/bttX79eqPLwzXIj0OIIE8KAICrUqKm1N13360ff/xRUt6SultuuUVbt27Vf/7zH7344otXNIazs7PatWundevW2bdZrVatW7dOXbp0KfI5Xbp0KbC/JK1du9a+f05OjnJycmQ2FzwsBwcHWa3WYmtxcXGRl5dXgVtVZzab1CKYsHMAAMrL5s2b9eKLL6pOnToym80ym83q1q2bpk6dqscee8zo8nAN8mdKteTKewAAXJUSNaX27t2rjh07SpL+97//qUWLFtq0aZOWLFmihQsXXvE4EyZM0HvvvacPP/xQBw4c0D//+U9lZGRo9OjRkqQRI0Zo0qRJ9v0ff/xxrV69WjNnztTvv/+uyZMna/v27Ro3bpwkycvLSz169NDEiRO1fv16HTt2TAsXLtRHH32kgQMHluRQq7T8JXyEnQMAUPYsFos8PfPyhurUqaO4uDhJUmhoqA4ePGhkabgGVquNmVIAAJRQiTKlcnJy5OLiIkn6/vvv7cGc4eHhio+Pv+Jxhg4dqlOnTum5555TQkKCWrdurdWrV9vDzKOjowvMeuratauWLl2qZ555Rk8//bQaN26sVatWqUWLFvZ9li1bpkmTJumee+7RmTNnFBoaqpdfflkPPfRQSQ61SssPO8//dA8AAJSdFi1a6LffflP9+vXVqVMnTZ8+Xc7Oznr33XfVoEEDo8tDCR3/M0NpWblycTSrsV8No8sBAKBSKVFTqnnz5po3b5769euntWvXasqUKZKkuLg41a5d+6rGGjdunH2m08WKyle46667dNdddxU7XkBAgBYsWHBVNVRX+TOlDsQTdg4AQFl75plnlJGRIUl68cUXddttt+mGG25Q7dq1tXz5coOrQ0nlxyA0C/LiXAoAgKtUoqbUq6++qoEDB+q1117TyJEj1apVK0nSF198YV/Wh4ovP+w8PStXh5PS1TSw6mdpAQBglN69e9u/btSokX7//XedOXNGNWvWtF+BD5VPlD1PiqV7AABcrRI1pW688UadPn1aqampqlmz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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "from modulefinder import test\n", + "import torch\n", + "from torch.utils.data import DataLoader # 显式导入DataLoader\n", + "import torch.nn as nn\n", + "from torchvision import datasets, transforms\n", + "from tqdm import tqdm\n", + "import matplotlib.pyplot as plt\n", + "\n", + "# 处理数据\n", + "transform = transforms.Compose([\n", + " transforms.ToTensor(), # 添加 ToTensor\n", + " transforms.Normalize(mean=[0.5],std=[0.5])\n", + "])\n", + "\n", + "# 导入数据\n", + "trainset = datasets.MNIST(root='./data',train=True,download=True,transform=transform)\n", + "testset = datasets.MNIST(root='./data',train=False,download=True,transform=transform) # 修正测试集\n", + "\n", + "trainloader = DataLoader(trainset,batch_size=64,shuffle=True)\n", + "testloader = DataLoader(testset,batch_size=64,shuffle=False) # 使用正确的测试集\n", + "\n", + "class SimpleNet(nn.Module):\n", + " def __init__(self):\n", + " super(SimpleNet,self).__init__()\n", + " self.conv1 = nn.Conv2d(1, 32, kernel_size=3, stride=1)\n", + " self.relu1 = nn.ReLU()\n", + " self.pool1 = nn.MaxPool2d(kernel_size=2)\n", + " \n", + " self.conv2 = nn.Conv2d(32, 64, kernel_size=3, stride=1)\n", + " self.relu2 = nn.ReLU()\n", + " self.pool2 = nn.MaxPool2d(kernel_size=2)\n", + " \n", + " self.flat = nn.Flatten()\n", + " self.fc1 = nn.Linear(64 * 5 * 5, 128)\n", + " self.fc2 = nn.Linear(128, 10)\n", + "\n", + " def forward(self, x):\n", + " x = self.pool1(self.relu1(self.conv1(x)))\n", + " x = self.pool2(self.relu2(self.conv2(x)))\n", + " x = self.flat(x)\n", + " x = self.fc1(x)\n", + " x = self.fc2(x)\n", + " return x\n", + "\n", + "model = SimpleNet()\n", + "\n", + "device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')\n", + "\n", + "model.to(device)\n", + "\n", + "criterion = nn.CrossEntropyLoss()\n", + "optimizer = torch.optim.Adam(model.parameters(),lr=0.001)\n", + "\n", + "epochs = 10\n", + "train_losses = []\n", + "train_accuracies = []\n", + "\n", + "for epoch in range(epochs):\n", + " running_loss = 0.0\n", + " correct = 0\n", + " total = 0\n", + "\n", + " train_iter = tqdm(trainloader, desc=f'Epoch {epoch+1}/{epochs}', unit='batch')\n", + "\n", + " for images,labels in train_iter:\n", + " images, labels = images.to(device), labels.to(device)\n", + " optimizer.zero_grad()\n", + "\n", + " output = model.forward(images)\n", + " loss = criterion(output,labels)\n", + " loss.backward()\n", + " optimizer.step()\n", + "\n", + " _,predicted = torch.max(output.data,1)\n", + " total += labels.size(0)\n", + " correct += (predicted == labels).sum().item()\n", + "\n", + " running_loss += loss.item()\n", + " train_iter.set_postfix({\n", + " 'Loss': f\"{running_loss / len(train_iter):.4f}\",\n", + " 'Accuracy': f\"{100 * correct / total:.2f}\"\n", + " })\n", + "\n", + " # 将统计信息移到循环外\n", + " epoch_loss = running_loss / len(trainloader)\n", + " epoch_acc = 100 * correct / total\n", + " train_losses.append(epoch_loss)\n", + " train_accuracies.append(epoch_acc) \n", + "\n", + "model.eval()\n", + "test_loss = 0.0\n", + "test_correct = 0\n", + "test_total = 0\n", + "\n", + "with torch.no_grad():\n", + " for images,labels in testloader:\n", + " images, labels = images.to(device), labels.to(device)\n", + " output = model.forward(images)\n", + " loss = criterion(output,labels)\n", + "\n", + " _,predicted = torch.max(output.data,1)\n", + " test_total += labels.size(0)\n", + " test_correct += (predicted == labels).sum().item()\n", + " test_loss += loss.item()\n", + "\n", + "test_loss /= len(testloader)\n", + "test_acc = 100 * test_correct / test_total\n", + "print(f\"Test Loss: {test_loss:.4f}, Test Accuracy: {test_acc:.2f}%\")\n", + "\n", + "torch.save({\n", + " 'model_state_dict':model.state_dict(),\n", + " 'optimizer_state_dict':optimizer.state_dict(),\n", + " 'model_definition':SimpleNet\n", + "},'./models/mnist_model_cnn_torch.pth')\n", + "print(\"模型已保存 ./models/mnist_model_cnn_torch.pth\")\n", + "\n", + "# 训练结束后绘制曲线\n", + "plt.figure(figsize=(12, 5))\n", + "\n", + "# 绘制损失曲线\n", + "plt.subplot(1, 2, 1)\n", + "plt.plot(train_losses, label='Train Loss')\n", + "plt.xlabel('Epoch')\n", + "plt.ylabel('Loss')\n", + "plt.title('Training Loss')\n", + "plt.legend()\n", + "\n", + "\n", + "# 绘制准确率曲线\n", + "plt.subplot(1, 2, 2)\n", + "plt.plot(train_accuracies, label='Train Accuracy')\n", + "plt.xlabel('Epoch')\n", + "plt.ylabel('Accuracy')\n", + "plt.title('Training Accuracy')\n", + "plt.legend()\n", + "\n", + "plt.tight_layout()\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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Efl4TjQ8ITY2ts5fFSVp0aJFOnjwYJ3zxo4dq4MHD+r111+vPa+iokLPP/98ndyFF16o3r176/HHH1dpaekpl/fZZ5+FcPcA0Hy82I+PPfaYHn/8cd177726/fbbG3M4ABBSXuvIo0ePnrIfSfrDH/4gSRo8ePDpDwgRgXui4QlXXnmlHnzwQd100036+te/rm3btmnBggXq1atXndwPfvADPfPMM7rhhht0++23q3PnzlqwYIHatm0rSbV/WYyJidEf/vAHjR8/Xueff75uuukmdenSRQcPHtTq1auVkpKiN95447R7euONN2rfY7C6ulq5ubn69a9/LUm66qqrNGDAgFB/GwDgFF7rx8WLF+uee+7Rueeeq69+9av6y1/+Uufzo0ePrn0eIAA0N6915F/+8hc999xzmjhxonr16qWSkhItW7ZMy5cv14QJE3jqS5RgiIYn3HvvvSorK9OLL76ol19+WRdccIHeeust/exnP6uTS0pK0qpVq3TbbbfpqaeeUlJSkm688UZ9/etf16RJk2qLUJJGjBih9evX66GHHtIzzzyj0tJSZWZmKjs72/RclL/+9a/685//XPvxli1btGXLFklS165dGaIBtAiv9ePJPy7u3r1b3/ve9075/OrVqxmiAbQYr3XkJZdcovfee08vvfSSCgoKFBcXpz59+ujJJ5/Ubbfd1izfA7Q8n1Pf4w2ACDNnzhzdeeedOnDggLp06RLu7QCAZ9CPANAwOhJNwRCNiHPixAklJCTUflxRUaGvfe1rCgQC2rVrVxh3BgDhRT8CQMPoSIQKD+dGxLn22mvVvXt3DRo0SEVFRfrLX/6iHTt2aMGCBeHeGgCEFf0IAA2jIxEqDNGIOGPHjtUf/vAHLViwQIFAQOedd54WLlyoyZMnh3trABBW9CMANIyORKjwcG4AAAAAAIx4n2gAAAAAAIwYogEAAAAAMPLcc6KDwaAOHTqk5OTk2jc9B4DGcBxHJSUlysrKUkxMdP2tkI4EcCboRwCoX2P60XND9KFDh9StW7dwbwNAFNi/f7+6du0a7m2EFB0JIBToRwCon6Ufm22Injt3rh577DHl5+dr4MCB+t3vfqehQ4e6fl1ycnJzbQlAK+PVPmlqP0r/OaY2bdq43tMSCATOeK8AIkt8fPxpP+84jioqKuhH+hFodULZj80yRL/88su66667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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "图片 ./test/0.png 的预测结果:0\n", + "概率分布:[9.9999154e-01 5.6558246e-08 3.9694714e-07 5.7686158e-09 4.9810051e-08\n", + " 1.6635587e-09 4.9098890e-06 1.9493548e-08 1.0571516e-06 2.1142114e-06]\n", + "----------------------------------------\n", + "图片 ./test/2.png 的预测结果:2\n", + "概率分布:[2.3606985e-07 1.3911462e-07 9.9999619e-01 1.7604706e-06 1.4577779e-07\n", + " 3.0409397e-09 4.2655217e-09 8.3528255e-07 5.8725487e-07 9.2491959e-08]\n", + "----------------------------------------\n", + "图片 ./test/3.png 的预测结果:3\n", + "概率分布:[1.3083167e-14 2.3400937e-10 5.6043814e-10 9.9999726e-01 8.9110906e-12\n", + " 1.3752571e-06 2.9259326e-15 1.3170462e-06 1.0465531e-09 3.7561829e-08]\n", + "----------------------------------------\n" + ] + } + ], + "source": [ + "# 多图片同时预测\n", + "import torch\n", + "from PIL import Image\n", + "import torchvision.transforms as transforms\n", + "import matplotlib.pyplot as plt\n", + "\n", + "# 加载模型\n", + "checkpoint = torch.load('./models/mnist_model_cnn_torch.pth')\n", + "model = checkpoint['model_definition']()\n", + "model.load_state_dict(checkpoint['model_state_dict'])\n", + "model.eval() # 设置为评估模式\n", + "\n", + "# 图片预处理\n", + "transform = transforms.Compose([\n", + " transforms.Resize((28, 28)),\n", + " transforms.Grayscale(),\n", + " transforms.ToTensor(),\n", + " transforms.Normalize((0.5,), (0.5,))\n", + "])\n", + "\n", + "# 加载并预处理多个图片\n", + "image_paths = ['./test/0.png', './test/2.png', './test/3.png'] # 添加更多图片路径\n", + "images = [Image.open(path) for path in image_paths]\n", + "processed_images = torch.stack([transform(img) for img in images]) # 将多个图片堆叠成一个批次\n", + "\n", + "# 可视化预处理后的图片\n", + "fig, axes = plt.subplots(1, len(images), figsize=(12, 4))\n", + "for i, img in enumerate(processed_images):\n", + " axes[i].imshow(img.squeeze(), cmap='gray')\n", + " axes[i].set_title(f'Image {i+1}')\n", + "plt.show()\n", + "\n", + "# 进行预测\n", + "with torch.no_grad():\n", + " outputs = model(processed_images) # 直接传入批次数据\n", + " probabilities = torch.nn.functional.softmax(outputs, dim=1)\n", + " predicted_classes = torch.argmax(probabilities, dim=1).numpy()\n", + "\n", + "# 打印预测结果\n", + "for i, (path, pred, prob) in enumerate(zip(image_paths, predicted_classes, probabilities)):\n", + " print(f\"图片 {path} 的预测结果:{pred}\")\n", + " print(f\"概率分布:{prob.numpy()}\")\n", + " print(\"-\" * 40)" + ] } ], "metadata": {