百度PaddlePaddle入门-7 (Numpy的应用)


Numpy应用举例——计算激活函数

使用ndarray数组可以很方便的构建数学函数,而且能利用其底层的矢量计算能力快速实现计算。神经网络中比较常用激活函数是Sigmoid和ReLU,其定义如下。

  • Sigmoid激活函数

y=1/(1+e−x

  • ReLU激活函数

y={0,(x<0);=x,(x≥0)

下面使用numpy和matplotlib计算函数值并画出图形

 1 #Clip函数的使用
 2 import numpy as np
 3 x=np.array([1,2,3,4,5,6,7,8,9])
 4 #对X进行clip,小于3的为3,大于8的为8
 5 y=np.clip(x,3,8)    
 6 x,y
 7 #此模式对数组也同样实用
 8 a=np.array([[1,2,3,4,5,6,7,8,9],[1,2,3,4,5,6,7,8,9]])
 9 b=np.clip(a,3,8)
10 a,b
(array([[1, 2, 3, 4, 5, 6, 7, 8, 9],
        [1, 2, 3, 4, 5, 6, 7, 8, 9]]), array([[3, 3, 3, 4, 5, 6, 7, 8, 8],
        [3, 3, 3, 4, 5, 6, 7, 8, 8]]))
 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 #设置图片大小
 8 plt.figure(figsize=(8, 3))
 9 
10 # x是1维数组,数组大小是从-10. 到10.的实数,每隔0.1取一个点
11 x = np.arange(-10, 10, 0.1)
12 # 计算 Sigmoid函数
13 s = 1.0 / (1 + np.exp(- x))
14 
15 # 计算ReLU函数,Clip函数定义很奇怪
16 y = np.clip(x, a_min = 0., a_max = None)
17 
18 #########################################################
19 # 以下部分为画图程序
20 
21 # 设置两个子图窗口,将Sigmoid的函数图像画在左边
22 f = plt.subplot(121)
23 # 画出函数曲线
24 plt.plot(x, s, color='r')
25 # 添加文字说明
26 plt.text(-5., 0.9, r'$y=\sigma(x)$', fontsize=13)
27 # 设置坐标轴格式
28 currentAxis=plt.gca()
29 currentAxis.xaxis.set_label_text('x', fontsize=15)
30 currentAxis.yaxis.set_label_text('y', fontsize=15)
31 
32 # 将ReLU的函数图像画在右边
33 f = plt.subplot(122)
34 # 画出函数曲线
35 plt.plot(x, y, color='g')
36 # 添加文字说明
37 plt.text(-3.0, 9, r'$y=ReLU(x)$', fontsize=13)
38 # 设置坐标轴格式
39 currentAxis=plt.gca()
40 currentAxis.xaxis.set_label_text('x', fontsize=15)
41 currentAxis.yaxis.set_label_text('y', fontsize=15)
42 
43 plt.show()

为了将面向对象的绘图库包装成只使用函数的调用接口,pyplot模块的内部保存了当前图表以及当前子图等信息。当前的图表和子图可以使用plt.gcf()plt.gca()获得,分别表示"Get Current Figure"和"Get Current Axes"。在pyplot模块中,许多函数都是对当前的Figure或Axes对象进行处理,比如说:

plt.plot()实际上会通过plt.gca()获得当前的Axes对象ax,然后再调用ax.plot()方法实现真正的绘图。


 

Numpy应用举例——图像翻转和裁剪

图像是由像素点构成的矩阵,其数值可以用ndarray来表示。可以将上面章节中介绍的操作用在图像数据对应的ndarray上,并且通过图像直观的展示出它的效果来。

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

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

1 # 水平方向翻转
2 image3 = image[:, ::-1, :]
3 plt.imshow(image3)

1 # 保存图片
2 im3 = Image.fromarray(image3)
3 im3.save('im3.jpg')
1 #  高度方向裁剪
2 H, W = image.shape[0], image.shape[1]
3 #print("H={},W={}".format(H,W))  #H=612,W=612
4 # 注意此处用整除,H_start必须为整数
5 H1 = H // 2 
6 H2 = H
7 #print("H1={}, H2={}".format(H1,H2)) #H1=306,H2=612
8 image4 = image[H1:H2, :, :]
9 plt.imshow(image4)

1 #  宽度方向裁剪
2 W1 = W//6
3 W2 = W//3 * 2
4 print("W1={}, W2={}".format(W1,W2)) #H1=306,H2=612
5 image5 = image[:, W1:W2, :]
6 plt.imshow(image5)
W1=102, W2=408
<matplotlib.image.AxesImage at 0x7f13e7d2d290>
1 # 两个方向同时裁剪
2 image5 = image[H1:H2, \
3                W1:W2, :]
4 plt.imshow(image5)

1 # 调整亮度
2 image6 = image * 0.5
3 plt.imshow(image6.astype('uint8'))

1 # 调整亮度
2 image7 = image * 2.0
3 # 由于图片的RGB像素值必须在0-255之间,
4 # 此处使用np.clip进行数值裁剪; None换成0也是有效的
5 image7 = np.clip(image7, \
6         a_min=None, a_max=255.)
7 plt.imshow(image7.astype('uint8'))

1 #高度方向每隔一行取像素点
2 image8 = image[::2, :, :]
3 plt.imshow(image8)

1 #宽度方向每隔一列取像素点
2 image9 = image[:, ::2, :]
3 plt.imshow(image9)

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

 

 

posted @ 2020-02-07 19:13  yuzaihuan  阅读(549)  评论(0编辑  收藏  举报