{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# 多层神经网络\n", "\n", "本节在前面学习线性回归模型的基础上,我们学习如何利用PyTorch实现多层神经网络。" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 1. 多层神经网络\n", "在前面的线性回归中,我们的公式是 $y = w x + b$,而在 Logistic 回归中,我们的公式是 $y = Sigmoid(w x + b)$,其实它们都可以看成单层神经网络,其中 Sigmoid 被称为激活函数。" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 1.1 神经网络的结构\n", "神经网络就是很多个神经元堆在一起形成一层神经网络,那么多个层堆叠在一起就是深层神经网络\n", "\n", "![nn demo](imgs/nn-forward.gif)\n", "\n", "可以看到,神经网络的结构其实非常简单,主要有输入层,隐藏层,输出层构成,输入层需要根据特征数目来决定,输出层根据解决的问题来决定,那么隐藏层的网路层数以及每层的神经元数就是可以调节的参数,而不同的层数和每层的参数对模型的影响非常大,我们看看这个网站的示例 [demo](http://cs.stanford.edu/people/karpathy/convnetjs/demo/classify2d.html)\n", "\n", "神经网络向前传播也非常简单,就是一层一层不断做运算即可。" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 1.2 示例程序" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import torch\n", "import numpy as np\n", "from torch import nn\n", "from torch.autograd import Variable\n", "import torch.nn.functional as F\n", "\n", "import matplotlib.pyplot as plt\n", "%matplotlib inline" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "from sklearn import datasets\n", "\n", "# generate sample data\n", "np.random.seed(0)\n", "data_x, data_y = datasets.make_moons(200, noise=0.20)\n", "\n", "# plot data\n", "plt.scatter(data_x[:, 0], data_x[:, 1], c=data_y, cmap=plt.cm.Spectral)\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "def plot_decision_boundary(model, x, y):\n", " # Set min and max values and give it some padding\n", " x_min, x_max = x[:, 0].min() - 1, x[:, 0].max() + 1\n", " y_min, y_max = x[:, 1].min() - 1, x[:, 1].max() + 1\n", " h = 0.01\n", " # Generate a grid of points with distance h between them\n", " xx, yy = np.meshgrid(np.arange(x_min, x_max, h), np.arange(y_min, y_max, h))\n", " # Predict the function value for the whole grid .c_按行连接两个矩阵,左右相加。\n", " Z = model(np.c_[xx.ravel(), yy.ravel()])\n", " Z = Z.reshape(xx.shape)\n", " # Plot the contour and training examples\n", " plt.contourf(xx, yy, Z, cmap=plt.cm.Spectral)\n", " plt.ylabel('x2')\n", " plt.xlabel('x1')\n", " plt.scatter(x[:, 0], x[:, 1], c=y.reshape(-1), s=40, cmap=plt.cm.Spectral)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "这次我们仍然处理一个二分类问题,但是比前面的 logistic 回归更加复杂。我们可以先尝试用 logistic 回归来解决这个问题" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "# 变量\n", "x = torch.from_numpy(data_x).float()\n", "y = torch.from_numpy(data_y).float().unsqueeze(1)\n", "\n", "# 定义参数\n", "w = nn.Parameter(torch.randn(2, 1))\n", "b = nn.Parameter(torch.zeros(1))\n", "\n", "# 优化器\n", "optimizer = torch.optim.SGD([w, b], 1e-1)\n", "\n", "def logistic_regression(x):\n", " return torch.mm(x, w) + b\n", " \n", "criterion = nn.BCEWithLogitsLoss()" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "epoch: 20, loss: 0.5933903455734253\n", "epoch: 40, loss: 0.5228480696678162\n", "epoch: 60, loss: 0.4789358973503113\n", "epoch: 80, loss: 0.4493311941623688\n", "epoch: 100, loss: 0.42803263664245605\n" ] } ], "source": [ "for e in range(100):\n", " #更新并自动计算\n", " out = logistic_regression(Variable(x))\n", " loss = criterion(out, Variable(y))\n", " \n", " optimizer.zero_grad()\n", " loss.backward()\n", " optimizer.step()\n", " \n", " if (e + 1) % 20 == 0:\n", " print('epoch: {}, loss: {}'.format(e+1, loss.item()))" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [], "source": [ "def plot_logistic(x):\n", " x = Variable(torch.from_numpy(x).float())\n", " out = F.sigmoid(logistic_regression(x))\n", " out = (out > 0.5) * 1\n", " return out.data.numpy()" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/home/bushuhui/anaconda3/envs/test2/lib/python3.9/site-packages/torch/nn/functional.py:1805: UserWarning: nn.functional.sigmoid is deprecated. Use torch.sigmoid instead.\n", " warnings.warn(\"nn.functional.sigmoid is deprecated. Use torch.sigmoid instead.\")\n" ] }, { "data": { "text/plain": [ "Text(0.5, 1.0, 'logistic regression')" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "plot_decision_boundary(lambda x: plot_logistic(x), x.numpy(), y.numpy())\n", "plt.title('logistic regression')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 1.3 多层神经网络示例程序\n", "\n", "可以看到,logistic 回归并不能很好的区分开这个复杂的数据集,如果你还记得前面的内容,你就知道 logistic 回归是一个线性分类器。接下来我们用两层神经网络来对同样的数据进行处理,看看效果如何。" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [], "source": [ "# 定义两层神经网络的参数\n", "w1 = nn.Parameter(torch.randn(2, 4) * 0.01) # 隐藏层神经元个数 2\n", "b1 = nn.Parameter(torch.zeros(4))\n", "\n", "w2 = nn.Parameter(torch.randn(4, 1) * 0.01)\n", "b2 = nn.Parameter(torch.zeros(1))\n", "\n", "# 定义模型\n", "def two_network(x):\n", " x1 = torch.mm(x, w1) + b1\n", " x1 = torch.tanh(x1) # 使用 PyTorch 自带的 tanh 激活函数\n", " x2 = torch.mm(x1, w2) + b2\n", " return x2\n", "\n", "optimizer = torch.optim.SGD([w1, w2, b1, b2], 1.)\n", "\n", "criterion = nn.BCEWithLogitsLoss()" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "epoch: 100, loss: 0.3045365512371063\n", "epoch: 200, loss: 0.3033600151538849\n", "epoch: 300, loss: 0.302661269903183\n", "epoch: 400, loss: 0.30217817425727844\n", "epoch: 500, loss: 0.30179286003112793\n", "epoch: 600, loss: 0.30145177245140076\n", "epoch: 700, loss: 0.301126092672348\n", "epoch: 800, loss: 0.3007963001728058\n", "epoch: 900, loss: 0.30044662952423096\n", "epoch: 1000, loss: 0.30006444454193115\n" ] } ], "source": [ "# 我们训练 1000 次\n", "for e in range(1000):\n", " out = two_network(Variable(x))\n", " loss = criterion(out, Variable(y))\n", " optimizer.zero_grad()\n", " loss.backward()\n", " optimizer.step()\n", " if (e + 1) % 100 == 0:\n", " print('epoch: {}, loss: {}'.format(e+1, loss.item()))" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [], "source": [ "def plot_network(x):\n", " x = Variable(torch.from_numpy(x).float())\n", " x1 = torch.mm(x, w1) + b1\n", " x1 = F.tanh(x1)\n", " x2 = torch.mm(x1, w2) + b2\n", " out = F.sigmoid(x2)\n", " out = (out > 0.5) * 1\n", " return out.data.numpy()" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/home/bushuhui/anaconda3/envs/test2/lib/python3.9/site-packages/torch/nn/functional.py:1794: UserWarning: nn.functional.tanh is deprecated. Use torch.tanh instead.\n", " warnings.warn(\"nn.functional.tanh is deprecated. Use torch.tanh instead.\")\n" ] }, { "data": { "text/plain": [ "Text(0.5, 1.0, '2 layer network')" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "plot_decision_boundary(lambda x: plot_network(x), x.numpy(), y.numpy())\n", "plt.title('2 layer network')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "可以看到神经网络能够非常好地分类这个复杂的数据,和前面的 logistic 回归相比,神经网络因为有了激活函数的存在,成了一个非线性分类器,所以神经网络分类的边界更加复杂。" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 2. Sequential 和 Module" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "前面讲了数据处理,模型构建,loss 函数设计等等内容,但是目前为止我们还没有准备好构建一个完整的机器学习系统,一个完整的机器学习系统需要我们不断地读写模型。在现实应用中,一般我们会将模型在本地进行训练,然后保存模型,接着我们会将模型部署到不同的地方进行应用。" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "对于前面的线性回归模型、 Logistic回归模型和神经网络,在构建的时候定义了需要的参数。这对于比较小的模型是可行的,但是对于大的模型,比如100 层的神经网络,这个时候再去手动定义参数就显得非常麻烦,所以 PyTorch 提供了两个模块来帮助我们构建模型,一个是Sequential,一个是 Module。\n", "\n", "Sequential 允许我们构建序列化的模块,而 Module 是一种更加灵活的模型定义方式,我们下面分别用 Sequential 和 Module 来定义上面的神经网络。" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 2.1 Sequential" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [], "source": [ "# Sequential\n", "seq_net = nn.Sequential(\n", " nn.Linear(2, 4), # PyTorch 中的线性层,wx + b\n", " nn.Tanh(),\n", " nn.Linear(4, 1)\n", ")" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Linear(in_features=2, out_features=4, bias=True)" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# 序列模块可以通过索引访问每一层\n", "\n", "seq_net[0] # 第一层" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Parameter containing:\n", "tensor([[-0.4644, -0.4195],\n", " [-0.3199, 0.1816],\n", " [ 0.3588, 0.1743],\n", " [-0.5447, -0.6158]], requires_grad=True)\n" ] } ], "source": [ "# 打印出第一层的权重\n", "\n", "w0 = seq_net[0].weight\n", "print(w0)" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [], "source": [ "# 通过 parameters 可以取得模型的参数\n", "param = seq_net.parameters()\n", "\n", "# 定义优化器\n", "optim = torch.optim.SGD(param, 1.)" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "epoch: 1000, loss: 0.07597314566373825\n", "epoch: 2000, loss: 0.06681923568248749\n", "epoch: 3000, loss: 0.06246059015393257\n", "epoch: 4000, loss: 0.05549143627285957\n", "epoch: 5000, loss: 0.050142571330070496\n", "epoch: 6000, loss: 0.04679693281650543\n", "epoch: 7000, loss: 0.04454003646969795\n", "epoch: 8000, loss: 0.04290143400430679\n", "epoch: 9000, loss: 0.041652847081422806\n", "epoch: 10000, loss: 0.04066724702715874\n" ] } ], "source": [ "# 我们训练 10000 次\n", "for e in range(10000):\n", " out = seq_net(Variable(x))\n", " loss = criterion(out, Variable(y))\n", " optim.zero_grad()\n", " loss.backward()\n", " optim.step()\n", " if (e + 1) % 1000 == 0:\n", " print('epoch: {}, loss: {}'.format(e+1, loss.item()))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "可以看到,训练 10000 次 loss 比之前的更低,这是因为 PyTorch 自带的模块比我们写的更加稳定,同时也有一些初始化的问题在里面,关于参数初始化,我们会在后面的课程中讲到" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [], "source": [ "def plot_seq(x):\n", " out = F.sigmoid(seq_net(Variable(torch.from_numpy(x).float()))).data.numpy()\n", " out = (out > 0.5) * 1\n", " return out" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Text(0.5, 1.0, 'sequential')" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "plot_decision_boundary(lambda x: plot_seq(x), x.numpy(), y.numpy())\n", "plt.title('sequential')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 2.2 保存模型参数\n", "\n", "保存模型在 PyTorch 中有两种方式,一种是将模型结构和参数都保存在一起,一种是只将参数保存下来。" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [], "source": [ "# 将参数和模型保存在一起\n", "torch.save(seq_net, 'save_seq_net.pth')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "上面就是保存模型的方式,`torch.save`里面有两个参数,第一个是要保存的模型,第二个参数是保存的路径,读取模型的方式也非常简单" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [], "source": [ "# 读取保存的模型\n", "seq_net1 = torch.load('save_seq_net.pth')" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Sequential(\n", " (0): Linear(in_features=2, out_features=4, bias=True)\n", " (1): Tanh()\n", " (2): Linear(in_features=4, out_features=1, bias=True)\n", ")" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "seq_net1" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Parameter containing:\n", "tensor([[-5.7823, 5.7006],\n", " [ 5.3129, 3.6949],\n", " [ 3.5471, -0.7431],\n", " [ 2.4003, 1.7605]], requires_grad=True)\n" ] } ], "source": [ "print(seq_net1[0].weight)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "我们可以看到我们重新读入了模型,并且将其命名为 seq_net1,并且打印了第一层的参数\n", "\n", "下面我们看看第二种保存模型的方式,只保存参数而不保存模型结构" ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [], "source": [ "# 保存模型参数\n", "torch.save(seq_net.state_dict(), 'save_seq_net_params.pth')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "通过上面的方式,我们保存了模型的参数,如果要重新读入模型的参数,首先我们需要重新定义一次模型,接着重新读入参数" ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 24, "metadata": {}, "output_type": "execute_result" } ], "source": [ "seq_net2 = nn.Sequential(\n", " nn.Linear(2, 4),\n", " nn.Tanh(),\n", " nn.Linear(4, 1)\n", ")\n", "\n", "seq_net2.load_state_dict(torch.load('save_seq_net_params.pth'))" ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Sequential(\n", " (0): Linear(in_features=2, out_features=4, bias=True)\n", " (1): Tanh()\n", " (2): Linear(in_features=4, out_features=1, bias=True)\n", ")" ] }, "execution_count": 25, "metadata": {}, "output_type": "execute_result" } ], "source": [ "seq_net2" ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Parameter containing:\n", "tensor([[-5.7823, 5.7006],\n", " [ 5.3129, 3.6949],\n", " [ 3.5471, -0.7431],\n", " [ 2.4003, 1.7605]], requires_grad=True)\n" ] } ], "source": [ "print(seq_net2[0].weight)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "通过这种方式我们也重新读入了相同的模型,打印第一层的参数对比,发现和前面的办法是一样" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "有这两种保存和读取模型的方法,我们推荐使用**第二种**,因为第二种可移植性更强" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 2.3 Module\n", "下面我们再用 Module 定义这个模型,下面是使用 Module 的模板\n", "\n", "```\n", "class 网络名字(nn.Module):\n", " def __init__(self, 一些定义的参数):\n", " super(网络名字, self).__init__()\n", " self.layer1 = nn.Linear(num_input, num_hidden)\n", " self.layer2 = nn.Sequential(...)\n", " ...\n", " \n", " 定义需要用的网络层\n", " \n", " def forward(self, x): # 定义前向传播\n", " x1 = self.layer1(x)\n", " x2 = self.layer2(x)\n", " x = x1 + x2\n", " ...\n", " return x\n", "```\n", "\n", "注意的是,Module 里面也可以使用 Sequential,同时 Module 非常灵活,具体体现在 forward 中,如何复杂的操作都能直观的在 forward 里面执行\n", "\n", "下面我们照着模板实现一下上面的神经网络" ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [], "source": [ "class module_net(nn.Module):\n", " def __init__(self, num_input, num_hidden, num_output):\n", " super(module_net, self).__init__()\n", " self.layer1 = nn.Linear(num_input, num_hidden)\n", " \n", " self.layer2 = nn.Tanh()\n", " \n", " self.layer3 = nn.Linear(num_hidden, num_output)\n", " \n", " def forward(self, x):\n", " x = self.layer1(x)\n", " x = self.layer2(x)\n", " x = self.layer3(x)\n", " return x" ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [], "source": [ "mo_net = module_net(2, 4, 1)" ] }, { "cell_type": "code", "execution_count": 29, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Linear(in_features=2, out_features=4, bias=True)\n" ] } ], "source": [ "# 访问模型中的某层可以直接通过名字\n", "\n", "# 第一层\n", "l1 = mo_net.layer1\n", "print(l1)" ] }, { "cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Parameter containing:\n", "tensor([[-0.0458, -0.6043],\n", " [ 0.0567, -0.6961],\n", " [ 0.5034, 0.2557],\n", " [ 0.2466, -0.5245]], requires_grad=True)\n" ] } ], "source": [ "# 打印出第一层的权重\n", "print(l1.weight)" ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [], "source": [ "# 定义优化器\n", "optim = torch.optim.SGD(mo_net.parameters(), 1.)" ] }, { "cell_type": "code", "execution_count": 32, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "epoch: 1000, loss: 0.07277397811412811\n", "epoch: 2000, loss: 0.06705372780561447\n", "epoch: 3000, loss: 0.06257135421037674\n", "epoch: 4000, loss: 0.056195128709077835\n", "epoch: 5000, loss: 0.050691165030002594\n", "epoch: 6000, loss: 0.04715902358293533\n", "epoch: 7000, loss: 0.0447952002286911\n", "epoch: 8000, loss: 0.04309132695198059\n", "epoch: 9000, loss: 0.04179977998137474\n", "epoch: 10000, loss: 0.040784407407045364\n" ] } ], "source": [ "# 我们训练 10000 次\n", "for e in range(10000):\n", " out = mo_net(Variable(x))\n", " loss = criterion(out, Variable(y))\n", " optim.zero_grad()\n", " loss.backward()\n", " optim.step()\n", " if (e + 1) % 1000 == 0:\n", " print('epoch: {}, loss: {}'.format(e+1, loss.item()))" ] }, { "cell_type": "code", "execution_count": 33, "metadata": {}, "outputs": [], "source": [ "# 保存模型\n", "torch.save(mo_net.state_dict(), 'module_net.pth')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "可以看到我们得到了相同的结果,而且使用 Sequential 和 Module 来定义模型更加方便\n", "\n", "在这一节中我们还是使用梯度下降法来优化参数,在神经网络中,这种优化方法有一个特别的名字,反向传播算法,下一次课我们会讲一讲什么是反向传播算法" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**小练习:改变网络的隐藏层神经元数目,或者试试定义一个 5 层甚至更深的模型,增加训练次数,改变学习率,看看结果会怎么样**" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "下面举个例子" ] }, { "cell_type": "code", "execution_count": 34, "metadata": {}, "outputs": [], "source": [ "net = nn.Sequential(\n", " nn.Linear(2, 10),\n", " nn.Tanh(),\n", " nn.Linear(10, 10),\n", " nn.Tanh(),\n", " nn.Linear(10, 10),\n", " nn.Tanh(),\n", " nn.Linear(10, 1)\n", ")\n", "\n", "optim = torch.optim.SGD(net.parameters(), 0.1)" ] }, { "cell_type": "code", "execution_count": 35, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "epoch: 1000, loss: 0.07510872185230255\n", "epoch: 2000, loss: 0.0662045031785965\n", "epoch: 3000, loss: 0.062202777713537216\n", "epoch: 4000, loss: 0.053606368601322174\n", "epoch: 5000, loss: 0.047997504472732544\n", "epoch: 6000, loss: 0.045905228704214096\n", "epoch: 7000, loss: 0.044531650841236115\n", "epoch: 8000, loss: 0.04245807230472565\n", "epoch: 9000, loss: 0.0403163880109787\n", "epoch: 10000, loss: 0.03822056204080582\n", "epoch: 11000, loss: 0.03605899214744568\n", "epoch: 12000, loss: 0.033822499215602875\n", "epoch: 13000, loss: 0.031671419739723206\n", "epoch: 14000, loss: 0.029688959941267967\n", "epoch: 15000, loss: 0.02786232717335224\n", "epoch: 16000, loss: 0.026174388825893402\n", "epoch: 17000, loss: 0.024574236944317818\n", "epoch: 18000, loss: 0.022980017587542534\n", "epoch: 19000, loss: 0.021339748054742813\n", "epoch: 20000, loss: 0.019654229283332825\n" ] } ], "source": [ "# 我们训练 20000 次\n", "for e in range(20000):\n", " out = net(Variable(x))\n", " loss = criterion(out, Variable(y))\n", " optim.zero_grad()\n", " loss.backward()\n", " optim.step()\n", " if (e + 1) % 1000 == 0:\n", " print('epoch: {}, loss: {}'.format(e+1, loss.item()))" ] }, { "cell_type": "code", "execution_count": 36, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Text(0.5, 1.0, 'sequential')" ] }, "execution_count": 36, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "def plot_net(x):\n", " out = F.sigmoid(net(Variable(torch.from_numpy(x).float()))).data.numpy()\n", " out = (out > 0.5) * 1\n", " return out\n", "\n", "plot_decision_boundary(lambda x: plot_net(x), x.numpy(), y.numpy())\n", "plt.title('sequential')" ] } ], "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.9.7" } }, "nbformat": 4, "nbformat_minor": 2 }