mirror of
https://github.com/ZhangXinNan/DL-with-Python-and-PyTorch2.git
synced 2025-10-20 23:34:18 +08:00
475 lines
62 KiB
Plaintext
475 lines
62 KiB
Plaintext
{
|
||
"cells": [
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"## 5.5 选择合适的损失函数"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"1.torch.nn.MSELoss代码示例"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 1,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"tensor([[-0.6014, -1.0122]], requires_grad=True)\n",
|
||
"tensor([[-0.3023, -1.2277]])\n",
|
||
"tensor(0.0680, grad_fn=<MseLossBackward>)\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"import torch\n",
|
||
"import torch.nn as nn\n",
|
||
"import torch.nn.functional as F\n",
|
||
"\n",
|
||
"torch.manual_seed(10)\n",
|
||
"\n",
|
||
"loss = nn.MSELoss(reduction='mean')\n",
|
||
"input = torch.randn(1, 2, requires_grad=True)\n",
|
||
"print(input)\n",
|
||
"target = torch.randn(1, 2)\n",
|
||
"print(target)\n",
|
||
"output = loss(input, target)\n",
|
||
"print(output)\n",
|
||
"output.backward()\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"2.torch.nn.CrossEntropyLoss代码示例"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 2,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"import torch\n",
|
||
"import torch.nn as nn\n",
|
||
"\n",
|
||
"torch.manual_seed(10)\n",
|
||
"\n",
|
||
"loss = nn.CrossEntropyLoss()\n",
|
||
"#假设类别数为5\n",
|
||
"input = torch.randn(3, 5, requires_grad=True)\n",
|
||
"#每个样本对应的类别索引,其值范围为[0,4]\n",
|
||
"target = torch.empty(3, dtype=torch.long).random_(5)\n",
|
||
"output = loss(input, target)\n",
|
||
"output.backward()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"## 5.6 使用合适优化器"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"### 5.6.2 批量随机梯度下降法"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 1,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"import numpy as np\n",
|
||
"import torch\n",
|
||
"import time\n",
|
||
"# 导入 pytorch 内置的 mnist 数据\n",
|
||
"from torchvision.datasets import mnist \n",
|
||
"#import torchvision\n",
|
||
"#导入预处理模块\n",
|
||
"import torchvision.transforms as transforms\n",
|
||
"from torch.utils.data import DataLoader\n",
|
||
"#导入nn及优化器\n",
|
||
"import torch.nn.functional as F\n",
|
||
"import torch.optim as optim\n",
|
||
"from torch import nn"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 2,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"# 定义一些超参数\n",
|
||
"train_batch_size = 64\n",
|
||
"test_batch_size = 128\n",
|
||
"learning_rate = 0.01\n",
|
||
"num_epoches = 20"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 3,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"transform = transforms.Compose([transforms.ToTensor(),transforms.Normalize([0.5], [0.5])])"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 4,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"#定义预处理函数\n",
|
||
"transform = transforms.Compose([transforms.ToTensor(),transforms.Normalize([0.5], [0.5])])\n",
|
||
"#下载数据,并对数据进行预处理\n",
|
||
"train_dataset = mnist.MNIST('../data', train=True, transform=transform, download=False)\n",
|
||
"test_dataset = mnist.MNIST('../data', train=False, transform=transform)\n",
|
||
"#得到一个生成器\n",
|
||
"train_loader = DataLoader(train_dataset, batch_size=train_batch_size, shuffle=True)\n",
|
||
"test_loader = DataLoader(test_dataset, batch_size=test_batch_size, shuffle=False)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 5,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"image/png": "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9xadA/Yuxx13nBfv2rXLi1etWlXJdDLjDAUAEAQFBQAQBAUFABAE11DQIpxwgv8JxvPOOy/vtu+//74Xn3POOV68bt26uN3Q0OD17bvvvl78+uuvx+2+fft6fZ06dSqQMfC1fv36efHmzZu9eObMmZVMJzPOUAAAQVBQAABB1MSUV/IjnZdddpnX9/e//92Lv/rqq7j91FNPeX1r1qzx4uXLl4dKETXusMMO82Izf/GA5DTX4MGDvb7Vq1cXfZzrr7/ei3v16pV32xdeeKHo/WLv07t377g9fvx4r6+5rlTNGQoAIAgKCgAgCAoKACCImriGMnny5LjdvXv3oh93xRVXePGmTZu8OP3x0EpILpGQfF6StGjRokqns9d4/vnnvfioo47y4uTYWL9+febjjB071ovbtGmTeV/Yu333u9+N2+3bt/f60ksHNRecoQAAgqCgAACCoKAAAIKoiWsoye+e9OnTx+tbunSpF3/ve9+L2/379/f6zjjjDC8+6aST4vann37q9R155JFF57djxw4vXrt2bdxOf/8hKX2HPq6hVE59fX2Q/UyYMMGL03fWS3rjjTcKxkDSjTfeGLfT47W5vlZwhgIACIKCAgAIoiamvP7yl7/ssb0nL730Ut6+Aw44wIuTK3guXrzY6zvxxBOLzi+53IskffTRR3E7PSV34IEHxu0VK1YUfQzUjmHDhsXtu+66y+tLrzb8+eefx+2bb77Z69uyZUsZskNzlf5KRHKF7ORrivTN1YabC85QAABBUFAAAEFQUAAAQdTENZRQvvzySy+eN29e3m0bu1ZTyMiRI+N2+rrNu+++G7eb6/IJe7vk3Hb6mkla8m+8YMGCsuWE5u/000/P25f8KkJzxhkKACAICgoAIAgKCgAgiBZ1DaVcDj74YC+eMmVK3G7Vyq/Jye8tNGWZdFTOc88958Vnnnlm3m2feOIJL7711lvLkhNanmOPPTZvX/pWF80VZygAgCAoKACAIJjyKsLVV1/txQcddFDcTn9U+cMPP6xITsguvUL0gAEDvLiuri5ur1u3zuu75557vLihoSFwdmgpkqudS9Ill1zixW+99VbcfvnllyuSU7lxhgIACIKCAgAIgoICAAiCayh7cMopp3jxL37xi7zbjhgxwovfe++9suSEcGbMmOHFnTp1yrvttGnTvJhbEqBYgwYN8uLkrS0k/1Yc6VtkNFecoQAAgqCgAACCoKAAAILgGsoeDB061IvbtGnjxcml71977bWK5ISmOeecc+J2//79C247f/78uH377beXKyW0cH379vVi55wXT58+vZLpVARnKACAICgoAIAgmPLK2W+//eL2WWed5fVt27bNi5PTINu3by9vYsgk/VHgW265JW6npzDT3n777bjN0iooxaGHHhq3Tz31VK8vvSzTzJkzK5JTJXGGAgAIgoICAAiCggIACIJrKDkTJkyI28cdd5zXl1wiQZJeffXViuSE7K6//novPvHEE/Num75jIx8VRlY//elP43b6Tq8vvvhihbOpPM5QAABBUFAAAEFQUAAAQey111DOPvtsL77tttvi9j/+8Q+v76677qpITgjnuuuuK3rb8ePHezHfPUFW3bp1y9uXvl14S8QZCgAgCAoKACCIvWbKK70Ux69//Wsvbt26ddyeM2eO1/f666+XLzFUXfpOelmX09m4cWPB/SSXfOnYsWPe/ey///5eXMr03c6dO734pptuittbtmwpej/IZtiwYXn7nn/++QpmUh2coQAAgqCgAACCoKAAAIJo0ddQktdF0sunfPvb3/biFStWxO3kR4jR8r3zzjtB9vPHP/7Ri1evXu3FhxxySNweM2ZMkGM2Zs2aNXF70qRJFTnm3mTgwIFenFy+fm/EGQoAIAgKCgAgiBY95dWzZ8+4ffzxxxfcNvnRzOT0F5qn9Ee/zz333LIfc/To0Zkfu2PHjri9a9eugtvOmjUrbi9atKjgtn/9618z54TGnXfeeV6cnGZ/6623vL6FCxdWJKdq4gwFABAEBQUAEAQFBQAQRIu6hpJe6XPu3Ll5t03eoVGSZs+eXZacUB3nn3++F994441xO7kESmOOOeYYLy7l476PPvqoF69cuTLvtjNmzIjby5YtK/oYqKx27dp58dChQ/NuO336dC9OL4vTEnGGAgAIgoICAAiCggIACKJFXUO5/PLLvbhr1655t12wYIEXO+fKkhNqw+TJk4PsZ9y4cUH2g+YpfUuC9F0Yk98ReuCBByqSUy3hDAUAEAQFBQAQRLOe8kqv9HnNNddUKRMAe4P0lNeAAQOqlElt4gwFABAEBQUAEAQFBQAQRLO+hnLqqad6cYcOHfJum16SvqGhoSw5AcDeijMUAEAQFBQAQBAUFABAEM36GkpjlixZErd//OMfe33r16+vdDoA0KJxhgIACIKCAgAIwkpZZdfMWJK3BjnnrNo5FMK4qVmLnXMnVDuJQhg7NWuPY4czFABAEBQUAEAQFBQAQBClfmx4naT6ciSCzLpVO4EiMG5qE2MHWe1x7JR0UR4AgHyY8gIABEFBAQAEQUEBAARBQQEABEFBAQAEQUEBAARBQQEABEFBAQAEQUEBAARBQQEABEFBAQAEQUEBAARBQQEABNGiC4qZrTSzQVU8/iozO6Nax0d2jB1ktTePnSYVFDMba2ZvmNlmM/s8177KzGr9HucvmllD7t92M9uWiB/OuM9pZnZH4Dz/zczqc3k9a2b7h9x/NTF2vH0GHzuJfT9pZs7Mupdj/9XA2PH2GXTsmNkRZva8ma3OjZsupTw+c0Exs+slPSDpPkmHSjpE0pWSTpG0b57HtM56vJCcc0Occx2ccx0kPSVp8u7YOXdlenszK/VGZE1mZn0kTZF0oaLf73ZJv6l0HuXA2KmM3LvU5nATraIxdspul6Q5kkZlerRzruR/kjpK2ixpZCPbPSZpai7BzZIG5R77hKS1iu7EdqukVrnt75A0LfH47pKcpH1y8XxJd0v6m6RNkuZK6pzY/qLcPr+QNFHSSkmDisjxntTPBuUee4ukNZJ+J+nfJc1PbLNPLrfukq5S9IK/TVKDpJm5bVZJuk7Su5I2SnpaUl2Rv+PJkp5IxEdL+qekdln+ZrXyj7FT/rGTe3wbSUsk9d19rGr/7Rk7zWPs5PbRNnecLqU8LusZysmS6iT9qYhtx0maJOlbkl6R9KCiP24PSadL+omkS0o49rjc9gcrekdygySZWS9Fg+giSYdL6iSppNO1lC6SOkjqqugPl5dzboqkZyT90kXvNs5LdF8g6V8VPd/jc/nJzFqb2QYzOynPbo9R9IKw+xgfKnr38H+yPZ2awdhJKNPYkaLn9j+S3s/8LGoPYyehjGMns6wFpbOkdc65Hbt/YGav5hLdamanJbb9k3Pub865XYqq6RhJNzvnNjnnVkr6D+WebJF+55z7yDm3VdIfJPXL/XyUpNnOuYXOuX9Kuk3RC3BWOyTd4ZzbljtWVv/pnFvjnPtC0uzd+Trndjrn9nfOvZ7ncR0UvbtI+oei/yDNGWOneJnGjpl1k3SponfeLQljp3hZX3eaJGtB+UJS5+Qcn3NugHNu/1xfcr+fJtqdFVX3+sTP6iUdUcKx1yTaWxS98ErRu4P4WM65zblcsvrMObetCY/fLV++jWmQ9C+pn/2LolPu5oyxU7ysY+fXkm53zjX3sZLG2Cle1rHTJFkLymuK5vPPLWJbl2ivU/RuIXmhsKuk/821N0tql+g7tIScVks6cndgZu0UnX5m5VJxY7mlt2+q9xXNf0uSzOw7iv5e/y/wcSqNsVP+sfNjSfeb2RpF8+mS9KaZjQl8nEpj7JR/7DRJpoLinNsg6U5JU8xslJl1MLNWZtZPUvsCj9up6HRxkpl9K3dqfp2kablN3pZ0mpl1NbOOkm4uIa3pkoaZ2UAz21fSXQr7PZslkvqY2bFmtp+k21P9nymarwxlmqQRZjbAzNorej5/dM5tCXiMimPsVGTs9FA0xdFP0fy5JA2VNCvgMSqOsVORsSMza6voWpUk1ZlZXaHtkzI/cefcZEV/lBslfa7oiT0i6SZJrxZ46DWKqu7Hii6W/bekR3P7fFnRRaZ3JC1WNPdXbD7vS7o6t7/Vkr7U1+/Omsw594GkXyr6xMeHkhamNvkvSX3N7Eszm97Y/nIXxxrM7OQ8x3tH0nhJv1f0+61T9Ltr9hg7ZR87n+fmz9co+t1K0tomzsnXBMZOecdObjpxq6QNuR8tV/R7K4rlPiIGAECTtOilVwAAlUNBAQAEQUEBAARBQQEABEFBAQAEUdJqlmbGR8JqkHOu1pftZtzUpnXOuYOqnUQhjJ2atcexwxkKsPeqb3wTYI/2OHYoKACAICgoAIAgKCgAgCAoKACAICgoAIAgKCgAgCAoKACAICgoAIAgKCgAgCAoKACAICgoAIAgKCgAgCBKWm24uWnfvn3cvu+++7y+K664wosXL14ct0ePHu311dezhh4ANIYzFABAEBQUAEAQLXrK67DDDovbl112mde3a9cuLz7++OPj9rBhw7y+hx56qAzZoVr69+/vxc8++6wXd+/evew5nHnmmV68dOnSuP3pp5+W/fioLcOHD/fiWbNmefH48ePj9sMPP+z17dy5s3yJlYgzFABAEBQUAEAQFBQAQBAt6hrKQQcd5MWPP/54lTJBLRs8eLAX19XVVTyH9Jz5pZdeGrfHjh1b6XRQBZ06dYrbU6ZMKbjtb37zm7j96KOPen1bt24Nm1gTcIYCAAiCggIACKJZT3n9/Oc/9+IRI0Z48fe///1M+z3ttNO8uFUrv+4uWbIkbi9cuDDTMVBZ++zz9VAfOnRoFTOJJFdmkKTrrrsubidXeJCkzZs3VyQnVFbydaZLly4Ft3366afj9ldffVW2nJqKMxQAQBAUFABAEBQUAEAQzfoayq9+9SsvTi+nktX5559fME6uPjxmzBivLz03jtrwwx/+MG6ffPLJXt/kyZMrnY4OOOAAL+7Vq1fcbteundfHNZSWIf3x9IkTJxb92CeffDJuO+eC5RQaZygAgCAoKACAICgoAIAgrJT5ODOr+uTdnDlz4vaQIUO8vqZcQ/niiy/idkNDg9fXrVu3ovfTunXrzDlk5Zyzih+0BNUYN7179/bi+fPnx+3k31ryb10gffPvXw7JfCRp4MCBcTt52wVJWrt2bbnSWOycO6FcOw+hFl5zQjnhBP9X/eabb+bddseOHV7cpk2bsuTUBHscO5yhAACCoKAAAIKo+Y8Nn3766V589NFHx+30FFcpU17pu57NnTs3bm/cuNHr+9GPfuTFhT7u97Of/SxuT506teh8ENatt97qxcnlTM466yyvrxJTXJJ04IEHxu30uA71kXfUrpEjRxa9bfL1qDnhDAUAEAQFBQAQBAUFABBEzV1D6d69uxf//ve/9+LOnTsXva/kEikzZszw+u68804v3rJlS1H7kaTLL788bqfvEplcxqNt27ZeX/Kua5K0ffv2vMdEaUaNGuXF6SXqly9fHrcXLVpUkZzSktfe0tdMkh8j3rBhQ6VSQgWlb4uRtG3bNi8uZVmWWsIZCgAgCAoKACAICgoAIIiau4aSvFWrVNo1kwULFnjx2LFj4/a6desy55S+hnLvvffG7fvvv9/rSy49nl4WfdasWV68YsWKzDnBN3r0aC9OLwE/ZcqUSqYj6ZvXAy+88MK4vXPnTq/vnnvuidtcW2sZBgwYUDBOSt+i4O233y5LTuXGGQoAIAgKCgAgiJqb8ipF+uOfl156qRc3ZZqrkOTUVXIaQ5JOPPHEshwT39SxY8e4fdJJJxXcthrL4CQ/Xi7507dLly71+ubNm1eRnFA5pbwWtJRlmjhDAQAEQUEBAARBQQEABFHz11Batcpf837wgx9UMJOvmX19g8R0foXyveOOO7z4oosuCprX3qauri5uH3HEEV7f008/Xel0vqFnz555+957770KZoJqSN+hMS25xA7XUAAASKCgAACCoKAAAIKouWsoV155pRfX4q1Rhw8fHrePO+44ry+Zbzr39DUUNM2mTZvidnqpij59+nhx8va769evL0s+Bx98sBenl9RPeuWVV8qSA6pr4MCBcXvcuHEFt03eanzVqlVly6mSOEMBAARBQQEABFFzU17J6aRqSd+FsVevXl58yy23FLWftWvXejGryIa1devWuJ1euXnkyJFe/MILL8Tt9ArRpejdu7cX9+jRI26nVxd2zuXdTy1O5aLpOnXqFLcLfYVAkl5++eVyp1NxnKEAAIKgoAAAgqCgAACCqLlrKLVg4sSJXnz11VcX/diVK1fG7Ysvvtjr++STT5qUF/K7/fbbvTi5PI4knX322XG7KcuypG+JkLxOUsrdRR977LHMOaB2FfqoeHKpFUl65JFHyp1OxXGGAgAIgoICAAiCggIACIJrKDlz5syJ20cffXTm/XzwwQdxm+U1KmfZsmVefMEFF3hxv3794vZRRx2V+TjTp0/P2/f44497cfr20EnJ79Cg+erSpYsXF1puJb28SvoW5i0BZygAgCAoKACAIGpuyiv9cc9CyxcMGTKk4L5++9vfxu3DDz+84LbJ4zRlWYxaWDoG35RcjTi9MnEoH3/8cdHbppdw4Q6OzdOAAQO8uNDr1XPPPVfudKqOMxQAQBAUFABAEBQUAEAQNXcNZerUqV48efLkvNvOnj3biwtd+yjlukgp2z788MNFb4uWLX39Lx0ncc2kZUguV5+WXqbngQceKHc6VccZCgAgCAoKACCImpvyevbZZ714woQJXpy+m2I5pO+0uHTpUi++/PLL4/bq1avLng+ah/QdGgvdsREtw+DBg/P2pVcX37hxY7nTqTrOUAAAQVBQAABBUFAAAEHU3DWU+vp6Lx47dqwXjxgxIm5fe+21Zclh0qRJXvzQQw+V5ThoWdq2bVuwnxWGm782bdp4cc+ePfNu+9VXX3nx9u3by5JTLeEMBQAQBAUFABAEBQUAEETNXUNJW7hwYd547ty5Xl/y+yGSv5T8rFmzvL7k0vaSv0xG8q6LQLEuueQSL96wYYMX33333ZVMB2WQXpYpfdfF5G0Jli9fXpGcaglnKACAICgoAIAgan7Kq5CXXnqpYAxU0ptvvunF999/vxfPmzevkumgDHbu3OnFEydO9OLkcjuLFy+uSE61hDMUAEAQFBQAQBAUFABAEFbKEttmxnrcNcg5l//WgDWAcVOzFjvnTqh2EoUwdmrWHscOZygAgCAoKACAICgoAIAgKCgAgCAoKACAICgoAIAgKCgAgCAoKACAICgoAIAgKCgAgCBKXb5+naT6ciSCzLpVO4EiMG5qE2MHWe1x7JS0lhcAAPkw5QUACIKCAgAIgoICAAiCggIACIKCAgAIgoICAAiCggIACIKCAgAIgoICAAji/wNyT3w8hw7vmQAAAABJRU5ErkJggg==\n",
|
||
"text/plain": [
|
||
"<Figure size 432x288 with 6 Axes>"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"import matplotlib.pyplot as plt\n",
|
||
"%matplotlib inline\n",
|
||
"\n",
|
||
"examples = enumerate(test_loader)\n",
|
||
"batch_idx, (example_data, example_targets) = next(examples)\n",
|
||
"\n",
|
||
"fig = plt.figure()\n",
|
||
"for i in range(6):\n",
|
||
" plt.subplot(2,3,i+1)\n",
|
||
" plt.tight_layout()\n",
|
||
" plt.imshow(example_data[i][0], cmap='gray', interpolation='none')\n",
|
||
" plt.title(\"Ground Truth: {}\".format(example_targets[i]))\n",
|
||
" plt.xticks([])\n",
|
||
" plt.yticks([])"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"### 加载数据"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 6,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"train_loader = DataLoader(train_dataset, batch_size=1, shuffle=True)\n",
|
||
"test_loader = DataLoader(test_dataset, batch_size=1, shuffle=False)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 7,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"loss_cnt = nn.CrossEntropyLoss()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 8,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"def sgd_update(parameters, lr):\n",
|
||
" for param in parameters:\n",
|
||
" param.data -= lr * param.grad\n",
|
||
" param.grad.data.zero_()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"### 定义模型"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 9,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"net = nn.Sequential(\n",
|
||
" nn.Linear(784, 200),\n",
|
||
" nn.ReLU(),\n",
|
||
" nn.Linear(200, 10),\n",
|
||
")"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"### 训练模型"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 10,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"epoch: 0, Train Loss: 0.345866\n",
|
||
"epoch: 1, Train Loss: 0.212836\n",
|
||
"epoch: 2, Train Loss: 0.170220\n",
|
||
"epoch: 3, Train Loss: 0.155545\n",
|
||
"epoch: 4, Train Loss: 0.137840\n",
|
||
"使用时间: 261.23325 s\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"# 开始训练\n",
|
||
"losses1 = []\n",
|
||
"idx = 0\n",
|
||
"\n",
|
||
"start = time.time() # 记时开始\n",
|
||
"for e in range(5):\n",
|
||
" train_loss = 0\n",
|
||
" for img, label in train_loader:\n",
|
||
" #展平img\n",
|
||
" img=img.view(img.size(0),-1)\n",
|
||
" # 前向传播\n",
|
||
" out = net(img)\n",
|
||
" loss = loss_cnt(out, label)\n",
|
||
" # 反向传播\n",
|
||
" net.zero_grad()\n",
|
||
" loss.backward()\n",
|
||
" sgd_update(net.parameters(), 1e-2) # 使用 0.01 的学习率\n",
|
||
" # 记录误差\n",
|
||
" train_loss += loss.item()\n",
|
||
" if idx % 30 == 0:\n",
|
||
" losses1.append(loss.item())\n",
|
||
" idx += 1\n",
|
||
" print('epoch: {}, Train Loss: {:.6f}'\n",
|
||
" .format(e, train_loss / len(train_loader)))\n",
|
||
"end = time.time() # 计时结束\n",
|
||
"print('使用时间: {:.5f} s'.format(end - start))"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 11,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"<matplotlib.legend.Legend at 0x220dfdd0148>"
|
||
]
|
||
},
|
||
"execution_count": 11,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
},
|
||
{
|
||
"data": {
|
||
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAXwAAAD4CAYAAADvsV2wAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8QZhcZAAAgAElEQVR4nO3deXwU9f0/8Nc7J4dQFFCRgMGKAqJim+K3orbWCxSlVavw1W9FUVSktbX2V3p861FaqFVbD7TqV0WUgqhYuQQEBUTCEUKABAgmEGATQk7Ife7n98dmkz1m752dzczr+XjwIDs7O/Oe3dn3fPZzjSilQERE5pdgdABERBQbTPhERBbBhE9EZBFM+EREFsGET0RkEUlGB+DPgAEDVHp6utFhEBF1Kzt37qxQSg30XB7XCT89PR1ZWVlGh0FE1K2IyBGt5azSISKyCCZ8IiKLYMInIrKIuK7DJyLjtba2wmazoampyehQyEOPHj2QlpaG5OTkoNZnwiciv2w2G/r06YP09HSIiNHhUAelFCorK2Gz2TBs2LCgXsMqHSLyq6mpCf3792eyjzMigv79+4f0y4sJn4gCYrKPT6F+Lkz4FDd2HqlGY0u70WGYXkFZHTILK40OgwzAhG9CSil8mlOMptbukzzLappw+2tb8MSHu40OxfSue2Ejpry51egwyABM+Ca09VAVHlucg9kr9xkdStDqO0r2eSWnDI6E4lFRURFGjx4d9Prz589HSUlJwHVmzpwZUVx/+tOfsG7duoi24aqlrR2lp5qglML48ePRr18/TJw4MWrbZy8dE6ptagUAlJ5qNjgSoKapFSmJCeiRnOi2/OnleUhKEPzh5lEGRUZmNn/+fIwePRrnnHOOrvt55plnorq9I5UNaGxtR79eyfjNb36DhoYGvP7661HbPhM+6eqSp9ZicL+e+HrWj9yWv/N1EQCYLuFnFlZi7LAzkJhgzkbOp5fnYV9JTVS3OeqcvnjylosCrtfW1oZ7770Xu3btwgUXXIAFCxbgueeew/Lly9HY2IgrrrgCr7/+Oj7++GNkZWXh7rvvRs+ePZGZmYnc3Fw89thjqK+vR2pqKtavXw8AsBUX48prrkPpsSO47baf4Nlnn9Xcd3t7O6ZNm4asrCyICO6//3786le/wtSpUzFx4kSkp6fjgQce6Fw3NzcXSikUFhbi0UcfRXl5OXr16oU333wTI0aM8HmMrnecvfbaa7Fhw4bg38ggsEonQlX1LXjy01y0tNlRfLIRv/1oD1rb7WFta9Irm/Gzt7dHOULjFZ9sDLiOGe6tvPmbCkx5cyv+tbGwc9mX+WW49Om1aGhpMzAyfbS02dES5rkejvz8fEyfPh179uxB37598eqrr2LmzJnYsWMHcnNz0djYiBUrVuCOO+5ARkYGFi5ciJycHCQmJuKuu+7Ciy++iN27d2PdunXo2bMnACAnJwd/m/cWVm3ahg8++ADHjh3T3HdOTg6Ki4uRm5uLvXv34r777nN7PiMjAzk5OcjJycH48ePxxBNPAACmT5+Ol19+GTt37sRzzz2HGTNmAAAWLlyIMWPGeP37xQP/o+M7yBJ+xP66aj8+2mnDmKH98PHOYmwuqMDESwfhquEDsf94DUac3SforlO7bfFbf/3lgTKs3XcCc2672OhQ4lZpjaM/dGF5XeeyZ1fn41RjKw5X1OOic75lVGhR41oS32M7CQAY9K2eSEgA+vdORVu7Hc1tdvROjX5qGTJkCMaNGwcAuOeee/DSSy9h2LBhePbZZ9HQ0ICqqipcdNFFuOWWW9xel5+fj0GDBuF73/seAKBv376dz139wx+hT99voUePFIwaNQpHjhzBkCFDvPZ93nnnoaDwEH427WFMuWMSbrzxxs7nWtrsaLcrJCYIlixZguzsbKxduxZ1dXXYsmULfvrTnwJwlN6bmh3nyN133427777baz/O91QvLOG7aG5rx99WH0B9c/ClsXa7o2S666j7B/X5vhOY8OJX+GRXcVRjNMp983dg0fajum2f/bzjS1FFPZ5alge7PfAvr+OnGlFc7fgVd7ii3u2CF6yGljZU1bf4XcfzHBERzJgxAx999BH27t2LBx98UHMQklLK5/mVmprS+XdiYiLa2rS/+6effjqWrNmEMZdfgXnz5nVW3yg4jv9oVQPy8vLw5JNPYvHixUhMTITdbke/fv06S/7vr9qID9c5ekf5KuH/+qF7/b4HkWLCd7Fo21G8tqEQr3xZ4HOdl9Z/g2W7vVv/F2S6Tz9dUOY46fNP1EYU0x7bSfzj84MRbYP009Jmx6RXNpuuX/vD7+/E/C1FIZ+/jRpdge1KoTFAlVZBWR1s1Q1+1zl69CgyMzMBAIsWLcKVV14JABgwYADq6urw0Ucfda7bp08f1NY6Yh8xYgRKSkqwY8cOAEBtba3PxO5LRUUF7HY7rrvpVjz19DPIzs52PNFxPSwtr8TkyZOxYMECDBzouO9I3759MWzYMHz44YcAALvdjvx9ewE4SvjOC4Hrv+dffzekuELFKh0Xre2OT6+1ratecuPBcgDADy5wfIgvdCTfM3ql4MEFWTi3fy9dY7r1la8BAL+6/gJd9xOOqvoW/H1NPp68ZZRXL5x48Oi/s3H5sDPws++nB/2a6voWrMkrxeSxQ4Na/1h1A3bbTmHKm1sxdtgZYUaqn5Y2O45W1eP8M/uE9XqlAK2ycTAlf6fSU02oqGvGhWf1QWoE58nIkSPx7rvv4qGHHsLw4cPxyCOPoLq6GhdffDHS09M7q2wAYOrUqXj44Yc7G20/+OADzHh0Jlqam9CzZ8+Qu1IWFxfjvnt+BrvdjtTkRMydM8ft+S/WrMSRI0ccvzJa7UhOFOzdsxsLFy7EI488gtmzZ6OusRk33nobfnrDVZr7sHu0Y1111VU4cOAA6urqkJaWhrfeesutKikcpk74heV16N87Bf16pQRe2UWzS8K/t6MRtWjuzW7r3PPWNgDAgVLtEpCC/o2Qz6/Nx40XnY3Rg42pG5772X4sybLhsqH9cGeGd72np/lfH8brmw4h83fXhrSftnY7nlt7ENOvPg9n9A7+s1y55zhW7jkeUsJ/7IMcbDpYju+eezqGn+WeJJVSeHJZHu7MGKL5nm8/XOVzu6G2Sdc3t6G13R7yuevp6eV5WLjtKLb9/lqc1bdHyK9XUJoJ/1BFfdDbaOgYY9FmV0gNYd/tdjv2H6/Fuf17IT09Hfv2eY8rmT17NmbPnu21/Pbbb8ftt9/e+XjUJZfhraVrMOC0VJzTz9FgO3XqVEy6879xrMrxy2LFihU+Y7n00kvx4ZpNaLcrjBrUF0mJjsqRd955B7klp5Aggj/88hG0tdux73hNZy+tYcOGYfXq1QAC18+XVLt3bvjqq6/8rh8O01bpVNQ149rnN+L6f2zSfD6zsBJtPnoYvLdV8+5gYRGPr0tTazta2iLv2VBV34KXvyjALa9s9nruy/xyt8d7bafw9zUHIt6np85Cnkcya2ptx6mGVq/1n1q+D8dPBT/RU1ZRFe54bQtW5ZbiXxsL8eSyPACO40mftRKr9h7HvW9vD/v93GM7ie/++XNUu9QdV9Q6xi40a2yzqr4FCzKPhNSTKtyWiSvmfoExz3we5qu7OC9Cpxq9Pw9/nHXevi5UWr2Owu2d5ktTqx12pXCiJrzxJHa7QnltM5RSnW1t0fjuAY6L0R7bSVQ3+G93CFZbux1VUdqWP6ZM+FX1LciY7fjJVl7bjKXZNrfns4qqMOXNrfjHutDqxoPtOui6mmdJf8T/rsaEF7suQuW1zXh9Y6HXtg9X1PucV+aTXTZ858+fe+3LybNx9dZ5mzHvy8KQfoY7rdxz3G17q/Ye7/zbVzK79ZXNuPSZtSHvy9Md/8pE1pFqvL35MICuqraPOz7PGQuzsfFgeWd7Sahe/bIQlfUt2Hqoq/492r/LapsdifY1l66awfCVoNvtCjVN7s+t23ci6iOUw7lQ7T8eWv/8msZW1IR4IQpFWW0zjp9qRHVDS0gXo8svv9yrMXXv3r1u6zirf8vrQr8YaX0PndvTmymrdDyvuk98uBu3fScNpxpaUV7XhPKOUlxhWfA/SwHgztcz/T7v2hHAs2R/tLIBP1/kaOgpLO/a72OLd2FLYSXmfNZVAm+3K1zz3AZcc6HXTecBAFsKvBsIF247gne+LsK6x3/gstRxEjkvCuF0hHn039luj2cszPaq3vK8qB08EXoCdo4Obmq1o6m13a1NoN3jC+J5HMFUn5XVNqFvj2SfbQ1KKazJK0W73a65j5C4hFNZ5zgXV+45jnn/HcE24Ri1/Kf/5OI/OSWYMPpsvDzlMiQlJuCBBVkAvKsdI+E8fue546+ni5Zg1i+qdHwPLknr53e9hpY2NLS0oVdKaOnKWSdutwMlpxzVJTVNrSgoq8P5Z57m83Xbtm3TXB7URTWItyi35JRbtVAkQh2/YsoSvud7YFeOEtOlz6zFdS9s6qxTDNWOourgY/BIQq9uKNDsZ1+n0QXUeaJ+9U1F0Pv7wye5YZd0wxWtnpQbD5Z3Nk6X1jThirlfRGfDLsb+ZT0e7EiMWtbkncDD72drXqy0eo8opbBu34mQv3BfHDihWd0VjEueWov/5Dh6iH2WW4rp7+0M+rWBwjxQWoPlLr3POhM+FHr06IHKysqwB8cFGnRWGUQpOVCXTX/aPAoMkQ6Cq21u82pgdWpy5pYAb5VnTOFw3gClR4/g22ZMWcLfUuidKF1/Rv26Y0ZGZwmjtd2O5ChcbbUStGdJ36n4ZCMSRcLqfx5uon1pfQGmX30eeqYkory2Gf17pyDBzxQARUE2zEU6SHb7YfdfLJ5fbufFc3tRlWa7S7D7d34+/9lVjJfWf4PBp/fsfK6y3j3pOD+3VXuPY8bCbMy/73u42KWh9uPsYjzx4W7cNy49uJ3D0V/7/vlZGHd+fyx84L+Cfp0v+T46DByrakBqcgLO7NMj6HNl/D8dDYS3XOqYe8Z5/EoBaWlpsNlsKC/vahs6Ue1/9HRybdd761xXVaciJSnBa/kJlxrI/S6va26zd/4ar0lORO1p2g3YtU2t6J2S5HUun2xoRV1zG+pTk7wKVs791De3obqhFbUpiag/4b+BvPRkI+zKEW9KUoJbe4AIkFjTE7aOY0oQIKGmp9vr3d6zk6luOae13e7WVtFWmYKeKYF7NDlvcRgsUyb8I5XeJTKtE7++pQ3Ld5fg54t2eVSFRI+v6oZxHaXY7wz1/3M2Ek2t7snxH+sOormtHalJifjHuoP49fUX4OfXDndbJ7f4FH6xeBc+fXQcfvLq13637+tippeq+haf7S5zVu1H357JePSa872eW7//hNvjX36QA6Crp4mI72PZ0/GrbN/xGreEX9pRRVAaoBHadavPr3XE/rVGldy/Nhbi05wSfPaYdpe9UFz17JcAIqvi6SrhA8nJyV630Jswa6Xf1697/Gqk9++NstpmTHjXca4vnXEFRg493e82Cv96E779+1X4480jMXvl/s7lP7hgIN69/1Kv9TMLKzHl3a24YdRZeONnGW7PPbUsD/O3HMN949LxztfuUyYUzb0Z72UW4X8/dXQEmDTmHLw4eaTfY7rzqTWobXJcOM7oneJWMElNSsDep27EhD9+5rYPV67Hu/7XP8C3B3ZVK+0rqcGD77v3yolmFZ2TJap0AO2RnMeqGrE6rxRA6A1OwcotPoXfLd3r8ydcgkZcxQFKT57J6Z2vD2uut7mgAps9fnU0trZ3Js0NB8u9XvP3Nfk4VF6PrCPVqA6y6sFXAduzcTEavvHRPvD6pkP4+5p8zeemveu7KsfJ82O46aWv3Bpzo8Hzs1ibV4rVuY5G8LmfHQj5HCw+2YiHg6zWaW23d44pCYbz7Qi3Gue6Fzbhr6sOhFw9t6PI0avINdm7Kqqox1GXAl1bR5uLs5p28huZeOi9wJ834KgWc8oqqg76Fy2gXVWvNSAz3pgy4Te2atTRBXHebi/y3Y86FK67+rqgEou2H8VHO22a62ol/B8+twFA8FU3Ty/3Pe995iHf7QA7j1RjQ36Z27LOpBDE+xUovlte7uoyWhLEBGquXHsoxWJeNa1D+WeIvbiclu4qRvqsldh9zL3ftXOuHQBYvP0opr+3Ew+/n+358pA4CyyBPLsmH/e+vR1ZwZ7jzm6Z4QYGYNM37heYYE7nQJ/1D5/bgKv//qXP57ceqsKaPPdfdMGcP8UnGzu/d8HwPPdFvAdO+VMWZlfTSJky4S/a7j3j3aEK7ZLhyj2OElZLmx2f7+s6UcY8szasboyAY7CWs3dGIOHUx0fSWOo5T9DUdxzDzZVSOFLZVcJ5389YhLIa92oMpRz9iF9e/41bg5hr1ZqzGkWLVnXKtc9v6Pw7L4rT8Wr3tJCoNUC78nWRB4BZS/f6fC5cjS3tyC12Pz7ne3u44/wPtvGzq4Tvvvz4qcag76QWTr/8ijC6ORrDc3xNaMdq1B3HTFmHr+Unr27x+3y7x5l9sqHVbZlWQ7A//r7srrRK+HpakqUd11ubD7v9jF5/oExzPcBxsq7/9Q/denJ8sqsYz39+0Gc1jmfXykBKQhig5TbuQSms2luK60adqbnuzS95D1QDVNjtEa7VAuEK1A4AuI9/8OWWVzZH3FPr4IlaLNlxrLNgsO1wJb57ble9+/fnfIEfjdB+b6NBa8BbpEKplsovrUXJyUZcE+AYtb62kfQkihXLJPxIHdVoCPYn2JGNmWHUE+txjcgKoctpyUlnguoKpKnNvS5VT57fX9eG8U3fVODRf2fjoavP023/VfUtQX++wfTCcq1Wq21qRZ8eyZ2PK+qasf1wFWYsDFz1E26yd7YjAMANHiPTn12djw+zbFj4wOWdUxJ84acwECk9ij+hFDVu/Kfj+AM1mGrFOfez6I9mjzYmfCeNs8I1sUSh22zcKj3V5NUt0R+vgU9BvDee9dl6Odkx6C6UXwiAhJxpcoujV83kWr1zoqbJLeFPm78jKvdJOFbluw0lUDvC4Yp6XDH3C6z8xZURxwF09KzRuUojPUAvokh119m8TVmHH45AJe1YTIbmyXW4dfqslZ190Ouao1uK/q8560MaVOY810M56f0NNIn0y6N1wVkeYo8JrRCMuAnXdS+4l7CDuVuYL5PfyES9n0FGq3OP464Ao8ddPfHhnrBjAbqqaz7ODq66M1ri+WZqx081do418ORrapVIsITfQetGJa5JPh5K+C3tduQcOxlyMos2z2oK17cm1MarUGUfrcbafSd8Pu+c+VBv4VTFhaMiyMZ/LVsP+e+RE2kPoVBNfmMrrvh2f2zxc++AZ3WY5M/XZIj+4ggkWmNQvj/H0W111S+8x18UVdZj5KC+XssjwYTvx+5jXT+lK3xchWNpyY5jASdZ8pwoDnCUoKNZyhGP/wHvic38eXyJ7x47gWglQNfucM+tDb0rpQji6gYmO48E/2uruwmUZMOdGRMIrYdPoJutREtDSxuSEhLcRhgbKT6iiFMLMos6/35x/TeGxeH0lJ/+9k6PL9nttSzaP2lrNeb/cQ6ACcbS7Oje9nFDfvADirQ89N5OLNXpVpThlAPNeMPzWMg5Gnw7Uai9xgCENShh1J/WYNI8/yPWHZs22WyZItIbwKsAWgBsUEotjNW+wxUHtThe/rJKewRirAXbFzuQv60+gGQ/8/kEI9rzsGsJZRQmOWhNcdJdnKhpwr7jNbjvnR149/6xSEoQzYJOMIIZQV3TGJuLfEQlfBF5W0TKRCTXY/l4EckXkQIRmdWx+DYAHymlHgRwayT7peDpNd9NtJLsaxtCmyc+lpQCVuxxtJf4Gr/Q3TTp0M89Fso0qlTtdoWXv/B9/+lIXP7X9bivY1DivW9vx93/5z5lcrR76SzfE5t2uUhL+PMBvAJggXOBiCQCmAfgegA2ADtEZBmANADO/me6dtZOSpCoTD/q645Y3UksfiruOlrtd37x7irSqTbiseveLxbtMjqEsGiVktftP9F5R6/NBRUhTW0QqVB3dfyU/95W/9521O/z0RJRwldKbRKRdI/FYwEUKKUOAYCILAYwCY7knwYgBzq3HThGr0b+4XvOyUHalmYXR9QoFem1OR4TayQ+2OE9NUg80GuCwXB5dmCIpNeN3py9cYymR+IdDMD1jLV1LFsK4HYReQ3Acl8vFpHpIpIlIlmu82+HwmwJoDuI5F6h8zbo87M8LoRxLq7YE3gaBTJWaU0oA/vihx6NttpjWJSqB3BfoBcrpd4A8AYAZGRkhFX2i/X8NPEs1nPWhyOeB8ZE4psTdZ3zpxOFSo/vhR4lfBuAIS6P0wDEdKRQhJ0+TKUxSr1p4lm8XtRiNTiLKFh6lPB3ABguIsMAFAOYDCDC2zeHhiX8Lm9t1r45SqQufmothpzRM/CKJnLAxy0FibqLSLtlLgKQCeBCEbGJyDSlVBuAmQDWANgPYIlSKi/yUEOJK5Z7sy5/E3LFUqw+b8+ueUTdTaS9dKb4WL4KwKpIth0JfzfmJqLuSe8ZMGPNiJu9mHJqBVbpWMvBE6xqsSIjZrCNpozZ62K+T5MmfKMjoFjieAmi4Jgy4QdzlyEiIqsxZ8I3OgAiimtmHfsRiCkTPuvwicyvLIK587sDPdooTJnwE1mJT2Rqx6oa8MyKwPeHIHemTPj/O3Gk0SEQkY5uevEro0PolkyZ8MedP8DoEIhIR+HejMTqTJnwiYjIGxM+EVmORTvpMOETEVkFEz4RkUUw4RMRWYQpEz6nViCi7q673PGKiIjiEBM+EZFFmDLhK6vOjEREQbFqjjBnwjc6ACKKa9UNLUaHYAhzJnxmfCLy4/bXMo0OwRCmTPgs4hOR0VbuOW50CF5MmfC7+70uiaj7e/Tf2UaH4MWUCd/OfE9E5MWUCd+qLfBERP6YMuGzhE9E5M2UCb9vzySjQyAiijumTPipSYlGh0BEFHdMmfCJiMgbEz4RkUUw4RMRWQQTPhGRRTDhExHFId4AhYiIwsaET0RkEUz4REQWwYRPRGQRTPhERBbBhE9EZBFM+EREFsGET0RkETFN+CLyYxF5U0Q+FZEbYrlvIqLuRI9btQad8EXkbREpE5Fcj+XjRSRfRApEZJa/bSil/qOUehDAVAB3hRUxERGFJZQS/nwA410XiEgigHkAJgAYBWCKiIwSkYtFZIXHvzNdXvrHjtfp5rbLBuu5eSKibifoW0MppTaJSLrH4rEACpRShwBARBYDmKSUmgNgouc2REQAzAXwmVJK85buIjIdwHQAGDp0aLDheXnhrjFYuqs47NcTEZlNpHX4gwEcc3ls61jmy88BXAfgDhF5WGsFpdQbSqkMpVTGwIEDIwyPiIicIr35q2gs89nSoJR6CcBLEe6TiIjCEGkJ3wZgiMvjNAAlEW6TiIh0EGnC3wFguIgME5EUAJMBLIs8LCIiirZQumUuApAJ4EIRsYnINKVUG4CZANYA2A9giVIqT59QiYgoEqH00pniY/kqAKuiFhEREfGOV0REFD4mfCIii2DCJyKyCCZ8IiKLYMInIrIIJnwiIotgwicisggmfCIii2DCJyKKQzqMuzJ3wk9NMvXhERGFxNQZccrY8G+gQkRkNqZO+KI1Wz8RkUWZOuETEVEXJnwiIoswdcIXzTswEhFZk6kTPhERdWHCJyKyCFMn/GtHnml0CEREYVE63PLK1Al/3PkDjA6BiChumDrhExFRFyZ8IqI4xLl0iIgobEz4REQWwYRPRGQRTPhERBZh+oR/JbtmEhEBsEDCH3F2H6NDICIKmQ7jrsyf8ImIyIEJn4jIIpjwiYgsggmfiMgimPCJiCyCCZ+IyCKY8ImILML0CV+PGeeIiPTHG6AQEVGYTJ/wxegAiIjihOkTPhEROTDhExFZREwTvoj0FpGdIjIxlvslIqIgE76IvC0iZSKS67F8vIjki0iBiMwKYlO/BbAknECJiCgySUGuNx/AKwAWOBeISCKAeQCuB2ADsENElgFIBDDH4/X3A7gEwD4APSILmYjI/PSYHjmohK+U2iQi6R6LxwIoUEodAgARWQxgklJqDgCvKhsRuQZAbwCjADSKyCqllF1jvekApgPA0KFDgz8SIiLyK9gSvpbBAI65PLYBuNzXykqpPwCAiEwFUKGV7DvWewPAGwCQkZHBcVNEZEl6JL9IEr5WF/eAMSql5kewTyIiClMkvXRsAIa4PE4DUBJZOEREpJdIEv4OAMNFZJiIpACYDGBZdMIiIqJoC7Zb5iIAmQAuFBGbiExTSrUBmAlgDYD9AJYopfL0CzU8/U9LNToEIqK4EGwvnSk+lq8CsCqqEUXZg1cNw8A+qVidW4p1+08YHQ4RkWFMP7VCUmIC7vhuGoSzqBGRxZk+4Tsx3xOR1Vkm4RMRWR0TPhFRHNJjagXLJHwO2SUiq7NMwicisjomfCIii2DCJyKyCCZ8IiKLYMInIrIIyyT801IjmQmaiKj7s0zC//1NI40OgYjIUJZJ+H16sIRPRN2H0mHklWUSPhFRd6LHYFEmfCIii2DCJyKyCMskfD0mIiIi6k4sk/C1FM292egQiIhixtIJn4jISpjwiYgsggmfiMgiLJPwFW+BQkTdCO94RUREYWPCJyKyCMsn/NQky78FRGQRzHZERBbBhE9EZBGWSfiJCWJ0CEREhrJMwk9NSsQnM64wOgwiIsNYJuEDwGVDT/dadv2oswyIhIjIPz3GDlkq4Wt54c4x6Ncr2egwiIh0Z/mEn5KUgLP79jA6DCIi3Vk+4QOcK5+IrIEJn4goHnEuHSIiChcTPhGRRVg24T9w5bCY7m/Qt7Qbhs8b0DumcRCRdVk24f9x4ijdtv3wD77ttexf93xXt/0REQUjZglfRBJE5C8i8rKI3Bur/QYj2gMcbriIg7mIKDJ6dB4MKuGLyNsiUiYiuR7Lx4tIvogUiMisAJuZBGAwgFYAtvDC7b6EU/kQkcGCLeHPBzDedYGIJAKYB2ACgFEApojIKBG5WERWePw7E8CFADKVUo8DeCR6h6CPWRNGxGQ/HAJARLGSFMxKSqlNIpLusXgsgAKl1CEAEJHFACYppeYAmOi5DRGxAWjpeNjua18iMrN7l2wAAAXKSURBVB3AdAAYOnRoMOFFTOBd/L40rV8E2/PGwV1EZLRI6vAHAzjm8tjWscyXpQBuFJGXAWzytZJS6g2lVIZSKmPgwIERhBcZ3vSciMwmqBK+D5oFWV8rK6UaAEyLYH/dhmhU2Puqw58w+my8uqFQ54iIiCIr4dsADHF5nAagJLJwjGFkaX7iJecYtm8ispZIEv4OAMNFZJiIpACYDGBZdMKKb+9Pu9zv8+yQQ0TxKNhumYsAZAK4UERsIjJNKdUGYCaANQD2A1iilMrTL9T4ceXwASG/RqthGGB3TSKKnWB76UzxsXwVgFVRjchiRpzdx+gQiCgO6dGzz7JTK+gplFK7VgMvEZEemPBjZOgZvbyWndvfexkRkV4i6ZZpGnoPiiqaezOUxk42/uYafXdMROSCJXwiIotgwvfQOyURAHD+wNPC3oavHjlEREZiwvdw65jBKJp7M87sq33DEk9Fc2+O6Hlfzj8z/AsOEXV/egwIZcInIrIIJnwiIotgwgcwZkjoUyH3TE70+VxSIuvwiSgyHHilkz//eDSmjA1t7v3Nv70GG574oeZzKUmB31Zfr9Xbg1fF9ubt3cnIQX2NDoFIV0z4AHokJ2L04NC+7P1PS0X6gN5h7zPQa7X67UdD3x7JumzXDK4OY44kou6ECZ+IyCKY8ImILIIJ32J440Yi62LCJ3Ji5yoyOSb8DskJjrciJUpdKoPpqeMPp00momjjbJkdfnzZYBRW1GHmNeeH/NrzzzwNBWV1bstW/PxKbDpYrrn+spnjAm7zgrO8t0lEFAkm/A4pSQn43YSR4b020bs0f8FZfXDBWdp3s7okLfBAL07ARmRterS3sUonTukxcRIRWRsTPhGRRTDhE3VgNRqZHRM+EZFFMOETEVkEEz4RkUUw4RMRWQQTvsXoNOsyEUWZHlOki17zrkeDiJQDOBLmywcAqIhiON0Bj9kaeMzmF+nxnquUGui5MK4TfiREJEsplWF0HLHEY7YGHrP56XW8rNIhIrIIJnwiIoswc8J/w+gADMBjtgYes/npcrymrcMnIiJ3Zi7hExGRCyZ8IiKLMGXCF5HxIpIvIgUiMsvoePQmIm+LSJmI5BodSyyIyBAR+VJE9otInog8ZnRMehORHiKyXUR2dxzz00bHFCsikigiu0RkhdGxxIKIFInIXhHJEZGsqG7bbHX4IpII4CCA6wHYAOwAMEUptc/QwHQkIlcDqAOwQCk12uh49CYigwAMUkpli0gfADsB/Njkn7EA6K2UqhORZACbATymlNpqcGi6E5HHAWQA6KuUmmh0PHoTkSIAGUqpqA80M2MJfyyAAqXUIaVUC4DFACYZHJOulFKbAFQZHUesKKWOK6WyO/6uBbAfwGBjo9KXcnDe5Di545+5SmsaRCQNwM0A/s/oWMzAjAl/MIBjLo9tMHkysDIRSQdwGYBtxkaiv46qjRwAZQA+V0qZ/pgB/BPA/wNgNzqQGFIA1orIThGZHs0NmzHha922yPQlISsSkdMAfAzgl0qpGqPj0ZtSql0pNQZAGoCxImLq6jsRmQigTCm10+hYYmycUuo7ACYAeLSjyjYqzJjwbQCGuDxOA1BiUCykk4567I8BLFRKLTU6nlhSSp0EsAHAeIND0ds4ALd21GkvBvAjEXnf2JD0p5Qq6fi/DMAncFRTR4UZE/4OAMNFZJiIpACYDGCZwTFRFHU0YL4FYL9S6gWj44kFERkoIv06/u4J4DoAB4yNSl9Kqd8ppdKUUulwfI+/UErdY3BYuhKR3h0dESAivQHcACBqve9Ml/CVUm0AZgJYA0dj3hKlVJ6xUelLRBYByARwoYjYRGSa0THpbByA/4GjxJfT8e8mo4PS2SAAX4rIHjgKNZ8rpSzRTdFizgKwWUR2A9gOYKVSanW0Nm66bplERKTNdCV8IiLSxoRPRGQRTPhERBbBhE9EZBFM+EREFsGET0RkEUz4REQW8f8BzwZ/v0Rg4nIAAAAASUVORK5CYII=\n",
|
||
"text/plain": [
|
||
"<Figure size 432x288 with 1 Axes>"
|
||
]
|
||
},
|
||
"metadata": {
|
||
"needs_background": "light"
|
||
},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"x_axis = np.linspace(0, 5, len(losses1), endpoint=True)\n",
|
||
"plt.semilogy(x_axis, losses1, label='batch_size=1')\n",
|
||
"plt.legend(loc='best')"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"可以看到,loss 在剧烈震荡,因为每次都是只对一个样本点做计算,每一层的梯度都具有很高的随机性,而且需要耗费了大量的时间"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"### 批量随机梯度下降法"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 9,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"train_loader = DataLoader(train_dataset, batch_size=64, shuffle=True)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 10,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"net1 = nn.Sequential(\n",
|
||
" nn.Linear(784, 200),\n",
|
||
" nn.ReLU(),\n",
|
||
" nn.Linear(200, 10),\n",
|
||
")"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 12,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"epoch: 0, Train Loss: 0.721458\n",
|
||
"epoch: 1, Train Loss: 0.364912\n",
|
||
"epoch: 2, Train Loss: 0.319628\n",
|
||
"epoch: 3, Train Loss: 0.292893\n",
|
||
"epoch: 4, Train Loss: 0.270584\n",
|
||
"使用时间: 46.09111 s\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"# 开始训练\n",
|
||
"losses1 = []\n",
|
||
"idx = 0\n",
|
||
"\n",
|
||
"start = time.time() # 记时开始\n",
|
||
"for e in range(5):\n",
|
||
" train_loss = 0\n",
|
||
" for img, label in train_loader:\n",
|
||
" #展平img\n",
|
||
" img=img.view(img.size(0),-1)\n",
|
||
" # 前向传播\n",
|
||
" out = net1(img)\n",
|
||
" loss = loss_cnt(out, label)\n",
|
||
" # 反向传播\n",
|
||
" net1.zero_grad()\n",
|
||
" loss.backward()\n",
|
||
" sgd_update(net1.parameters(), 1e-2) # 使用 0.01 的学习率\n",
|
||
" # 记录误差\n",
|
||
" train_loss += loss.item()\n",
|
||
" if idx % 30 == 0:\n",
|
||
" losses1.append(loss.item())\n",
|
||
" idx += 1\n",
|
||
" print('epoch: {}, Train Loss: {:.6f}'\n",
|
||
" .format(e, train_loss / len(train_loader)))\n",
|
||
"end = time.time() # 计时结束\n",
|
||
"print('使用时间: {:.5f} s'.format(end - start))"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 13,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"<matplotlib.legend.Legend at 0x1277ffbef08>"
|
||
]
|
||
},
|
||
"execution_count": 13,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
},
|
||
{
|
||
"data": {
|
||
"image/png": "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\n",
|
||
"text/plain": [
|
||
"<Figure size 432x288 with 1 Axes>"
|
||
]
|
||
},
|
||
"metadata": {
|
||
"needs_background": "light"
|
||
},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"x_axis = np.linspace(0, 5, len(losses1), endpoint=True)\n",
|
||
"plt.semilogy(x_axis, losses1, label='batch_size=64')\n",
|
||
"plt.legend(loc='best')"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": []
|
||
}
|
||
],
|
||
"metadata": {
|
||
"kernelspec": {
|
||
"display_name": "Python 3",
|
||
"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.7.4"
|
||
}
|
||
},
|
||
"nbformat": 4,
|
||
"nbformat_minor": 2
|
||
}
|