欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

吴恩达之深度学习和神经网络-2.10-2.12向量化

程序员文章站 2022-07-14 20:18:19
...

什么是向量化,为什么引入向量化。
以logistic线性回归为例,z=wTx+b
w=[w1w2,,,wn]
x=[x1x2,,,xn]
非向量化实现:
z=0
for i in range(n):
z+=w[i]x[i]
z+=b
向量化实现:
z=np.dot(w,x)+b
以上两个程序分别对z=wTx+b进行实现,非向量化采用for循环,而向量化则完全的隐藏了for循环,因为,在深度学习中,要去训练大量的数据,要是采用for循环,将会把训练时间拉伸的很长,这对于深度学习来说并不是那么理想。
因此,采用向量化的原因就是避免for循环的使用,在以后的日常编程当中,要尽可能做到以内函数来替代for循环,这样,我们的程序将会快很多。
那如何使用内函数避免for循环的使用,这里将会用到一个python的内置库-numpy,这个库十分强大,几乎就是为了数学计算而产生的,我们几乎能用到的数学公式都可以从numpy中找到并使用,避免了for循环,极大的缩短程序运行时间。

# -*- coding: utf-8 -*-

import numpy as np
import time

a = np.random.rand(1000000)
b = np.random.rand(1000000)

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('vectorized version:'+str(1000*(toc-tic))+'ms')

吴恩达之深度学习和神经网络-2.10-2.12向量化
可以看出来,向量化比for循环的时间要缩短将近100倍的时间,这在深度学习中将是非常重要的,可以大幅度缩短训练时间。
看下面的例子:
J=0,dw1=0,dw2=0,db=0
for i = 1 to n:
z(i)=wTx(i)+b
a(i)=σ(z(i))
J+=[y(i)logy^(i)+(1y(i))log(1y^(i))]
dz(i)=a(i)(1a(i))
dw1+=x1(i)dz(i)
dw2+=x2(i)dz(i)
db+=dz(i)
J=J/m,dw1=dw1/m,dw2=dw2/m,db=db/m
向量化之后的式子为:
J=0,dw=np.zeros((nx,1)),db=0
for i = 1 to n:
z(i)=wTx(i)+b
a(i)=σ(z(i))
J+=[y(i)logy^(i)+(1y(i))log(1y^(i))]
dz(i)=a(i)(1a(i))
dw+=x(i)dz(i)
db+=dz(i)
J=J/m,dw=dw/m,db=db/m
numpy中有许多可以用作数学计算公式的方法,譬如:
np.exp(v)求每一个值的指数
np.log(v)求每一个值得log值等等