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

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

作者: 科技老丁哥 | 来源:发表于2018-11-02 10:33 被阅读6次

    【火炉炼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),构成了标签列。加载方式很简单,前面讲过多次,此处只把该数据集中特征列的分布情况绘制出来。如下

    image

    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变化图绘制出来可以得到:

    image

    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著,陶俊杰,陈小莉译

    相关文章

      网友评论

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

        本文链接:https://www.haomeiwen.com/subject/rnyqxqtx.html