1. 程式人生 > >用keras建立擬合網路解決迴歸問題Regression

用keras建立擬合網路解決迴歸問題Regression

實現了正弦曲線的擬合,即regression問題。

建立的模型單輸入單輸出,兩個隱層分別為100、50個神經元。

在keras的官方文件中,給的例子多是關於分類的。因此在測試regression時,遇到了一些問題。總結來說,應注意以下幾個方面:

1)訓練資料需是矩陣型,這裡的輸入和輸出是1000*1,即1000個樣本;每個樣本得到一個輸出;

注意:訓練資料的生成非常關鍵,首先需要檢查輸入資料和輸出資料的維度匹配;

2)對資料進行規範化,這裡用到的是零均值單位方差的規範方法。規範化方法對於各種訓練模型很有講究,具體參照另一篇筆記:http://blog.csdn.net/csmqq/article/details/51461696;

3)輸出層的啟用函式選擇很重要,該擬合的輸出有正負值,因此選擇tanh比較合適;

4)regression問題中,訓練函式compile中的誤差函式通常選擇mean_squared_error。

5)值得注意的是,在訓練時,可以將測試資料的輸入和輸出繪製出來,這樣可以幫助除錯引數。

6)keras中實現迴歸問題,返回的準確率為0。

  1. # -*- coding: utf-8 -*-
  2. """ 
  3. Created on Mon May 16 13:34:30 2016 
  4. @author: Michelle 
  5. """
  6. from keras.models import Sequential      
  7. from keras.layers.core import Dense, Activation     
  8. from keras.optimizers import SGD  
  9. from keras.layers.advanced_activations import LeakyReLU  
  10. from sklearn import preprocessing  
  11. from keras.utils.visualize_plots import figures  
  12. import matplotlib.pyplot as plt  
  13. import numpy as np      
  14. #part1: train data  
  15. #generate 100 numbers from -2pi to 2pi    
  16. x_train = np.linspace(-2*np.pi, 2*np.pi, 1000)  #array: [1000,]  
  17. x_train = np.array(x_train).reshape((len(x_train), 1)) #reshape to matrix with [100,1]
  18. n=0.1*np.random.rand(len(x_train),1#generate a matrix with size [len(x),1], value in (0,1),array: [1000,1]  
  19. y_train=np.sin(x_train)+n  
  20. #訓練資料集:零均值單位方差
  21. x_train = preprocessing.scale(x_train)  
  22. scaler = preprocessing.StandardScaler().fit(x_train)   
  23. y_train = scaler.transform(y_train)  
  24. #part2: test data  
  25. x_test = np.linspace(-5,5,2000)    
  26. x_test = np.array(x_test).reshape((len(x_test), 1))  
  27. y_test=np.sin(x_test)  
  28. #零均值單位方差
  29. x_test = scaler.transform(x_test)  
  30. #y_test = scaler.transform(y_test)
  31. ##plot testing data
  32. #fig, ax = plt.subplots()
  33. #ax.plot(x_test, y_test,'g')
  34. #prediction data
  35. x_prd = np.linspace(-3,3,101)    
  36. x_prd = np.array(x_prd).reshape((len(x_prd), 1))  
  37. x_prd = scaler.transform(x_prd)  
  38. y_prd=np.sin(x_prd)  
  39. #plot testing data
  40. fig, ax = plt.subplots()  
  41. ax.plot(x_prd, y_prd,'r')  
  42. #part3: create models, with 1hidden layers    
  43. model = Sequential()      
  44. model.add(Dense(100, init='uniform', input_dim=1))      
  45. #model.add(Activation(LeakyReLU(alpha=0.01))) 
  46. model.add(Activation('relu'))  
  47. model.add(Dense(50))      
  48. #model.add(Activation(LeakyReLU(alpha=0.1))) 
  49. model.add(Activation('relu'))  
  50. model.add(Dense(1))      
  51. #model.add(Activation(LeakyReLU(alpha=0.01))) 
  52. model.add(Activation('tanh'))  
  53. #sgd = SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True)
  54. model.compile(loss='mean_squared_error', optimizer="rmsprop", metrics=["accuracy"])  
  55. #model.compile(loss='mean_squared_error', optimizer=sgd, metrics=["accuracy"])
  56. #model.fit(x_train, y_train, nb_epoch=64, batch_size=20, verbose=0)   
  57. hist = model.fit(x_test, y_test, batch_size=10, nb_epoch=100, shuffle=True,verbose=0,validation_split=0.2)  
  58. #print(hist.history)
  59. score = model.evaluate(x_test, y_test, batch_size=10)  
  60. out = model.predict(x_prd, batch_size=1)  
  61. #plot prediction data
  62. ax.plot(x_prd, out, 'k--', lw=4)  
  63. ax.set_xlabel('Measured')  
  64. ax.set_ylabel('Predicted')  
  65. plt.show()  
  66. figures(hist)  


虛線是預測值,紅色是輸入值;


繪製誤差值隨著迭代次數的曲線函式是Visualize_plots.py,

1)將其放在C:\Anaconda2\Lib\site-packages\keras\utils下面。

2)在使用時,需要新增這句話:from keras.utils.visualize_plots import figures,然後在程式中直接呼叫函式figures(hist)。

垓函式的實現程式碼為:

  1. # -*- coding: utf-8 -*-
  2. """ 
  3. Created on Sat May 21 22:26:24 2016 
  4. @author: Shemmy 
  5. """
  6. def figures(history,figure_name="plots"):  
  7.     """ method to visualize accuracies and loss vs epoch for training as well as testind data\n 
  8.         Argumets: history     = an instance returned by model.fit method\n 
  9.                   figure_name = a string representing file name to plots. By default it is set to "plots" \n 
  10.        Usage: hist = model.fit(X,y)\n              figures(hist) """
  11.     from keras.callbacks import History  
  12.     if isinstance(history,History):  
  13.         import matplotlib.pyplot as plt  
  14.         hist     = history.history   
  15.         epoch    = history.epoch  
  16.         acc      = hist['acc']  
  17.         loss     = hist['loss']  
  18.         val_loss = hist['val_loss']  
  19.         val_acc  = hist['val_acc']  
  20.         plt.figure(1)  
  21.         plt.subplot(221)  
  22.         plt.plot(epoch,acc)  
  23.         plt.title("Training accuracy vs Epoch")  
  24.         plt.xlabel("Epoch")  
  25.         plt.ylabel("Accuracy")       
  26.         plt.subplot(222)  
  27.         plt.plot(epoch,loss)  
  28.         plt.title("Training loss vs Epoch")  
  29.         plt.xlabel("Epoch")  
  30.         plt.ylabel("Loss")    
  31.         plt.subplot(223)  
  32.         plt.plot(epoch,val_acc)  
  33.         plt.title("Validation Acc vs Epoch")  
  34.         plt.xlabel("Epoch")  
  35.         plt.ylabel("Validation Accuracy")    
  36.         plt.subplot(224)  
  37.         plt.plot(epoch,val_loss)  
  38.         plt.title("Validation loss vs Epoch")  
  39.         plt.xlabel("Epoch")  
  40.         plt.ylabel("Validation Loss")    
  41.         plt.tight_layout()  
  42.         plt.savefig(figure_name)  
  43.     else:  
  44.         print"Input Argument is not an instance of class History"

討論keras中實現擬合迴歸問題的帖子: https://github.com/fchollet/keras/issues/108