深度學習之Numpy整理

1、Numpy介紹、爲何要用Numpy

一、Numpy介紹python

Numpy是Python的一個擴展包,語法和Matlab有不少類似之處。它支持高維數組和矩陣運算,也提供了許多數組和矩陣運算的函數。另外,它在數組和矩陣運算方面速度很快,效率很高。數組

二、爲何要用Numpy網絡

Numpy向量化計算非向量化計算性能比較dom

# coding: utf-8
import time
import numpy as np


# Numpy向量化測試
a = np.random.rand(1000000)
b = np.random.rand(1000000)

tic = time.time()
c = np.dot(a,b)
toc = time.time()
print("計算結果"+str(c))
print("向量化使用時間:"+str(1000*(toc-tic)) + "ms")


# 使用for循環測試
c = 0
tic = time.time()

for i in range(1000000):
    c += a[i] * b[i]

toc = time.time()
print("計算結果"+str(c))
print("循環使用時間:"+str(1000*(toc-tic)) + "ms")

#計算結果250011.92519533934
#向量化使用時間:0.9119510650634766ms
#計算結果250011.92519534056
#循環使用時間:466.2208557128906ms

複製代碼

爲何向量化比循環快?函數

由於Numpy對向量計算作了優化,用到了CPU或GPU的並行計算,因此速度要比單純的for循環要快。具體細節感興趣能夠自行研究。性能

2、數組建立

一、生成數組學習

(1)一維數組測試

import numpy as np
x = np.array([1.0,2.0,3.0])
print(x)
# [1. 2. 3.]

x = np.np.arange(0,5)
print(x)
# [0 1 2 3 4]
複製代碼

各個元素與標量之間進行運算,稱爲廣播。優化

(2)二維數組spa

A = np.array([[1,2],[3,4]])
A.shape 
# 返回n*m的數組

A.dtype 
# 返回數據類型

A.size 
# 返回數組元素個數4

np.ndim(A) 
#返回數組維數

複製代碼

三、訪問元素

for row in A:
  print(row)

A[0]
A[0][1]

A.flatten() #將X轉換爲一維數組
# [1 2 3 4]

A[np.array([0,1])]#獲取索引爲一、2的元素
#[[1 2]
#[3 4]]

A > 15 #得到布爾型數組
#[[False False]
# [False False]]

複製代碼

3、矩陣

一、建立矩陣

A = np.matrix('1,2;3,4')
print(A)
print(type((A)))
#[[1 2]
# [3 4]]
#<class 'numpy.matrixlib.defmatrix.matrix'>
複製代碼

二、數組轉矩陣

A = np.array([[1,2],[3,4]])
#[[1 2]
# [3 4]]
B = np.mat(A)
print(B)
print(type(B))
#<class 'numpy.matrixlib.defmatrix.matrix'>
複製代碼

三、建立單位矩陣

E = np.eye(3)
#[[1. 0. 0.]
# [0. 1. 0.]
# [0. 0. 1.]]

複製代碼

四、改變數組形狀

# 將2*2的數組變形爲4*1的數組
A = np.array([[1,2],[3,4]])
A = A.reshape((A.size,1))
print(A)

#[[1]
 #[2]
 #[3]
 #[4]]

複製代碼

4、計算

一、廣播

爲什麼叫廣播,由於單個標量被廣播、複製成n維數組。

如二維數組[[1,2],[3,4]]與標量10相乘,等同於[[1,2],[3,4]]乘以[[10,10],[10,10]]

二、矩陣轉置

由於np.random.randn(5)寫法不直觀,建議使用寫法np.random.randn(5,1)

a = np.random.randn(5,1)

#轉置
b = a.T
print(a)

#[[-0.30232915]
# [-0.13689176]
# [ 0.74737671]
# [ 0.58641912]
# [ 0.14419141]]

print(a.T)

#[[-0.30232915 -0.13689176 0.74737671 0.58641912 0.14419141]]


複製代碼

三、矩陣乘法(點積)

(1)

import numpy as np
A = np.array([[1,2],[3,4]])
B = np.array([[5,6],[7,8]])
#點積
print(np.dot(A,B))
#array([[19, 22],[43, 50]])

