You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

regularization.py 3.8 kB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. # -*- coding: utf-8 -*-
  2. # ---
  3. # jupyter:
  4. # jupytext_format_version: '1.2'
  5. # kernelspec:
  6. # display_name: Python 3
  7. # language: python
  8. # name: python3
  9. # language_info:
  10. # codemirror_mode:
  11. # name: ipython
  12. # version: 3
  13. # file_extension: .py
  14. # mimetype: text/x-python
  15. # name: python
  16. # nbconvert_exporter: python
  17. # pygments_lexer: ipython3
  18. # version: 3.5.2
  19. # ---
  20. # # 正则化
  21. # 前面我们讲了数据增强和 dropout,而在实际使用中,现在的网络往往不使用 dropout,而是用另外一个技术,叫正则化。
  22. #
  23. # 正则化是机器学习中提出来的一种方法,有 L1 和 L2 正则化,目前使用较多的是 L2 正则化,引入正则化相当于在 loss 函数上面加上一项,比如
  24. #
  25. # $$
  26. # f = loss + \lambda \sum_{p \in params} ||p||_2^2
  27. # $$
  28. #
  29. # 就是在 loss 的基础上加上了参数的二范数作为一个正则化,我们在训练网络的时候,不仅要最小化 loss 函数,同时还要最小化参数的二范数,也就是说我们会对参数做一些限制,不让它变得太大。
  30. # 如果我们对新的损失函数 f 求导进行梯度下降,就有
  31. #
  32. # $$
  33. # \frac{\partial f}{\partial p_j} = \frac{\partial loss}{\partial p_j} + 2 \lambda p_j
  34. # $$
  35. #
  36. # 那么在更新参数的时候就有
  37. #
  38. # $$
  39. # p_j \rightarrow p_j - \eta (\frac{\partial loss}{\partial p_j} + 2 \lambda p_j) = p_j - \eta \frac{\partial loss}{\partial p_j} - 2 \eta \lambda p_j
  40. # $$
  41. #
  42. # 可以看到 $p_j - \eta \frac{\partial loss}{\partial p_j}$ 和没加正则项要更新的部分一样,而后面的 $2\eta \lambda p_j$ 就是正则项的影响,可以看到加完正则项之后会对参数做更大程度的更新,这也被称为权重衰减(weight decay),在 pytorch 中正则项就是通过这种方式来加入的,比如想在随机梯度下降法中使用正则项,或者说权重衰减,`torch.optim.SGD(net.parameters(), lr=0.1, weight_decay=1e-4)` 就可以了,这个 `weight_decay` 系数就是上面公式中的 $\lambda$,非常方便
  43. #
  44. # 注意正则项的系数的大小非常重要,如果太大,会极大的抑制参数的更新,导致欠拟合,如果太小,那么正则项这个部分基本没有贡献,所以选择一个合适的权重衰减系数非常重要,这个需要根据具体的情况去尝试,初步尝试可以使用 `1e-4` 或者 `1e-3`
  45. #
  46. # 下面我们在训练 cifar 10 中添加正则项
  47. # + {"ExecuteTime": {"start_time": "2017-12-24T08:02:11.383170Z", "end_time": "2017-12-24T08:02:11.903459Z"}}
  48. import sys
  49. sys.path.append('..')
  50. import numpy as np
  51. import torch
  52. from torch import nn
  53. import torch.nn.functional as F
  54. from torch.autograd import Variable
  55. from torchvision.datasets import CIFAR10
  56. from utils import train, resnet
  57. from torchvision import transforms as tfs
  58. # + {"ExecuteTime": {"start_time": "2017-12-24T08:02:11.905617Z", "end_time": "2017-12-24T08:02:13.120502Z"}}
  59. def data_tf(x):
  60. im_aug = tfs.Compose([
  61. tfs.Resize(96),
  62. tfs.ToTensor(),
  63. tfs.Normalize([0.5, 0.5, 0.5], [0.5, 0.5, 0.5])
  64. ])
  65. x = im_aug(x)
  66. return x
  67. train_set = CIFAR10('./data', train=True, transform=data_tf)
  68. train_data = torch.utils.data.DataLoader(train_set, batch_size=64, shuffle=True, num_workers=4)
  69. test_set = CIFAR10('./data', train=False, transform=data_tf)
  70. test_data = torch.utils.data.DataLoader(test_set, batch_size=128, shuffle=False, num_workers=4)
  71. net = resnet(3, 10)
  72. optimizer = torch.optim.SGD(net.parameters(), lr=0.01, weight_decay=1e-4) # 增加正则项
  73. criterion = nn.CrossEntropyLoss()
  74. # + {"ExecuteTime": {"start_time": "2017-12-24T08:02:13.122785Z", "end_time": "2017-12-24T08:11:36.106177Z"}}
  75. from utils import train
  76. train(net, train_data, test_data, 20, optimizer, criterion)

机器学习越来越多应用到飞行器、机器人等领域,其目的是利用计算机实现类似人类的智能,从而实现装备的智能化与无人化。本课程旨在引导学生掌握机器学习的基本知识、典型方法与技术,通过具体的应用案例激发学生对该学科的兴趣,鼓励学生能够从人工智能的角度来分析、解决飞行器、机器人所面临的问题和挑战。本课程主要内容包括Python编程基础,机器学习模型,无监督学习、监督学习、深度学习基础知识与实现,并学习如何利用机器学习解决实际问题,从而全面提升自我的《综合能力》。