Numpy应用举例

计算激活函数Sigmoid和ReLU

使用ndarray数组可以很方便的构建数学函数,并利用其底层的矢量计算能力快速实现计算。下面以神经网络中比较常用激活函数Sigmoid和ReLU为例,介绍代码实现过程。

  • 计算Sigmoid激活函数

Numpy应用举例 - 图1

  • 计算ReLU激活函数

Numpy应用举例 - 图2

使用Numpy计算激活函数Sigmoid和ReLU的值,使用matplotlib画出图形,代码如下所示。

  1. # ReLU和Sigmoid激活函数示意图
  2. import numpy as np
  3. %matplotlib inline
  4. import matplotlib.pyplot as plt
  5. import matplotlib.patches as patches
  6. #设置图片大小
  7. plt.figure(figsize=(8, 3))
  8. # x是1维数组,数组大小是从-10. 到10.的实数,每隔0.1取一个点
  9. x = np.arange(-10, 10, 0.1)
  10. # 计算 Sigmoid函数
  11. s = 1.0 / (1 + np.exp(- x))
  12. # 计算ReLU函数
  13. y = np.clip(x, a_min = 0., a_max = None)
  14. #########################################################
  15. # 以下部分为画图程序
  16. # 设置两个子图窗口,将Sigmoid的函数图像画在右边
  17. f = plt.subplot(121)
  18. # 画出函数曲线
  19. plt.plot(x, s, color='r')
  20. # 添加文字说明
  21. plt.text(-5., 0.9, r'$y=\sigma(x)$', fontsize=13)
  22. # 设置坐标轴格式
  23. currentAxis=plt.gca()
  24. currentAxis.xaxis.set_label_text('x', fontsize=15)
  25. currentAxis.yaxis.set_label_text('y', fontsize=15)
  26. # 将ReLU的函数图像画在左边
  27. f = plt.subplot(122)
  28. # 画出函数曲线
  29. plt.plot(x, y, color='g')
  30. # 添加文字说明
  31. plt.text(-3.0, 9, r'$y=ReLU(x)$', fontsize=13)
  32. # 设置坐标轴格式
  33. currentAxis=plt.gca()
  34. currentAxis.xaxis.set_label_text('x', fontsize=15)
  35. currentAxis.yaxis.set_label_text('y', fontsize=15)
  36. plt.show()

Numpy应用举例 - 图3

  1. <Figure size 576x216 with 2 Axes>

图像翻转和裁剪

图像是由像素点构成的矩阵,其数值可以用ndarray来表示。将上述介绍的操作用在图像数据对应的ndarray上,可以很轻松的实现图片的翻转、裁剪和亮度调整,具体代码和效果如下所示。

  1. # 导入需要的包
  2. import numpy as np
  3. import matplotlib.pyplot as plt
  4. from PIL import Image
  5. # 读入图片
  6. image = Image.open('./work/images/000000001584.jpg')
  7. image = np.array(image)
  8. # 查看数据形状,其形状是[H, W, 3],
  9. # 其中H代表高度, W是宽度,3代表RGB三个通道
  10. image.shape
  1. (612, 612, 3)
  1. # 原始图片
  2. plt.imshow(image)
  1. <matplotlib.image.AxesImage at 0x7fefe4f56290>

Numpy应用举例 - 图4

  1. <Figure size 432x288 with 1 Axes>
  1. # 垂直方向翻转
  2. # 这里使用数组切片的方式来完成,
  3. # 相当于将图片最后一行挪到第一行,
  4. # 倒数第二行挪到第二行,...,
  5. # 第一行挪到倒数第一行
  6. # 对于行指标,使用::-1来表示切片,
  7. # 负数步长表示以最后一个元素为起点,向左走寻找下一个点
  8. # 对于列指标和RGB通道,仅使用:表示该维度不改变
  9. image2 = image[::-1, :, :]
  10. plt.imshow(image2)
  1. <matplotlib.image.AxesImage at 0x7fefe4ecc850>

