目录
常用的激活函数
我们常用的激活函数有sigmoid,tanh,ReLU这三个函数,我们都来学习学习吧。
sigmoid函数
在深度学习中,我们经常会使用到sigmoid函数作为我们的激活函数,特别是在二分类上,sigmoid函数是比较好的一个选择,以下就是sigmoid函数的公式:
sigmoid函数的坐标图是:
sigmoid函数的代码实现:
import numpy as np
def sigmoid(x):
s = 1 / (1 + np.exp(-x))
return s
- 1
- 2
- 3
- 4
- 5
因为是使用numpy实现的sigmoid函数的,所以这个sigmoid函数可以计算实数、矢量和矩阵,如下面的就是当x是实数的时候:
if __name__ == '__main__':
x = 3
s = sigmoid(x)
print s
- 1
- 2
- 3
- 4
然后会输出:
0.952574126822
- 1
当x是矢量或者矩阵是,计算公式如下:
使用sigmoid函数如下:
if __name__ == '__main__':
x = np.array([2, 3, 4])
s = sigmoid(x)
print s
- 1
- 2
- 3
- 4
输出的结果是:
[0.88079708 0.95257413 0.98201379]
- 1
sigmoid函数的梯度
为什么要计算sigmoid函数的梯度,比如当我们在使用反向传播来计算梯度,以优化损失函数。当使用的激活函数是sigmoid函数就要计算sigmoid函数的梯度了。计算公式如下:
Python你代码实现:
import numpy as np
def sigmoid_derivative(x):
s = 1 / (1 + np.exp(-x))
ds = s * (1 - s)
return ds
- 1
- 2
- 3
- 4
- 5
- 6
当x是实数时,计算如下:
if __name__ == '__main__':
x = 3
s = sigmoid_derivative(x)
print s
- 1
- 2
- 3
- 4
输出结果如下:
0.0451766597309
- 1
当x是矩阵或者矢量时,计算如下:
if __name__ == '__main__':
x = np.array([2, 3, 4])
s = sigmoid_derivative(x)
print s
- 1
- 2
- 3
- 4
输出结果如下:
[0.10499359 0.04517666 0.01766271]
- 1
tanh函数
tanh也是一个常用的激活函数,它的公式如下:
tanh的坐标图是:
tanh的代码实现:
import numpy as np
def tanh(x):
s1 = np.exp(x) - np.exp(-x)
s2 = np.exp(x) + np.exp(-x)
s = s1 / s2
return s
- 1
- 2
- 3
- 4
- 5
- 6
- 7
为了方便,这里把x是实数、矢量或矩阵的情况一起计算了,调用方法如下:
if __name__ == '__main__':
x = 3
s = tanh(x)
print s
x = np.array([2, 3, 4])
s = tanh(x)
print s
- 1
- 2
- 3
- 4
- 5
- 6
- 7
以下就是输出结果:
0.995054753687
[0.96402758 0.99505475 0.9993293 ]
- 1
- 2
tanh函数的梯度
同样在这里我们也要计算tanh函数的梯度,计算公式如下:
Python代码实现如下:
import numpy as np
def tanh_derivative(x):
s1 = np.exp(x) - np.exp(-x)
s2 = np.exp(x) + np.exp(-x)
tanh = s1 / s2
s = 1 - tanh * tanh
return s
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
调用方法如下:
if __name__ == '__main__':
x = 3
s = tanh_derivative(x)
print s
x = np.array([2, 3, 4])
s = tanh_derivative(x)
print s
- 1
- 2
- 3
- 4
- 5
- 6
- 7
输出结果如下:
0.00986603716544
[0.07065082 0.00986604 0.00134095]
- 1
- 2
ReLU函数
ReLU是目前深度学习最常用的一个激活函数,数学公式如下:
其对应的坐标图为:
Python代码的实现:
import numpy as np
def relu(x):
s = np.where(x < 0, 0, x)
return s
- 1
- 2
- 3
- 4
- 5
调用方式如下:
if __name__ == '__main__':
x = -1
s = relu(x)
print s
x = np.array([2, -3, 1])
s = relu(x)
print s
- 1
- 2
- 3
- 4
- 5
- 6
- 7
输出结果如下:
0
[2 0 1]
- 1
- 2
图像转矢量
为了提高训练是的计算速度,一般会把图像转成矢量,一张三通道的图像的格式是(width,height,3)(width,height,3),我们使用Python代码尝试一下:
import numpy as np
def image2vector(image):
v = image.reshape((image.shape[0] * image.shape[1] * image.shape[2], 1))
return v
- 1
- 2
- 3
- 4
- 5
调用方法如下:
if __name__ == '__main__':
image = np.array([[[0.67826139, 0.29380381],
[0.90714982, 0.52835647],
[0.4215251, 0.45017551]],
[[0.92814219, 0.96677647],
[0.85304703, 0.52351845],
[0.19981397, 0.27417313]],
[[0.60659855, 0.00533165],
[0.10820313, 0.49978937],
[0.34144279, 0.94630077]]])
vector = image2vector(image)
print "image shape is :", image.shape
print "vector shape is :", vector.shape
print "vector is :" + str(image2vector(image))
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
输出结果如下:
image shape is : (3, 3, 2)
vector shape is : (18, 1)
vector is :[[0.67826139]
[0.29380381]
[0.90714982]
[0.52835647]
[0.4215251 ]
[0.45017551]
[0.92814219]
[0.96677647]
[0.85304703]
[0.52351845]
[0.19981397]
[0.27417313]
[0.60659855]
[0.00533165]
[0.10820313]
[0.49978937]
[0.34144279]
[0.94630077]]
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
规范化行
在深度学习中通过规范化行,可以使模型收敛得更快。它的计算公式如下:
Python代码实现:
import numpy as np
def normalizeRows(x):
x_norm = np.linalg.norm(x, axis=1, keepdims=True)
print "x_norm = ", x_norm
x = x / x_norm
return x
- 1
- 2
- 3
- 4
- 5
- 6
- 7
调用该函数:
if __name__ == '__main__':
x = np.array([
[0, 3, 4],
[1, 6, 4]])
print "normalizeRows(x) = " + str(normalizeRows(x))
- 1
- 2
- 3
- 4
- 5
输出结果如下:
x_norm = [[5. ]
[7.28010989]]
normalizeRows(x) = [[0. 0.6 0.8 ]
[0.13736056 0.82416338 0.54944226]]
- 1
- 2
- 3
- 4
广播和softmax函数
广播是将较小的矩阵“广播”到较大矩阵相同的形状尺度上,使它们对等以可以进行数学计算。注意的是较小的矩阵要是较大矩阵的倍数,否则无法使用广播。
以下就是softmax函数,这函数在计算的过程就使用到了广播的性质。softmax函数的公式如下: