《吴恩达深度学习笔记》01.神经网络和深度学习 W2.神经网络基础
Posted Michael阿明
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《吴恩达深度学习笔记》01.神经网络和深度学习 W2.神经网络基础相关的知识,希望对你有一定的参考价值。
1. 二分类
2. 逻辑回归
3. 逻辑回归损失函数
4. 梯度下降
5. 导数
6. 计算图导数计算
7. 逻辑回归中的梯度下降
8. m个样本的梯度下降
9. 向量化
10. 向量化的更多例子
11. 向量化 logistic 回归
12. 向量化 logistic 回归梯度输出
13. numpy 广播机制
14. 关于 python / numpy 向量的说明
参考:
吴恩达视频课
深度学习笔记
1. 二分类
-
判断图片中动物是猫?不是猫?特征向量 是 3通道的RGB矩阵 展平
2. 逻辑回归
3. 逻辑回归损失函数
几种常见的损失函数
交叉熵损失函数,常用于二分类问题。
代价函数:
-
所有的样本的损失函数的平均值
目标就是找到合适的参数,使得代价函数最小化
4. 梯度下降
如何寻找合适的 使得代价函数最小呢?
迭代的过程中,不断的在各参数的偏导数方向上更新参数值, 是学习率
5. 导数
函数在某一点的斜率,在不同的点,斜率可能是不同的。
6. 计算图导数计算
链式求导法则:
7. 逻辑回归中的梯度下降
sigmoid 函数: sigmoid 求导:
8. m个样本的梯度下降
假设有m个样本,样本有2个特征
// 伪代码 from http://www.ai-start.com/dl2017/html/lesson1-week2.html
J=0; dw1=0; dw2=0; db=0;
for i = 1 to m
z(i) = wx(i)+b;
a(i) = sigmoid(z(i));
J += -[y(i)log(a(i))+(1-y(i))log(1-a(i))];
dz(i) = a(i)-y(i);
dw1 += x1(i)dz(i); // 全部样本的梯度累加
dw2 += x2(i)dz(i);
db += dz(i);
// 求平均值
J /= m;
dw1 /= m;
dw2 /= m;
db /= m;
// 更新参数 w, b
w = w - alpha*dw
b = b - alpha*db
-
显式的使用 for 循环是很低效的,要使用 「向量化」技术 加速计算速度
9. 向量化
使用 numpy
等库实现向量化计算,效率更高
import numpy as np #导入numpy库
a = np.array([1,2,3,4]) #创建一个数据a
print(a)
# [1 2 3 4]
import time #导入时间库
a = np.random.rand(1000000)
b = np.random.rand(1000000) #通过round随机得到两个一百万维度的数组
tic = time.time() #现在测量一下当前时间
#向量化的版本
c = np.dot(a,b)
toc = time.time()
print(c)
print('Vectorized version:' + str(1000*(toc-tic)) +'ms') #打印一下向量化的版本的时间
#继续增加非向量化的版本
c = 0
tic = time.time()
for i in range(1000000):
c += a[i]*b[i]
toc = time.time()
print(c)
print('For loop:' + str(1000*(toc-tic)) + 'ms')#打印for循环的版本的时间
上面例子,向量化计算快了600多倍
250241.79388712568
Vectorized version:0.9975433349609375ms
250241.7938871326
For loop:687.734842300415ms
10. 向量化的更多例子
J=0; db=0;
dw = np.zeros((nx,1)) // numpy向量化
for i = 1 to m
z(i) = wx(i)+b;
a(i) = sigmoid(z(i));
J += -[y(i)log(a(i))+(1-y(i))log(1-a(i))];
dz(i) = a(i)-y(i);
dw += x(i)dz(i); // 向量化,全部样本的梯度累加
db += dz(i);
// 求平均值
J /= m;
dw /= m;// 向量化
db /= m;
// 更新参数 w, b
w = w - alpha*dw
b = b - alpha*db
这样就把内层的 dw1,... dwn
的计算使用向量化了,只用1层 for 循环,还可以做的更好,往下看
11. 向量化 logistic 回归
逻辑回归前向传播步骤:
-
对每个样本进行计算
-
计算激活函数,得到预测值 y`
可以使用 numpy
来计算:
-
,+ b 会对每个元素操作,是 numpy
的广播机制 -
这样就没有显式使用 for 循环,计算非常高效
12. 向量化 logistic 回归梯度输出
非向量化、向量化对比:
-
这样就向量化的计算,完成了逻辑回归的 1 次迭代,要完成 n_iter
次迭代就在外层加一层 for 循环,这个 for 是省不了的
13. numpy 广播机制
import numpy as np
A = np.array([
[56, 0, 4.4, 68],
[1.2, 104, 52, 8],
[1.8, 135, 99, 0.9]
])
cal = A.sum(axis=0) # 按列求和
print(cal)
percentage = 100 * A / cal.reshape(1, 4)
print(percentage)
[ 59. 239. 155.4 76.9]
[[94.91525424 0. 2.83140283 88.42652796]
[ 2.03389831 43.51464435 33.46203346 10.40312094]
[ 3.05084746 56.48535565 63.70656371 1.17035111]]
axis
指明运算 沿着哪个轴执行,在numpy
中,「0」轴是「垂直」的,也就是「列」,而「1」轴是「水平」的,也就是行
-
例1
A = np.array([[1, 2, 3, 4]])
b = 100
print(A+b)
[[101 102 103 104]]
-
例2
A = np.array([[1, 2, 3],
[4, 5, 6]])
B = np.array([100, 200, 300])
print(A+B)
[[101 202 303]
[104 205 306]]
-
例3
A = np.array([[1, 2, 3],
[4, 5, 6]])
B = np.array([[100], [200]])
print(A + B)
[[101 102 103]
[204 205 206]]
-
广播机制与执行的运算种类无关
14. 关于 python / numpy 向量的说明
-
总是使用 nx1 维矩阵(列向量),或者 1xn 维矩阵(行向量) -
为了确保所需要的维数时,不要羞于 reshape
操作
以上是关于《吴恩达深度学习笔记》01.神经网络和深度学习 W2.神经网络基础的主要内容,如果未能解决你的问题,请参考以下文章