我刚刚开始学习神经网络,看看它们是否对我有用。
我已下载此simple python code of 3 layer feed forward neural network
我只是将学习模式修改为棋盘而不是XOR,隐藏层中的节点数为10.如果我理解universal approximation theorem这3层网络(一个隐藏层)应该能够从中学习任何函数R2到R包括我的棋盘功能。 ......但事实并非如此。
有什么问题?
有没有一般的方法如何修改优化(学习)方案,以确保收敛到任何可以由给定网络根据通用逼近定理理论描述的函数?
是否有任何一般测试,它会告诉我,如果我的网络(具有给定的拓扑,层数和节点)能够描述给定的功能,是否只是陷入某些局部最小值?
这是隐藏层中10个神经元的结果:
train it with some patterns
error 3.14902
error 1.37104
error 1.35305
error 1.30453
error 1.28329
error 1.27599
error 1.27275
error 1.27108
error 1.27014
error 1.26957
test it
([0.0, 0.0], '->', [0.019645293674000152])
([0.0, 0.5], '->', [0.5981006916165954])
([0.0, 1.0], '->', [0.5673621981298169])
([0.5, 0.0], '->', [0.5801274708105488])
([0.5, 0.5], '->', [0.5475774428347904])
([0.5, 1.0], '->', [0.5054692523873793])
([1.0, 0.0], '->', [0.5269586801603834])
([1.0, 0.5], '->', [0.48368767897171666])
([1.0, 1.0], '->', [0.43916379836698244])
这是测试运行的定义(只是我修改过的代码的一部分):
def demo():
# Teach network checkerboard function
pat = [
[ [0.0,0.0], [0.0] ],
[ [0.0,0.5], [1.0] ],
[ [0.0,1.0], [0.0] ],
[ [0.5,0.0], [1.0] ],
[ [0.5,0.5], [0.0] ],
[ [0.5,1.0], [1.0] ],
[ [1.0,0.0], [0.0] ],
[ [1.0,0.5], [1.0] ],
[ [1.0,1.0], [0.0] ]
]
# create a network with two input, 10 hidden, and one output nodes
n = NN(2, 10, 1)
print " train it with some patterns "
n.train(pat)
print " test it "
n.test(pat)
答案 0 :(得分:0)
通用近似定理表明任何连续函数可以用一个隐藏层任意近似。它不需要任何类型的数据可分离性,我们讨论的是任意函数。
特别是,如果你有N个隐藏节点,其中N是训练样本的数量,那么总是可以完美地学习你的训练集(它可以简单地记住所有输入 - 输出对)。
然而, none 保证了这些对象的泛化,也没有对较小网络的学习保证。神经网络不是普遍的答案",它们很难正确处理。
回到你的问题,你的功能非常简单,并且上述问题都没有在这里应用,这样的功能可以通过非常基本的网络轻松学习。看起来以下两个方面之一就是问题: