深度摸鱼入门
import numpy as np
a=np.array([1,2,3,4])
print(a)
[1 2 3 4]
import time
# this code is to compare the vectorization and for-loops
a=np.random.rand(1000000)
b=np.random.rand(1000000)
tic=time.time()
c=np.dot(a,b) # dian cheng in Chinese
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")
# and we know how fast the vectorization can be than the for-loops
249857.1312811841
Vectorized version:1.0018348693847656ms
249857.13128117658
For loop:375.45204162597656ms
由此开始深度学习之路:
这是我的第一个jupyter note,是在用过matlab的mlx之后才开始用这个超级方便的工具,在开始之前,我希望读者可以先做到这几步:
第一步用jupyter notebook,先配好自动补全的环境:Jupyter Notebook 代码自动补全功能设置 - 知乎 (zhihu.com)
第二步学会写公式,在线LaTeX公式编辑器-编辑器 (latexlive.com)
第三步学会用英文表达变量名,百度翻译-200种语言互译、沟通全世界! (baidu.com)
好,我们下面接着向量化与for-loops的比较:
\[ u=A\cdot v\\u_i=\sum_jA_{ij}v_{j}\\
\]
如果写成for-loops
u=np.zeros(rows,colomns)
for i in range(rows):
for j in range(colomns):
u[i]+=A[i][j]*v[j]
但如果写成vectorization,这样就可以了
u=np.dot(A,v)
又比如这个
\[v=\begin{bmatrix}
v_1\\\vdots\\
v_n
\end{bmatrix}
\]
你想得到,
\[u=\begin{bmatrix}
e^{v_1}\\\vdots\\
e^{v_n}
\end{bmatrix}
\]
如果你想用for-loops的话就只能这样,但我们可以直接用numpy的内置函数
u=np.zeros((n,1))
for i in range(n):
u[i]=math.exp(v[i])
这样显然更快:
import numpy as np
u=np.exp(v)
这些向量化的函数都会大大加快我们计算的速度,注意下面的v是vector的意思:
np.log(v) | np.abs(v) | np.maximun(v,0) | v**x | 1/v |
---|---|---|---|---|
lnx | 绝对值 | 同零相比最大的绝对值 | v^2 | 倒数 |
\[ z^{(i)}=w^{T}x^{(i)}+b^{(i)}\\
在这里x^{(i)}代表的是第i列的数据,
\\在这里我们通常喜欢定义X为一个n\times m的矩阵,\\则Z也定义成一个n\times m的矩阵,而w是一个n\times 1的向量,\\而w^T就是一个1\times n的向量,b是一个1\times m的向量\\则我们可以这样理解这个句子\\
Z=w^TX+b\\
\begin{align}
\Rightarrow
\begin{bmatrix}
z^{(1)}& z^{(2)} &\cdots &z^{(m)}
\end{bmatrix}&=w^TX+
\begin{bmatrix}
b^{(1)}& b^{(2)} &\cdots &b^{(m)}
\end{bmatrix}\\
&=\begin{bmatrix}
w^Tx^{(1)}+b^{(1)}&w^Tx^{(2)}+b^{(2)} &\cdots &w^Tx^{(m)}+b^{(m)}
\end{bmatrix}
\end{align}
\\\begin{pmatrix}
但需要注意到的是其实在python中输入时b是一个常数\\而在计算时会被拓展成1\times m的向量,这在python中叫broadcasting
\end{pmatrix}
\\则上面这个本来应该用for-loops去赋值的语句我们可以写成:
\]
z=np.dot(w.T,X)+b
# 这里的numpy库中的点乘意思,w.T相当于np.transpose(w)即矩阵转置,b是一个常数
Broadcasting example
import numpy as np
A=np.array([[56.0,0.0,4.4,68.0],
[1.2,104.0,52.0,8.0],
[1.8,135.0,99.0,0.9]])
print(A)
[[ 56. 0. 4.4 68. ]
[ 1.2 104. 52. 8. ]
[ 1.8 135. 99. 0.9]]
cal=A.sum(axis=0)# means you want to sum vertically,else axis=1 is horizontally
print(cal)
[ 59. 239. 155.4 76.9]
percentage=100*A/cal.reshape(1,4) #如果不知道矩阵类型这是个好办法去保证
print(percentage)
[[94.91525424 0. 2.83140283 88.42652796]
[ 2.03389831 43.51464435 33.46203346 10.40312094]
[ 3.05084746 56.48535565 63.70656371 1.17035111]]