我们正在研究如何用更廉价、更高效、鲁棒性更好的方法对大宽度、大深度的神经网路进行调参(hidden layer的层数,每层layer的节点,epochs,batch_size)。
无论如何,先构建一个规模较大的神经网络,要保证训练的时间(即使使用GPU计算)。此神经网络有9个隐含层,每层400个节点,1450401个trainable parameters,是一个预测类的后向反馈神经网络,建立feval值(用以量化某声学设备设计方案的好坏)和15个设计尺寸的函数关系。1.导入依赖库
pandas用以处理矩阵数据,matplotlib用以可视化,keras用以训练后向反馈神经网络。
import pandas as pdimport matplotlib.pyplot as pltfrom keras.models import Sequentialfrom keras.layers.core import Dense,Dropout, Activationfrom 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.将数据归一化,提高训练效率
计算各个特征和标签的平均值和标准差,用来做线性变换将数据归一化,并转化为矩阵格式。data_mean = data_train.mean()data_std = data_train.std()data_train = (data_train - data_mean)/data_stdx_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)
5.训练模型
迭代200次,每一次批量梯度下降使用256个样本。model.fit(x_train, y_train, epochs = 200, batch_size = 256)
最终loss值稳定在0.0035左右
6.测试模型
将data数据归一化后使用训练的模型预测tl值,并保存到excel文件中。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()