深度学习利用回归算法进行数据预测
机床加工过程中,因热变形产生的热误差占机床加工总误差的40%-70%。热误差值补偿是解决热误差的主流技术,如何将神经网络建模与热误差值预测结合起来,是今天介绍的重点。
本项目研究对象为立式数控加工中心,“立式”指的是主轴竖直放置,那么主轴旋转产生的热量加上主轴自身重力的影响,热形变主要集中在Z向,也就是垂直方向。
-
目标值:热误差值如何测量?
Z向的位移如何测量呢?项目通过采用主轴分析仪测量,主轴分析仪是一款根据电涡流原理测量位移的精密仪器,放置在主轴端面正下方,无限接近主轴的地方。测量值和热误差有什么关系呢?通过这张图很好地反映了。
那么任意时刻i的测量值Li,和主轴停机初始状态下的测量值L1的差值,极为热误差值,
在明确我们的目标值如何测量的情况下,我们接着介绍“多源异构数据”是哪些物理量。 -
“多源异构数据”如何测量?
本项目的数据,还有8温度数据,主轴功率、电流数据。
研究热误差补偿,必不可少的就是温度了,温度如何测量呢?采用磁吸式或者贴片式温度传感器,安装在主轴及主轴外壳8各不同的位置,具体如下:
温度传感器布置完后,再由数据采集卡,将数据汇总至上位机PC端,由PC端二次开发,读取8个温度数据。
至于主轴功率、电流,熟悉机床的应该知道,可以通过数控系统二次开发实时读取数据,这两个数据容易获得。采集到的数据都是“野生数据”,要对数据预处理才能使用。
3.数据预处理
3.1 统一采集频率
项目中各数据的采集频率都不一样,例如,温度的采集频率为:0.01s/次,功率和电流的读取频率为:0.001s/次,Z向热形变量60s/次,因此,要统一各数据的采集频率。项目设计频率为:60s/次。
3.2 明确自变量和因变量,并对自变量归一化和标准化
回归问题的实质是寻求自变量x到因变量y的映射关系,
由于多源异构数据量纲不一致,有的数据10000,有的数据0.001,如果不做预处理直接输入模型,很容易导致模型训练过久,以及难以收敛。因此,归一化和标准化十分重要。归一化和标准化代码如下:
#将数据标准化,自变量需做预处理,标签项不需要
#减去特征平均值,再除以标准差,得到特征平均值为0,标准差为1
mean=train_data.mean(axis=0)
train_data-=mean
std=train_data.std(axis=0)
train_data/=std
#测试数据必须以训练数据的均值和标准差进行变换,这样两者的变换才一致
test_data-=mean
test_data/=std
4.ANN模型搭建
由于本项目数据集较少,一共1905组数据。数据维度(1905,11),划分输入值后的数据维度:(1905,10),输出数据维度:(1905,1)。
训练集:[ :1600],测试集:[1600:]
那么为什么没有验证集呢?
小数据集在建模时,要采用交叉验证的方式进行。
项目采用K折交叉验证,其中k取4。一般情况下k为4或5。
K折交叉验证代码如下:
for i in range(k):
print('第几折:'+str(i))
#验证集
val_data=train_data[i*num_val_samples:(i+1)*num_val_samples]
val_targets=train_targets[i*num_val_samples:(i+1)*num_val_samples]
#训练集
x_train_data=np.concatenate([train_data[:i*num_val_samples],
train_data[(i+1)*num_val_samples:]],axis=0)
y_train_targers=np.concatenate([train_targets[:i*num_val_samples],
train_targets[(i+1)*num_val_samples:]],axis=0)
model=build_model()
#verbose=0代表训练时用的是静默模式
history=model.fit(x=x_train_data,
y=y_train_targers,
validation_data=(val_data,val_targets),
epochs=num_epochs,
batch_size=1,
verbose=1)
#保存验证的平均绝对误差
val_mae_history=history.history['val_mae']
all_val_mae_histories.append(val_mae_history)
#计算所有轮次中K折验证分数的平均值
average_mae_history=[np.mean([x[i] for x in all_val_mae_histories]) for i in range(num_epochs)]
采用keras深度学习框架搭建3层ANN网络模型,模型层数如下:
代码如下:
def build_model():
model=models.Sequential()
model.add(layers.Dense(units=64,activation='relu',input_shape=(10,)))
model.add(layers.Dense(units=64,activation='relu'))
#回归问题的输出问题不需要激活函数,默认就为恒等函数
model.add(layers.Dense(units=1))
#损失函数使用均方误差 监控指标使用平均绝对误差
model.compile(optimizer='rmsprop',loss='mse',metrics=['mae'])
return model
接着就是训练模型,评估模型了,模型评估指标如下:
在迭代100次后,发现验证集在第57次具有最小mae,
取epoch=57,训练模型,验证集的表现为:
我们发现,test_ mae_score = 0.002059,这是什么意思呢?
要注意,本文热形变测量值单位是毫米(mm),这是什么意思呢?比如真实值是100mm,回归的预测误差为0.0025mm,这个效果就很好了。
因此,通过本项目可以发现,深度学习对于热误差预测、补偿都具有很高的精度。
当然在本文最后,要感谢深度学习大师,本文不少代码都是借鉴他的这篇“Keras深度学习(4)-回归问题之预测房价”