{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import torch\n", "\n", "# 固定随机种子,使得运行结果可以稳定复现\n", "torch.manual_seed(1024)\n", "# 产生训练用的数据\n", "x_origin = torch.linspace(100, 300, 200)\n", "# 将变量X归一化,否则梯度下降法很容易不稳定\n", "x = (x_origin - torch.mean(x_origin)) / torch.std(x_origin)\n", "epsilon = torch.randn(x.shape)\n", "y = 10 * x + 5 + epsilon" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "# 为了使用PyTorch的高层封装函数,我们通过继承Module类来定义函数\n", "class Linear(torch.nn.Module):\n", " def __init__(self):\n", " \"\"\"\n", " 定义线性回归模型的参数:a, b\n", " \"\"\"\n", " super().__init__()\n", " self.a = torch.nn.Parameter(torch.zeros(()))\n", " self.b = torch.nn.Parameter(torch.zeros(()))\n", "\n", " def forward(self, x):\n", " \"\"\"\n", " 根据当前的参数估计值,得到模型的预测结果\n", " 参数\n", " ----\n", " x :torch.tensor,变量x\n", " 返回\n", " ----\n", " y_pred :torch.tensor,模型预测值\n", " \"\"\"\n", " return self.a * x + self.b\n", "\n", " def string(self):\n", " \"\"\"\n", " 输出当前模型的结果\n", " \"\"\"\n", " return f'y = {self.a.item():.2f} * x + {self.b.item():.2f}'" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Step 1, Loss: 101.19; Result: y = 3.12 * x + -1.99\n", "Step 2, Loss: 3.61; Result: y = 3.48 * x + -2.28\n", "Step 3, Loss: 4.00; Result: y = 3.22 * x + -1.97\n", "Step 4, Loss: 14.92; Result: y = 2.85 * x + -1.22\n", "Step 5, Loss: 25.90; Result: y = 2.68 * x + -0.23\n", "Step 6, Loss: 44.56; Result: y = 2.92 * x + 1.08\n", "Step 7, Loss: 60.46; Result: y = 3.74 * x + 2.61\n", "Step 8, Loss: 60.59; Result: y = 5.07 * x + 4.15\n", "Step 9, Loss: 47.31; Result: y = 6.73 * x + 5.52\n", "Step 10, Loss: 24.05; Result: y = 8.22 * x + 6.48\n", "Step 11, Loss: 14.43; Result: y = 9.36 * x + 5.75\n", "Step 12, Loss: 4.00; Result: y = 9.75 * x + 5.42\n", "Step 13, Loss: 1.48; Result: y = 9.88 * x + 5.28\n", "Step 14, Loss: 0.58; Result: y = 9.89 * x + 5.26\n", "Step 15, Loss: 1.48; Result: y = 9.89 * x + 5.20\n", "Step 16, Loss: 0.95; Result: y = 9.88 * x + 5.18\n", "Step 17, Loss: 1.03; Result: y = 9.88 * x + 5.17\n", "Step 18, Loss: 1.68; Result: y = 9.84 * x + 5.14\n", "Step 19, Loss: 0.55; Result: y = 9.86 * x + 5.15\n", "Step 20, Loss: 1.27; Result: y = 9.94 * x + 5.21\n" ] } ], "source": [ "# 定义每批次用到的数据量\n", "batch_size = 20\n", "# 定义模型\n", "model = Linear()\n", "# 确定最优化算法\n", "learning_rate = 0.1\n", "optimizer = torch.optim.SGD(model.parameters(), lr=learning_rate)\n", "\n", "for t in range(20):\n", " # 选取当前批次的数据,用于训练模型\n", " ix = (t * batch_size) % len(x)\n", " xx = x[ix: ix + batch_size]\n", " yy = y[ix: ix + batch_size]\n", " yy_pred = model(xx)\n", " # 计算当前批次数据的损失\n", " loss = (yy - yy_pred).pow(2).mean()\n", " # 将上一次的梯度清零\n", " optimizer.zero_grad()\n", " # 计算损失函数的梯度\n", " loss.backward()\n", " # 迭代更新模型参数的估计值\n", " optimizer.step()\n", " # 注意!loss记录的是模型在当前批次数据上的损失,该数值的波动较大\n", " print(f'Step {t + 1}, Loss: {loss: .2f}; Result: {model.string()}')" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "# 定义损失函数\n", "mse = lambda y, y_pred: (y - y_pred).pow(2).mean()" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "# 定义每批次用到的数据量\n", "batch_size = 20\n", "# 定义模型\n", "model = Linear()\n", "# 确定最优化算法\n", "learning_rate = 0.1\n", "optimizer = torch.optim.SGD(model.parameters(), lr=learning_rate)\n", "stats = {'batch_loss': [], 'total_loss': []}\n", "\n", "for t in range(20):\n", " # 选取当前批次的数据,用于训练模型\n", " ix = (t * batch_size) % len(x)\n", " xx = x[ix: ix + batch_size]\n", " yy = y[ix: ix + batch_size]\n", " # 计算当前批次数据的损失\n", " loss = mse(yy, model(xx))\n", " # 将上一次的梯度清零\n", " optimizer.zero_grad()\n", " # 计算损失函数的梯度\n", " loss.backward()\n", " # 迭代更新模型参数的估计值\n", " optimizer.step()\n", " # 预估模型在整个数据集上面的损失\n", " stats['batch_loss'].append(loss.item())\n", " stats['total_loss'].append(mse(y, model(x)).item())" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "image/png": "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6N+/P507d+add95h165ddoejVIlpMvOwiIiIMhszO336NOPHjyc6OlpbZd7mggushFalCgwYAF6ytpiI8PLLL5ORkcHzzz9vdzhKlZgmMw8ry5bZ9OnTOXLkCE899RTBwcFlck1VDM2bw8qV1mPDhnZHk6NXr1707t2buXPn8ttvv9kdjlIlosnMwyIjI0lOTiYzM9Oj1zl9+jTjxo0jOjqau+++26PXUqVw4YXw009nquunpNgbj8PLL79MdnY2o0ePtjsUpUpEk5mHOW+cTkxM9Oh1ZsyYwZEjR3jyySe1Vebt/Bz/7Nats1po69bZGw/QqVMnrrnmGhYsWMCWLVvsDkepYtNk5mFlUZ8xOTmZcePGUbduXe655x6PXUe5WWAgBAScSW42e/HFFxERnnnmGbtDUarYvONfUTlWFiWtZsyYweHDhxk1apS2ynxJ584QFwfdulmvs7NtDad169YMHjyYJUuWsGHDBltjUaq4NJl5mKdLWjlbZXXq1OHee+/1yDWUB4WEWI+//QatW1vjaTZ6/vnn8ff356mnnsIYY2ssShWHJjMP83Q341tvvcWhQ4cYNWoUIc5fjMr37N9vtdIuuwx++cW2MJo0acKQIUNYu3Yty71wgVGlCqLJzMM82c2YkpLCuHHjqF27Nvfdd5/bz6/KUO/e8L//QWKi9fzXX20LZfTo0QQFBfH0009r60z5DE1mHubJZPbWW29x8OBBbZWVF1deCZ9+CidOQK9e8McftoRRv3597r//fjZt2sTnn39uSwxKFZcmMw/z1JhZSkoKr732mrbKyptrrrEKEh89aiW0uDhbwnjqqacIDQ3l2WefJSsry5YYlCoOTWYe5qkxs7fffpuDBw/yxBNPUKlSJbeeW9nsxhvhgw/g4EErof3+e5mHULNmTf7973+zY8cOPv744zK/vlLFpcnMwzzRzehsldWqVYuhQ4e67bzKiwweDO+/D/Hx0L49fPRRmYfw+OOPExkZyZgxY8jIyCjz6ytVHJrMPMwTyeydd97hwIED2ior726/3SpOHBEBo0dDamqZXr5KlSo8/vjj7Ny5k1mzZpXptZUqLinPs5Wio6PNvn37bI3BGENAQADXXnstn332WanPl5qaSkxMDNnZ2ezatUuTWUVw6BAcOwYtWlivExLgvPPK5NJJSUnExMQQFBREXFycTjRSthGR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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "import matplotlib.pyplot as plt\n", "\n", "# 创建一个图形框\n", "fig = plt.figure(figsize=(6, 6), dpi=80)\n", "# 在图形框里只画一幅图\n", "ax = fig.add_subplot(111)\n", "# 解决中文显示问题\n", "plt.rcParams['font.sans-serif'] = ['SimHei']\n", "plt.rcParams['axes.unicode_minus'] = False\n", "plt.rcParams.update({'font.size': 13})\n", "ax.set_xlabel('训练步数', fontsize=18)\n", "ax.set_ylabel('模型损失', fontsize=18)\n", "ax.plot(stats['batch_loss'], 'k', label='批次损失')\n", "ax.plot(stats['total_loss'], 'r-.', label='整体损失')\n", "legend = plt.legend(shadow=True)\n", "plt.savefig(\"sgd.png\", dpi=800)\n", "plt.show()" ] } ], "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.8.5" } }, "nbformat": 4, "nbformat_minor": 4 }