练习
神经网络与深度学习
神经网络基础
Numpy基础
学习目标:
- 使用numpy,包括函数调用及向量矩阵运算
- 广播
- 向量化代码
1-使用numpy构建基本函数
1.1- sigmoid function和np.exp()
在使用np.exp()之前,你将使用math.exp()实现Sigmoid函数。然后,你将知道为什么np.exp()比math.exp()更可取。
练习:构建一个返回实数x的sigmoid的函数。将math.exp(x)用于指数函数。
提示:
有时也称
为逻辑函数。它是一种非线性函数,即可用于机器学习(逻辑回归),也能用于深度学习。
要引用特定程序包的函数,可以使用package_name.function()对其进行调用。运行下面的代码查看带有math.exp()的示例。
但是在深度学习中很少使用math库,是因为在深度学习中更多的使用矩阵与向量,故numpy更加实用
import math
def basic_sigmoid(x):
s = 1/(1 + math.exp(-x))
return s
basic_sigmoid(3)
0.9525741268224334
import numpy as np
x = np.array([1,2,3])
print(1 / (1 + np.exp(-x)))
[0.73105858 0.88079708 0.95257413]
import numpy as np
def sigmoid(x):
s = 1/(1 + np.exp(-x))
return s
x = np.array([1,2,3])
sigmoid(x)
array([0.73105858, 0.88079708, 0.95257413])
1.2- Sigmoid gradient
正如你在教程中所看到的,我们需要计算梯度来使用反向传播优化损失函数。 让我们开始编写第一个梯度函数吧。
练习:创建函数sigmoid_grad()计算sigmoid函数相对于其输入x的梯度。 公式为:
我们通常分两步编写此函数代码:
1.将s设为x的sigmoid。 你可能会发现sigmoid(x)函数很方便。
2.计算
def sigmoid_derivative(x):
s = sigmoid(x)
ds = s * (1 - s)
return ds
x = np.array([1,2,3])
sigmoid_derivative(x)
array([0.19661193, 0.10499359, 0.04517666])
1.3- 重塑数组
深度学习中两个常用的numpy函数是np.shape和np.reshape()。
-X.shape用于获取矩阵/向量X的shape(维度)。
-X.reshape(…)用于将X重塑为其他尺寸。
例如,在计算机科学中,图像由shape为
的3D数组表示。但是,当你读取图像作为算法的输入时,会将其转换为维度为
的向量。换句话说,将3D阵列“展开”或重塑为1D向量。
练习:实现image2vector() ,该输入采用维度为(length, height, 3)的输入,并返回维度为(lengthheight3, 1)的向量。例如,如果你想将形为(a,b,c)的数组v重塑为维度为(a*b, 3)的向量,则可以执行以下操作:
v = v.reshape((v.shape[0]*v.shape[1], v.shape[2]))
#v.shape[0] = a ; v.shape[1] = b ; v.shape[2] = c
def image2vector(image):
v = image.reshape(image.shape[0] * image.shape[1] * image.shape[2], 1)
return v
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]]])
print ("image2vector(image) = " + str(image2vector(image)))
image2vector(image) = [[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.4- 行标准化
我们在机器学习和深度学习中使用的另一种常见技术是对数据进行标准化。 由于归一化后梯度下降的收敛速度更快,通常会表现出更好的效果。 通过归一化,也就是将x更改为(将x的每个行向量除以其范数)。(化为单位向量)
练习: 执行 normalizeRows()来标准化矩阵的行。 将此函数应用于输入矩阵x之后,x的每一行应为单位长度(即长度为1)向量。
def normalizeRows(x):
x_norm = np.linalg.norm(x, axis = 1, keepdims = True)
x = x / x_norm
return x
x = np.array([[0, 3, 4],
[10, 12, 13]])
print("normalizeRows(x) = " + str(normalizeRows(x)))
normalizeRows(x) = [[0. 0.6 0.8 ]
[0.49206783 0.5904814 0.63968818]]
行标准化: x_norm = np.linalg.norm(x, axis = 1, keepdims = True)
x = x / x_norm
1.5- 广播和softmax函数
练习: 使用numpy实现softmax函数。 你可以将softmax理解为算法需要对两个或多个类进行分类时使用的标准化函数。 你将在本专业的第二门课中了解有关softmax的更多信息。
操作指南:
#首先算出每行元素之和(得n行1列矩阵),再将原矩阵与该矩阵相除
def softmax(x):
xExp = np.exp(x)
xSum = np.sum(xExp, axis = 1, keepdims = True)
s = xExp / xSum
return s
x = np.array([
[9, 2, 5, 0, 0],
[7, 5, 0, 0 ,0]])
print("softmax(x) = " + str(softmax(x)))
总结:
- -np.exp(x)适用于任何np.array x并将指数函数应用于每个坐标
- sigmoid函数及其梯度
- image2vector通常用于深度学习
- np.reshape被广泛使用。 保持矩阵/向量尺寸不变有助于我们消除许多错误。
- numpy具有高效的内置功能
- broadcasting非常有用
2-向量化
2.1实现L1和L2损失函数
练习: 实现L1损失函数的Numpy向量化版本。 我们会发现函数abs(x)(x的绝对值)很有用。
提示:
-损失函数用于评估模型的性能。 损失越大,预测(
) 与真实值()的差异也就越大。 在深度学习中,我们使用诸如Gradient Descent之类的优化算法来训练模型并最大程度地降低成本。
-L1损失函数定义为