2a05422ddf
Signed-off-by: 邓凯洋 <13202611+deng-kaiyang@user.noreply.gitee.com>
595 lines
50 KiB
Plaintext
595 lines
50 KiB
Plaintext
{
|
||
"cells": [
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 66,
|
||
"id": "a101b276",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"import os\n",
|
||
"import numpy as np\n",
|
||
"import pandas as pd\n",
|
||
"import torch\n",
|
||
"import torch.nn as nn\n",
|
||
"import torch.optim as optim\n",
|
||
"import torch.nn.functional as F\n",
|
||
"from torch.utils.data import Dataset, DataLoader"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 67,
|
||
"id": "e3aae877",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"device(type='cpu')"
|
||
]
|
||
},
|
||
"execution_count": 67,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"device=torch.device(\"cuda:0\" if torch.cuda.is_available() else \"cpu\")\n",
|
||
"device"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 68,
|
||
"id": "b4cc37cd",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"batch_size = 256\n",
|
||
"lr=1e-4\n",
|
||
"epochs=20\n",
|
||
"# 设置好超参数\n",
|
||
"# 因为不是linux系统上跑,所以num_workers就不写,默认0"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"id": "34cdea7c",
|
||
"metadata": {},
|
||
"source": [
|
||
"下载"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 69,
|
||
"id": "6a9c3adf",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"from torchvision import transforms\n",
|
||
"image_size = 28\n",
|
||
"data_transforms = transforms.Compose([\n",
|
||
" # transforms.ToPILImage(),\n",
|
||
" transforms.Resize(image_size),\n",
|
||
" transforms.ToTensor()\n",
|
||
"])\n",
|
||
"# 如果你使用的内置的dataset,那么ToPILImage这一句可以不要"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 70,
|
||
"id": "8a61f664",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"from torchvision import datasets\n",
|
||
"train_data=datasets.FashionMNIST(root='./', train=True, download=True, transform=data_transforms)\n",
|
||
"test_data=datasets.FashionMNIST(root='./', train=True, download=True, transform=data_transforms)\n",
|
||
" "
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 71,
|
||
"id": "1be36a9f",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"train_loader = DataLoader(train_data,\n",
|
||
" batch_size = batch_size,\n",
|
||
" shuffle = True,\n",
|
||
" drop_last = True)\n",
|
||
"\n",
|
||
"test_loader = DataLoader(test_data,\n",
|
||
" batch_size = batch_size,\n",
|
||
" shuffle = False)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"id": "b2d74d55",
|
||
"metadata": {},
|
||
"source": [
|
||
"这里,我们把上面的测试集与训练集构造好。"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 72,
|
||
"id": "7d3f3e6f",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"Dataset FashionMNIST\n",
|
||
" Number of datapoints: 60000\n",
|
||
" Root location: ./\n",
|
||
" Split: Train\n",
|
||
" StandardTransform\n",
|
||
"Transform: Compose(\n",
|
||
" Resize(size=28, interpolation=bilinear, max_size=None, antialias=warn)\n",
|
||
" ToTensor()\n",
|
||
" )"
|
||
]
|
||
},
|
||
"execution_count": 72,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"train_data "
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 73,
|
||
"id": "228c7437",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"torch.Size([256, 1, 28, 28]) torch.Size([256])\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"image, label = next(iter(train_loader))\n",
|
||
"print(image.shape, label.shape)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 74,
|
||
"id": "4620adae",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"<matplotlib.image.AxesImage at 0x1842f00ee30>"
|
||
]
|
||
},
|
||
"execution_count": 74,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
},
|
||
{
|
||
"data": {
|
||
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAaEAAAGdCAYAAAC7EMwUAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy88F64QAAAACXBIWXMAAA9hAAAPYQGoP6dpAAAhLUlEQVR4nO3df3TU9b3n8ddkSCYBJ2MjJjORGHO9UC1BehUFOSiBrblmT1kVuxd164Vta7UCe9nouqXsrmzPLvHaI8u9S6W3nh4KrVT2bP11C0dMLyTURVrk4kqR0ngBiSVpJEomBMiPyWf/YMk9kRh8f0nyySTPxzlzDpn5vphPvvmS13yZmfeEnHNOAAB4kOF7AQCA0YsSAgB4QwkBALyhhAAA3lBCAABvKCEAgDeUEADAG0oIAODNGN8L+KTu7m4dP35c0WhUoVDI93IAAEbOObW2tqqwsFAZGf2f6wy7Ejp+/LiKiop8LwMAcInq6+s1YcKEfrcZdiUUjUYlSbP0LzVGmZ5X8ymCnKGNwOlIGdkRc+bM7ZPNmfbPhc2Z3M17zBlcmtP/apo589F19p/t1Vs/Nme6f/t7cwbBdalTb2hrz+/z/gxaCT377LP63ve+p4aGBk2ePFlr1qzRbbfddtHc+f+CG6NMjQmNoBLSCCyhUJY5MyYz25zpyrL/ohq2x84IFuRnG44E+NmG7Q9+ujkehtb//3X3WZ5SGZQXJmzevFnLli3TihUrtG/fPt12222qqKjQsWPHBuPuAABpalBKaPXq1fr617+ub3zjG7r++uu1Zs0aFRUVad26dYNxdwCANDXgJdTR0aG9e/eqvLy81/Xl5eXatWvXBdu3t7crmUz2ugAARocBL6ETJ04olUqpoKCg1/UFBQVqbGy8YPuqqirFYrGeC6+MA4DRY9DerPrJJ6Scc30+SbV8+XK1tLT0XOrr6wdrSQCAYWbAXx03fvx4hcPhC856mpqaLjg7kqRIJKJIxP5qFwBA+hvwM6GsrCzddNNNqq6u7nV9dXW1Zs6cOdB3BwBIY4PyPqHKyko9+OCDmjZtmm699Vb98Ic/1LFjx/TII48Mxt0BANLUoJTQggUL1NzcrO9+97tqaGhQaWmptm7dquLi4sG4OwBAmgo5N7zmySSTScViMZXpLt71HsCpv5hhzhT/1aFA97WpZIc5s/tsypz5xtt/ac789Q0/N2ck6d/9/SJzJrtpaIbRO/twAY2/rSHQfe2c8pI588OWQnPmWPsV5sx/y99vzrzcdpk5I0lP/6evmjPRzbsD3ddI0uU6VaNX1NLSotzc3H635aMcAADeUEIAAG8oIQCAN5QQAMAbSggA4A0lBADwhhICAHhDCQEAvKGEAADeUEIAAG8oIQCAN5QQAMCbQZmijYFx8sFbzZnV//X75szPmu33I0nT/vO3zJlvPv6KORMbe8ac+avf3GfOSNI/LfiBOfOjlrg505Iaa87MHvc7c6au48IPkvws/vzgl82Z+o8vN2duSBw3Z27Z96/NmWtiH5kzkvRf/vt6c+apU/aBu5Ete8wZZQSYaCtJ3fYhwoOJMyEAgDeUEADAG0oIAOANJQQA8IYSAgB4QwkBALyhhAAA3lBCAABvKCEAgDeUEADAG0oIAOANJQQA8IYSAgB4wxTtYewLi39rzhztvNKc2XpwsjkjSddvO2bO1C22T3X+H5/fbM78tHmmOSNJpbv/jTlzpi3LnOnutE9A/sHYWeZMRoYzZyTpuoImc+bZP9tkznzzNw+aM5HsTnNmz4E/MWckadJl9v3wH/7mJ+bM3265zpwZbtOwg+JMCADgDSUEAPCGEgIAeEMJAQC8oYQAAN5QQgAAbyghAIA3lBAAwBtKCADgDSUEAPCGEgIAeEMJAQC8YYDpEDk77xZz5ivjN5oz+05fY85smvWcOSNJf/rmWXNm+5lCc+a5pjJz5vLM0+aMJP3N1BfMmQ+7cgPdl1Vz6jJzJjMUbMhlWN3mzP6zRebMf/ziNnPm75ummjN13SFzRpJiY+zH0bhQhzmTMfV6c6b7/x40Z4YjzoQAAN5QQgAAbyghAIA3lBAAwBtKCADgDSUEAPCGEgIAeEMJAQC8oYQAAN5QQgAAbyghAIA3lBAAwBsGmA6R0w+fNGeyQ53mzNVZJ8yZv234kjkjSb95v9ic+Vrpm+bM9eMazJktjaXmjCS1pSLmzJ/mNJkzv2m5xpw52Z5jzqRcsMeZiybsMmeeevUe+x0FmCtaMfctc+bBhP24k6ROFzZnMkL24a+H/v1Yc2biInNkWOJMCADgDSUEAPBmwEto5cqVCoVCvS7xeHyg7wYAMAIMynNCkydP1i9/+cuer8Nh+/+rAgBGvkEpoTFjxnD2AwC4qEF5Tqiurk6FhYUqKSnRfffdp8OHD3/qtu3t7Uomk70uAIDRYcBLaPr06dq4caO2bdum5557To2NjZo5c6aam5v73L6qqkqxWKznUlRk/5x6AEB6GvASqqio0L333qspU6boS1/6krZs2SJJ2rBhQ5/bL1++XC0tLT2X+vr6gV4SAGCYGvQ3q44bN05TpkxRXV1dn7dHIhFFIvY3CAIA0t+gv0+ovb1dBw8eVCKRGOy7AgCkmQEvoccff1y1tbU6cuSIfv3rX+srX/mKksmkFi5cONB3BQBIcwP+33EffPCB7r//fp04cUJXXnmlZsyYod27d6u42D5nDAAwsg14Cb3wwgsD/VeOCM9N/ok58077VebMtVn2YZoNp3PNGUlKtWaaMxOy+n6VZH8+6LjCnKm85nVzRpJqktebM6kAUzivv6zRnNFl9sjsy35nDynYEM6v3llrzvyi3j5o9h9+frM5M/drB80ZSQoH2A8fpew/qC1l/9OcWaaZ5sxwxOw4AIA3lBAAwBtKCADgDSUEAPCGEgIAeEMJAQC8oYQAAN5QQgAAbyghAIA3lBAAwBtKCADgDSUEAPBm0D/UbiTqnv1n5szvOt43Z4IMQrxW9gGmS4p3mDOS1HhVzJxpSY0zZz7uGmvO/O8T9iGXknTs1OfMmX+Rf8icmXWZPfO/mm8xZx579mFzRpLG/92b5kx40rXmzJrX7AOPXy+aYs4c7RhvzkjSlGz7Jz3/U0eBOZMd6jRnztxlPx4kKeeV3wTKDRbOhAAA3lBCAABvKCEAgDeUEADAG0oIAOANJQQA8IYSAgB4QwkBALyhhAAA3lBCAABvKCEAgDeUEADAG0oIAOANU7QDyPlugzlTmPmxOdPYZZ9S3ensP9IrwqfMGUk6dDZhznQrZM5cFbHvu2uz7dPEJSknXGTOzL3sXXPmqz9fYs58/tnj5kzmTGfOSFLGDdeZMweXRs2Zuo64OZPIPGnOXBex/5uVpFSA4zU344w5c3nGaXNm4nL7cSdJH7wSKDZoOBMCAHhDCQEAvKGEAADeUEIAAG8oIQCAN5QQAMAbSggA4A0lBADwhhICAHhDCQEAvKGEAADeUEIAAG8YYBrABy+UmDOvffMGc+aL4943ZwoCDCMtHGMf0ihJbc6+vt+esQ8IzQvwPXUHfHx1w7h6cyYvfNacGTfxpDlz7CtXmTO3/cU/mjOS9M3xteZMR4B9/nrrFHNm2tgj5swtEfvPSJJ+3xlgAGyA36pf+8eF5kzJ40n7HUmSgg0sHiycCQEAvKGEAADeUEIAAG8oIQCAN5QQAMAbSggA4A0lBADwhhICAHhDCQEAvKGEAADeUEIAAG8oIQCANyHnXIAJfYMnmUwqFoupTHdpTCjT93K8yrjhOnOm9MeHzJnK8b8yZySpNsAw0vrOPHMmL9xmzrR2Z5szkhTNsA+6jIbPmDO5Ae7nH5JfMGfujL1jzpy7r8nmTFn0oDnzYSrXnPljZ8ycOdiWMGckadGV9n8bK//t182ZjNp95sxw1uU6VaNX1NLSotzc/n/GnAkBALyhhAAA3phLaOfOnZo3b54KCwsVCoX08ssv97rdOaeVK1eqsLBQOTk5Kisr04EDBwZqvQCAEcRcQm1tbZo6darWrl3b5+1PP/20Vq9erbVr12rPnj2Kx+O644471NraesmLBQCMLObPAKyoqFBFRUWftznntGbNGq1YsULz58+XJG3YsEEFBQXatGmTHn744UtbLQBgRBnQ54SOHDmixsZGlZeX91wXiUQ0e/Zs7dq1q89Me3u7kslkrwsAYHQY0BJqbGyUJBUUFPS6vqCgoOe2T6qqqlIsFuu5FBXZX/YLAEhPg/LquFAo1Otr59wF1523fPlytbS09Fzq6+sHY0kAgGHI/JxQf+LxuKRzZ0SJxD+/OaypqemCs6PzIpGIIpHIQC4DAJAmBvRMqKSkRPF4XNXV1T3XdXR0qLa2VjNnzhzIuwIAjADmM6FTp07pvffe6/n6yJEjevvtt5WXl6err75ay5Yt06pVqzRx4kRNnDhRq1at0tixY/XAAw8M6MIBAOnPXEJvvfWW5syZ0/N1ZWWlJGnhwoX68Y9/rCeeeEJnzpzRo48+qo8//ljTp0/X66+/rmg0OnCrBgCMCAwwRWB/eWhoXkTyYZf9Aczl4dOB7iszlDJnznbbj9NxGe3mTF74lDlztPNKc0aSskJd5kyQfXdjxH4MPX9yujmz54thc2bY+5QXe13UEPzKZ4ApACAtUEIAAG8oIQCAN5QQAMAbSggA4A0lBADwhhICAHhDCQEAvKGEAADeUEIAAG8oIQCAN5QQAMAbSggA4M2AfrIqBliQKblDOBS9rdv+ibjXZv3RnDneebk5E1RmgOnRnSH7hOazzj55+8NU/9OI+9Lpgk2PDpILkjmdZf8V9LvWvj+luX8nAmQCGqp/t8PrAxAC40wIAOANJQQA8IYSAgB4QwkBALyhhAAA3lBCAABvKCEAgDeUEADAG0oIAOANJQQA8IYSAgB4QwkBALxhgOlwNswHFG7+wzRz5uGra82ZU6lsc6Yw86Q5I0lZoZQ50+rsj+WuGHPKnOkIMCA0rG5zRpLGZrSbM8c6xpszmSH7+iaMPWnOHDQnLsEw/3c73HAmBADwhhICAHhDCQEAvKGEAADeUEIAAG8oIQCAN5QQAMAbSggA4A0lBADwhhICAHhDCQEAvKGEAADeMMAUgR0+mm/OhK+2D3fs7B66wZ3ZoU5zJhXgsVxmqMucCTLANKhwyP5zSgUY5Ho2wPc0N/ddc+agJpkzgYVC9swoHnrKmRAAwBtKCADgDSUEAPCGEgIAeEMJAQC8oYQAAN5QQgAAbyghAIA3lBAAwBtKCADgDSUEAPCGEgIAeMMAUwQWbhmaw6e9234/2Rn2QaSS1NYdMWeyAgwjjWacNWc+7Mo1Z4Luh5SzD+EMcl8fpqLmzNycj8yZ75sTGCqcCQEAvKGEAADemEto586dmjdvngoLCxUKhfTyyy/3un3RokUKhUK9LjNmzBio9QIARhBzCbW1tWnq1Klau3btp25z5513qqGhoeeydevWS1okAGBkMj/jW1FRoYqKin63iUQiisfjgRcFABgdBuU5oZqaGuXn52vSpEl66KGH1NTU9Knbtre3K5lM9roAAEaHAS+hiooKPf/889q+fbueeeYZ7dmzR3PnzlV7e3uf21dVVSkWi/VcioqKBnpJAIBhasDf6LFgwYKeP5eWlmratGkqLi7Wli1bNH/+/Au2X758uSorK3u+TiaTFBEAjBKD/m7DRCKh4uJi1dXV9Xl7JBJRJGJ/gyAAIP0N+vuEmpubVV9fr0QiMdh3BQBIM+YzoVOnTum9997r+frIkSN6++23lZeXp7y8PK1cuVL33nuvEomEjh49qu985zsaP3687rnnngFdOAAg/ZlL6K233tKcOXN6vj7/fM7ChQu1bt067d+/Xxs3btTJkyeVSCQ0Z84cbd68WdGofUYUAGBkM5dQWVmZnHOfevu2bdsuaUFIHwHmiioc6h74hfQhM8BQUUlKuSxzJjtkH9yZpZQ5k3L2/z0Pur9zw/YBqx+l7PvhD5155szhMSfNmfAXJpkzkpR69/fmTCgcNmdcV7DjdSRgdhwAwBtKCADgDSUEAPCGEgIAeEMJAQC8oYQAAN5QQgAAbyghAIA3lBAAwBtKCADgDSUEAPCGEgIAeEMJAQC8GfRPVsUIFrNPTQ4yCTonbL+fsD590nt/xmW0mzMdzj41OTvAlO+gk8GDaOu2f9pxkGnip1LZ5kyQn23X58aaM5IUChTisb0FewsA4A0lBADwhhICAHhDCQEAvKGEAADeUEIAAG8oIQCAN5QQAMAbSggA4A0lBADwhhICAHhDCQEAvGGAKQK7YnyrOdPWnWXOZIZS5kyGus0ZSQqHguWsMkL2IZxZAfZDkOGqkhQOsP+C/JyCyAgwwLTpxmADTAv+jz3jUkOzH0YKzoQAAN5QQgAAbyghAIA3lBAAwBtKCADgDSUEAPCGEgIAeEMJAQC8oYQAAN5QQgAAbyghAIA3lBAAwBsGmCKwG/PrzZnuAI97ouGz5kxQQYZwZoc6zZluFzJnMgIMV+3sjpgzkpSdYf+egmhNZZszLQG+p+S0YMdQQZBQNwNMLTgTAgB4QwkBALyhhAAA3lBCAABvKCEAgDeUEADAG0oIAOANJQQA8IYSAgB4QwkBALyhhAAA3lBCAABvGGA6nIXsQy7l3MCv41PcFH3fnEk5++OeyBAN0wwqO9RlzqRk/9l2Ovs/18wAa5OCDWVtVY45E2Rg7FmXac7ccM0fzBlJOhMoBQvOhAAA3lBCAABvTCVUVVWlm2++WdFoVPn5+br77rt16NChXts457Ry5UoVFhYqJydHZWVlOnDgwIAuGgAwMphKqLa2VosXL9bu3btVXV2trq4ulZeXq62trWebp59+WqtXr9batWu1Z88exeNx3XHHHWptbR3wxQMA0pvpmc7XXnut19fr169Xfn6+9u7dq9tvv13OOa1Zs0YrVqzQ/PnzJUkbNmxQQUGBNm3apIcffnjgVg4ASHuX9JxQS0uLJCkvL0+SdOTIETU2Nqq8vLxnm0gkotmzZ2vXrl19/h3t7e1KJpO9LgCA0SFwCTnnVFlZqVmzZqm0tFSS1NjYKEkqKOj9yewFBQU9t31SVVWVYrFYz6WoqCjokgAAaSZwCS1ZskTvvPOOfvazn11wW+gT729xzl1w3XnLly9XS0tLz6W+vj7okgAAaSbQm1WXLl2qV199VTt37tSECRN6ro/H45LOnRElEome65uami44OzovEokoEokEWQYAIM2ZzoScc1qyZIlefPFFbd++XSUlJb1uLykpUTweV3V1dc91HR0dqq2t1cyZMwdmxQCAEcN0JrR48WJt2rRJr7zyiqLRaM/zPLFYTDk5OQqFQlq2bJlWrVqliRMnauLEiVq1apXGjh2rBx54YFC+AQBA+jKV0Lp16yRJZWVlva5fv369Fi1aJEl64okndObMGT366KP6+OOPNX36dL3++uuKRqMDsmAAwMgRcm4IJ15+BslkUrFYTGW6S2NC9kGFI0lojP0pO9cVbGBlED869oY584tTnzdnsgMMMC3KbDZnpGADNa/MOG3OnA4wjHR/+4SLb/QJ0Yyz5owUbPDp6W77c7uNXTFz5rpIgzlT1x43ZyTpF5M/Fyg32nW5TtXoFbW0tCg3N7ffbZkdBwDwhhICAHhDCQEAvKGEAADeUEIAAG8oIQCAN5QQAMAbSggA4A0lBADwhhICAHhDCQEAvKGEAADeUEIAAG8CfbIqhobrHpoB5xkBP2YjER5rzpx19snol4fsU6pTLtjjqyBTtMMh+88p5fr+uPv+dASYvJ2d0WHOSFJrKsecyQh1mzNB9ndbgGndM8fWmTOS9AvdEihnFrIfDxpeH4AQGGdCAABvKCEAgDeUEADAG0oIAOANJQQA8IYSAgB4QwkBALyhhAAA3lBCAABvKCEAgDeUEADAG0oIAOANA0yHM2cfCBlEqLAgUO4nrfEBXknfsjM6zZlOhQPdVzyj1ZyJBhhg+lGAAavZoWDDSIMIMoz0ZGqcOTMuo92cSck+7HNsqMucwdDgTAgA4A0lBADwhhICAHhDCQEAvKGEAADeUEIAAG8oIQCAN5QQAMAbSggA4A0lBADwhhICAHhDCQEAvGGA6XAWCvAYwaXsmQz7QMigWrrGmjNtYyLmzLiAD69au7OCBY3+0PU5c+aPXTFzptMF+yeeCvD49ERn1JwZn2kfGJtK2df2i1NTzJmhFArbB+66rpExlJUzIQCAN5QQAMAbSggA4A0lBADwhhICAHhDCQEAvKGEAADeUEIAAG8oIQCAN5QQAMAbSggA4A0lBADwhgGmw1hGtn1wZ/fp0+ZMe2GuOSNJs3MOmzP7w6fMmSsCZDJDAQa5SioMt5szeRn2oaeXZxw3Z+JjTpoz2aFgQy7PBhh82pZpP16zMzrNmSzZf7Z/knnWnJGkHZ9faM6kDr1nv6MAA0zFAFMAAC4NJQQA8MZUQlVVVbr55psVjUaVn5+vu+++W4cOHeq1zaJFixQKhXpdZsyYMaCLBgCMDKYSqq2t1eLFi7V7925VV1erq6tL5eXlamtr67XdnXfeqYaGhp7L1q1bB3TRAICRwfTs42uvvdbr6/Xr1ys/P1979+7V7bff3nN9JBJRPB4fmBUCAEasS3pOqKWlRZKUl5fX6/qamhrl5+dr0qRJeuihh9TU1PSpf0d7e7uSyWSvCwBgdAhcQs45VVZWatasWSotLe25vqKiQs8//7y2b9+uZ555Rnv27NHcuXPV3t73S1+rqqoUi8V6LkVFRUGXBABIM4HfJ7RkyRK98847euONN3pdv2DBgp4/l5aWatq0aSouLtaWLVs0f/78C/6e5cuXq7KysufrZDJJEQHAKBGohJYuXapXX31VO3fu1IQJE/rdNpFIqLi4WHV1dX3eHolEFInY3+QGAEh/phJyzmnp0qV66aWXVFNTo5KSkotmmpubVV9fr0QiEXiRAICRyfSc0OLFi/XTn/5UmzZtUjQaVWNjoxobG3XmzBlJ0qlTp/T444/rzTff1NGjR1VTU6N58+Zp/PjxuueeewblGwAApC/TmdC6deskSWVlZb2uX79+vRYtWqRwOKz9+/dr48aNOnnypBKJhObMmaPNmzcrGo0O2KIBACOD+b/j+pOTk6Nt27Zd0oIAAKMHU7SHMdc5NFNys480B8r96sw15sxfH/hzc2ZWkX1ad3H2R+aMJIVD3eZMQ0fMnDl66gpzpqUj25yJhIdu0nJirP09fteNazRn/q5mrjkzafIH5owkZYQZrznY2MMAAG8oIQCAN5QQAMAbSggA4A0lBADwhhICAHhDCQEAvKGEAADeUEIAAG8oIQCAN5QQAMAbSggA4E3IXWw09hBLJpOKxWIq010aE8r0vRwAgFGX61SNXlFLS4tyc3P73ZYzIQCAN5QQAMAbSggA4A0lBADwhhICAHhDCQEAvKGEAADeUEIAAG8oIQCAN5QQAMAbSggA4M0Y3wv4pPOj7LrUKQ2rqXYAgM+iS52S/vn3eX+GXQm1trZKkt7QVs8rAQBcitbWVsVisX63GXZTtLu7u3X8+HFFo1GFQqFetyWTSRUVFam+vv6ik1lHMvbDOeyHc9gP57AfzhkO+8E5p9bWVhUWFiojo/9nfYbdmVBGRoYmTJjQ7za5ubmj+iA7j/1wDvvhHPbDOeyHc3zvh4udAZ3HCxMAAN5QQgAAb9KqhCKRiJ588klFIhHfS/GK/XAO++Ec9sM57Idz0m0/DLsXJgAARo+0OhMCAIwslBAAwBtKCADgDSUEAPAmrUro2WefVUlJibKzs3XTTTfpV7/6le8lDamVK1cqFAr1usTjcd/LGnQ7d+7UvHnzVFhYqFAopJdffrnX7c45rVy5UoWFhcrJyVFZWZkOHDjgZ7GD6GL7YdGiRRccHzNmzPCz2EFSVVWlm2++WdFoVPn5+br77rt16NChXtuMhuPhs+yHdDke0qaENm/erGXLlmnFihXat2+fbrvtNlVUVOjYsWO+lzakJk+erIaGhp7L/v37fS9p0LW1tWnq1Klau3Ztn7c//fTTWr16tdauXas9e/YoHo/rjjvu6JlDOFJcbD9I0p133tnr+Ni6dWTNYKytrdXixYu1e/duVVdXq6urS+Xl5Wpra+vZZjQcD59lP0hpcjy4NHHLLbe4Rx55pNd11113nfv2t7/taUVD78knn3RTp071vQyvJLmXXnqp5+vu7m4Xj8fdU0891XPd2bNnXSwWcz/4wQ88rHBofHI/OOfcwoUL3V133eVlPb40NTU5Sa62ttY5N3qPh0/uB+fS53hIizOhjo4O7d27V+Xl5b2uLy8v165duzytyo+6ujoVFhaqpKRE9913nw4fPux7SV4dOXJEjY2NvY6NSCSi2bNnj7pjQ5JqamqUn5+vSZMm6aGHHlJTU5PvJQ2qlpYWSVJeXp6k0Xs8fHI/nJcOx0NalNCJEyeUSqVUUFDQ6/qCggI1NjZ6WtXQmz59ujZu3Kht27bpueeeU2Njo2bOnKnm5mbfS/Pm/M9/tB8bklRRUaHnn39e27dv1zPPPKM9e/Zo7ty5am9v9720QeGcU2VlpWbNmqXS0lJJo/N46Gs/SOlzPAy7Kdr9+eRHOzjnLrhuJKuoqOj585QpU3Trrbfq2muv1YYNG1RZWelxZf6N9mNDkhYsWNDz59LSUk2bNk3FxcXasmWL5s+f73Flg2PJkiV655139MYbb1xw22g6Hj5tP6TL8ZAWZ0Ljx49XOBy+4JFMU1PTBY94RpNx48ZpypQpqqur870Ub86/OpBj40KJRELFxcUj8vhYunSpXn31Ve3YsaPXR7+MtuPh0/ZDX4br8ZAWJZSVlaWbbrpJ1dXVva6vrq7WzJkzPa3Kv/b2dh08eFCJRML3UrwpKSlRPB7vdWx0dHSotrZ2VB8bktTc3Kz6+voRdXw457RkyRK9+OKL2r59u0pKSnrdPlqOh4vth74M2+PB44siTF544QWXmZnpfvSjH7l3333XLVu2zI0bN84dPXrU99KGzGOPPeZqamrc4cOH3e7du92Xv/xlF41GR/w+aG1tdfv27XP79u1zktzq1avdvn373Pvvv++cc+6pp55ysVjMvfjii27//v3u/vvvd4lEwiWTSc8rH1j97YfW1lb32GOPuV27drkjR464HTt2uFtvvdVdddVVI2o/fOtb33KxWMzV1NS4hoaGnsvp06d7thkNx8PF9kM6HQ9pU0LOOff973/fFRcXu6ysLHfjjTf2ejniaLBgwQKXSCRcZmamKywsdPPnz3cHDhzwvaxBt2PHDifpgsvChQudc+delvvkk0+6eDzuIpGIu/32293+/fv9LnoQ9LcfTp8+7crLy92VV17pMjMz3dVXX+0WLlzojh075nvZA6qv71+SW79+fc82o+F4uNh+SKfjgY9yAAB4kxbPCQEARiZKCADgDSUEAPCGEgIAeEMJAQC8oYQAAN5QQgAAbyghAIA3lBAAwBtKCADgDSUEAPCGEgIAePP/ALVWrW4xHeYnAAAAAElFTkSuQmCC\n",
|
||
"text/plain": [
|
||
"<Figure size 640x480 with 1 Axes>"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"import matplotlib.pyplot as plt\n",
|
||
"plt.imshow(image[0][0])"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"id": "b90d349e",
|
||
"metadata": {},
|
||
"source": [
|
||
"打印随机一张图"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"id": "9e1e54a8",
|
||
"metadata": {},
|
||
"source": [
|
||
"下面开始搭建模型"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 75,
|
||
"id": "7249785c",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"CNNnet(\n",
|
||
" (conv): Sequential(\n",
|
||
" (0): Conv2d(1, 32, kernel_size=(5, 5), stride=(1, 1))\n",
|
||
" (1): ReLU()\n",
|
||
" (2): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)\n",
|
||
" (3): Dropout(p=0.3, inplace=False)\n",
|
||
" (4): Conv2d(32, 64, kernel_size=(5, 5), stride=(1, 1))\n",
|
||
" (5): ReLU()\n",
|
||
" (6): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)\n",
|
||
" (7): Dropout(p=0.3, inplace=False)\n",
|
||
" )\n",
|
||
" (fc): Sequential(\n",
|
||
" (0): Linear(in_features=1024, out_features=512, bias=True)\n",
|
||
" (1): ReLU()\n",
|
||
" (2): Linear(in_features=512, out_features=10, bias=True)\n",
|
||
" )\n",
|
||
")\n"
|
||
]
|
||
},
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"=================================================================\n",
|
||
"Layer (type:depth-idx) Param #\n",
|
||
"=================================================================\n",
|
||
"CNNnet --\n",
|
||
"├─Sequential: 1-1 --\n",
|
||
"│ └─Conv2d: 2-1 832\n",
|
||
"│ └─ReLU: 2-2 --\n",
|
||
"│ └─MaxPool2d: 2-3 --\n",
|
||
"│ └─Dropout: 2-4 --\n",
|
||
"│ └─Conv2d: 2-5 51,264\n",
|
||
"│ └─ReLU: 2-6 --\n",
|
||
"│ └─MaxPool2d: 2-7 --\n",
|
||
"│ └─Dropout: 2-8 --\n",
|
||
"├─Sequential: 1-2 --\n",
|
||
"│ └─Linear: 2-9 524,800\n",
|
||
"│ └─ReLU: 2-10 --\n",
|
||
"│ └─Linear: 2-11 5,130\n",
|
||
"=================================================================\n",
|
||
"Total params: 582,026\n",
|
||
"Trainable params: 582,026\n",
|
||
"Non-trainable params: 0\n",
|
||
"================================================================="
|
||
]
|
||
},
|
||
"execution_count": 75,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"class CNNnet(nn.Module):\n",
|
||
" def __init__(self):\n",
|
||
" super(CNNnet, self).__init__()\n",
|
||
" self.conv = nn.Sequential(\n",
|
||
" # 黑白图片的in_channels = 1\n",
|
||
" nn.Conv2d(1, 32, 5),\n",
|
||
" nn.ReLU(),\n",
|
||
" nn.MaxPool2d(2, stride = 2),\n",
|
||
" # 防止过拟合\n",
|
||
" nn.Dropout(0.3),\n",
|
||
" nn.Conv2d(32, 64, 5),\n",
|
||
" nn.ReLU(),\n",
|
||
" # 下面第一个2为kernel_size的大小\n",
|
||
" nn.MaxPool2d(2, stride = 2),\n",
|
||
" nn.Dropout(0.3)\n",
|
||
" )\n",
|
||
" self.fc = nn.Sequential(\n",
|
||
" nn.Linear(64 * 4 * 4, 512),\n",
|
||
" nn.ReLU(),\n",
|
||
" nn.Linear(512, 10)\n",
|
||
" )\n",
|
||
" def forward(self, x):\n",
|
||
" x = self.conv(x)\n",
|
||
" x = x.view(-1, 64 * 4 * 4)\n",
|
||
" x = self.fc(x)\n",
|
||
" # x = nn.functional.normalize(x)\n",
|
||
" return x\n",
|
||
"\n",
|
||
"model=CNNnet()\n",
|
||
"print(model)\n",
|
||
"\n",
|
||
"\n",
|
||
"import torchvision.models as models\n",
|
||
"from torchinfo import summary\n",
|
||
"summary(model)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 76,
|
||
"id": "46a7c292",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"from tensorboardX import SummaryWriter\n",
|
||
"\n",
|
||
"\n",
|
||
"writer = SummaryWriter('./runs')\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"id": "37411736",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"writer.add_graph(model,input_to_model = torch.rand(32, 1, 224, 224))\n",
|
||
"writer.close()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 77,
|
||
"id": "1e2ad6ca",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"model = CNNnet()\n",
|
||
"# 建立模型\n",
|
||
"criterion = nn.CrossEntropyLoss()\n",
|
||
"# 交叉熵为loss function\n",
|
||
"optimizer = optim.Adam(model.parameters(),lr = 0.001)\n",
|
||
"# Adam作为优化算法"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 78,
|
||
"id": "da41eeed",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"def train(epoch):\n",
|
||
" model.train()\n",
|
||
" running_loss = 0.0\n",
|
||
" for batch_idx, data in enumerate(train_loader, 0):\n",
|
||
" # 1.准备数据\n",
|
||
" inputs, target = data \n",
|
||
" inputs, target = inputs.to(device), target.to(device)\n",
|
||
" # 2.Forward\n",
|
||
" outputs = model(inputs)\n",
|
||
" loss = criterion(outputs, target)\n",
|
||
" # 3.Backward\n",
|
||
" optimizer.zero_grad()\n",
|
||
" loss.backward()\n",
|
||
" # 4.Update parameters\n",
|
||
" optimizer.step()\n",
|
||
" \n",
|
||
" running_loss += loss.item()\n",
|
||
" if batch_idx % 30 == 29:\n",
|
||
" print('[%d, %5d] loss: %.3f'%(\n",
|
||
" epoch + 1,\n",
|
||
" batch_idx + 1,\n",
|
||
" running_loss / 30))\n",
|
||
" running_loss = 0.0\n",
|
||
" # 每30 batch 输出一次\n",
|
||
" print('Finished epoch %d, loss: %.3f'%(epoch + 1, running_loss))\n",
|
||
"# 训练整个CNN"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 79,
|
||
"id": "00f2185c",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"def test():\n",
|
||
" correct = 0\n",
|
||
" total = 0\n",
|
||
" with torch.no_grad():\n",
|
||
" for data in test_loader:\n",
|
||
" images, labels = data\n",
|
||
" images, labels = images.to(device), labels.to(device)\n",
|
||
" outputs = model(images)\n",
|
||
" # 求出每一行(样本)的最大值的下标,dim=1即行的维度\n",
|
||
" # 返回最大值和最大值所在的下标\n",
|
||
" _, predicted = torch.max(outputs.data, dim = 1)\n",
|
||
" # label矩阵为N × 1\n",
|
||
" total += labels.size(0)\n",
|
||
" correct += (predicted == labels).sum().item()\n",
|
||
" print('accuracy on test set :%d %% ' % (100 * correct / total))\n",
|
||
" return correct / total\n",
|
||
"# 测试"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 80,
|
||
"id": "9d7d6bc8",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"[1, 30] loss: 1.271\n",
|
||
"[1, 60] loss: 0.731\n",
|
||
"[1, 90] loss: 0.645\n",
|
||
"[1, 120] loss: 0.594\n",
|
||
"[1, 150] loss: 0.575\n",
|
||
"[1, 180] loss: 0.535\n",
|
||
"[1, 210] loss: 0.498\n",
|
||
"Finished epoch 1, loss: 11.899\n",
|
||
"accuracy on test set :82 % \n",
|
||
"[2, 30] loss: 0.460\n",
|
||
"[2, 60] loss: 0.442\n",
|
||
"[2, 90] loss: 0.438\n",
|
||
"[2, 120] loss: 0.430\n",
|
||
"[2, 150] loss: 0.421\n",
|
||
"[2, 180] loss: 0.410\n",
|
||
"[2, 210] loss: 0.393\n",
|
||
"Finished epoch 2, loss: 9.556\n",
|
||
"accuracy on test set :85 % \n",
|
||
"[3, 30] loss: 0.367\n",
|
||
"[3, 60] loss: 0.376\n",
|
||
"[3, 90] loss: 0.372\n",
|
||
"[3, 120] loss: 0.366\n",
|
||
"[3, 150] loss: 0.379\n",
|
||
"[3, 180] loss: 0.346\n",
|
||
"[3, 210] loss: 0.350\n",
|
||
"Finished epoch 3, loss: 8.165\n",
|
||
"accuracy on test set :87 % \n",
|
||
"[4, 30] loss: 0.342\n",
|
||
"[4, 60] loss: 0.330\n",
|
||
"[4, 90] loss: 0.332\n",
|
||
"[4, 120] loss: 0.322\n",
|
||
"[4, 150] loss: 0.334\n",
|
||
"[4, 180] loss: 0.322\n",
|
||
"[4, 210] loss: 0.338\n",
|
||
"Finished epoch 4, loss: 7.664\n",
|
||
"accuracy on test set :88 % \n",
|
||
"[5, 30] loss: 0.302\n",
|
||
"[5, 60] loss: 0.312\n",
|
||
"[5, 90] loss: 0.316\n",
|
||
"[5, 120] loss: 0.312\n",
|
||
"[5, 150] loss: 0.306\n",
|
||
"[5, 180] loss: 0.308\n",
|
||
"[5, 210] loss: 0.302\n",
|
||
"Finished epoch 5, loss: 7.232\n",
|
||
"accuracy on test set :89 % \n",
|
||
"[6, 30] loss: 0.280\n",
|
||
"[6, 60] loss: 0.285\n",
|
||
"[6, 90] loss: 0.302\n",
|
||
"[6, 120] loss: 0.295\n",
|
||
"[6, 150] loss: 0.284\n",
|
||
"[6, 180] loss: 0.294\n",
|
||
"[6, 210] loss: 0.302\n",
|
||
"Finished epoch 6, loss: 6.843\n",
|
||
"accuracy on test set :89 % \n",
|
||
"[7, 30] loss: 0.287\n",
|
||
"[7, 60] loss: 0.283\n",
|
||
"[7, 90] loss: 0.269\n",
|
||
"[7, 120] loss: 0.282\n",
|
||
"[7, 150] loss: 0.272\n",
|
||
"[7, 180] loss: 0.268\n",
|
||
"[7, 210] loss: 0.280\n",
|
||
"Finished epoch 7, loss: 6.722\n",
|
||
"accuracy on test set :90 % \n",
|
||
"[8, 30] loss: 0.255\n",
|
||
"[8, 60] loss: 0.268\n",
|
||
"[8, 90] loss: 0.257\n",
|
||
"[8, 120] loss: 0.248\n",
|
||
"[8, 150] loss: 0.280\n",
|
||
"[8, 180] loss: 0.262\n",
|
||
"[8, 210] loss: 0.274\n",
|
||
"Finished epoch 8, loss: 6.436\n",
|
||
"accuracy on test set :90 % \n",
|
||
"[9, 30] loss: 0.251\n",
|
||
"[9, 60] loss: 0.248\n",
|
||
"[9, 90] loss: 0.246\n",
|
||
"[9, 120] loss: 0.233\n",
|
||
"[9, 150] loss: 0.269\n",
|
||
"[9, 180] loss: 0.263\n",
|
||
"[9, 210] loss: 0.254\n",
|
||
"Finished epoch 9, loss: 6.501\n",
|
||
"accuracy on test set :90 % \n",
|
||
"[10, 30] loss: 0.248\n",
|
||
"[10, 60] loss: 0.252\n",
|
||
"[10, 90] loss: 0.242\n",
|
||
"[10, 120] loss: 0.240\n",
|
||
"[10, 150] loss: 0.247\n",
|
||
"[10, 180] loss: 0.242\n",
|
||
"[10, 210] loss: 0.241\n",
|
||
"Finished epoch 10, loss: 5.831\n",
|
||
"accuracy on test set :90 % \n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"if __name__ == '__main__':\n",
|
||
" epoch_list = []\n",
|
||
" acc_list = []\n",
|
||
" \n",
|
||
" for epoch in range(10):\n",
|
||
" train(epoch)\n",
|
||
" acc = test()\n",
|
||
" epoch_list.append(epoch)\n",
|
||
" acc_list.append(acc)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 81,
|
||
"id": "02d65fdd",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"image/png": "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\n",
|
||
"text/plain": [
|
||
"<Figure size 640x480 with 1 Axes>"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"plt.plot(epoch_list, acc_list)\n",
|
||
"plt.ylabel('accuracy')\n",
|
||
"plt.xlabel('epoch')\n",
|
||
"plt.show()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 82,
|
||
"id": "4932c64b",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"save_path = \"./Model.pkl\"\n",
|
||
"torch.save(model, save_path)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"id": "1ad83689",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": []
|
||
}
|
||
],
|
||
"metadata": {
|
||
"kernelspec": {
|
||
"display_name": "Python 3 (ipykernel)",
|
||
"language": "python",
|
||
"name": "python3"
|
||
},
|
||
"language_info": {
|
||
"codemirror_mode": {
|
||
"name": "ipython",
|
||
"version": 3
|
||
},
|
||
"file_extension": ".py",
|
||
"mimetype": "text/x-python",
|
||
"name": "python",
|
||
"nbconvert_exporter": "python",
|
||
"pygments_lexer": "ipython3",
|
||
"version": "3.10.9"
|
||
}
|
||
},
|
||
"nbformat": 4,
|
||
"nbformat_minor": 5
|
||
}
|