複製代碼

(2)

a = np.random.randn(5,1)
b = a.T
# (5,1)(1,5)的點積獲得的是5*5的矩陣
print(np.dot(a,b))
# (1,5)(5,1)的點積獲得的是1*1的矩陣
print(np.dot(b,a))
複製代碼

四、矩陣求逆

AB=E,矩陣A與B互爲逆矩陣,其中E爲單位矩陣,E的行列式計算爲1

A = np.matrix('1,2;3,4')
print(A.I)#求逆
#[[-2. 1. ]
# [ 1.5 -0.5]]

E = np.dot(A,A.I)
print(E)
#[[1.0000000e+00 0.0000000e+00]
#[8.8817842e-16 1.0000000e+00]]

value = np.linalg.det(E)#行列式計算
#0.9999999999999996
複製代碼

四、算術運算

x = np.array([1.0,2.0,3.0])
y = np.array([2.0,3.0,4.0])

#減法
print(x - y) 
# [-1. -1. -1.]

#加法
print(x + y)
#[3. 5. 7.]

#乘法
print(x * y)
#[ 2. 6. 12.]

#除法
print(x / y)
#[0.5 0.66666667 0.75 ]

#開方根
print(np.sqrt(x))
#[1. 1.41421356 1.73205081]

#對數
print(np.log(x))
#[0. 0.69314718 1.09861229]

# 指數
print(np.exp(a))
# [ 2.71828183 7.3890561 20.08553692]

複製代碼

五、平均值、方差、標準差

x = np.array([1,2,3,4,5,6])

# 平均值
np.mean([1,2,3,4])
# 3.5

# 方差
print(np.var(x))
#2.9166666666666665

# 標準差
print(np.std(x))
#1.707825127659933

複製代碼

5、應用

一、sigmoid函數

def sigmoid(x):

    s = 1.0 / (1.0 + np.exp(-x))
    return s
複製代碼

二、sigmoid求導

sigmoid求導.png

def sigmoid_derivative(x):
    s = sigmoid(x)
    ds = s*(1-s)
    return ds

複製代碼

三、softmax函數計算

softmax.png

def softmax(x):

    x_exp = np.exp(x)
    x_sum = np.sum(np.exp(x),axis=1,keepdims = True)
    s = x_exp / x_sum
    return s

複製代碼

四、計算損失函數

loss functions.png

def L1(yhat, y):
    loss = np.sum(np.abs(yhat - y))
    return loss
複製代碼

loss functions.png

def L1(yhat, y):
    loss = np.sum((y - yhat)**2)
    return loss
複製代碼

五、向量化練習

x1 = [9, 2, 5, 0, 0, 7, 5, 0, 0, 0, 9, 2, 5, 0, 0]
x2 = [9, 2, 2, 9, 0, 9, 2, 5, 0, 0, 9, 2, 5, 0, 0]

### VECTORIZED DOT PRODUCT OF VECTORS ###
tic = time.process_time()
dot = np.dot(x1,x2)
toc = time.process_time()
print ("dot = " + str(dot) + "\n ----- Computation time = " + str(1000*(toc - tic)) + "ms")

### VECTORIZED OUTER PRODUCT ###
tic = time.process_time()
outer = np.outer(x1,x2)
toc = time.process_time()
print ("outer = " + str(outer) + "\n ----- Computation time = " + str(1000*(toc - tic)) + "ms")

### VECTORIZED ELEMENTWISE MULTIPLICATION ###
tic = time.process_time()
mul = np.multiply(x1,x2)
toc = time.process_time()
print ("elementwise multiplication = " + str(mul) + "\n ----- Computation time = " + str(1000*(toc - tic)) + "ms")

### VECTORIZED GENERAL DOT PRODUCT ###
tic = time.process_time()
dot = np.dot(W,x1)
toc = time.process_time()
print ("gdot = " + str(dot) + "\n ----- Computation time = " + str(1000*(toc - tic)) + "ms")

複製代碼

參考文檔

Numpy 1.15.4官方文檔

神經網絡和深度學習-吳恩達——Vectorization

numpy基本方法總結

相關文章
相關標籤/搜索