1. 程式人生 > >Keras例項教程(1)

Keras例項教程(1)

版權宣告:本文為博主原創文章,未經博主允許不得轉載。    https://blog.csdn.net/baimafujinji/article/details/78384792
現在人工智慧,特別是深度學習可謂風光無限,加之各種框架神器層出不窮也令深度學習不再是什麼空中樓閣。由於工具化的趨勢越來越明顯,現在要自行搭建一個深度神經網路已經變得越來越容易。你可能聽說過的框架有TensorFlow、Theano、Torch、Caffe、MXNet等等,今天我們就要來介紹構建神經網路最為容易的一個框架——Keras。之所以說Keras是當前構建神經網路最為容易的框架,就是因為相比於Theano和TensorFlow,你會發現使用Keras,你所需要自行編寫的程式碼是最少的。真是不得不令人感嘆:沒有對比,就沒有傷害。

總的來說,使用Keras構建神經網路的基本工作流程主要可以分為4個部分。而且這個用法和思路我個人感覺,很像是在使用Scikit-learn中的機器學習方法

Model definition → Model compilation → Training → Evaluation and Prediction 

下面我們就通過一個非常簡單的例子來一步一步地演示如果在Keras中構建一個簡單的用於迴歸的神經網路。這個例子基本上跟文章【TensorFlow簡明入門寶典 】中最後給出的那個求解線性迴歸的例子要做的事情是一致的。

首先,我們人為地造一組由 y = 0.5x + 2 加上一些噪聲而生成的資料,資料量一共有200個,其中前160作為train set,後40作為test set。


import numpy as np
import matplotlib.pyplot as plt
 
X = np.linspace(-2, 6, 200)
np.random.shuffle(X)
Y = 0.5 * X + 2 + 0.15 * np.random.randn(200,) 
 
# plot data
plt.scatter(X, Y)
plt.show()
 
X_train, Y_train = X[:160], Y[:160]     # train first 160 data points
X_test, Y_test = X[160:], Y[160:]       # test remaining 40 data points
可以用matplotlib中提供的方法來繪製一下資料的分佈情況:

接下來,我們要執行構建模型的第一步,即Model Definition。這一步的作用就是定義NN中的層次結構。為此要引入兩個重要的類,Sequential和Dense。
from keras.models import Sequential
from keras.layers import Dense
其中Sequential是Keras中構建NN最常用的一種Model(也是最簡單的一種),一個Sequential的Model 就是 a linear stack of layers,也就是說,你只要按順序(使用add()方法)一層一層地順序地新增神經網路層就可以了。而Dense表示全連線層,此時它需要接收兩個引數,即輸入的節點數及輸出的節點數,特別地,在一層一層地構建NN時,Keras還可以根據上一層的輸出來推斷下一次的輸入,所以有些全連線層引數可以省略。

在這個簡單的例子中,我們的全連線層只有一層,而且輸入的節點數和輸出的節點數都為1,所以有:


model = Sequential()
model.add(Dense(output_dim = 1, input_dim = 1))

接下來執行構建模型的第一步,即Model compilation。這一步是要指定模型中的loss function(在這例子中使用的是最小二乘誤差‘mse’),優化器以及metrics等內容。優化器你可以使用系統提供的預設優化器,例如你可以像下面這樣用'sgd'表示隨機梯度下降。

model.compile(loss='mse', optimizer='sgd')
你可以可以像下面這樣自定義優化器中的引數:
from keras.optimizers import SGD
model.compile(loss='mse', optimizer=SGD(lr=0.01, momentum=0.9, nesterov=True))

然後來執行Training的部分。在這一步你可以有兩個選擇。第一種直接使用fit,這個簡直和Scikit-learn中的感覺像極了!你只要在fit方法的引數列表中指定訓練資料(特徵向量和label)、訓練的次數和用來做梯度下降的batch size就可以了。

model.fit(x_train, y_train, epochs=100, batch_size=64)
另外一個選擇是你也可以採用下面的語法來feed batches to your model manually:

model.train_on_batch(x_batch, y_batch)
例如在本例中你可以把訓練部分寫成下面這種形式,其中每20步,我們會輸出一次cost。
print('Training -----------')
for step in range(100):
    cost = model.train_on_batch(X_train, Y_train)
    if step % 20 == 0:
        print('train cost: ', cost)
我的程式輸出結果如下(注意由於存在各種隨機性,每次的輸出未必完全一致):

Training -----------
train cost:  0.0290748
train cost:  0.0276375
train cost:  0.026696
train cost:  0.0260792
train cost:  0.0256752

最後,終於可以進入Evaluation and Prediction的部分了。對於之前預留的測試集來說,你可以使用:

cost = model.evaluate(X_test, Y_test, batch_size=40)
具體來說針對我們現在這個例子則有:
print('\nTesting ------------')
loss_and_metrics = model.evaluate(X_test, Y_test, batch_size=40)
print('test cost:', cost)
W, b = model.layers[0].get_weights()
print('Weights=', W, '\nbiases=', b)
我的程式輸出結果如下:
Testing ------------
40/40 [==============================] - 0s
test cost: 0.0254213
Weights= [[ 0.50829154]] 
biases= [ 1.9707619]

對一些新的資料來進行預測,那麼你可以使用predict,而且它的使用也與Scikit-learn中的用法及其相似,最終我們預測test set中每個的點,並繪製預測的模型。

Y_pred = model.predict(X_test)
plt.scatter(X_test, Y_test)
plt.plot(X_test, Y_pred)
plt.show()
輸出之圖形如下:


最後,我個人認為【1】是入門Keras的一個非常好的Talk。另外,本文的jupyter notebook檔案,你可以從下面的連結【3】中獲取到。

參考文獻:

【1】https://www.youtube.com/watch?v=OUMDUq5OJLg (需要自備梯子)

【2】https://keras.io/#getting-started-30-seconds-to-keras

【3】https://pan.baidu.com/s/1jI8CgHw

(本文完)
--------------------- 
作者:白馬負金羈 
來源:CSDN 
原文:https://blog.csdn.net/baimafujinji/article/details/78384792 
版權宣告:本文為博主原創文章,轉載請附上博文連結!