1. 深度學習是什麼?python
一般應用程序並不須要收集真實世界中的數據,也不須要系統地提取這些數據特徵,只要有充足的時間,咱們的常識與編程技巧足夠讓咱們完成任務,好比你寫一個郵箱系統,或者寫一個微波爐程序。但有時候不只僅只有編程技巧所能搞定的,好比判斷一張圖片中有沒有貓的程序,先簡化該問題,假設全部圖像的高度和寬度都是400像素大小,一個像素點由紅綠藍3個值構成,那麼一張圖像就由近50w個數值表示(400*400*3),咱們須要從這些數據中尋找特徵,如邊緣、質地、形狀、眼睛、鼻子等,最終才能判斷圖像中是否有貓。編程
解決這個問題須要逆向思考,與其設計一個解決問題的程序,不如從最終的需求入手尋找一個解決方案:「用數據編程」,這是目前機器學習和深度學習的核心思想,即與其枯坐房間裏苦思如何設計一個識別貓的程序,不如利用人類肉眼在圖像中識別貓的能力,咱們收集一些已知包含貓和不包含貓的圖像,而後咱們的目標就轉化成如何從這些圖像入手獲得一個能夠推斷圖像中是否有貓的函數。這個函數經過咱們的知識來針對特定問題選定,例如,咱們使用一個二次函數來判斷圖像中是否有貓,可是像二次函數的參數具體值是經過數據來肯定的。數組
通俗來講,機器學習是一門討論各式各樣的適用於不一樣問題的函數形式,以及如何使用數據來有效地獲取函數具體值的學科。網絡
通俗來講,機器學習是一門討論各式各樣的適用於不一樣問題的函數形式,以及如何使用數據來有效地獲取函數具體值的學科。dom
通俗來講,機器學習是一門討論各式各樣的適用於不一樣問題的函數形式,以及如何使用數據來有效地獲取函數具體值的學科。機器學習
《重要的事說3遍,你品你細品》ide
深度學習是機器學習中的一類函數,它的形式一般爲多層神經網絡,近年來,仰仗大數據和強大的硬件,深度學習已逐漸成爲處理圖像、文本語料和聲音信號等複雜高維度數據的主要方法。函數
2. 名詞解釋工具
conda:一個流行的python包管理軟件學習
MXNet:深度學習包,裏面也包含一些張量運算庫,分爲CPU和GPU版本
jupyter:一種在線編輯和執行Python代碼的工具
3. 數據操做
from mxnet import nd # 從mxnet包中導入nd模塊
x = nd.arange(12)
nd爲NDArray的簡寫,它是一個類,用於存儲和變換數據的主要工具,它與numpy很相似,因爲提供了GPU計算和自動求梯度等更多功能,因此相對numpy,它更適合深度學習。
nd.arange(12):生成一個size爲12的一維數組,並從0到11逐步填充數據,可使用shape屬性來查看它的屬性
nd.arange(12).shape. ----->. (12,)
使用size屬性查看它的大小:nd.arange(12).size. -------> 12
使用reshape()函數能夠一維向量變動爲二維矩陣:nd.arange(12).reshape(3,4) 把size爲12的一維向量變動爲3行4列的矩陣
0,1,2,3,4,5,6,7,8,9,10,11 --------> [[0,1,2,3],
[4,5,6,7],
[8,9,10,11]]
上面因爲知道了具體元數個數,因此能夠寫爲(3,4),也能夠推斷好比nd.arange(12).reshape(-1,4) 讓NDArray去推測有幾行,或者nd.arange(12).reshape(3, -1),讓NDArray去推測每行有幾列數據
使用NDArray也能夠建立一個各元素爲0,形狀爲(2,3,4)的張量:nd.zeros((2,3,4))
使用NDArray也能夠建立一個各元素爲1,形狀爲(3,4)的張量:nd.ones((3,4))
也能夠經過Python的列表(list)指定須要建立的NDArray中每一個元素的值:y=nd.array([[1,2,3,4],[2,3,4,1],[3,4,1,2],[4,1,2,3]])
備註:比較神奇的是,即使沒有from mxnet import nd,上述代碼也能夠執行
有些狀況下,咱們須要隨機生成張量中的值:nd.random.normal(0,1, shape=(3,4))
這裏建立一個形狀爲(3,4)的NDArray,它的每一個元素都採用均值爲0,標準差爲1的正態分佈值填充
4. NDArray運算:NDArray支持大量的運算符
x = [[0, 1, 2, 3]. Y = [[2, 1, 4, 3],
[4, 5, 6, 7], [1,2,3,4]
[8,9,10,11]] [4,3,2,1]]
那麼X+Y、X/Y、Y.exp()、nd.dot(X, Y.T), nd.concat(X,Y, dim=0), nd.concat(X, Y, dim=1)都可實現
dot函數作矩陣乘法nd.dot(X, Y.T), Y.T爲矩陣Y的轉置
concat(X,Y, dim=0):把兩個矩陣鏈接起來,dim=0表示矩陣長度鏈接,dim=1表示矩陣寬度鏈接
dim=0: [ [0,1,2,3], [4,5,6,7], [8,9,10,11], [2,1,4,3], [1,2,3,4], [4,3,2,1]]
dim=1: [[0,1,2,3,2,1,4,3],
[4,5,6,7,1,2,3,4],
[8,9,10,11,4,3,2,1]]
還能夠判斷X==Y : 在X和Y相同的位置作求真運算(相同爲1,不然爲0)
5. 上面張量運算都是兩個形狀相同的NDArray運算,對於兩個形狀不一樣的運算,可能會觸發廣播機制
x = nd.arange(3).reshape((3,1)) # 3行1列的矩陣
x=[[0],
[1],
[2]]
y = nd.arange(2).reshape((1,2)) #1行2列的矩陣
y=[[0,1]]
此時:x+y,因爲它們的形狀不一樣,因此觸發廣播機制,即都自動擴展爲2*3矩陣
x + y = (0) (1, 2)
(1) +
(2)
= (0, 0) (1, 2) # x的第一列被廣播到了第二列,即把第1列的值複製到第2列
(1, 1) + (1, 2) # y的第1行2個元素被廣播到第二、3行,即把第1行的值複製到第二、3行
(2, 2) (1, 2)
= (1, 2)
(2, 3)
(3, 4)
6. 索引
表明了元素的位置,索引從0開始逐一遞增,分爲行索引和列索引
x = [[0, 1, 2, 3],
[4, 5, 6, 7],
[8, 9, 10, 11]]
則x[1:3]表示: 按行索引,取第1行和第2行
[[4, 5, 6, 7],
[8, 9, 10, 11]]
則x[1,2] = 9, 表示取第1行第2列的值
則x[1:3, :] = 12,表示把矩陣的第二、3行,全部列的數據都修改成12
則x[1:3, 1:3] = 12,表示把矩陣的第2,3行,第2,3列的數據都修改成12
7. 內存與id()函數
Y = X + Y, 其中X和Y都是矩陣,執行這個運算以後,Y指向了新的地址,這點與Java的基礎類型的運算不一樣
from mxnet import nd
x = nd.arange(12).reshape(3,4)
y = nd.ones((3,4))
before = id(y)
print(before) # 打印張量y的地址:
140389110238512
y = y + x
after = id(y)
print(after) # 打印張量y的地址:
140389110236832
能夠看到儘管是同一個變量,但先後地址已發生變化。 若是想指定結果到特定內存,能夠以下操做
z = y.zeros_like() # 初始化一個與y形狀相同的矩陣,但使用0填充
before = id(z) # 記錄z的地址
z[:] = x + y # 執行矩陣加,並使用索引把矩陣和填充到z中
after = id(z) # 再獲取z的地址
before == after # 比較地址的先後變化
true
這裏的z[:] = x + y仍是開了臨時內存來存儲計算結果,再複製到z對應的內存。若是想避免這個臨時內存開銷,能夠使用運算符全名函數中的out參數:
nd.elemwise_add(x, y, out = z)
id(z) == before
另外,也能夠適當考慮不使用要的矩陣,例如x初始化以後再也不使用,徹底能夠把x複用起來,減小內存的開銷,如x[:]=x+y,或者x += y
8. ndarray與numpy
ndarray是mxnet中存儲和變換數據的主要工具,開發者能夠輕鬆地對ndarray建立、運算、指定索引、並與numpy進行變換
import numpy as np
p = np.ones((2,3)) # 使用np建立2*3的矩陣
d = nd.array(p) #使用ndarray把numpy建立的2*3矩陣轉換爲ndarray的2*3矩陣
[[1,1,1],
[1,1,1]]
d.asnumpy(). # 把ndarray矩陣轉換爲numpy矩陣