Numpy应用举例 - 图5

  1. <Figure size 432x288 with 1 Axes>
  1. # 水平方向翻转
  2. image3 = image[:, ::-1, :]
  3. plt.imshow(image3)
  1. <matplotlib.image.AxesImage at 0x7fefe4e35f10>

Numpy应用举例 - 图6

  1. <Figure size 432x288 with 1 Axes>
  1. # 保存图片
  2. im3 = Image.fromarray(image3)
  3. im3.save('im3.jpg')
  1. # 高度方向裁剪
  2. H, W = image.shape[0], image.shape[1]
  3. # 注意此处用整除,H_start必须为整数
  4. H1 = H // 2
  5. H2 = H
  6. image4 = image[H1:H2, :, :]
  7. plt.imshow(image4)
  1. <matplotlib.image.AxesImage at 0x7fefe4e2cc10>

Numpy应用举例 - 图7

  1. <Figure size 432x288 with 1 Axes>
  1. # 宽度方向裁剪
  2. W1 = W//6
  3. W2 = W//3 * 2
  4. image5 = image[:, W1:W2, :]
  5. plt.imshow(image5)
  1. <matplotlib.image.AxesImage at 0x7fefe4d2e050>

Numpy应用举例 - 图8

  1. <Figure size 432x288 with 1 Axes>
  1. # 两个方向同时裁剪
  2. image5 = image[H1:H2, \
  3. W1:W2, :]
  4. plt.imshow(image5)
  1. <matplotlib.image.AxesImage at 0x7fefe4d09b10>

Numpy应用举例 - 图9

  1. <Figure size 432x288 with 1 Axes>
  1. # 调整亮度
  2. image6 = image * 0.5
  3. plt.imshow(image6.astype('uint8'))
  1. <matplotlib.image.AxesImage at 0x7fefe4367fd0>

Numpy应用举例 - 图10

  1. <Figure size 432x288 with 1 Axes>
  1. # 调整亮度
  2. image7 = image * 2.0
  3. # 由于图片的RGB像素值必须在0-255之间,
  4. # 此处使用np.clip进行数值裁剪
  5. image7 = np.clip(image7, \
  6. a_min=None, a_max=255.)
  7. plt.imshow(image7.astype('uint8'))
  1. <matplotlib.image.AxesImage at 0x7fefe42e4990>

Numpy应用举例 - 图11

  1. <Figure size 432x288 with 1 Axes>
  1. #高度方向每隔一行取像素点
  2. image8 = image[::2, :, :]
  3. plt.imshow(image8)
  1. <matplotlib.image.AxesImage at 0x7fefe4259e50>

Numpy应用举例 - 图12

  1. <Figure size 432x288 with 1 Axes>
  1. #宽度方向每隔一列取像素点
  2. image9 = image[:, ::2, :]
  3. plt.imshow(image9)
  1. <matplotlib.image.AxesImage at 0x7fefe4255510>

Numpy应用举例 - 图13

  1. <Figure size 432x288 with 1 Axes>
  1. #间隔行列采样,图像尺寸会减半,清晰度变差
  2. image10 = image[::2, ::2, :]
  3. plt.imshow(image10)
  4. image10.shape
  1. (306, 306, 3)

Numpy应用举例 - 图14

  1. <Figure size 432x288 with 1 Axes>

作业1-7:使用numpy计算tanh激活函数

tanh是神经网络中常用的一种激活函数,其定义如下:

Numpy应用举例 - 图15

请参照讲义中Sigmoid激活函数的计算程序,用numpy实现tanh函数的计算,并画出其函数曲线。

提交方式:请用numpy写出计算程序,并画出tanh函数曲线图,x的取值范围设置为[-10., 10.]。

作业1-8: 统计随机生成矩阵中有多少个元素大于0

假设使用np.random.randn生成了随机数构成的矩阵:

  1. p = np.random.randn(10, 10)

请写一段程序统计其中有多少个元素大于0?

提示:可以试下使用 q = (p > 0),观察q是什么的数据类型和元素的取值。

提交方式:提交计算的代码,能够直接运行输出统计出来的结果。