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

什么是向量化,为什么引入向量化。
以logistic线性回归为例, z=wTx+b z = w T x + b
w=[w1w2,,,wn] w = [ w 1 、 w 2 , , , w n ]
x=[x1x2,,,xn] x = [ x 1 、 x 2 , , , x n ]
非向量化实现:
z=0 z = 0
for i in range(n):
z+=w[i]x[i] z + = w [ i ] ∗ x [ i ]
z+=b z + = b
向量化实现:
z=np.dot(w,x)+b z = n p . d o t ( w , x ) + b
以上两个程序分别对 z=wTx+b z = w T x + 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')

这里写图片描述
可以看出来,向量化比for循环的时间要缩短将近100倍的时间,这在深度学习中将是非常重要的,可以大幅度缩短训练时间。
看下面的例子:
J=0,dw1=0,dw2=0,db=0 J = 0 , d w 1 = 0 , d w 2 = 0 , d b = 0
for i = 1 to n:
z(i)=wTx(i)+b z ( i ) = w T x ( i ) + b
a(i)=σ(z(i)) a ( i ) = σ ( z ( i ) )
J+=[y(i)logy^(i)+(1y(i))log(1y^(i))] J + = − [ y ( i ) l o g y ^ ( i ) + ( 1 − y ( i ) ) l o g ( 1 − y ^ ( i ) ) ]
dz(i)=a(i)(1a(i)) d z ( i ) = a ( i ) ( 1 − a ( i ) )
dw1+=x(i)1dz(i) d w 1 + = x 1 ( i ) d z ( i )
dw2+=x(i)2dz(i) d w 2 + = x 2 ( i ) d z ( i )
db+=dz(i) d b + = d z ( i )
J=J/m,dw1=dw1/m,dw2=dw2/m,db=db/m J = J / m , d w 1 = d w 1 / m , d w 2 = d w 2 / m , d b = d b / m
向量化之后的式子为:
J=0,dw=np.zeros((nx,1)),db=0 J = 0 , d w = n p . z e r o s ( ( n x , 1 ) ) , d b = 0
for i = 1 to n:
z(i)=wTx(i)+b z ( i ) = w T x ( i ) + b
a(i)=σ(z(i)) a ( i ) = σ ( z ( i ) )
J+=[y(i)logy^(i)+(1y(i))log(1y^(i))] J + = − [ y ( i ) l o g y ^ ( i ) + ( 1 − y ( i ) ) l o g ( 1 − y ^ ( i ) ) ]
dz(i)=a(i)(1a(i)) d z ( i ) = a ( i ) ( 1 − a ( i ) )
dw+=x(i)dz(i) d w + = x ( i ) d z ( i )
db+=dz(i) d b + = d z ( i )
J=J/m,dw=dw/m,db=db/m J = J / m , d w = d w / m , d b = d b / m
numpy中有许多可以用作数学计算公式的方法,譬如:
np.exp(v)求每一个值的指数
np.log(v)求每一个值得log值等等

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值