文章目录
-
- 二分类
- 逻辑回归
- 逻辑回归损失函数
- 梯度下降
- 导数
- 计算图导数计算
- 逻辑回归中的梯度下降
- m个样本的梯度下降
- 向量化
- 向量化的更多例子
- 向量化 logistic 回归
- 向量化 logistic 回归梯度输出
- numpy 广播机制
- 关于 python / numpy 向量的说明
- 作业
参考:
吴恩达视频课
深度学习笔记
1. 二分类
- 判断图片中动物是猫?不是猫? 特征向量 是 3通道的RGB矩阵 展平
2. 逻辑回归
3. 逻辑回归损失函数
5. 导数
函数在某一点的斜率,在不同的点,斜率可能是不同的。
6. 计算图导数计算
链式求导法则:
7. 逻辑回归中的梯度下降
8. m个样本的梯度下降
假设有m个样本,样本有2个特征
代码语言:javascript复制// 伪代码 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多倍
代码语言:javascript复制250241.79388712568
Vectorized version:0.9975433349609375ms
250241.7938871326
For loop:687.734842300415ms
10. 向量化的更多例子
代码语言:javascript复制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 回归
逻辑回归前向传播步骤:
- 这样就向量化的计算,完成了逻辑回归的 1 次迭代,要完成
n_iter
次迭代就在外层加一层 for 循环,这个 for 是省不了的
13. numpy 广播机制
代码语言:javascript复制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)
代码语言:javascript复制[ 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)
代码语言:javascript复制[[101 102 103 104]]
- 例2
A = np.array([[1, 2, 3],
[4, 5, 6]])
B = np.array([100, 200, 300])
print(A B)
代码语言:javascript复制[[101 202 303]
[104 205 306]]
- 例3
A = np.array([[1, 2, 3],
[4, 5, 6]])
B = np.array([[100], [200]])
print(A B)
代码语言:javascript复制[[101 102 103]
[204 205 206]]
- 广播机制与执行的运算种类无关
14. 关于 python / numpy 向量的说明
- 总是使用 nx1 维矩阵(列向量),或者 1xn 维矩阵(行向量)
- 为了确保所需要的维数时,不要羞于
reshape
操作
作业
01.神经网络和深度学习 W2.神经网络基础(作业 - 逻辑回归 图片识别)