gpt4 book ai didi

ruby - 使用 Ruby 的人工神经网络

转载 作者:数据小太阳 更新时间:2023-10-29 09:03:36 25 4
gpt4 key购买 nike

我正在尝试将一些人工神经网络与 Ruby 结合使用,我尝试了一些 gems(ruby-fann、Ai4r),当我在一些测试输入上运行经过训练的网络时,它们都返回相同的结果 [1.0, 1.0] ,但在训练数据中,所有输出都在 100 左右。我有 10 个输入神经元和 2 个输出。我尝试了不同的网络配置,期望错误,具有不同的层数和不同的神经元数量。在训练 ruby​​-fann 的神经网络时,我得到了这个:

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。

最佳答案

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

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

使用 logistic 函数(或 sigmoid)的网络很常见,它的输出总是在 0.0 和 1.0 之间。对于某些 NN 库,这可能是您唯一的选择。

您有两个基本选择来改善您的网络收敛:

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

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

如果我没记错的话,FANN 以及 ruby​​-fann 在神经元类型和现代神经网络的其他特征(例如正则化、各种“聪明的”批处理学习技巧等)方面的选择非常有限。我认为可能没有 - 在这种情况下,您唯一的选择是缩放训练目标以适应范围 0..1。但是,从您的评论中我可以看出 there are a few methods available to set activation functions .

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

关于ruby - 使用 Ruby 的人工神经网络,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29330411/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com