Can machines think? –AM Turing
- 写在文前:最近在学机器学习的相关知识,由于相关文档和更新速度的关系选择了当前较为流行的Keras,一个基于python的深度学习框架。学校正在进行一个基于深度学习/强化学习(reinforcement learning)控制水下滑翔机的项目,我学习了一下Keras,并做了一些练习。这篇文章将水下滑翔机作为问题背景介绍一下用Keras和Sequential模型处理回归问题。
问题背景
水下滑翔机(Underwater glider)是通过两个方向上的可动质量块改变横滚角度和航向角度的,同时角度和滑翔机的深度和油量也有关系。现在我们想利用已知的可动质量块/深度/油量数据预测滑翔机的姿态。我们可以建立一个三输入两输出的Sequential模型,利用已有数据和神经网络算法解决这个问题。下面用两个例子说明怎么使用Keras较好地做回归。
Regression的两个例子
下面的内容包括利用Keras拟合一个单输入单输出的函数和一个双输入单输出的函数。
单输入单输出函数拟合
这里使用的函数为:
\[y=cos(arctan(x))\]
Sequential
是多个网络层的线性堆叠。在这个问题中,我们输入量是一个一阶张量,所以可以通过input_dim
来指定输入维度。接下来我们可以建立一个最简单的全连接网络,最后一层的Dense
维度同样为1。同时由于输出量有正有负,使用tanh
作为激活函数。全部代码如下:
|
|
代码大约分为三个部分,首先使用np.linspace
生成数据,接下来将生成的x
和计算得到的y
扔进建好的模型里并fit
。最后使用matplotlib
绘图,观察预测值和真实值。得到的图像如下:
Tips:在做这个的时候发现了几个小问题:
batch_size
不宜过小,不然在数据集上不收敛- 要有足量的数据用于训练,否则容易欠拟合,误差极大
- 准确来说应该分训练集和测试集验证模型的泛化性能,我没干是因为懒
双输入单输出函数拟合
这里使用的函数是:
\[z=sin(\sqrt{x^2+y^2})\] 解决这个问题我们需要引入一个Merge
层将多个Sequential
合并到一个输出,结构如下图所示,图片来自Keras中文文档 在这个问题中,我们要将两个一维张量输入模型,需添加一个
LSTM
层,但是我发现这个所谓的LSTM
层并不能传入一个一维张量,要求数据的shape
必须是二维或以上,不知道是我的打开方式不对还是其他原因,这里存在疑问。为了解决这个问题,我就把输入的两个一维张量reshape
了。下面是代码:
|
|
这个模型和前面提到的是一样的,实现的效果基本上令人满意。程序结构和上一个基本相同,分为三个部分:生成数据,训练数据,验证数据。下面是程序运行的结果图,使用Matplotlib
绘制:
单输入双输出函数拟合
这里使用了两个函数:
\[y=cos(arctan(x))\] \[y=sin(x)\]
在这个问题中我们需要增加一个输出层,代码如下:
|
|
这个说起来并没有什么难的,值的一提的是,在解决这个问题的时候顺便学会了early_stopping
的使用。两个参数一个是monitor
,监视loss
就可以;另一个参数patience
填入一个整数x
,若训练过程中monitor
监视的值不减小x
次,那么就提前结束训练。这样epoch
就可以往大了设置了。
程序运行的结果如下图所示:
小结
嗯,没什么总结的,就这样。愚人节快乐(/ω\)