探索大型神经网络智能调参(一):构建大规模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.将数据归一化,提高训练效率
计算各个特征和标签的平均值和标准差,用来做线性变换将数据归一化,并转化为矩阵格式。

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)

探索大型神经网络智能调参(一):构建大规模BPNN

5.训练模型
迭代200次,每一次批量梯度下降使用256个样本。

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

最终loss值稳定在0.0035左右
探索大型神经网络智能调参(一):构建大规模BPNN

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()

探索大型神经网络智能调参(一):构建大规模BPNN

相关推荐