天天看點

Keras一些基本概念符号計算張量‘th’與’tf’泛型模型Batch

符号計算

Keras的底層庫使用Theano或TensorFlow,這兩個庫也稱為Keras的後端,無論事Theano還是TensorFlow,都是一個符号主義的庫。

關于符号主義,可以一般概括為這種說法:符号主義的計算首先定義各種變量,然後建立一個“計算圖”,計算圖規定了各個變量之間的計算關系。建立好的計算圖需要編譯已确定其内部細節,然而,此時的計算圖還是一個“空殼子”,裡面沒有任何實際的資料,隻有當你把需要運算的輸入放進去後,才能在整個模型中形成資料流,進而形成輸出值。

Keras的模型搭建形式就是這種方法,在你搭建Keras模型完畢後,你的模型就是一個空殼子,隻有實際生成可調用的函數後(K.function),輸入資料,才會形成真正的資料流。

使用計算圖的語言,如Theano,以難以調試而聞名,當Keras的Debug進入Theano這個層次時,往往也令人頭痛。沒有經驗的開發者很難直覺的感受到計算圖到底在幹些什麼。盡管很讓人頭痛,但大多數的深度學習架構使用的都是符号計算這一套方法,因為符号計算能夠提供關鍵的計算優化、自動求導等功能。

張量

前面的概念中提到并解釋了這個詞,該詞本身還是兼具多個學科的,而這裡的用到的相對來說較簡單一些。

張量,或tensor,是本文檔會經常出現的一個詞彙,在此稍作解釋。

使用這個詞彙的目的是為了表述統一,張量可以看作是向量、矩陣的自然推廣,我們用張量來表示廣泛的資料類型。

規模最小的張量是0階張量,即标量,也就是一個數。

當我們把一些數有序的排列起來,就形成了1階張量,也就是一個向量

如果我們繼續把一組向量有序的排列起來,就形成了2階張量,也就是一個矩陣

把矩陣摞起來,就是3階張量,我們可以稱為一個立方體,具有3個顔色通道的彩色圖檔就是一個這樣的立方體

把矩陣摞起來,好吧這次我們真的沒有給它起别名了,就叫4階張量了,不要去試圖想像4階張量是什麼樣子,它就是個數學上的概念。

‘th’與’tf’

‘th’模式,也即Theano模式會把100張RGB三通道的16×32(高為16寬為32)彩色圖表示為下面這種形式(100,3,16,32),Caffe采取的也是這種方式。第0個次元是樣本維,代表樣本的數目,第1個次元是通道維,代表顔色通道數。後面兩個就是高和寬了。

而TensorFlow,即‘tf’模式的表達形式是(100,16,32,3),即把通道維放在了最後。這兩個表達方法本質上沒有什麼差別。

泛型模型

在原本的Keras版本中,模型其實有兩種,一種叫Sequential,稱為序貫模型,也就是單輸入單輸出,一條路通到底,層與層之間隻有相鄰關系,跨層連接配接統統沒有。這種模型編譯速度快,操作上也比較簡單。第二種模型稱為Graph,即圖模型,這個模型支援多輸入多輸出,層與層之間想怎麼連怎麼連,但是編譯速度慢。可以看到,Sequential其實是Graph的一個特殊情況。

在現在這版Keras中,圖模型被移除,而增加了了“functional model API”,這個東西,更加強調了Sequential是特殊情況這一點。一般的模型就稱為Model,然後如果你要用簡單的Sequential,OK,那還有一個快捷方式Sequential。

由于functional model API表達的是“一般的模型”這個概念,我們将其譯為泛型模型,即隻要這個東西接收一個或一些張量作為輸入,然後輸出的也是一個或一些張,不管它是什麼鬼。統統都稱作“模型”。

Batch

其實我之前看到這個參數設定的時候,一直沒搞懂,今天來整理一下吧。

這詞設計到訓練過程中如何優化,嘿嘿,那就提到了深度學習的優化算法,說白了就是梯度下降。每次的參數更新有兩種方式。

第一種,周遊全部資料集算一次損失函數,然後算函數對各個參數的梯度,更新梯度。這種方法每更新一次參數都要把資料集裡的所有樣本都看一遍,計算量開銷大,計算速度慢,不支援線上學習,這稱為Batch gradient descent,批梯度下降。

另一種,每看一個資料就算一下損失函數,然後求梯度更新參數,這個稱為随機梯度下降,stochastic gradient descent。這個方法速度比較快,但是收斂性能不太好,可能在最優點附近晃來晃去,hit不到最優點。兩次參數的更新也有可能互相抵消掉,造成目标函數震蕩的比較劇烈。

為了克服兩種方法的缺點,現在一般采用的是一種折中手段,mini-batch gradient decent,小批的梯度下降,這種方法把資料分為若幹個批,按批來更新參數,這樣,一個批中的一組資料共同決定了本次梯度的方向,下降起來就不容易跑偏,減少了随機性。另一方面因為批的樣本數與整個資料集相比小了很多,計算量也不是很大。

基本上現在的梯度下降都是基于mini-batch的,是以Keras的子產品中經常會出現batch_size,就是指這個。

順便說一句,Keras中用的優化器SGD是stochastic gradient descent的縮寫,但不代表是一個樣本就更新一回,還是基于mini-batch的。

繼續閱讀