|
4 | 4 | "cell_type": "markdown",
|
5 | 5 | "metadata": {},
|
6 | 6 | "source": [
|
7 | | - "# 多层神经网络,Sequential 和 Module\n", |
8 | | - "通过前面的章节,我们了解到了机器学习领域中最常见的两个模型,线性回归模型和 Logistic 回归模型,他们分别是处理机器学习中最常见的两类问题-回归问题和分类问题。\n", |
9 | | - "\n", |
10 | | - "下面我们会讲第一个深度学习的模型,多层神经网络。" |
| 7 | + "# 多层神经网络,Sequential 和 Module" |
11 | 8 | ]
|
12 | 9 | },
|
13 | 10 | {
|
|
232 | 229 | "plt.title('logistic regression')"
|
233 | 230 | ]
|
234 | 231 | },
|
235 | | - { |
236 | | - "cell_type": "markdown", |
237 | | - "metadata": {}, |
238 | | - "source": [ |
239 | | - "可以看到,logistic 回归并不能很好的区分开这个复杂的数据集,如果你还记得前面的内容,你就知道 logistic 回归是一个线性分类器,这个时候就该我们的神经网络登场了!" |
240 | | - ] |
241 | | - }, |
242 | 232 | {
|
243 | 233 | "cell_type": "code",
|
244 | 234 | "execution_count": 43,
|
|
360 | 350 | "## Sequential 和 Module"
|
361 | 351 | ]
|
362 | 352 | },
|
363 | | - { |
364 | | - "cell_type": "markdown", |
365 | | - "metadata": {}, |
366 | | - "source": [ |
367 | | - "我们讲了数据处理,模型构建,loss 函数设计等等内容,但是目前为止我们还没有准备好构建一个完整的机器学习系统,一个完整的机器学习系统需要我们不断地读写模型。在现实应用中,一般我们会将模型在本地进行训练,然后保存模型,接着我们会将模型部署到不同的地方进行应用,所以在这节课我们会教大家如何保存 PyTorch 的模型。\n", |
368 | | - "\n", |
369 | | - "首先我们会讲一下 PyTorch 中的模块,Sequential 和 Module。" |
370 | | - ] |
371 | | - }, |
372 | | - { |
373 | | - "cell_type": "markdown", |
374 | | - "metadata": {}, |
375 | | - "source": [ |
376 | | - "对于前面的线性回归模型、 Logistic回归模型和神经网络,我们在构建的时候定义了需要的参数。这对于比较小的模型是可行的,但是对于大的模型,比如100 层的神经网络,这个时候再去手动定义参数就显得非常麻烦,所以 PyTorch 提供了两个模块来帮助我们构建模型,一个是Sequential,一个是 Module。\n", |
377 | | - "\n", |
378 | | - "Sequential 允许我们构建序列化的模块,而 Module 是一种更加灵活的模型定义方式,我们下面分别用 Sequential 和 Module 来定义上面的神经网络。" |
379 | | - ] |
380 | | - }, |
381 | 353 | {
|
382 | 354 | "cell_type": "code",
|
383 | 355 | "execution_count": 73,
|
|
497 | 469 | " print('epoch: {}, loss: {}'.format(e+1, loss.data[0]))"
|
498 | 470 | ]
|
499 | 471 | },
|
500 | | - { |
501 | | - "cell_type": "markdown", |
502 | | - "metadata": {}, |
503 | | - "source": [ |
504 | | - "可以看到,训练 10000 次 loss 比之前的更低,这是因为 PyTorch 自带的模块比我们写的更加稳定,同时也有一些初始化的问题在里面,关于参数初始化,我们会在后面的课程中讲到" |
505 | | - ] |
506 | | - }, |
507 | 472 | {
|
508 | 473 | "cell_type": "code",
|
509 | 474 | "execution_count": 80,
|
|
558 | 523 | "\n"
|
559 | 524 | ]
|
560 | 525 | },
|
561 | | - { |
562 | | - "cell_type": "markdown", |
563 | | - "metadata": {}, |
564 | | - "source": [ |
565 | | - "下面我们再用 Module 定义这个模型,下面是使用 Module 的模板\n", |
566 | | - "\n", |
567 | | - "```\n", |
568 | | - "class 网络名字(nn.Module):\n", |
569 | | - " def __init__(self, 一些定义的参数):\n", |
570 | | - " super(网络名字, self).__init__()\n", |
571 | | - " self.layer1 = nn.Linear(num_input, num_hidden)\n", |
572 | | - " self.layer2 = nn.Sequential(...)\n", |
573 | | - " ...\n", |
574 | | - " \n", |
575 | | - " 定义需要用的网络层\n", |
576 | | - " \n", |
577 | | - " def forward(self, x): # 定义前向传播\n", |
578 | | - " x1 = self.layer1(x)\n", |
579 | | - " x2 = self.layer2(x)\n", |
580 | | - " x = x1 + x2\n", |
581 | | - " ...\n", |
582 | | - " return x\n", |
583 | | - "```\n", |
584 | | - "\n", |
585 | | - "注意的是,Module 里面也可以使用 Sequential,同时 Module 非常灵活,具体体现在 forward 中,如何复杂的操作都能直观的在 forward 里面执行\n", |
586 | | - "\n", |
587 | | - "下面我们照着模板实现一下上面的神经网络" |
588 | | - ] |
589 | | - }, |
590 | 526 | {
|
591 | 527 | "cell_type": "code",
|
592 | 528 | "execution_count": 84,
|
|
718 | 654 | " if (e + 1) % 1000 == 0:\n",
|
719 | 655 | " print('epoch: {}, loss: {}'.format(e+1, loss.data[0]))"
|
720 | 656 | ]
|
721 | | - }, |
722 | | - { |
723 | | - "cell_type": "markdown", |
724 | | - "metadata": {}, |
725 | | - "source": [ |
726 | | - "可以看到我们得到了相同的结果,而且使用 Sequential 和 Module 来定义模型更加方便" |
727 | | - ] |
728 | 657 | }
|
729 | 658 | ],
|
730 | 659 | "metadata": {
|
|
0 commit comments