楼主: Scalachen
1506 0

Neural Network using Julia [推广有奖]

  • 0关注
  • 0粉丝

已卖:147份资源

本科生

56%

还不是VIP/贵宾

-

TA的文库  其他...

Haskell NewOccidental

Splunk NewOccidental

Apache Storm NewOccidental

威望
0
论坛币
5149 个
通用积分
0
学术水平
9 点
热心指数
11 点
信用等级
9 点
经验
1156 点
帖子
24
精华
1
在线时间
0 小时
注册时间
2015-3-29
最后登录
2017-8-22

楼主
Scalachen 发表于 2015-3-31 21:19:19 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
  1. type NeuralNetwork
  2.     structure::Array{Int64, 1}
  3.     disable_bias::Bool
  4.     learning_rate::Float64
  5.     momentum::Float64
  6.     initial_weight_function::Function
  7.     propagation_function::Function
  8.     derivative_propagation_function::Function
  9.     activation_nodes::Array{Array{Float64}, 1}
  10.     weights::Array{Array{Float64}, 1}
  11.     last_changes::Array{Array{Float64}, 1}
  12.     deltas::Array{Array{Float64}, 1}
  13. end

  14. function NeuralNetwork(structure::Array{Int64, 1}, disable_bias::Bool)
  15.     len_struct  = length(structure)
  16.     len_weights = length(structure) - 1

  17.     NeuralNetwork(structure,
  18.                   disable_bias,
  19.                   0.25,
  20.                   0.1,
  21.                   () -> rand(0:2000)/1000.0 - 1,
  22.                   (x::Float64) -> 1/(1+exp(-1*(x))),
  23.                   (y::Float64) -> y*(1-y),
  24.                   Array(Array{Float64}, len_struct),
  25.                   Array(Array{Float64}, len_weights),
  26.                   Array(Array{Float64}, len_weights),
  27.                   Array(Array{Float64}, 1)
  28.                   )
  29. end

  30. function init_network(structure::Array{Int64,1})
  31.     network = NeuralNetwork(structure, false)
  32.     init_activation_nodes(network)
  33.     init_weights(network)
  34.     init_last_changes(network)
  35.     return network
  36. end

  37. function init_activation_nodes(network::NeuralNetwork)
  38.     len = length(network.activation_nodes)
  39.     # for each layer in network, build 1.0 matrices
  40.     for i in 1:len
  41.         if !network.disable_bias && i < len
  42.             network.activation_nodes[i] = ones(network.structure[i] + 1)
  43.         else
  44.             network.activation_nodes[i] = ones(network.structure[i])
  45.         end
  46.     end
  47. end

  48. function init_weights(network::NeuralNetwork)
  49.     for i in 1:length(network.weights)
  50.         arr = Array(Float64, length(network.activation_nodes[i]), network.structure[i+1])

  51.         for j=1:length(arr)
  52.             arr[j] = network.initial_weight_function()
  53.         end

  54.         network.weights[i] = arr
  55.     end
  56. end

  57. function init_last_changes(network::NeuralNetwork)
  58.     for i in 1:length(network.last_changes)
  59.         network.last_changes[i] = [zeros(size(network.weights[i]))]
  60.     end
  61. end

  62. function train(network::NeuralNetwork, inputs::Vector{Float64}, outputs::Vector{Float64})
  63.     net_eval(network, inputs)
  64.     backpropagate(network, outputs)
  65.     calculate_error(network, outputs)
  66. end

  67. function net_eval(network::NeuralNetwork, inputs::Vector{Float64})
  68.     check_input_dimension(network, inputs)
  69.     if length(network.weights) == 0
  70.         init_network(network)
  71.     end
  72.     feedforward(network, inputs)
  73.     return network.activation_nodes[end]
  74. end

  75. function feedforward(network::NeuralNetwork, inputs::Vector{Float64})
  76.     for i in 1:length(inputs)
  77.         network.activation_nodes[1][i] = inputs[i]
  78.     end

  79.     for n in 1:length(network.weights)
  80.         for j in 1:network.structure[n+1]
  81.             s = dot(network.activation_nodes[n], network.weights[n][:, j])
  82.             network.activation_nodes[n+1][j] = network.propagation_function(s)
  83.         end
  84.     end
  85. end

  86. function backpropagate(network::NeuralNetwork, expected_values::Vector{Float64})
  87.     check_output_dimension(network, expected_values)
  88.     calculate_output_deltas(network, expected_values)
  89.     calculate_internal_deltas(network)
  90.     update_weights(network)
  91. end

  92. function calculate_output_deltas(network::NeuralNetwork, expected_values::Vector{Float64})
  93.     output_values = network.activation_nodes[end]
  94.     err = expected_values - output_values
  95.     output_deltas = Array(Float64, 1, length(err))
  96.     for i=1:length(err)
  97.         output_deltas[i] = network.derivative_propagation_function(output_values[i]) * err[i]
  98.     end
  99.     network.deltas = Array{Float64}[output_deltas]
  100. end

  101. function calculate_internal_deltas(network::NeuralNetwork)
  102.     prev_deltas = network.deltas[end]
  103.     for layer_index=2:length(network.activation_nodes)-1
  104.         layer_deltas = Array(Float64,1,length(network.activation_nodes[layer_index]))
  105.         for j=1:length(network.activation_nodes[layer_index])
  106.             err = 0.0
  107.             for k=1:network.structure[layer_index+1]
  108.                 err += prev_deltas[k] * network.weights[layer_index][j,k]
  109.             end
  110.             layer_deltas[j] = network.derivative_propagation_function(network.activation_nodes[layer_index][j]) * err
  111.         end
  112.         unshift!(network.deltas, layer_deltas)
  113.     end
  114. end

  115. function update_weights(network::NeuralNetwork)
  116.     for n=1:length(network.weights)
  117.         for i=1:size(network.weights[n],1)
  118.             for j=:1:size(network.weights[n],2)
  119.                 change = network.deltas[n][j] * network.activation_nodes[n][i]
  120.                 network.weights[n][i,j] += (network.learning_rate * change + network.momentum * network.last_changes[n][i,j])
  121.                 network.last_changes[n][i,j] = change
  122.             end
  123.         end
  124.     end
  125. end

  126. function calculate_error(network::NeuralNetwork, expected_output::Vector{Float64})
  127.     output_values = network.activation_nodes[end]
  128.     err = 0.0
  129.     diff = output_values - expected_output
  130.     for output_index=1:length(diff)
  131.         err +=
  132.         0.5 * diff[output_index]^2
  133.     end
  134.     return err
  135. end

  136. # TODO: throw exception here..
  137. function check_input_dimension(network::NeuralNetwork, inputs::Vector{Float64})
  138.     if length(inputs) != network.structure[1]
  139.         error("Wrong number of inputs.\n",
  140.         strcat("Expected: ", network.structure[1], "\n"),
  141.         strcat("Received: ", length(inputs)))
  142.     end
  143. end

  144. function check_output_dimension(network::NeuralNetwork, outputs::Vector{Float64})
  145.     if length(outputs) != network.structure[end]
  146.         error("Wrong number of outputs.\n",
  147.         strcat("Expected: ", network.structure[end], "\n"),
  148.         strcat("Received: ", length(outputs)))
  149.     end
  150. end
复制代码


二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:network Neural Julia Using Work

已有 1 人评分经验 学术水平 热心指数 信用等级 收起 理由
fantuanxiaot + 15 + 1 + 1 + 1 精彩帖子

总评分: 经验 + 15  学术水平 + 1  热心指数 + 1  信用等级 + 1   查看全部评分

本帖被以下文库推荐

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注jltj
拉您入交流群
GMT+8, 2026-1-8 05:19