探索大型神經網絡智能調參(一):構建大規模BPNN

咱們正在研究如何用更廉價、更高效、魯棒性更好的方法對大寬度、大深度的神經網路進行調參(hidden layer的層數,每層layer的節點,epochs,batch_size)。
不管如何,先構建一個規模較大的神經網絡,要保證訓練的時間(即便使用GPU計算)。
此神經網絡有9個隱含層,每層400個節點,1450401個trainable parameters,是一個預測類的後向反饋神經網絡,創建feval值(用以量化某聲學設備設計方案的好壞)和15個設計尺寸的函數關係。網絡

1.導入依賴庫函數

pandas用以處理矩陣數據,matplotlib用以可視化,keras用以訓練後向反饋神經網絡。學習

import pandas as pd
import matplotlib.pyplot as plt
from keras.models import Sequential
from keras.layers.core import Dense,Dropout, Activation
from keras.utils.vis_utils import plot_model

2.導入EXCEL文件中的數據測試

定義輸入文件、輸出文件、模型參數保存文件的目錄;
讀取excel數據,定義15個feature和1個Label;
截取前40000個example做爲訓練數據集。優化

inputfile = 'Dataset.xlsx'
outputfile = 'output.xls'
modelfile = 'modelweight.model'
data = pd.read_excel(inputfile,index='index',sheetname=0)
feature = ['l1','l2','l3','l4','l5',
           'p1','p2','p3','p4','p5',
           'h1','h2','h3','h4','h5']
label = ['feval']
data_train = data.loc[range(0,40000)].copy()

3.將數據歸一化,提升訓練效率
計算各個特徵和標籤的平均值和標準差,用來作線性變換將數據歸一化,並轉化爲矩陣格式。spa

data_mean = data_train.mean()
data_std = data_train.std()
data_train = (data_train - data_mean)/data_std
x_train = data_train[feature].as_matrix()
y_train = data_train[label].as_matrix()

4.創建深度學習模型
Sequential類的模型,輸入層接受15個輸入,輸出到第一個隱藏層的400個神經元中,其後9個隱藏層都接受400個輸入併產生400個輸出。輸入層和隱藏層都採用ReLu做爲激活函數,Dropout機率都爲1%。
採用均方根偏差(mse)值做爲loss value,優化器使用adam。
打印summary,並將結構圖保存爲png文件。設計

model = Sequential()
model.add(Dense(400,input_dim=15,kernel_initializer="uniform"))
model.add(Activation('relu'))
model.add(Dropout(0.01))
model.add(Dense(400,input_dim=400,kernel_initializer="uniform"))
model.add(Activation('relu'))
model.add(Dropout(0.01))
model.add(Dense(400,input_dim=400,kernel_initializer='uniform'))
model.add(Activation('relu'))
model.add(Dropout(0.01))
model.add(Dense(400,input_dim=400,kernel_initializer='uniform'))
model.add(Activation('relu'))
model.add(Dropout(0.01))
model.add(Dense(400,input_dim=400,kernel_initializer='uniform'))
model.add(Activation('relu'))
model.add(Dropout(0.01))
model.add(Dense(400,input_dim=400,kernel_initializer='uniform'))
model.add(Activation('relu'))
model.add(Dropout(0.01))
model.add(Dense(400,input_dim=400,kernel_initializer='uniform'))
model.add(Activation('relu'))
model.add(Dropout(0.01))
model.add(Dense(400,input_dim=400,kernel_initializer='uniform'))
model.add(Activation('relu'))
model.add(Dropout(0.01))
model.add(Dense(400,input_dim=400,kernel_initializer='uniform'))
model.add(Activation('relu'))
model.add(Dropout(0.01))
model.add(Dense(400,input_dim=400,kernel_initializer='uniform'))
model.add(Activation('relu'))
model.add(Dropout(0.01))
model.add(Dense(1,input_dim=400))
model.compile(loss='mean_squared_error', optimizer='adam')
print(model.summary())
plot_model(model, to_file='bpnn_predict_model.png',show_shapes=True)

clipboard.png

5.訓練模型
迭代200次,每一次批量梯度降低使用256個樣本。excel

model.fit(x_train, y_train, epochs = 200, batch_size = 256)

最終loss值穩定在0.0035左右
clipboard.pngcode

6.測試模型
將data數據歸一化後使用訓練的模型預測tl值,並保存到excel文件中。orm

x = ((data[feature] - data_mean[feature])/data_std[feature]).as_matrix()
data[u'feval_pred'] = model.predict(x) * data_std['feval'] + data_mean['feval']
data.to_excel(outputfile)

打印預測值(除去訓練集樣本)並與真實值進行對比。

plt.xlim(6000, 16000)
plt.ylim(6000, 16000)
plt.gca().set_aspect(1)
plt.scatter(data['feval_pred'][40000:],data['feval'][40000:],s=1, c='b', marker='.')
plt.show()

clipboard.png

相關文章
相關標籤/搜索