這是一個簡單快速入門教程——用Keras搭建神經網絡實現手寫數字識別,它大部分基於Keras的源代碼示例 minst_mlp.py.python
首先,你須要安裝最近版本的Python,再加上一些包Keras,numpy,matplotlib和jupyter.你能夠安裝這些報在全局,可是我建議安裝它們在virtualenv虛擬環境,git
這基本上封裝了一個徹底孤立的Python環境。github
安裝Python包管理器數組
sudo easy_install pip
安裝virtualenv網絡
pip install virtualenv
使用cd ~進入主目錄,並建立一個名爲kerasenv的虛擬環境app
virtualenv kerasenv
再激活這個虛擬環境函數
source kerasenv/bin/activate
如今你能夠安裝前面提到的包到這個環境性能
pip install numpy jupyter keras matplotlib
如下代碼都在Google Colab中運行學習
import numpy as np import matplotlib.pyplot as plt plt.rcParams['figure.figsize'] = (7,7) # Make the figures a bit bigger from keras.datasets import mnist from keras.models import Sequential from keras.layers.core import Dense, Dropout, Activation from keras.utils import np_utils
nb_classes = 10 # the data, shuffled and split between tran and test sets (X_train, y_train), (X_test, y_test) = mnist.load_data() print("X_train original shape", X_train.shape) print("y_train original shape", y_train.shape)
結果:優化
Downloading data from https://s3.amazonaws.com/img-datasets/mnist.npz 11493376/11490434 [==============================] - 0s 0us/step X_train original shape (60000, 28, 28) y_train original shape (60000,)
讓咱們看看訓練集中的一些例子:
for i in range(20): plt.subplot(4,5,i+1) plt.imshow(X_train[i], cmap='gray', interpolation='none') plt.title("Class {}".format(y_train[i]))
對於每個訓練樣本咱們的神經網絡獲得單個的數組,因此咱們須要將28x28的圖片變造成784的向量,咱們還將輸入從[0,255]縮到[0,1].
X_train = X_train.reshape(60000, 784) X_test = X_test.reshape(10000, 784) X_train = X_train.astype('float32') X_test = X_test.astype('float32') X_train /= 255 X_test /= 255 print("Training matrix shape", X_train.shape) print("Testing matrix shape", X_test.shape)
結果:
Training matrix shape (60000, 784)
Testing matrix shape (10000, 784)
將目標矩陣變成one-hot格式
0 -> [1, 0, 0, 0, 0, 0, 0, 0, 0] 1 -> [0, 1, 0, 0, 0, 0, 0, 0, 0] 2 -> [0, 0, 1, 0, 0, 0, 0, 0, 0] etc.
Y_train = np_utils.to_categorical(y_train, nb_classes)
Y_test = np_utils.to_categorical(y_test, nb_classes)
咱們將作一個簡單的三層全鏈接網絡,以下:
model = Sequential() model.add(Dense(512, input_shape=(784,))) model.add(Activation('relu')) # An "activation" is just a non-linear function applied to the output # of the layer above. Here, with a "rectified linear unit", # we clamp all values below 0 to 0. model.add(Dropout(0.2)) # Dropout helps protect the model from memorizing or "overfitting" the training data model.add(Dense(512)) model.add(Activation('relu')) model.add(Dropout(0.2)) model.add(Dense(10)) model.add(Activation('softmax')) # This special "softmax" activation among other things, # ensures the output is a valid probaility distribution, that is # that its values are all non-negative and sum to 1.
結果:
WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/tensorflow/python/framework/op_def_library.py:263: colocate_with (from tensorflow.python.framework.ops) is deprecated and will be removed in a future version. Instructions for updating: Colocations handled automatically by placer. WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/keras/backend/tensorflow_backend.py:3445: calling dropout (from tensorflow.python.ops.nn_ops) with keep_prob is deprecated and will be removed in a future version. Instructions for updating: Please use `rate` instead of `keep_prob`. Rate should be set to `rate = 1 - keep_prob`.
Keras是創建在Theano(如今TensorFlow也是),這兩個包都容許你定義計算圖,而後高效地在CPU或GPU上編譯和運行,而沒有Python解釋器地開銷。
當編譯一個模型,Keras要求你肯定損失函數和優化器,我使用的是分類交叉熵(categorical crossentropy),它是一種很是適合比較兩個機率分佈的函數。
在這裏,咱們的預測是十個不一樣數字的機率分佈(例如,80%認爲這個圖片是3,10%認爲是2,5%認爲是1等),目標是一個機率分佈,正確類別爲100%,其餘全部類別爲0。交叉熵是度量兩個機率分佈差別程度的方法,詳情wiki。
優化器幫助模型快速的學習,同時防止「卡住「和「爆炸」的狀況,咱們不討論其太多的細節,可是「adam」是一個常常使用的好的選擇。
model.compile(loss='categorical_crossentropy', optimizer='adam')
這是有趣的部分:你能夠喂入以前加載好的訓練集到模型,它將學習如何分類數字.
model.fit(X_train, Y_train, batch_size=128, epochs=4, verbose=1, validation_data=(X_test, Y_test))
結果:
Train on 60000 samples, validate on 10000 samples Epoch 1/4 60000/60000 [==============================] - 10s 171us/step - loss: 0.0514 - val_loss: 0.0691 Epoch 2/4 60000/60000 [==============================] - 10s 170us/step - loss: 0.0410 - val_loss: 0.0700 Epoch 3/4 60000/60000 [==============================] - 11s 177us/step - loss: 0.0349 - val_loss: 0.0750 Epoch 4/4 60000/60000 [==============================] - 11s 184us/step - loss: 0.0298 - val_loss: 0.0616 <keras.callbacks.History at 0x7f531f596fd0>
score = model.evaluate(X_test, Y_test, verbose=0) print('Test score:', score)
效果:
Test score: 0.061617326979574866
檢查輸出,檢查輸出並確保一切看起來都很合理,這老是一個好主意。接下來,咱們看一些分類正確的例子和錯誤的例子.
# The predict_classes function outputs the highest probability class # according to the trained classifier for each input example. predicted_classes = model.predict_classes(X_test) # Check which items we got right / wrong correct_indices = np.nonzero(predicted_classes == y_test)[0] incorrect_indices = np.nonzero(predicted_classes != y_test)[0]
plt.figure() for i, correct in enumerate(correct_indices[:9]): plt.subplot(3,3,i+1) plt.imshow(X_test[correct].reshape(28,28), cmap='gray', interpolation='none') plt.title("Predicted {}, Class {}".format(predicted_classes[correct], y_test[correct])) plt.figure() for i, incorrect in enumerate(incorrect_indices[:9]): plt.subplot(3,3,i+1) plt.imshow(X_test[incorrect].reshape(28,28), cmap='gray', interpolation='none') plt.title("Predicted {}, Class {}".format(predicted_classes[incorrect], y_test[incorrect]))
結果:
總之,這是一個完整的程序,在Keras主頁http://keras.io/和githubhttps://github.com/fchollet/keras有其它許多優秀的例子。