1. 程式人生 > >深度學習之路:(一)Keras中mnist資料集測試

深度學習之路:(一)Keras中mnist資料集測試

Keras環境搭建

本地環境 MacOS

一、安裝Anaconda

1、下載Anaconda最新版本:官網下載地址

anaconda3.png

2、下載後直接安裝,點選next

3、檢測版本

  • 開啟終端
  • 輸入conda --v
  • 如顯示如下,則安裝成功。
shiqingdeMacBook-Air:~ shiqingwang$ conda --v
conda 4.4.9

二、安裝Keras

1、開啟Anaconda-Navigator

  • 依次點選 Environments -> anaconda3 -> open Terminal
# GPU 版本
pip install --upgrade tensorflow-gpu

# CPU 版本
pip install --upgrade tensorflow

# Keras 安裝
pip install keras -U --pre

install.png

2、檢測是否安裝成功Keras

  • 在已安裝模組中搜索,keras,若如下,則安裝成功

keras.png

三、Keras中mnist資料集測試

1、 下載Keras開發包

conda install git
git clone https://github.com/fchollet/keras.git
cd keras/examples/
python mnist_mlp.py

2、執行出錯

出現網路連線錯誤,下載超時,聯想到昨晚大佬發的部落格:解決Tensorflow讀取MNIST資料集時網路超時問題,想到解決方案。

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "mnist_mlp.py", line 21, in <module>
    (x_train, y_train), (x_test, y_test) = mnist.load_data()
  File "/anaconda3/lib/python3.6/site-packages/keras/datasets/mnist.py"
, line 23, in load_data file_hash='8a61469f7ea1b51cbae51d4f78837e45') File "/anaconda3/lib/python3.6/site-packages/keras/utils/data_utils.py", line 225, in get_file raise Exception(error_msg.format(origin, e.errno, e.reason)) Exception: URL fetch failure on https://s3.amazonaws.com/img-datasets/mnist.npz: None -- [Errno 60] Operation timed out

3、解決方案

第一次執行的時候,會在https://s3.amazonaws.com/img-datasets/mnist.npz下載資料集到~/.keras/datasets,而第二次執行的時候直接就開始執行,不會再下載一次。

  • 手動下載mnist.npz資料集
  • 移動到資料集mnist.npz 到目錄:~/.keras/datasets
shiqingdeMacBook-Air:datasets shiqingwang$ cp ~/Downloads/mnist.npz .
shiqingdeMacBook-Air:datasets shiqingwang$ ls
mnist.npz
shiqingdeMacBook-Air:datasets shiqingwang$ pwd
/Users/shiqingwang/.keras/datasets
  • 修改/keras/keras/datasets/mnist.py檔案的load_data程式碼
# path = get_file(path,
#                 origin='https://s3.amazonaws.com/img-datasets/mnist.npz',
#                 file_hash='8a61469f7ea1b51cbae51d4f78837e45')
path = get_file('/Users/shiqingwang/.keras/datasets/mnist.npz')
  • 再次執行 python mnist_mlp.py
    mnist_mlp.py

如此就可以運行了,結果可以達到98.39%

轉載一些基礎知識

1、符號計算

Keras由純Python編寫而成並基Tensorflow、Theano以及CNTK後端。這幾個庫也稱為Keras的後端,無論Theano還是TensorFlow,都是一個符號主義的庫。
關於符號主義,可以一般概括為這種說法:符號主義的計算首先定義各種變數,然後建立一個“計算圖”,計算圖規定了各個變數之間的計算關係。建立好的計算圖需要編譯已確定其內部細節,然而,此時的計算圖還是一個“空殼子”,裡面沒有任何實際的資料,只有當你把需要運算的輸入放進去後,才能在整個模型中形成資料流,從而形成輸出值。
Keras的模型搭建形式就是這種方法,在你搭建Keras模型完畢後,你的模型就是一個空殼子,只有實際生成可呼叫的函式後(K.function),輸入資料,才會形成真正的資料流。
使用計算圖的語言,如Theano,以難以除錯而聞名,當Keras的Debug進入Theano這個層次時,往往也令人頭痛。沒有經驗的開發者很難直觀的感受到計算圖到底在幹些什麼。儘管很讓人頭痛,但大多數的深度學習框架使用的都是符號計算這一套方法,因為符號計算能夠提供關鍵的計算優化、自動求導等功能。

