对比普通实现方法与使用Numpy科学计算模块实现的差别,体现使用Numpy的优势在哪里。
1、Sigmoid函数,np.exp()
np.exp():e的多少次幂,即 ex e x
我们分别使用 math.exp()、np.exp() 来实现 sigmoid中的指数函数的构建。
import math
def basic_sigmoid(x):
'''
计算输入为 x 的sigmoid函数
Arguments: x: 实数
Return:s--sigmoid(x)
'''
s = 1 / (1 + math.exp(-x))
return s
但是事实上,深度学习中很少用 ’math‘ 模块,因为它的输入必须是一个实数,而在深度学习中,输入经常为矩阵或是向量。
import numpy as np
x = np.array([1,2,3])
print(np.exp(x))
>> [ 2.71828183 7.3890561 20.08553692]
结果是将输入矩阵的每个元素都对应的做了 ex e x 运算。
x = np.array([1,2,3])
print(x+3)
输出结果为矩阵的每一个元素都做相同的运算。
注:
这里输入的作为运算的矩阵必须是 np.array([ , , ]) 生成的, nimpy array,否则无法执行这些运算。
我们可以构建一个输入为矩阵的 Sigmoid S i g m o i d 函数:
import numpy as np
def sigmoid(x):
s = 1 / (1 + np.exp(-x))
return s
x = np.array([1,2,3])
sigmoid(x)
>> [0.73105858 0.88079708 0.95257413]
对每一个输入矩阵的元素做了 11+e−x 1 1 + e − x 运算,然后返回了同样形状的矩阵。
2、Sigmoid 梯度
我们需要使用反向传播来计算优化损失函数的梯度,梯度也就是导数。
首先我们对 Sigmiod S i g m i o d 函数求导:
令 Sigmoid S i g m o i d 函数表示为 σ(x) σ ( x ) 即梯度函数可以写为:
简化即计算:
def sigmoid_derivative(x):
s = sigmoid(x)
ds = s * (1 - s)
return ds
x = np.array([1,2,3])
print('Sigmoid_derivative')
>> [0.19661193 0.10499359 0.04517666]
同样是对每个元素应用了 Sigmoid 求导公式。
3、重塑矩阵(Reshaping arrays)
X.shape():可以得到矩阵 / 向量 X 的形状
X.reshape():用于将 X 改变成其他的形状
例如,在科学计算的时候,输入一张图片是一个3D形状的矩阵 (length,height,depth=3) ( l e n g t h , h e i g h t , d e p t h = 3 ) ,然而,当把这张图片作为一个算法的输入的时候,要将它转换为一个向量的形状