当前位置: 首页 > 面试题库 >

如何创建简单的三层神经网络并使用监督学习进行教学?

帅雅逸
2023-03-14
问题内容

基于PyBrain的教程,我设法将以下代码组合在一起:

#!/usr/bin/env python2
# coding: utf-8

from pybrain.structure import FeedForwardNetwork, LinearLayer, SigmoidLayer, FullConnection
from pybrain.datasets import SupervisedDataSet
from pybrain.supervised.trainers import BackpropTrainer

n = FeedForwardNetwork()

inLayer = LinearLayer(2)
hiddenLayer = SigmoidLayer(3)
outLayer = LinearLayer(1)

n.addInputModule(inLayer)
n.addModule(hiddenLayer)
n.addOutputModule(outLayer)

in_to_hidden = FullConnection(inLayer, hiddenLayer)
hidden_to_out = FullConnection(hiddenLayer, outLayer)

n.addConnection(in_to_hidden)
n.addConnection(hidden_to_out)

n.sortModules()

ds = SupervisedDataSet(2, 1)
ds.addSample((0, 0), (0,))
ds.addSample((0, 1), (1,))
ds.addSample((1, 0), (1,))
ds.addSample((1, 1), (0,))

trainer = BackpropTrainer(n, ds)
# trainer.train()
trainer.trainUntilConvergence()

print n.activate([0, 0])[0]
print n.activate([0, 1])[0]
print n.activate([1, 0])[0]
print n.activate([1, 1])[0]

本来应该学习XOR函数的,但是结果似乎很随机:

0.208884929522

0.168926515771

0.459452834043

0.424209192223

要么

0.84956138664

0.888512762786

0.564964077401

0.611111147862


问题答案:

您的方法有四个问题,在阅读《神经网络常见问题》后都可以轻松找到:

  • 为什么要使用偏置/阈值?:您应该添加一个偏置节点。偏见的缺乏使学习非常有限:网络代表的分离的超平面只能通过原点。使用bias节点,它可以自由移动并更好地拟合数据:

    bias = BiasUnit()
    

    n.addModule(bias)

    bias_to_hidden = FullConnection(bias, hiddenLayer)
    n.addConnection(bias_to_hidden)

  • 为什么不将二进制输入编码为0和1?:所有样本都位于样本空间的一个象限中。移动它们使其分散在原点周围:

    ds = SupervisedDataSet(2, 1)
    

    ds.addSample((-1, -1), (0,))
    ds.addSample((-1, 1), (1,))
    ds.addSample((1, -1), (1,))
    ds.addSample((1, 1), (0,))

(相应地,将验证码固定在脚本的末尾。)

  • trainUntilConvergence该方法使用验证工作,并且执行类似于早期停止方法的操作。对于这么小的数据集,这没有任何意义。使用trainEpochs代替。1000对于这个问题,时代对于网络而言已经足够了:

    trainer.trainEpochs(1000)
    
  • 反向传播应使用哪种学习率?:调整学习率参数。每当您使用神经网络时,便会执行此操作。在这种情况下,该值0.1甚至会0.2大大提高学习速度:

    trainer = BackpropTrainer(n, dataset=ds, learningrate=0.1, verbose=True)
    

(请注意verbose=True参数。调整参数时,观察错误的行为至关重要。)

有了这些修复程序,我就可以针对具有给定数据集的给定网络获得一致且正确的结果,并且误差小于1e-23



 类似资料:
  • 校验者: @不将就 翻译者: @夜神月 2.13.1. 限制波尔兹曼机 Restricted Boltzmann machines (RBM)(限制玻尔兹曼机)是基于概率模型的无监督非线性特征学习器。当用 RBM 或 RBMs 中的层次结构提取的特征在馈入线性分类器(如线性支持向量机或感知机)时通常会获得良好的结果。 该模型对输入的分布作出假设。目前,scikit-learn 只提供了 Berno

  • 校验者: @tiantian1412 @火星 翻译者: @A Warning 此实现不适用于大规模数据应用。 特别是 scikit-learn 不支持 GPU。如果想要提高运行速度并使用基于 GPU 的实现以及为构建深度学习架构提供更多灵活性的框架,请参阅 Related Projects 。 1.17.1. 多层感知器 多层感知器(MLP) 是一种监督学习算法,通过在数据集上训练来学习函数 ,其

  • 在场景1中,我有一个多层稀疏自动编码器,它试图再现我的输入,所以我的所有层都使用随机启动的权重进行训练。没有监督层,在我的数据上,这没有学到任何相关信息(代码运行良好,经过验证,因为我已经在许多其他深层神经网络问题中使用过它) 在场景2中,我只是在贪婪的逐层训练中训练多个自动编码器,类似于深度学习(但最终没有监督步骤),每一层都在前一个自动编码器的隐藏层的输出上。他们现在将分别学习一些模式(正如我

  • 权重初始化 结果表明,我们可以比使用正规化的高斯分布效果更好。为什么?假设我们使用一个很多的输入神经元,比如说 $$1000$$。假设,我们已经使用正规化的高斯分布初始化了连接第一隐藏层的权重。现在我将注意力集中在这一层的连接权重上,忽略网络其他部分: 我们为了简化,假设,我们使用训练样本 x 其中一半的神经元值为 $$0$$,另一半为 $$1$$。下面的观点也是可以更加广泛地应用,但是你可以从特

  • 当一个高尔夫球员刚开始学习打高尔夫时,他们通常会在挥杆的练习上花费大多数时间。慢慢地他们才会在基本的挥杆上通过变化发展其他的击球方式,学习低飞球、左曲球和右曲球。类似的,我们现在仍然聚焦在反向传播算法的理解上。这就是我们的“基本挥杆”——神经网络中大部分工作学习和研究的基础。本章,我会解释若干技术能够用来提升我们关于反向传播的初级的实现,最终改进网络学习的方式。 本章涉及的技术包括:更好的代价函数

  • 我试图用TensorFlow建立一个简单的神经网络。目标是在32像素x 32像素的图像中找到矩形的中心。矩形由五个向量描述。第一个向量是位置向量,其他四个是方向向量,组成矩形边。一个向量有两个值(x和y)。 该图像的相应输入为(2,5)(0,4)(6,0)(0,-4)(-6,0)。中心(以及所需输出)位于(5,7)。 我想出的代码如下所示: 遗憾的是,网络无法正常学习。结果太离谱了。例如,[[3.

  • 监督学习的目标是建立一个学习过程,将预测结果与“训练数据”(即输入数据)的实际结果进行比较,不断的调整预测模型,直到模型的预测结果达到一个预期的准确率,包括分类、回归等问题。而常用算法包括线性回归、决策树、贝叶斯分类、最小二乘回归、逻辑回归、支持向量机、神经网络等。 监督学习的整个训练流程如下图所示

  • 本文向大家介绍监督学习和无监督学习的区别相关面试题,主要包含被问及监督学习和无监督学习的区别时的应答技巧和注意事项,需要的朋友参考一下 参考回答: 输入的数据有标签则为监督学习,输入数据无标签为非监督学习。