百度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)