gpt4 book ai didi

ruby - 应用神经网络识别数字

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

我试着理解神经网络

我将输入数组组合为

..# ### ### #.#
.## ..# ..# #.#
..# ### ### ###
..# #.. ..# ..#
..# ### ### ..#, etc

期望的输出我设置为digit/10,即digit = 5 output = 0.5

代码

require 'ruby-fann'

train = RubyFann::TrainData.new(
inputs: [
[0,0,1,0,1,1,0,0,1,0,0,1,0,0,1],
[1,1,1,0,0,1,1,1,1,1,0,0,1,1,1],
[1,1,1,0,0,1,1,1,1,0,0,1,1,1,1],
[1,0,1,1,0,1,1,1,1,0,0,1,0,0,1],
[1,1,1,1,0,0,1,1,1,0,0,1,1,1,1],
[1,1,1,1,0,0,1,1,1,1,0,1,1,1,1],
[1,1,1,0,0,1,0,1,0,1,0,0,1,0,0],
[1,1,1,1,0,1,1,1,1,1,0,1,1,1,1],
[1,1,1,1,0,1,1,1,1,0,0,1,1,1,1]
],
desired_outputs: [[0.1],[0.2],[0.3], [0.4], [0.5], [0.6], [0.7], [0.8], [0.9]]
)
fann = RubyFann::Standard.new(
num_inputs: 15,
hidden_neurons: [8,4,3,4,1],
num_outputs: 1
)
fann.train_on_data(train, 100000, 10, 0.1) # 100000 max_epochs, 100 errors between reports and 0.1 desired MSE (mean-squared-error)
outputs = fann.run([0,0,1,0,1,1,0,0,1,0,0,1,0,0,1])
result = outputs.first
abort result.inspect

每个运行脚本的输出

0.5367386954219215
0.5141728468011051
0.5249739971144654
0.5373135467504666
0.5182686028674102
0.46710004502372293
0.4723526462690119
0.5306690734137796
0.5151398228322749
0.5359153267266001
0.469100790593523
0.4749347798092478
0.5094355973839471
0.5205985468860461
0.5277528652471375
0.4825827561254995

我不明白为什么输出不等于 0.1,这与第一个输入完全相同。

音域在 0.46 - 0.53 之间的值是什么意思?

更新

我用 0.1 替换 0,用 0.9 替换 1

输出

0.4794515462681635
0.5332274595769928
0.4601992972516728
0.427064909364266
0.43466252163025687
0.46931411920827737
0.4455544021835517
0.48051179013023565
0.4798245565677274
0.4479353078492235
0.4646710791032779
0.4887400910135108

我还为零数字添加了 +1 输入,没有发生任何重大事情

最佳答案

训练神经网络有点像黑暗艺术。在这里,您最大的问题是将 RMS 误差目标设置为 0.1 - 这意味着您将接受大于您感兴趣的差异的平均绝对误差。将其设置得较低应该会有很大帮助。

另外(但不太重要):

  • 您不需要那么多隐藏层。足够的神经元。通过反复试验,我认为您的 [8,4,3,4,1] 对于这个问题有点低(最后一个 1 没有任何用处)。 [30] 的值似乎有效 - 我基本上是通过尝试一些猜测得到的。

  • 分类通常最好用每个类别一个 0/​​1 输出来完成,然后选择最大值。不过,您不需要,我用您的 0.1、0.2 等目标进行了测试,它工作得很好。解释为什么单独的输出更好:如果你的输入有一些噪音,并且网络应该在 3 和 8 之间理想地选择,那么使用单个输出的中间值可能是 0.55 - 不是很有用,即使你四舍五入该值基本上是不正确的。但是,对于用于分类的 9 个输出,“3”和“8”的输出都将很高,您可以选择稍高的那个,或者有信心地显示正确的值是“3” ”或“8”。

  • 您选择作为测试用例的问题可能会陷入局部最小值,您需要调整动量和学习率以获得更好的成功机会。

  • 打乱训练数据也可能有所帮助。

对您的代码/参数进行以下更改应该会更接近您期望的结果:

require 'ruby-fann'

train = RubyFann::TrainData.new(
inputs: [
[0,0,1,0,1,1,0,0,1,0,0,1,0,0,1], [1,1,1,0,0,1,1,1,1,1,0,0,1,1,1],
[1,1,1,0,0,1,1,1,1,0,0,1,1,1,1], [1,0,1,1,0,1,1,1,1,0,0,1,0,0,1],
[1,1,1,1,0,0,1,1,1,0,0,1,1,1,1], [1,1,1,1,0,0,1,1,1,1,0,1,1,1,1],
[1,1,1,0,0,1,0,1,0,1,0,0,1,0,0], [1,1,1,1,0,1,1,1,1,1,0,1,1,1,1],
[1,1,1,1,0,1,1,1,1,0,0,1,1,1,1]
],
desired_outputs: [ [1,0,0,0,0,0,0,0,0], [0,1,0,0,0,0,0,0,0],
[0,0,1,0,0,0,0,0,0], [0,0,0,1,0,0,0,0,0],
[0,0,0,0,1,0,0,0,0], [0,0,0,0,0,1,0,0,0],
[0,0,0,0,0,0,1,0,0], [0,0,0,0,0,0,0,1,0],
[0,0,0,0,0,0,0,0,1] ]
)

fann = RubyFann::Standard.new(
num_inputs: 15,
hidden_neurons: [30],
num_outputs: 9
)

fann.learning_rate = 0.5
fann.momentum = 0.5

fann.train_on_data(train, 10000, 1000, 0.001)

outputs = fann.run([0,0,1,0,1,1,0,0,1,0,0,1,0,0,1])
m = outputs.max
puts "Result: #{( outputs.find_index { |x| x == m } ) + 1}"

关于ruby - 应用神经网络识别数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20746782/

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