为什么一个训练有素的Pybrain网络即使输入用于训练也会产生不同的结果

2024-10-01 22:31:55 发布

您现在位置:Python中文网/ 问答频道 /正文

我用pybrain训练了一个神经网络。但是,当我使用与训练相同的输入测试我的网络时,我得到了完全不同的结果。这是我的密码

from pybrain.structure import FeedForwardNetwork
from pybrain.structure import LinearLayer, SigmoidLayer
from pybrain.structure import FullConnection
import numpy as np
from pybrain.datasets import SupervisedDataSet
from pybrain.supervised import BackpropTrainer
from pybrain.tools.xml.networkreader import NetworkReader
from pybrain.tools.xml.networkwriter import NetworkWriter
from pybrain.utilities import percentError

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()

X = np.array(([3,5], [5,1], [10,2]),dtype=float)
Y = np.array(([75], [82], [93]),dtype=float)
X/=np.amax(X, axis=0)
Y/=100

print(n.activate([ 1, 2]))
print(in_to_hidden.params)
ds = SupervisedDataSet(2,1)
for i in range(len(X)):
  ds.addSample(X[i],Y[i])

trainer=BackpropTrainer(n,ds, learningrate=0.5, momentum=0.05,verbose=True)
trainer.trainUntilConvergence(ds)
trainer.testOnData(ds, verbose=True)

现在当我想用代码测试输入时 print("Testing",n.activate([3,5])) 我得到('Testing', array([ 1.17809308]))。我应该有大约0.75的这个输入n.activate([3,5])。所以我不明白为什么这个奇怪的结果


Tags: toinfromimportnpdsstructurearray
2条回答

我没看到结果有什么奇怪的。仅仅因为您有一个具有输入[3,5]和输出[0.75]的训练实例,并不意味着网络应该总是产生相同的输出。该模型并不是简单地记忆训练实例。在

如果我没弄错的话,这只是模型验证的一个方面,你必须一直这样做。网络通常会根据所有的训练数据尽量减少误差,但它不会精确地得到每一个结果。你也许可以通过运行更多的隐藏神经元来提高预测的准确性。然而,这样做最终会通过过度的柔韧性导致过度贴合。这有点平衡。在

作为一个类比,以回归为例。在下面的线性情况下,模型不匹配任何训练(蓝色)数据,但通常捕获蓝色和红色(外部测试)数据的趋势。对于所有的数据,使用线性方程总是给我一个错误的答案,但它是一个不错的近似器。然后假设我用多项式趋势线拟合数据。现在它有了更大的灵活性,可以命中所有的蓝点,但是测试数据的误差已经增加了。在

regression

一旦你建立了你的网络,你需要通过它重新运行你的所有数据。然后您可以在absolute average deviationMSEMASE等上进行验证,此外还可以进行k折交叉验证。你对错误的容忍度取决于你的应用程序:在工程中,我可能总是需要在5%的误差范围内,任何超过这个阈值(在第二张图中会出现的情况)都可能造成致命的后果。在语言处理中,我可能能忍受一两个真正的混乱,如果大多数预测非常接近,我可能会用另一种方法捕捉它们,所以我可能会选择第二张图。在

发挥你的学习速度和动力可能有助于找到更好的解决方案。在

编辑:基于注释

“应该能够识别它”的评论对我来说意味着与神经网络基础不同的东西。在网络中甚至没有一个模糊的记忆概念,它只是利用训练数据来开发一套复杂的规则,以尽量减少针对所有数据点的误差。一旦网络被训练,它就不记得任何训练数据了,它只剩下一个意大利面条式的乘法步骤,它将在输入数据上执行。因此,无论你的人际网络有多好,你永远无法将你的训练输入反向映射到正确的答案。在

“融合”的概念不能被认为是你有一个良好的人际网络。网络可能只是发现一个local minima出错而放弃学习。这就是为什么必须始终验证您的模型。如果您对验证结果不满意,可以尝试通过以下方式改进模型:
-只需重新运行它。网络的随机初始化现在可以避免局部最小值
-改变神经元的数量。这会放松或收紧模型的灵活性
-改变学习速度和动力
-改变学习规则,例如从Levenberg Marquardt交换到Bayesian正则化

相关问题 更多 >

    热门问题