《吴恩达深度学习笔记》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. 逻辑回归

《吴恩达深度学习笔记》01.神经网络和深度学习 W2.神经网络基础
在这里插入图片描述

3. 逻辑回归损失函数

几种常见的损失函数

交叉熵损失函数,常用于二分类问题。

代价函数:

  • 所有的样本的损失函数的平均值

目标就是找到合适的参数,使得代价函数最小化

4. 梯度下降

如何寻找合适的 使得代价函数最小呢?

迭代的过程中,不断的在各参数的偏导数方向上更新参数值, 是学习率

5. 导数

函数在某一点的斜率,在不同的点,斜率可能是不同的。

6. 计算图导数计算

链式求导法则:《吴恩达深度学习笔记》01.神经网络和深度学习 W2.神经网络基础

7. 逻辑回归中的梯度下降

sigmoid 函数: sigmoid 求导:

《吴恩达深度学习笔记》01.神经网络和深度学习 W2.神经网络基础
在这里插入图片描述

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`

《吴恩达深度学习笔记》01.神经网络和深度学习 W2.神经网络基础可以使用 numpy 来计算:

  • ,+ b 会对每个元素操作,是 numpy 的广播机制

这样就没有显式使用 for 循环,计算非常高效

12. 向量化 logistic 回归梯度输出

非向量化、向量化对比:《吴恩达深度学习笔记》01.神经网络和深度学习 W2.神经网络基础

  • 这样就向量化的计算,完成了逻辑回归的 1 次迭代,要完成 n_iter 次迭代就在外层加一层 for 循环,这个 for 是省不了的

13. numpy 广播机制

import numpy as np

A = np.array([
    [5604.468],
    [1.2104528],
    [1.8135990.9]
])

cal = A.sum(axis=0)  # 按列求和
print(cal)

percentage = 100 * A / cal.reshape(14)
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([[1234]])
b = 100
print(A+b)
《吴恩达深度学习笔记》01.神经网络和深度学习 W2.神经网络基础
在这里插入图片描述
[[101 102 103 104]]
  • 例2
A = np.array([[123],
              [456]])
B = np.array([100200300])
print(A+B)
《吴恩达深度学习笔记》01.神经网络和深度学习 W2.神经网络基础
在这里插入图片描述
[[101 202 303]
 [104 205 306]]
  • 例3
A = np.array([[123],
              [456]])
B = np.array([[100], [200]])
print(A + B)
《吴恩达深度学习笔记》01.神经网络和深度学习 W2.神经网络基础
在这里插入图片描述
[[101 102 103]
 [204 205 206]]
  • 广播机制与执行的运算种类无关
《吴恩达深度学习笔记》01.神经网络和深度学习 W2.神经网络基础
在这里插入图片描述

14. 关于 python / numpy 向量的说明

《吴恩达深度学习笔记》01.神经网络和深度学习 W2.神经网络基础

  • 总是使用 nx1 维矩阵(列向量),或者 1xn 维矩阵(行向量)
  • 为了确保所需要的维数时,不要羞于 reshape 操作


以上是关于《吴恩达深度学习笔记》01.神经网络和深度学习 W2.神经网络基础的主要内容,如果未能解决你的问题,请参考以下文章

吴恩达 DeepLearning.ai课程笔记(1-3)神经网络和深度学习 --- 浅层神经网络

吴恩达深度学习课程笔记

吴恩达深度学习课程笔记

吴恩达深度学习笔记

吴恩达深度学习笔记

吴恩达-深度学习-课程笔记-6: 深度学习的实用层面( Week 1 )