Ruby的人工神经网络

时间:2015-03-29 14:35:28

标签: ruby artificial-intelligence

我试图在Ruby上使用一些人工神经网络,我尝试了几个宝石(ruby-fann,Ai4r),当我在一些测试输入上运行经过训练的网络时,我总是回报我同样的事情[1.0, 1.0],但在训练数据中,所有输出都在100左右。我有10个输入神经元,2个输出。我尝试了不同的网络配置,需要错误,不同层数和不同数量的神经元。在训练ruby-fann的NN时,我得到了这个:

1. Current error: 10034.23571597 Bit fail: 1938
100. Current error: 9937.62571597 Bit fail: 1938

之后所有错误和失败都是一样的。这是我的代码:

inputs_to_learn = []
outputs_to_learn = []
some cycle:
    inputs_to_learn.push([i1,i2,i3,i4,i5,i6,i7,i8,i9,i10,])
    outputs_to_learn.push([o1, o2])
train = RubyFann::TrainData.new(:inputs=>inputs_to_learn, :desired_outputs=>outputs_to_learn)
fann = RubyFann::Standard.new(:num_inputs=>10, :hidden_neurons=>[30, 30, 30, 30], :num_outputs=>2) 
fann.train_on_data(train, 1000, 100, 0.5)
result = fann.run([100, 100, 95, 105, 95, 105, 95, 105, 95, 105])

所以问题是,如果列车数据是数字的100倍,为什么我得到1.0。

1 个答案:

答案 0 :(得分:2)

构建神经网络时有很多选择。一个重要的选择是应用于所有输入总数的传递函数乘以每个神经元的权重。这也可称为激活功能。

这主要影响输出层。对于您的网络,输出中无法使用值100,因此网络无法正确学习它们。

通常会看到使用逻辑函数(或sigmoid)的网络,它总是在0.0和1.0之间输出。对于一些NN库,这可能是您唯一的选择。

您有两个基本选择来改善网络的融合:

1)阅读您正在使用的库的文档,并查看是否可以使用线性输出层(即不应用传输函数)。如果您尝试在连续变量上创建回归模型,这可能是其他原因的一个很好的选择。

2)缩放输出变量以适应0.0..1.0的可用输出范围。您需要将训练数据映射到此范围,然后在解释输出时反转该映射,使用网络获取新的输入数据。

如果我没记错的话,FANN,以及因此ruby-fann,在涉及神经元的类型和现代NN的其他特征(例如正规化,各种“聪明的”批量学习技巧等)方面的选择非常有限。我认为可能没有 - 在这种情况下,您唯一的选择是将训练目标扩展到适合范围0..1。但是,根据您的评论,我可以看到there are a few methods available to set activation functions

为获得最佳性能,理想情况下,您还应根据训练数据缩放输入。通常,您将它们标准化为在训练集上具有平均值0.0,标准差1.0(并且对于该点的所有输入使用相同的偏移和乘数),尽管将范围限制为0.0..1.0或-1.0..1.0也很常见