2、張量

前面的概念中提到並解釋了這個詞,該詞本身還是兼具多個學科的,而這裡的用到的相對來說較簡單一些。
張量,或tensor,是本文件會經常出現的一個詞彙,在此稍作解釋。
使用這個詞彙的目的是為了表述統一,張量可以看作是向量、矩陣的自然推廣,我們用張量來表示廣泛的資料型別。
規模最小的張量是0階張量,即標量,也就是一個數。
當我們把一些數有序的排列起來,就形成了1階張量,也就是一個向量
如果我們繼續把一組向量有序的排列起來,就形成了2階張量,也就是一個矩陣
把矩陣摞起來,就是3階張量,我們可以稱為一個立方體,具有3個顏色通道的彩色圖片就是一個這樣的立方體
把矩陣摞起來,好吧這次我們真的沒有給它起別名了,就叫4階張量了,不要去試圖想像4階張量是什麼樣子,它就是個數學上的概念。

3、‘th’與’tf’

‘th’模式,也即Theano模式會把100張RGB三通道的16×32(高為16寬為32)彩色圖表示為下面這種形式(100,3,16,32),Caffe採取的也是這種方式。第0個維度是樣本維,代表樣本的數目,第1個維度是通道維,代表顏色通道數。後面兩個就是高和寬了。
而TensorFlow,即‘tf’模式的表達形式是(100,16,32,3),即把通道維放在了最後。這兩個表達方法本質上沒有什麼區別。

4、泛型模型

在原本的Keras版本中,模型其實有兩種,一種叫Sequential,稱為序貫模型,也就是單輸入單輸出,一條路通到底,層與層之間只有相鄰關係,跨層連線統統沒有。這種模型編譯速度快,操作上也比較簡單。第二種模型稱為Graph,即圖模型,這個模型支援多輸入多輸出,層與層之間想怎麼連怎麼連,但是編譯速度慢。可以看到,Sequential其實是Graph的一個特殊情況。
在現在這版Keras中,圖模型被移除,而增加了了“functional model API”,這個東西,更加強調了Sequential是特殊情況這一點。一般的模型就稱為Model,然後如果你要用簡單的Sequential,OK,那還有一個快捷方式Sequential。
由於functional model API表達的是“一般的模型”這個概念,我們將其譯為泛型模型,即只要這個東西接收一個或一些張量作為輸入,然後輸出的也是一個或一些張,不管它是什麼鬼。統統都稱作“模型”。

5、Batch

其實我之前看到這個引數設定的時候,一直沒搞懂,今天來整理一下吧。
這詞設計到訓練過程中如何優化,嘿嘿,那就提到了深度學習的優化演算法,說白了就是梯度下降。每次的引數更新有兩種方式。
第一種,遍歷全部資料集算一次損失函式,然後算函式對各個引數的梯度,更新梯度。這種方法每更新一次引數都要把資料集裡的所有樣本都看一遍,計算量開銷大,計算速度慢,不支援線上學習,這稱為Batch gradient descent,批梯度下降。
另一種,每看一個數據就算一下損失函式,然後求梯度更新引數,這個稱為隨機梯度下降,stochastic gradient descent。這個方法速度比較快,但是收斂效能不太好,可能在最優點附近晃來晃去,hit不到最優點。兩次引數的更新也有可能互相抵消掉,造成目標函式震盪的比較劇烈。
為了克服兩種方法的缺點,現在一般採用的是一種折中手段,mini-batch gradient decent,小批的梯度下降,這種方法把資料分為若干個批,按批來更新引數,這樣,一個批中的一組資料共同決定了本次梯度的方向,下降起來就不容易跑偏,減少了隨機性。另一方面因為批的樣本數與整個資料集相比小了很多,計算量也不是很大。
基本上現在的梯度下降都是基於mini-batch的,所以Keras的模組中經常會出現batch_size,就是指這個。
順便說一句,Keras中用的優化器SGD是stochastic gradient descent的縮寫,但不代表是一個樣本就更新一回,還是基於mini-batch的。