數(shù)據(jù)流圖
數(shù)據(jù)流圖(data flow graphs)伺绽,用于數(shù)值計算的開源軟件庫闲孤。節(jié)點(Nodes)在圖中表示數(shù)學操作搏色,圖中的線(edges)則表示在節(jié)點間相互聯(lián)系的多維數(shù)據(jù)數(shù)組,即張量(tensor)缭召。例如TensorFlow等
張量
張量是所有深度學習框架中最核心的組件员辩,因為后續(xù)的所有運算和優(yōu)化算法都是基于張量進行的盒粮。幾何代數(shù)中定義的張量是基于向量和矩陣的推廣,通俗一點理解的話奠滑,我們可以將 標量視為零階張量拆讯,矢量視為一階張量,矩陣就是二階張量养叛。舉例來說,我們可以將任意一張RGB彩色圖片表示成一個三階張量(三個維度分別是圖片的高度宰翅、寬度和色彩數(shù)據(jù))弃甥。如下圖所示是一張普通的水果圖片,按照RGB三原色表示汁讼,其可以拆分為三張紅色淆攻、綠色和藍色的灰度圖片阔墩,如果將這種表示方法用張量的形式寫出來,就是圖中最下方的那張表格瓶珊。
在python中:
- 零階張量啸箫,標量使用基本加減運算,對應單個Tensor
- 一階張量伞芹,矢量忘苛,使用list,tuple唱较,numpy.array扎唾,binascii等,對應數(shù)組Tensor
- 二階張量南缓,矩陣胸遇,使用numpy.matrix,pandas.series汉形,對應二位Tensor
- 三階張量纸镊,如圖,使用pandas.dataframe概疆,對應一個二位加通道的Tensor
張量的階數(shù)有時候也稱為維度逗威,或者軸,軸這個詞翻譯自英文axis届案。譬如一個矩陣[[1,2],[3,4]]庵楷,是一個2階張量,有兩個維度或軸楣颠,沿著第0個軸(為了與python的計數(shù)方式一致尽纽,本文檔維度和軸從0算起)你看到的是[1,2],[3,4]兩個向量童漩,沿著第1個軸你看到的是[1,3]弄贿,[2,4]兩個向量。
要理解“沿著某個軸”是什么意思矫膨,不妨試著運行一下下面的代碼:
import numpy as np
a = np.array([[1,2],[3,4]])
s0 = np.sum(a, axis=0)
s1 = np.sum(a, axis=1)
print s0
print s1
data_format
在計算機中機器碼的表示方式分為大端和小端差凹,在數(shù)據(jù)的表達上也分大端和小端。例如如何表示一組彩色圖片的問題上侧馅,Theano和TensorFlow發(fā)生了分歧危尿,'th'模式,也即Theano模式會把100張RGB三通道的16×32(高為16寬為32)彩色圖表示為下面這種形式(100,3,16,32)馁痴,Caffe采取的也是這種方式谊娇。第0個維度是樣本維,代表樣本的數(shù)目罗晕,第1個維度是通道維济欢,代表顏色通道數(shù)赠堵。后面兩個就是高和寬了。這種theano風格的數(shù)據(jù)組織方法法褥,稱為“channels_first”茫叭,即通道維靠前。
而TensorFlow半等,的表達形式是(100,16,32,3)揍愁,即把通道維放在了最后,這種數(shù)據(jù)組織方式稱為“channels_last”酱鸭。
Keras默認的數(shù)據(jù)組織形式在~/.keras/keras.json中規(guī)定吗垮,可查看該文件的image_data_format一項查看,也可在代碼中通過K.image_data_format()函數(shù)返回凹髓,請在網(wǎng)絡的訓練和測試中保持維度順序一致烁登。
函數(shù)式模型
在Keras 0.x中,模型其實有兩種蔚舀,一種叫Sequential饵沧,稱為序貫模型,也就是單輸入單輸出赌躺,層與層之間只有相鄰關系狼牺,跨層連接統(tǒng)統(tǒng)沒有。這種模型編譯速度快礼患,操作上也比較簡單是钥。第二種模型稱為Graph,即圖模型缅叠,這個模型支持多輸入多輸出悄泥,層與層之間想怎么連怎么連,但是編譯速度慢肤粱〉簦可以看到,Sequential其實是Graph的一個特殊情況领曼。
在Keras1和Keras2中鸥鹉,圖模型被移除,而增加了了“functional model API”庶骄,這個東西毁渗,更加強調(diào)了Sequential是特殊情況這一點。一般的模型就稱為Model单刁,然后如果你要用簡單的Sequential灸异,OK,那還有一個快捷方式Sequential。
由于functional model API在使用時利用的是“函數(shù)式編程”的風格绎狭,我們這里將其譯為函數(shù)式模型∪彀總而言之儡嘶,只要這個東西接收一個或一些張量作為輸入,然后輸出的也是一個或一些張量恍风,可以構(gòu)建有向圖蹦狂,統(tǒng)統(tǒng)都稱作“模型”。
batch
深度學習的優(yōu)化算法朋贬,說白了就是梯度下降凯楔。每次的參數(shù)更新有兩種方式。
第一種锦募,遍歷全部數(shù)據(jù)集算一次損失函數(shù)摆屯,然后算函數(shù)對各個參數(shù)的梯度,更新梯度糠亩。這種方法每更新一次參數(shù)都要把數(shù)據(jù)集里的所有樣本都看一遍虐骑,計算量開銷大,計算速度慢赎线,不支持在線學習廷没,這稱為Batch gradient descent,批梯度下降垂寥。
另一種颠黎,每看一個數(shù)據(jù)就算一下?lián)p失函數(shù),然后求梯度更新參數(shù)滞项,這個稱為隨機梯度下降狭归,stochastic gradient descent。這個方法速度比較快蓖扑,但是收斂性能不太好唉铜,可能在最優(yōu)點附近晃來晃去,hit不到最優(yōu)點律杠。兩次參數(shù)的更新也有可能互相抵消掉潭流,造成目標函數(shù)震蕩的比較劇烈。
為了克服兩種方法的缺點柜去,現(xiàn)在一般采用的是一種折中手段灰嫉,mini-batch gradient decent,小批的梯度下降嗓奢,這種方法把數(shù)據(jù)分為若干個批讼撒,按批來更新參數(shù),這樣,一個批中的一組數(shù)據(jù)共同決定了本次梯度的方向根盒,下降起來就不容易跑偏钳幅,減少了隨機性。另一方面因為批的樣本數(shù)與整個數(shù)據(jù)集相比小了很多炎滞,計算量也不是很大敢艰。
基本上現(xiàn)在的梯度下降都是基于mini-batch的,所以Keras的模塊中經(jīng)常會出現(xiàn)batch_size册赛,就是指這個钠导。
順便說一句,Keras中用的優(yōu)化器SGD是stochastic gradient descent的縮寫森瘪,但不代表是一個樣本就更新一回牡属,還是基于mini-batch的。
epochs
epochs指的就是訓練次數(shù)扼睬。
原文地址略有改動