(本文所使用的 Python 库和版本号: Python 3.6, Numpy 1.14, scikit-learn 0.19, matplotlib 2.2 )
前面我们介绍了神经网络的基本结构单元 - 感知器, 现在我们再升一级, 看看神经网络的基本结构和训练方法.
1. 单层神经网络
单层神经网络由一个层次中的多个神经元组成, 总体来看, 单层神经网络的结构是: 一个输入层, 一个隐含层, 一个输出层. 如下为结构示意图.
图中描述的是前向网络, 但其反向传播网络的结构也是一样的. 蓝色方框表示输入层, 绿色圆圈表示隐含层, 输出层没有绘制出来. 图片来源于 2017/7/20 朱兴全教授学术讲座观点与总结第二讲: 单个神经元 / 单层神经网络.
也可以从下图中看出单层神经网络的基本结构:
那么从代码上怎么创建单层神经网络, 并对其进行训练呢?
1.1 加载数据集
首先我们加载数据集, 该数据集很简单, 包含 16 行, 四列, 前两列是 double 型数据, 构成了特征列, 后两列是整数(0 或 1), 构成了标签列. 加载方式很简单, 前面讲过多次, 此处只把该数据集中特征列的分布情况绘制出来. 如下
1.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 变化图绘制出来可以得到:
1.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 https://github.com/RayDean/DeepLearning ) 上, 欢迎下载.
参考资料:
1, Python 机器学习经典实例, Prateek Joshi 著, 陶俊杰, 陈小莉译
来源: https://juejin.im/post/5bdbc14e6fb9a049e129a0d0