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.

basic_conv.py 5.6 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  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. # 前面我们介绍了卷积网络的基本知识,其在计算机视觉领域被应用得非常广泛,那么常见的卷机网络中用到的模块能够使用 pytorch 非常轻松地实现,下面我们来讲一下 pytorch 中的卷积模块
  22. # ## 卷积
  23. # 卷积在 pytorch 中有两种方式,一种是 `torch.nn.Conv2d()`,一种是 `torch.nn.functional.conv2d()`,这两种形式本质都是使用一个卷积操作
  24. #
  25. # 这两种形式的卷积对于输入的要求都是一样的,首先需要输入是一个 `torch.autograd.Variable()` 的类型,大小是 (batch, channel, H, W),其中 batch 表示输入的一批数据的数目,第二个是输入的通道数,一般一张彩色的图片是 3,灰度图是 1,而卷积网络过程中的通道数比较大,会出现几十到几百的通道数,H 和 W 表示输入图片的高度和宽度,比如一个 batch 是 32 张图片,每张图片是 3 通道,高和宽分别是 50 和 100,那么输入的大小就是 (32, 3, 50, 100)
  26. #
  27. # 下面举例来说明一下这两种卷积方式
  28. import numpy as np
  29. import torch
  30. from torch import nn
  31. from torch.autograd import Variable
  32. import torch.nn.functional as F
  33. from PIL import Image
  34. import matplotlib.pyplot as plt
  35. # %matplotlib inline
  36. im = Image.open('./cat.png').convert('L') # 读入一张灰度图的图片
  37. im = np.array(im, dtype='float32') # 将其转换为一个矩阵
  38. # 可视化图片
  39. plt.imshow(im.astype('uint8'), cmap='gray')
  40. # 将图片矩阵转化为 pytorch tensor,并适配卷积输入的要求
  41. im = torch.from_numpy(im.reshape((1, 1, im.shape[0], im.shape[1])))
  42. # 下面我们定义一个算子对其进行轮廓检测
  43. # +
  44. # 使用 nn.Conv2d
  45. conv1 = nn.Conv2d(1, 1, 3, bias=False) # 定义卷积
  46. sobel_kernel = np.array([[-1, -1, -1], [-1, 8, -1], [-1, -1, -1]], dtype='float32') # 定义轮廓检测算子
  47. sobel_kernel = sobel_kernel.reshape((1, 1, 3, 3)) # 适配卷积的输入输出
  48. conv1.weight.data = torch.from_numpy(sobel_kernel) # 给卷积的 kernel 赋值
  49. edge1 = conv1(Variable(im)) # 作用在图片上
  50. edge1 = edge1.data.squeeze().numpy() # 将输出转换为图片的格式
  51. # -
  52. # 下面我们可视化边缘检测之后的结果
  53. plt.imshow(edge1, cmap='gray')
  54. # +
  55. # 使用 F.conv2d
  56. sobel_kernel = np.array([[-1, -1, -1], [-1, 8, -1], [-1, -1, -1]], dtype='float32') # 定义轮廓检测算子
  57. sobel_kernel = sobel_kernel.reshape((1, 1, 3, 3)) # 适配卷积的输入输出
  58. weight = Variable(torch.from_numpy(sobel_kernel))
  59. edge2 = F.conv2d(Variable(im), weight) # 作用在图片上
  60. edge2 = edge2.data.squeeze().numpy() # 将输出转换为图片的格式
  61. plt.imshow(edge2, cmap='gray')
  62. # -
  63. # 可以看到两种形式能够得到相同的效果,不同的地方相信你也看到了,使用 `nn.Conv2d()` 相当于直接定义了一层卷积网络结构,而使用 `torch.nn.functional.conv2d()` 相当于定义了一个卷积的操作,所以使用后者需要再额外去定义一个 weight,而且这个 weight 也必须是一个 Variable,而使用 `nn.Conv2d()` 则会帮我们默认定义一个随机初始化的 weight,如果我们需要修改,那么取出其中的值对其修改,如果不想修改,那么可以直接使用这个默认初始化的值,非常方便
  64. #
  65. # **实际使用中我们基本都使用 `nn.Conv2d()` 这种形式**
  66. # ## 池化层
  67. # 卷积网络中另外一个非常重要的结构就是池化,这是利用了图片的下采样不变性,即一张图片变小了还是能够看出了这张图片的内容,而使用池化层能够将图片大小降低,非常好地提高了计算效率,同时池化层也没有参数。池化的方式有很多种,比如最大值池化,均值池化等等,在卷积网络中一般使用最大值池化。
  68. #
  69. # 在 pytorch 中最大值池化的方式也有两种,一种是 `nn.MaxPool2d()`,一种是 `torch.nn.functional.max_pool2d()`,他们对于图片的输入要求跟卷积对于图片的输入要求是一样了,就不再赘述,下面我们也举例说明
  70. # 使用 nn.MaxPool2d
  71. pool1 = nn.MaxPool2d(2, 2)
  72. print('before max pool, image shape: {} x {}'.format(im.shape[2], im.shape[3]))
  73. small_im1 = pool1(Variable(im))
  74. small_im1 = small_im1.data.squeeze().numpy()
  75. print('after max pool, image shape: {} x {} '.format(small_im1.shape[0], small_im1.shape[1]))
  76. # 可以看到图片的大小减小了一半,那么图片是不是变了呢?我们可以可视化一下
  77. plt.imshow(small_im1, cmap='gray')
  78. # 可以看到图片几乎没有变化,说明池化层只是减小了图片的尺寸,并不会影响图片的内容
  79. # F.max_pool2d
  80. print('before max pool, image shape: {} x {}'.format(im.shape[2], im.shape[3]))
  81. small_im2 = F.max_pool2d(Variable(im), 2, 2)
  82. small_im2 = small_im2.data.squeeze().numpy()
  83. print('after max pool, image shape: {} x {} '.format(small_im1.shape[0], small_im1.shape[1]))
  84. plt.imshow(small_im2, cmap='gray')
  85. # **跟卷积层一样,实际使用中,我们一般使用 `nn.MaxPool2d()`**
  86. # 以上我们介绍了如何在 pytorch 中使用卷积网络中的卷积模块和池化模块,接下来我们会开始讲卷积网络中几个非常著名的网络结构

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