【火炉炼AI】深度学习002-构建并训练单层神经网络模型
【火炉炼AI】深度学习002-构建并训练单层神经网络模型
(本文所使用的Python库和版本号: Python 3.6, Numpy 1.14, scikit-learn 0.19, matplotlib 2.2 )
前面我们介绍了神经网络的基本结构单元-感知器,现在我们再升一级,看看神经网络的基本结构和训练方法。
1. 单层神经网络
单层神经网络由一个层次中的多个神经元组成,总体来看,单层神经网络的结构是:一个输入层,一个隐含层,一个输出层。如下为结构示意图。
image图中描述的是前向网络,但其反向传播网络的结构也是一样的。蓝色方框表示输入层,绿色圆圈表示隐含层,输出层没有绘制出来。图片来源于2017/7/20 朱兴全教授学术讲座观点与总结第二讲:单个神经元/单层神经网络。
也可以从下图中看出单层神经网络的基本结构:
image那么从代码上怎么创建单层神经网络,并对其进行训练呢?
1.1 加载数据集
首先我们加载数据集,该数据集很简单,包含16行,四列,前两列是double型数据,构成了特征列,后两列是整数(0或1),构成了标签列。加载方式很简单,前面讲过多次,此处只把该数据集中特征列的分布情况绘制出来。如下
image1.2 建立模型并训练
数据集准备完成后, 就需要构建单层神经网络模型,并对其进行训练。
# 构建单层NN模型,该模型的隐含层含有两个感知器
import neurolab as nl
x_min, x_max = dataset_X[:,0].min(), dataset_X[:,0].max()
y_min, y_max = dataset_X[:,1].min(), dataset_X[:,1].max()
single_layer_net = nl.net.newp([[x_min, x_max], [y_min, y_max]], 2) # 隐含层含有两个神经元
# 所以本单层NN模型含有两个输入神经元,两个隐含层神经元,两个输出神经元
cost = single_layer_net.train(dataset_X, dataset_y, epochs=50, show=2, lr=0.01)
# 训练该单层NN模型,50个回合,每2个回合显示一下训练结果,学习速率为0.01
-------------------------------------输---------出--------------------------------
Epoch: 2; Error: 7.5;
Epoch: 4; Error: 7.0;
Epoch: 6; Error: 4.0;
Epoch: 8; Error: 4.0;
Epoch: 10; Error: 4.0;
Epoch: 12; Error: 4.0;
Epoch: 14; Error: 4.0;
Epoch: 16; Error: 4.0;
Epoch: 18; Error: 4.0;
Epoch: 20; Error: 4.0;
Epoch: 22; Error: 4.0;
Epoch: 24; Error: 4.0;
Epoch: 26; Error: 4.0;
Epoch: 28; Error: 4.0;
Epoch: 30; Error: 4.0;
Epoch: 32; Error: 4.0;
Epoch: 34; Error: 4.0;
Epoch: 36; Error: 4.0;
Epoch: 38; Error: 4.0;
Epoch: 40; Error: 4.0;
Epoch: 42; Error: 4.0;
Epoch: 44; Error: 4.0;
Epoch: 46; Error: 4.0;
Epoch: 48; Error: 4.0;
Epoch: 50; Error: 4.0;
The maximum number of train epochs is reached
--------------------------------------------完-------------------------------------
可以看出在第6个回合时,cost就达到最低,并不再变化,表示已经收敛,再提高训练回合数也用处不大。将Error变化图绘制出来可以得到:
image1.3 使用训练好的模型来预测新样本
训练后的模型肯定是要用它来预测新样本,期望它能对从来没有见过的新样本也能得到理想的结果。
预测的代码为:
# 用训练好的模型来预测新样本
new_samples=np.array([[0.3, 4.5],
[4.5, 0.5],
[4.3, 8]])
print(single_layer_net.sim(new_samples))
-------------------------------------输---------出--------------------------------
[[0. 0.]
[1. 0.]
[1. 1.]]
--------------------------------------------完-------------------------------------
单单从结果上来看,我们成功的构建了单层NN模型并对其进行训练,通过训练后的模型来成功预测了新样本,一般的,一个深度学习模型流程就是这样的。
单层神经网络模型虽然结构简单,训练很快,比较适合一些简单问题,对于复杂一些的问题,这个模型就会力不从心,并且,有时我们的优化方法并不一定能够找到所希望的优化参数,也找不到所需要的拟合函数,由于模型比较简单,难以学习到复杂的内在机理,很容易产生欠拟合。
########################小**********结###############################
1,单层神经网络模型结构简单,训练耗时短,能够解决的问题也相对比较简单,对于比较复杂的问题会出现欠拟合,故而应用上受到一定限制,目前直接使用单层神经网络模型的情况非常少。
#################################################################
注:本部分代码已经全部上传到(我的github)上,欢迎下载。
参考资料:
1, Python机器学习经典实例,Prateek Joshi著,陶俊杰,陈小莉译