• 【火炉炼AI】深度学习002-构建并训练单层神经网络模型


    【火炉炼AI】深度学习002-构建并训练单层神经网络模型

    (本文所使用的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)上,欢迎下载。

    参考资料:

    1, Python机器学习经典实例,Prateek Joshi著,陶俊杰,陈小莉译

  • 相关阅读:
    MS CRM 2011 RC中的新特性(4)——活动方面之批量编辑、自定义活动
    最近的一些有关MS CRM 2011的更新
    MS CRM 2011 RC中的新特性(6)——连接
    MS CRM 2011 RC中的新特性(7)—仪表板
    参加MS CRM2011深度培训课程——第一天
    MS CRM 2011插件调试工具
    MS CRM2011实体介绍(四)——目标管理方面的实体
    MS CRM 2011 RC中的新特性(3)——客户服务管理方面
    MS CRM 2011 RC中的新特性(8)—数据管理
    ExtAspNet 登陆
  • 原文地址:https://www.cnblogs.com/RayDean/p/9894885.html
Copyright © 2020-2023  润新知