【问题标题】:Artificial neural network with Ruby使用 Ruby 的人工神经网络
【发布时间】:2015-04-08 15:06:44
【问题描述】:

我正在尝试将一些人工神经网络与 Ruby 一起使用,我尝试了一些 gem(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。

【问题讨论】:

    标签: ruby artificial-intelligence


    【解决方案1】:

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

    这主要影响你的输出层。对于您的网络,输出中不可能有 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 也很常见.

    【讨论】:

    • 顺便说一句:我很遗憾地说 Ruby 中的 NN 库并不多。如果学习 NN 是一个优先事项,您可能会发现改用 Python,使用 Scikit-Learn 或 Lasagne/no-learn 作为库最终将为您提供更大的灵活性并获得更好的尖端技术。
    • 谢谢你的回答,它帮我找到了一个“方向”,原来ruby-fann类中有一个方法,可以为神经元设置“激活函数”。方法类似于输出神经元的 set_activation_function_output(:linear) 和隐藏神经元的 set_activation_function_hidden(:linear)。 (ruby-fann.rubyforge.org/RubyFann/Standard.html)
    • 我不知道。您会希望在隐藏层中保留非线性神经元,对于某些类型的问题,通常只有输出层应该是线性的。
    猜你喜欢
    • 2011-11-19
    • 1970-01-01
    • 2011-01-22
    • 2011-07-13
    • 2017-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多