使用Keras構建神經網絡的基本工作流程主要可以分為 4個部分。(而這個用法和思路,很像是在使用Scikit-learn中的機器學習方法)
Model definition → Model compilation → Training → Evaluation and Prediction
以下為實踐的步驟:
首先 人為地造一組由 y=0.5x+2 加上一些噪聲而生成的數據,數據量一共有200個,其中160作為train set ,后40作為test set
# # 首先 人為地造一組由 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
繪制出的數據的分布情況如下:
1、首先執行構建模型的
第一步,即 Model Definition:
這一步的作用就是定義NN中的層次結構。為此要引入兩個重要的類,
Sequential和Dense。
from keras.models import Sequential from keras.layers import Dense
(1)Sequential是Keras中構建NN最常用的一種Model(也是最簡單的一種),一個Sequential的Model 就是 a linear stack of layers,也就是說,你只要按順序(使用add()方法)一層一層地順序地添加神經網絡層就可以了。
(2)
Dense表示全連接層,此時它需要接收兩個參數,即輸入的節點數及輸出的節點數,特別地,在一層一層地構建NN時,Keras還可以根據上一層的輸出來推斷下一次的輸入,所以有些全連接層參數可以省略。
在這個簡單的例子中,我們的全連接層只有一層,而且輸入的節點數和輸出的節點數都為1,所以有:
model = Sequential() model.add(Dense(output_dim = 1, input_dim = 1))
2、接下來執行構建模型的
第二步,即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))
3、接下來執行構建模型的
第三步,即 Training:
有兩個選擇:
(1)第一種直接使用 fit,和Scikit-learn特別像!你只要在 fit 方法的參數列表中指定訓練數據(特征向量和label)、訓練的次數和用來做梯度下降的 batch size 就可以了。
model.fit(X_train, Y_train, epochs=100, batch_size=64)
(2)另外一個選擇是你也可以采用下面的語法來 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)
程序輸出結果如下(注意由於存在各種隨機性,每次的輸出未必完全一致):

4、最后進入
第四步: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:',loss_and_metrics) W,b = model.layers[0].get_weights() print('Weights= ',W, '\n biases=',b)
程序輸出結果如下:

那么對一些新的數據進行預測的話,可以使用 predict,而且它的使用也與Scikit-learn中的用法及其相似, 最終我們預測test set 中的每個的點,並繪制預測的模型。
Y_pred =model.predict(X_test)
plt.scatter(X_test,Y_test)
plt.plot(X_test,Y_test)
plt.show()
5、最后附上完整的代碼文件:
import numpy as np import theano.tensor as T import keras from keras import backend as K from keras import initializations # from keras import initializers ###### In Keras 2.0, initializations was renamed (mirror) as initializers. from keras.models import Sequential, Model, load_model, save_model from keras.layers.core import Dense, Lambda, Activation from keras.layers import Embedding, Input, Dense, merge, Reshape, Merge, Flatten from keras.optimizers import Adagrad, Adam, SGD, RMSprop from keras.regularizers import l2 from Dataset import Dataset from evaluate import evaluate_model from time import time import multiprocessing as mp import sys import math import argparse print(keras.__version__) # 使用的默認的Backend: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 # 第一步,即 Model Definition: from keras.models import Sequential from keras.layers import Dense model = Sequential() model.add(Dense(output_dim=1, input_dim=1)) # 第二步,即Model compilation: model.compile(loss='mse',optimizer='sgd') # 第三步,即 Training: # model.fit(X_train,Y_train,epochs=100,batch_size=64) # epochs=100會報錯是怎么回事 # 或者: print('Training ----------------') for step in range(100): cost = model.train_on_batch(X_train,Y_train) if step %20 ==0: print('train cost: ',cost) # 第四步: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:',loss_and_metrics) W,b = model.layers[0].get_weights() print('Weights= ',W, '\n biases=',b) # 那么對一些新的數據進行預測的話,可以使用 predict,而且它的使用也與Scikit-learn中的用法及其相似, # 最終我們預測test set 中的每個的點,並繪制預測的模型。 Y_pred =model.predict(X_test) plt.scatter(X_test,Y_test) plt.plot(X_test,Y_test) plt.show()
【Reference】
1、https://blog.csdn.net/baimafujinji/article/details/78384792