01.神经网络和深度学习 W2.神经网络基础

2021-02-19 11:37:28 浏览数 (1)

文章目录

      1. 二分类
      1. 逻辑回归
      1. 逻辑回归损失函数
      1. 梯度下降
      1. 导数
      1. 计算图导数计算
      1. 逻辑回归中的梯度下降
      1. m个样本的梯度下降
      1. 向量化
      1. 向量化的更多例子
      1. 向量化 logistic 回归
      1. 向量化 logistic 回归梯度输出
      1. numpy 广播机制
      1. 关于 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 等库实现向量化计算,效率更高

代码语言:javascript复制
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
代码语言:javascript复制
A = np.array([[1, 2, 3, 4]])
b = 100
print(A b)
代码语言:javascript复制
[[101 102 103 104]]
  • 例2
代码语言:javascript复制
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
代码语言:javascript复制
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.神经网络基础(作业 - 逻辑回归 图片识别)


0 人点赞