110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
|
# File 'lib/t_learn/feedforward_neural_network.rb', line 110
def back_propagation(y)
raise "output size different from node num of output layer" if get_output_layer.size != y.size
delta = {}
( @layer_size - 1).downto(0) do |layer_num|
if ( @layer_size - 1) == layer_num @layer_list[layer_num].each_with_index do |output_node, i|
delta["#{output_node.id}"] = -1.0 * calc_err(y[i], output_node.w) * output_node.w * (1.0 -output_node.w)
end
else
@layer_list[layer_num].each do |from_node|
@layer_list[layer_num + 1].each do |to_node|
momentum_weight = @momentum_rate * @momentum_weight_list["#{from_node.id}_#{to_node.id}"]
update_weight = -1.0 * @learning_rate * delta["#{to_node.id}"] * from_node.w
@link_list["#{from_node.id}_#{to_node.id}"] = @link_list["#{from_node.id}_#{to_node.id}"] + update_weight + momentum_weight
@momentum_weight_list["#{from_node.id}_#{to_node.id}"] = update_weight end
delta["#{from_node.id}"] = calc_delta(delta,layer_num, from_node) * from_node.w * (1.0 - from_node.w)
end
end
end
end
|