吴恩达《深度学习》L1W2作业1
知识点:numpy入门,函数向量化实现
1 使用numpy构建基本函数
Numpy是Python中主要的科学计算包。它由一个大型社区维护。在本练习中,你将学习一些关键的numpy函数,例如np.exp,np.log和np.reshape。你需要知道如何使用这些函数去完成将来的练习。
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()的示例。
import math
def basic_sigmoid(x):
s = 1 / (1 + math.exp(-x))
return s
x = 3
print(basic_sigmoid(x))
# 0.9525741268224334
因为函数的输入是实数,所以我们很少在深度学习中使用“math”库。 而深度学习中主要使用的是矩阵和向量,因此numpy更为实用。
import numpy as np
def basic_sigmoid(x):
s = 1 / (1 + np.exp(-x))
return s
x = np.array([1,2,3])
print(basic_sigmoid(x))
# [0.73105858 0.88079708 0.95257413]
1.2 Sigmoid gradient
练习:创建函数sigmoid_grad()计算sigmoid函数相对于其输入x的梯度。 公式为:
def sigmoid_derivative(x):
s = basic_sigmoid(x)
ds = s * (1-s)
return ds
x = np.array([1,2,3])
print("sigmoid_derivative = " + str(sigmoid_derivative(x)))
# sigmoid_derivative = [0.19661193 0.10499359 0.04517666]
1.3 重塑数组
深度学习中两个常用的numpy函数是np.shape和np.reshape()。
-X.shape用于获取矩阵/向量X的shape(维度)。
-X.reshape(…)用于将X重塑为其他尺寸。
练习:实现image2vector() ,该输入采用维度为(length, height, 3)的输入,并返回维度为(lengthheight3, 1)的向量。例如,如果你想将形为(a,b,c)的数组v重塑为维度为(a*b, 3)的向量,则可以执行以下操作:
# GRADED FUNCTION: image2vector
def image2vector(image):
v = image.reshape(image.shape[0] * image.shape[1] * image.shape[2], 1)
return v
1.4 行标准化
我们在机器学习和深度学习中使用的另一种常见技术是对数据进行标准化。 由于归一化后梯度下降的收敛速度更快,通常会表现出更好的效果。 通过归一化,也就是将x更改为x/||x||(将x的每个行向量除以其范数)。
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],
[1,6,4]
])
print("normalizeRows = " + str(normalizeRows(x)))
1.5 广播和softmax函数
在numpy中要理解的一个非常重要的概念是“广播”。 这对于在不同形状的数组之间执行数学运算非常有用。
练习: 使用numpy实现softmax函数。 你可以将softmax理解为算法需要对两个或多个类进行分类时使用的标准化函数。
def softmax(x):
x_exp = np.exp(x)
x_sum = np.sum(x_exp,axis = 1,keepdims=True)
s = x_exp / x_sum
return s
x = np.array([
[9, 2, 5, 0, 0],
[7, 5, 0, 0 ,0]])
print("softmax(x) = " + str(softmax(x)))
""" softmax(x) = [[9.80897665e-01 8.94462891e-04 1.79657674e-02 1.21052389e-04
1.21052389e-04]
[8.78679856e-01 1.18916387e-01 8.01252314e-04 8.01252314e-04
8.01252314e-04]] """
注意:
-如果你在上方输出 x_exp,x_sum和s的维度并重新运行练习单元,则会看到x_sum的纬度为(2,1),而x_exp和s的维度为(2,5)。 x_exp/x_sum 可以使用python广播。
2 向量化
在深度学习中,通常需要处理非常大的数据集。 因此,非计算最佳函数可能会成为算法中的巨大瓶颈,并可能使模型运行一段时间。 为了确保代码的高效计算,我们将使用向量化。 例如,尝试区分点/外部/元素乘积之间的区别。
尽可能少的使用 for 循环
2.1 实现L1和L2损失函数
练习:实现L1损失函数的Numpy向量化版本。 我们会发现函数abs(x)(x的绝对值)很有用。
提示:
-损失函数用于评估模型的性能。 损失越大,预测与真实值的差异也就越大。 在深度学习中,我们使用诸如Gradient Descent之类的优化算法来训练模型并最大程度地降低成本。
-L1损失函数定义为:
def L1(yhat,y):
loss = np.sum(np.abs(y - yhat))
return loss
yhat = np.array([.9, 0.2, 0.1, .4, .9])
y = np.array([1, 0, 0, 1, 1])
print("L1 = " + str(L1(yhat,y)))
# L1 = 1.1
def L2(yhat,y):
loss = np.dot((y - yhat),(y - yhat).T)
return loss
yhat = np.array([.9, 0.2, 0.1, .4, .9])
y = np.array([1, 0, 0, 1, 1])
print("L2 = " + str(L2(yhat,y)))
# L2 = 0.43