返回列表 上一主題 發帖

VBA 類神經運算 求助

VBA 類神經運算 求助

本帖最後由 qwertyuio111 於 2015-11-20 10:26 編輯

各位 高手 您好
小弟最近在學校,初學Excel VBA使用在類神經的運算模擬上。
此類神經模擬是以 「5 x 8 x 5 x 2 」的方式進行,輸入5個已知值,再透過兩個隱藏層(8,5)運算,求得2個目標值輸出。
透過已知的數據(輸入值,目標值),因此會求得 90個 模擬循環產生之新W。

此程式碼 運作一開始是以 產生一組亂數W 之後固定,再輸入值及目標值後,透過運算 迴圈公式 求得模擬後的新W。
發現迴圈程式碼過與冗長,經查資料發現使用「陣列運算」或許可行,但始終無法正確的寫出來。
尚且重複性的在資料表中,「輸入及讀取 儲存格的值」,造成迴圈運算的緩慢,及暫存記憶體的不足形成當機。
求助各位高手 能否幫助及教導小弟 解決這方面的問題

在此奉上 Excel 資料表 求助 謝謝 (因無法直接上傳 excel檔案 所以利用 google 雲端)

Excel 類神經運算模擬檔案

回復 1# qwertyuio111
為什麼你的W要設計成9X10的陣列
而不是 5x8、8x5、5x2,三個陣列
表達不清、題意不明確、沒附檔案格式、沒有討論問題的態度~~~~~~以上愛莫能助。

TOP

回復 2# stillfish00


    啊啊,是應該那樣子做才對嗎?
當初因為想到會透過前一個隱藏層的「誤差值」,重新運算 新的W產生。
所以沒有考慮到把陣列拆開運算的過程。

那我應該要怎麼做才正確呢?

是不是應該把 迴圈拆成 三個部分來寫 這樣比較妥當?

我想解決 重複 讀取 及 輸入 在儲存格上的步驟,因為會造成運算上的緩慢...
先 謝謝大大 指導

TOP

迴圈運算程式碼 記憶體釋放(求解)

本帖最後由 qwertyuio111 於 2015-11-21 19:31 編輯

大家好 我有個迴圈模擬運算的問題
會有自行輸入運算次數(Worksheets("Sheet1").Range("J9"))
因為重複 「讀取」及「輸入」數值的過程,造成記憶體不足。
請問 要增加哪個程式碼或改成怎麼樣的寫法會比較好呢?
才能夠解決 記憶體不足的問題呀?
以下為部分程式碼
  1. For i = 2 To Worksheets("Sheet1").Range("J9")
  2. intA = Worksheets("Sheet1").Range("B1")
  3. intB = Worksheets("Sheet1").Range("B2")
  4. intc = Worksheets("Sheet1").Range("B3")
  5. intD = Worksheets("Sheet1").Range("B4")
  6. intE = Worksheets("Sheet1").Range("B5")
  7. tarn = Worksheets("Sheet1").Range("L6")
  8. taro = Worksheets("Sheet1").Range("L7")

  9. neww1 = Worksheets("Sheet1").Range("A24")
  10. neww2 = Worksheets("Sheet1").Range("A25")
  11. neww3 = Worksheets("Sheet1").Range("A26")
  12. neww4 = Worksheets("Sheet1").Range("A27")
  13. neww5 = Worksheets("Sheet1").Range("A28")
  14. neww6 = Worksheets("Sheet1").Range("A29")
  15. neww7 = Worksheets("Sheet1").Range("A30")
  16. neww8 = Worksheets("Sheet1").Range("A31")
  17. neww9 = Worksheets("Sheet1").Range("A32")

  18. neww10 = Worksheets("Sheet1").Range("B24")
  19. neww11 = Worksheets("Sheet1").Range("B25")
  20. neww12 = Worksheets("Sheet1").Range("B26")
  21. neww13 = Worksheets("Sheet1").Range("B27")
  22. neww14 = Worksheets("Sheet1").Range("B28")
  23. neww15 = Worksheets("Sheet1").Range("B29")
  24. neww16 = Worksheets("Sheet1").Range("B30")
  25. neww17 = Worksheets("Sheet1").Range("B31")
  26. neww18 = Worksheets("Sheet1").Range("B32")

  27. neww19 = Worksheets("Sheet1").Range("C24")
  28. neww20 = Worksheets("Sheet1").Range("C25")
  29. neww21 = Worksheets("Sheet1").Range("C26")
  30. neww22 = Worksheets("Sheet1").Range("C27")
  31. neww23 = Worksheets("Sheet1").Range("C28")
  32. neww24 = Worksheets("Sheet1").Range("C29")
  33. neww25 = Worksheets("Sheet1").Range("C30")
  34. neww26 = Worksheets("Sheet1").Range("C31")
  35. neww27 = Worksheets("Sheet1").Range("C32")

  36. neww28 = Worksheets("Sheet1").Range("D24")
  37. neww29 = Worksheets("Sheet1").Range("D25")
  38. neww30 = Worksheets("Sheet1").Range("D26")
  39. neww31 = Worksheets("Sheet1").Range("D27")
  40. neww32 = Worksheets("Sheet1").Range("D28")
  41. neww33 = Worksheets("Sheet1").Range("D29")
  42. neww34 = Worksheets("Sheet1").Range("D30")
  43. neww35 = Worksheets("Sheet1").Range("D31")
  44. neww36 = Worksheets("Sheet1").Range("D32")

  45. neww37 = Worksheets("Sheet1").Range("E24")
  46. neww38 = Worksheets("Sheet1").Range("E25")
  47. neww39 = Worksheets("Sheet1").Range("E26")
  48. neww40 = Worksheets("Sheet1").Range("E27")
  49. neww41 = Worksheets("Sheet1").Range("E28")
  50. neww42 = Worksheets("Sheet1").Range("E29")
  51. neww43 = Worksheets("Sheet1").Range("E30")
  52. neww44 = Worksheets("Sheet1").Range("E31")
  53. neww45 = Worksheets("Sheet1").Range("E32")

  54. neww46 = Worksheets("Sheet1").Range("F24")
  55. neww47 = Worksheets("Sheet1").Range("F25")
  56. neww48 = Worksheets("Sheet1").Range("F26")
  57. neww49 = Worksheets("Sheet1").Range("F27")
  58. neww50 = Worksheets("Sheet1").Range("F28")
  59. neww51 = Worksheets("Sheet1").Range("F29")
  60. neww52 = Worksheets("Sheet1").Range("F30")
  61. neww53 = Worksheets("Sheet1").Range("F31")
  62. neww54 = Worksheets("Sheet1").Range("F32")

  63. neww55 = Worksheets("Sheet1").Range("G24")
  64. neww56 = Worksheets("Sheet1").Range("G25")
  65. neww57 = Worksheets("Sheet1").Range("G26")
  66. neww58 = Worksheets("Sheet1").Range("G27")
  67. neww59 = Worksheets("Sheet1").Range("G28")
  68. neww60 = Worksheets("Sheet1").Range("G29")
  69. neww61 = Worksheets("Sheet1").Range("G30")
  70. neww62 = Worksheets("Sheet1").Range("G31")
  71. neww63 = Worksheets("Sheet1").Range("G32")

  72. neww64 = Worksheets("Sheet1").Range("H24")
  73. neww65 = Worksheets("Sheet1").Range("H25")
  74. neww66 = Worksheets("Sheet1").Range("H26")
  75. neww67 = Worksheets("Sheet1").Range("H27")
  76. neww68 = Worksheets("Sheet1").Range("H28")
  77. neww69 = Worksheets("Sheet1").Range("H29")
  78. neww70 = Worksheets("Sheet1").Range("H30")
  79. neww71 = Worksheets("Sheet1").Range("H31")
  80. neww72 = Worksheets("Sheet1").Range("H32")

  81. neww73 = Worksheets("Sheet1").Range("I24")
  82. neww74 = Worksheets("Sheet1").Range("I25")
  83. neww75 = Worksheets("Sheet1").Range("I26")
  84. neww76 = Worksheets("Sheet1").Range("I27")
  85. neww77 = Worksheets("Sheet1").Range("I28")
  86. neww78 = Worksheets("Sheet1").Range("I29")
  87. neww79 = Worksheets("Sheet1").Range("I30")
  88. neww80 = Worksheets("Sheet1").Range("I31")
  89. neww81 = Worksheets("Sheet1").Range("I32")

  90. neww82 = Worksheets("Sheet1").Range("J24")
  91. neww83 = Worksheets("Sheet1").Range("J25")
  92. neww84 = Worksheets("Sheet1").Range("J26")
  93. neww85 = Worksheets("Sheet1").Range("J27")
  94. neww86 = Worksheets("Sheet1").Range("J28")
  95. neww87 = Worksheets("Sheet1").Range("J29")
  96. neww88 = Worksheets("Sheet1").Range("J30")
  97. neww89 = Worksheets("Sheet1").Range("J31")
  98. neww90 = Worksheets("Sheet1").Range("J32")

  99. inta1 = (intA * neww1) + (intB * neww9) + (intc * neww17) + (intD * neww25) + (intE * neww33)
  100. outa1 = 1 / (1 + Exp(-inta1))

  101. intb1 = (intA * neww2) + (intB * neww10) + (intc * neww18) + (intD * neww26) + (intE * neww34)
  102. outb1 = 1 / (1 + Exp(-intb1))

  103. intc1 = (intA * neww3) + (intB * neww11) + (intc * neww19) + (intD * neww27) + (intE * neww35)
  104. outc1 = 1 / (1 + Exp(-intc1))

  105. intd1 = (intA * neww4) + (intB * neww12) + (intc * neww20) + (intD * neww28) + (intE * neww36)
  106. outd1 = 1 / (1 + Exp(-intd1))

  107. inte1 = (intA * neww5) + (intB * neww13) + (intc * neww21) + (intD * neww29) + (intE * neww37)
  108. oute1 = 1 / (1 + Exp(-inte1))

  109. intf1 = (intA * neww6) + (intB * neww14) + (intc * neww22) + (intD * neww30) + (intE * neww38)
  110. outf1 = 1 / (1 + Exp(-intf1))

  111. intg1 = (intA * neww7) + (intB * neww15) + (intc * neww23) + (intD * neww31) + (intE * neww39)
  112. outg1 = 1 / (1 + Exp(-intg1))

  113. inth1 = (intA * neww8) + (intB * neww16) + (intc * neww24) + (intD * neww32) + (intE * neww40)
  114. outh1 = 1 / (1 + Exp(-inth1))

  115. Worksheets("Sheet1").Range("D1") = inta1
  116. Worksheets("Sheet1").Range("F1") = outa1
  117. Worksheets("Sheet1").Range("D2") = intb1
  118. Worksheets("Sheet1").Range("F2") = outb1
  119. Worksheets("Sheet1").Range("D3") = intc1
  120. Worksheets("Sheet1").Range("F3") = outc1
  121. Worksheets("Sheet1").Range("D4") = intd1
  122. Worksheets("Sheet1").Range("F4") = outd1
  123. Worksheets("Sheet1").Range("D5") = inte1
  124. Worksheets("Sheet1").Range("F5") = oute1
  125. Worksheets("Sheet1").Range("D6") = intf1
  126. Worksheets("Sheet1").Range("F6") = outf1
  127. Worksheets("Sheet1").Range("D7") = intg1
  128. Worksheets("Sheet1").Range("F7") = outg1
  129. Worksheets("Sheet1").Range("D8") = inth1
  130. Worksheets("Sheet1").Range("F8") = outh1

  131. inti1 = (outa1 * neww41) + (outb1 * neww46) + (outc1 * neww51) + (outd1 * neww56) + (oute1 * neww61) + (outf1 * neww66) + (outg1 * neww71) + (outh1 * neww76)
  132. outi1 = 1 / (1 + Exp(-inti1))

  133. intj1 = (outa1 * neww42) + (outb1 * neww47) + (outc1 * neww52) + (outd1 * neww57) + (oute1 * neww62) + (outf1 * neww67) + (outg1 * neww72) + (outh1 * neww77)
  134. outj1 = 1 / (1 + Exp(-intj1))

  135. intk1 = (outa1 * neww43) + (outb1 * neww48) + (outc1 * neww53) + (outd1 * neww58) + (oute1 * neww63) + (outf1 * neww68) + (outg1 * neww73) + (outh1 * neww78)
  136. outk1 = 1 / (1 + Exp(-intk1))

  137. intl1 = (outa1 * neww44) + (outb1 * neww49) + (outc1 * neww54) + (outd1 * neww59) + (oute1 * neww64) + (outf1 * neww69) + (outg1 * neww74) + (outh1 * neww79)
  138. outl1 = 1 / (1 + Exp(-intl1))

  139. intm1 = (outa1 * neww45) + (outb1 * neww50) + (outc1 * neww55) + (outd1 * neww60) + (oute1 * neww65) + (outf1 * neww70) + (outg1 * neww75) + (outh1 * neww80)
  140. outm1 = 1 / (1 + Exp(-intm1))

  141. Worksheets("Sheet1").Range("H1") = inti1
  142. Worksheets("Sheet1").Range("J1") = outi1
  143. Worksheets("Sheet1").Range("H2") = intj1
  144. Worksheets("Sheet1").Range("J2") = outj1
  145. Worksheets("Sheet1").Range("H3") = intk1
  146. Worksheets("Sheet1").Range("J3") = outk1
  147. Worksheets("Sheet1").Range("H4") = intl1
  148. Worksheets("Sheet1").Range("J4") = outl1
  149. Worksheets("Sheet1").Range("H5") = intm1
  150. Worksheets("Sheet1").Range("J5") = outm1

  151. intn1 = (outi1 * neww81) + (outj1 * neww83) + (outk1 * neww85) + (outl1 * neww87) + (outm1 * neww89)
  152. outn1 = 1 / (1 + Exp(-intn1))

  153. into1 = (outi1 * neww82) + (outj1 * neww84) + (outk1 * neww86) + (outl1 * neww88) + (outm1 * neww90)
  154. outo1 = 1 / (1 + Exp(-into1))

  155. Worksheets("Sheet1").Range("L1") = intn1
  156. Worksheets("Sheet1").Range("N1") = outn1
  157. Worksheets("Sheet1").Range("L2") = into1
  158. Worksheets("Sheet1").Range("N2") = outo1

  159. errn = outn1 * (1 - outn1) * (tarn - outn1)
  160. erro = outo1 * (1 - outo1) * (taro - outo1)

  161. Worksheets("Sheet1").Range("N5") = errn
  162. Worksheets("Sheet1").Range("N6") = erro

  163. neww81 = neww81 + (errn * outi1)
  164. neww82 = neww82 + (erro * outi1)
  165. neww83 = neww83 + (errn * outj1)
  166. neww84 = neww84 + (erro * outj1)
  167. neww85 = neww85 + (errn * outk1)
  168. neww86 = neww86 + (erro * outk1)
  169. neww87 = neww87 + (errn * outl1)
  170. neww88 = neww88 + (erro * outl1)
  171. neww89 = neww89 + (errn * outm1)
  172. neww90 = neww90 + (erro * outm1)

  173. erri = outi1 * (1 - outi1) * (errn * neww81 + erro * neww82)
  174. errj = outj1 * (1 - outj1) * (errn * neww83 + erro * neww84)
  175. errk = outk1 * (1 - outk1) * (errn * neww85 + erro * neww86)
  176. errl = outl1 * (1 - outl1) * (errn * neww87 + erro * neww88)
  177. errm = outm1 * (1 - outm1) * (errn * neww89 + erro * neww90)

  178. Worksheets("Sheet1").Range("P5") = erri
  179. Worksheets("Sheet1").Range("P6") = errj
  180. Worksheets("Sheet1").Range("P7") = errk
  181. Worksheets("Sheet1").Range("P8") = errl
  182. Worksheets("Sheet1").Range("P9") = errm

  183. neww41 = neww41 + (erri * outa1)
  184. neww42 = neww42 + (errj * outa1)
  185. neww43 = neww43 + (errk * outa1)
  186. neww44 = neww44 + (errl * outa1)
  187. neww45 = neww45 + (errm * outa1)
  188. neww46 = neww46 + (erri * outb1)
  189. neww47 = neww47 + (errj * outb1)
  190. neww48 = neww48 + (errk * outb1)
  191. neww49 = neww49 + (errl * outb1)
複製代碼

TOP

回復 4# qwertyuio111

版主 GBKEE
  小弟 我已附上Excel 壓縮檔案
求解 QAQ~~謝謝

類神經擴充 迴圈運算.zip (56.13 KB)

TOP

回復 5# qwertyuio111
可否詳說, 類神經運算 公式的規律邏輯.
感恩的心......(在麻辣家族討論區.用心學習會有進步的)
但資源無限,後援有限,  一天1元的贊助,人人有能力.

TOP

回復 6# GBKEE


    類神經網路 是一種模擬運算的邏輯,藉由模擬運算及訓練的過程找到可能解的產生。

如圖所示


然而在訓練的過程,必透過已知的資料(輸入層的數值以及輸出層之目標值)重覆運算誤差值,去求出隱藏層所佔的比重。


運算式的長短會因為層數及 輸入數目的不同而有所改變。
目的是找出經過許多已知資料所模擬出最佳w。再獲得新的資料時,輸入後透過運算(w)求得最佳的outpot輸出
附上圖片例題的運算excel
類神經例題(迴圈運算).zip (133.49 KB)

TOP

回復 7# qwertyuio111


修改你的程式碼 試試看
  1. Option Explicit  '在模組層次中強迫每個在模組裏的變數都必須明確的宣告
  2. Sub test()
  3.     Dim Sh As Worksheet, w(), i As Integer
  4.     Dim out As Single, ina1 As Single, inb1 As Single, ina2 As Single, outa2 As Single
  5.     Dim inc As Single, outc As Single, oute As Single, oute1 As Single, oute2 As Single
  6.     Dim inb2 As Single, outb2 As Single
  7.     Set Sh = Sheets("Sheet1")
  8.     out = Sh.Cells(1, 2)
  9.     ina1 = Sh.Cells(3, 2)
  10.     inb1 = Sh.Cells(5, 2)
  11.     w = Application.WorksheetFunction.Transpose(Sh.Range("b7").Resize(6))
  12.    
  13.     ina2 = (ina1 * w(3)) + (inb1 * w(4))
  14.     outa2 = 1 / (1 + Exp(-ina2))
  15.     inb2 = (ina1 * w(5)) + (inb1 * w(6))
  16.     outb2 = 1 / (1 + Exp(-inb2))
  17.     inc = (outa2 * w(1)) + (outb2 * w(2))
  18.     outc = 1 / (1 + Exp(-inc))
  19.     oute = (out - outc) * (1 - outc) * (outc)
  20.     w(1) = w(1) + (oute * outa2)
  21.     w(2) = w(2) + (oute * outb2)
  22.     oute1 = oute * w(1) * (1 - outa2) * outa2
  23.     oute2 = oute * w(2) * (1 - outb2) * outb2
  24.     w(3) = w(3) + (oute1 * ina1)
  25.     w(4) = w(4) + (oute1 * inb1)
  26.     w(5) = w(5) + (oute2 * ina1)
  27.     w(6) = w(6) + (oute2 * inb1)
  28. '***********************************************
  29.     For i = 2 To 300
  30.         ina2 = (ina1 * w(3)) + (inb1 * w(4))
  31.         outa2 = 1 / (1 + Exp(-ina2))
  32.         inb2 = (ina1 * w(5)) + (inb1 * w(6))
  33.         outb2 = 1 / (1 + Exp(-inb2))
  34.         inc = (outa2 * w(1)) + (outb2 * w(2))
  35.         outc = 1 / (1 + Exp(-inc))
  36.         oute = (out - outc) * (1 - outc) * (outc)
  37.         w(1) = w(1) + (oute * outa2)
  38.         w(2) = w(2) + (oute * outb2)
  39.         oute1 = oute * w(1) * (1 - outa2) * outa2
  40.         oute2 = oute * w(2) * (1 - outb2) * outb2
  41.         w(3) = w(3) + (oute1 * ina1)
  42.         w(4) = w(4) + (oute1 * inb1)
  43.         w(5) = w(5) + (oute2 * ina1)
  44.         w(6) = w(6) + (oute2 * inb1)
  45.     Next
  46.     ''''''''''''''''''''''''''''
  47.     With Sh
  48.         .Cells(14, 2) = ina2
  49.         .Cells(15, 2) = outa2
  50.         .Cells(17, 2) = inb2
  51.         .Cells(18, 2) = outb2
  52.         .Cells(20, 2) = inc
  53.         .Cells(21, 2) = outc
  54.         '''''''''''''''''''''''''''''
  55.         .Cells(23, 2) = oute
  56.         .Cells(25, 2) = w(1)
  57.         .Cells(26, 2) = w(2)
  58.         ''''''''''''''''''''''''
  59.         .Cells(29, 2) = oute1
  60.         .Cells(30, 2) = oute2
  61.         ''''''''''''''''''''
  62.         .Cells(32, 2) = w(3)
  63.         .Cells(33, 2) = w(4)
  64.         .Cells(34, 2) = w(5)
  65.         .Cells(35, 2) = w(6)
  66.     End With
  67. End Sub
複製代碼
感恩的心......(在麻辣家族討論區.用心學習會有進步的)
但資源無限,後援有限,  一天1元的贊助,人人有能力.

TOP

本帖最後由 c_c_lai 於 2015-11-24 11:32 編輯

回復 7# qwertyuio111
試試看 (依據你的程式碼修改):
  1. Sub 類神經運算()
  2.     Dim lowerRange, upperRange, myRange, myCell As Range, cts As Integer, nxt As Integer
  3.     Dim rp5 As Integer, bf1 As Integer
  4.    
  5.     With Sheets("Sheet1")
  6.         Set lowerRange = .Range("C11")
  7.         Set upperRange = .Range("C10")
  8.         lowerRange.Name = "lowerbound"
  9.         upperRange.Name = "upperbound"
  10.         Set myRange = .Range("A13:J21")

  11.         For Each myCell In myRange
  12.             myCell.Formula = "=RANDBETWEEN(lowerbound,upperbound)/10"
  13.         Next
  14.    
  15.        .[A23] = "循環W"
  16.            
  17.        For cts = 0 To 7     '  inta1 = (intA * w1) + (intB * w9) + (intc * w17) + (intD * w25) + (intE * w33)
  18.            .[D1].Offset(cts) = (.[B1] * .[A13].Offset(cts)) + (.[B2] * IIf(cts = 0, .[A21], .[B12].Offset(cts))) + (.[B3] * IIf(cts <= 1, .[B20], .[C11].Offset(cts)) + (.[B4] * IIf(cts <= 2, .[C19], .[D10].Offset(cts)))) + (.[B5] * IIf(cts <= 3, .[D18], .[E9].Offset(cts)))
  19.            .[F1].Offset(cts) = 1 / (1 + Exp(-.[D1].Offset(cts)))   '  outa1 = 1 / (1 + Exp(-inta1))
  20.        Next cts

  21.        For cts = 0 To 4     '  inti1 = (outa1 * w41) + (outb1 * w46) + (outc1 * w51) + (outd1 * w56) + (oute1 * w61) + (outf1 * w66) + (outg1 * w71) + (outh1 * w76)
  22.            .[H1].Offset(cts) = (.[F1] * .[E17].Offset(cts)) + (.[F2] * .[F13].Offset(cts)) + (.[F3] * IIf(cts = 4, .[G13], .[F18].Offset(cts))) + (.[F4] * .[G14].Offset(cts)) + (.[F5] * IIf(cts > 2, .[H10].Offset(cts), .[G19].Offset(cts))) + (.[F6] * .[H15].Offset(cts)) + (.[F7] * IIf(cts > 1, .[I11].Offset(cts), .[H20].Offset(cts))) + (.[F8] * .[I16].Offset(cts))
  23.            .[J1].Offset(cts) = 1 / (1 + Exp(-.[H1].Offset(cts)))     '  outi1 = 1 / (1 + Exp(-inti1))
  24.        Next cts
  25.    
  26.        For cts = 0 To 1     '  intn1 = (outi1 * w81) + (outj1 * w83) + (outk1 * w85) + (outl1 * w87) + (outm1 * w89)
  27.            .[L1].Offset(cts) = (.[J1] * IIf(cts = 0, .[I21], .[J13])) + (.[J2] * .[J14].Offset(cts)) + (.[J3] * .[J16].Offset(cts)) + (.[J4] * .[J18].Offset(cts)) + (.[J5] * .[J20].Offset(cts))
  28.            .[N1].Offset(cts) = 1 / (1 + Exp(-.[L1].Offset(cts)))     '  outn1 = 1 / (1 + Exp(-intn1))
  29.        Next cts
  30.       
  31.        For cts = 0 To 1     '  errn = outn1 * (1 - outn1) * (tarn - outn1) ,   erro = outo1 * (1 - outo1) * (taro - outo1)
  32.            .[N5].Offset(cts) = .[N1].Offset(cts) * (1 - .[N1].Offset(cts)) * (.[L6].Offset(cts) - .[N1].Offset(cts))
  33.        Next cts
  34.       
  35.        For cts = 0 To 4     '  erri = outi1 * (1 - outi1) * (errn * w81 + erro * w82)   ~   errm = outm1 * (1 - outm1) * (errn * w89 + erro * w90)
  36.            .[P5].Offset(cts) = .[J1].Offset(cts) * (1 - .[J1].Offset(cts)) * (.[N5] * IIf(cts = 0, .[I21], .[J9].Offset(cts * 2 + 1))) + (.[N6] * .[J11].Offset(cts * 2 + 2))
  37.        Next cts
  38.       
  39.        For cts = 0 To 7     '  erra = outa1 * (1 - outa1) * (erri * w41 + errj * w42 + errk * w43 + errl * w44 + errm * w45)
  40.             .Range("Z1:Z5").Clear    '  清除傳存運算資料欄之內容值
  41.             
  42.             If (cts = 7) Then       '  7
  43.                .[Z1] = .[I16]
  44.                .[Z2] = .[I17]
  45.             ElseIf (cts > 4) Then   '  5,6
  46.                .[Z1] = .[H15].Offset((cts - 5) * 5)
  47.                .[Z2] = .[H16].Offset((cts - 5) * 5)
  48.             ElseIf (cts > 2) Then   '  3,4
  49.                .[Z1] = .[G14].Offset((cts - 3) * 5)
  50.                .[Z2] = .[G15].Offset((cts - 3) * 5)
  51.             ElseIf (cts = 0) Then   '  0
  52.                .[Z1] = .[E17]
  53.                .[Z2] = .[E18]
  54.                .[Z3] = .[E19]
  55.             Else                    '  1,2
  56.                .[Z1] = .[F13].Offset((cts - 1) * 5)
  57.                .[Z2] = .[F14].Offset((cts - 1) * 5)
  58.             End If

  59.             If (cts > 5) Then       '  6,7
  60.                .[Z3] = .[I13].Offset((cts - 6) * 5)
  61.                .[Z4] = .[I14].Offset((cts - 6) * 5)
  62.                .[Z5] = .[I15].Offset((cts - 6) * 5)
  63.             ElseIf (cts = 5) Then   '  5
  64.                .[Z3] = .[H17]
  65.                .[Z4] = .[H13].Offset((cts - 5) * 5)
  66.                .[Z5] = .[H14].Offset((cts - 5) * 5)
  67.             ElseIf (cts > 3) Then    '  4
  68.                .[Z3] = .[G16].Offset((cts - 4) * 5)
  69.                .[Z4] = .[H13].Offset((cts - 4) * 5)
  70.                .[Z5] = .[H14].Offset((cts - 4) * 5)
  71.             ElseIf (cts = 3) Then    '  3
  72.                .[Z3] = .[G16].Offset((cts - 3) * 5)
  73.                .[Z4] = .[G15]
  74.                .[Z5] = .[H14].Offset((cts - 3) * 5)
  75.             ElseIf (cts > 1) Then    '  2
  76.                .[Z3] = .[F15].Offset((cts - 2) * 5)
  77.                .[Z4] = .[F16].Offset((cts - 2) * 5)
  78.                .[Z5] = .[G13].Offset((cts - 2) * 5)
  79.             ElseIf (cts = 0) Then    '  0
  80.                .[Z3] = .[E19]
  81.                .[Z4] = .[E20]
  82.                .[Z5] = .[E21]
  83.             Else                      '  1
  84.                .[Z3] = .[F15].Offset((cts - 1) * 5)
  85.                .[Z4] = .[F16].Offset((cts - 1) * 5)
  86.                .[Z5] = .[F17]
  87.             End If
  88.             
  89.             
  90.             .[R5].Offset(cts) = .[F1].Offset(cts) * (1 - .[F1].Offset(cts)) * (.[P5] * .[Z1] + .[P6] * .[Z2] + .[P7] * .[Z3] + .[P8] * .[Z4] + .[P9] * .[Z5])
  91.             '  檢驗測試結果
  92.             '  .[V10].Offset(cts) = .[Z1]
  93.             '  .[V10].Offset(cts, 1) = .[Z2]
  94.             '  .[V10].Offset(cts, 2) = .[Z3]
  95.             '  .[V10].Offset(cts, 3) = .[Z4]
  96.             '  .[V10].Offset(cts, 4) = .[Z5]
  97.        Next cts
  98.    
  99.        .Range("Z1:Z5").Clear         '  清除傳存運算資料欄之內容值
  100.        '  .Range("V10:Z17").Clear    '  清除傳存運算資料欄之內容值

  101.        rp5 = -1: bf1 = 0
  102.        For nxt = 0 To 9         '  neww1 = w1 + (erra * intA)   ~  neww54 = w54 + (errl * outc1)
  103.            For cts = 0 To 8
  104.                rp5 = rp5 + 1

  105.                If ((nxt * 9 + cts + 1) > 80) Then          '  neww81 = w81 + (errn * outi1) ~ neww90 = w90 + (erro * outm1)
  106.                    If ((nxt * 9 + cts + 1) = 81) Then
  107.                        rp5 = 0
  108.                        bf1 = 0
  109.                    End If
  110.                   
  111.                    .[A24].Offset(cts, nxt) = .[A13].Offset(cts) + (.[N5].Offset(rp5) * .[J1].Offset(bf1))
  112.                   
  113.                    If (rp5 = 1) Then
  114.                        rp5 = -1
  115.                        bf1 = bf1 + 1
  116.                    End If
  117.                ElseIf ((nxt * 9 + cts + 1) > 40) Then      '  neww41 = w41 + (erri * outa1) ~ neww80 = w80 + (errm * outh1)
  118.                    If ((nxt * 9 + cts + 1) = 41) Then
  119.                        rp5 = 0
  120.                        bf1 = 0
  121.                    End If
  122.                   
  123.                    .[A24].Offset(cts, nxt) = .[A13].Offset(cts) + (.[P5].Offset(rp5) * .[F1].Offset(bf1))
  124.                   
  125.                    If (rp5 = 4) Then
  126.                        rp5 = -1
  127.                        bf1 = bf1 + 1
  128.                    End If
  129.                Else                                        '  neww1 = w1 + (erra * intA) ~ neww40 = w40 + (errh * intE)
  130.                    .[A24].Offset(cts, nxt) = .[A13].Offset(cts) + (.[R5].Offset(rp5) * .[B1].Offset(bf1))
  131.                   
  132.                    If (rp5 = 7) Then
  133.                        rp5 = -1
  134.                        bf1 = bf1 + 1
  135.                    End If
  136.                End If
  137.            Next cts
  138.        Next nxt
  139.    End With
  140.   類神經擴充迴圈運算
  141. End Sub
複製代碼

TOP

回復 7# qwertyuio111
  1. Sub 類神經擴充迴圈運算()
  2.     Dim cts As Integer, nxt As Integer
  3.     Dim rp5 As Integer, bf1 As Integer, i As Integer
  4.    
  5.     With Sheets("Sheet1")
  6.        For i = 2 To 150    ' 1500
  7.            .[A23] = "循環W (" & i & ")"
  8.            For cts = 0 To 7     '  inta1 = (intA * neww1) + (intB * neww9) + (intc * neww17) + (intD * neww25) + (intE * neww33)
  9.                .[D1].Offset(cts) = (.[B1] * .[A24].Offset(cts)) + (.[B2] * IIf(cts = 0, .[A32], .[B23].Offset(cts))) + (.[B3] * IIf(cts <= 1, .[B31], .[C22].Offset(cts)) + (.[B4] * IIf(cts <= 2, .[C30], .[D21].Offset(cts)))) + (.[B5] * IIf(cts <= 3, .[D29], .[E20].Offset(cts)))
  10.                .[F1].Offset(cts) = 1 / (1 + Exp(-.[D1].Offset(cts)))   '  outa1 = 1 / (1 + Exp(-inta1))
  11.            Next cts

  12.            For cts = 0 To 4     '  inti1 = (outa1 * neww41) + (outb1 * neww46) + (outc1 * neww51) + (outd1 * neww56) + (oute1 * neww61) + (outf1 * neww66) + (outg1 * neww71) + (outh1 * neww76)
  13.            .[H1].Offset(cts) = (.[F1] * .[E28].Offset(cts)) + (.[F2] * .[F24].Offset(cts)) + (.[F3] * IIf(cts = 4, .[G24], .[F29].Offset(cts))) + (.[F4] * .[G25].Offset(cts)) + (.[F5] * IIf(cts > 2, .[H21].Offset(cts), .[G30].Offset(cts))) + (.[F6] * .[H26].Offset(cts)) + (.[F7] * IIf(cts > 1, .[I22].Offset(cts), .[H31].Offset(cts))) + (.[F8] * .[I27].Offset(cts))
  14.                .[J1].Offset(cts) = 1 / (1 + Exp(-.[H1].Offset(cts)))     '  outi1 = 1 / (1 + Exp(-inti1))
  15.            Next cts
  16.    
  17.            For cts = 0 To 1     '  intn1 = (outi1 * neww81) + (outj1 * neww83) + (outk1 * neww85) + (outl1 * neww87) + (outm1 * neww89)
  18.                .[L1].Offset(cts) = (.[J1] * IIf(cts = 0, .[I32], .[J24])) + (.[J2] * .[J25].Offset(cts)) + (.[J3] * .[J27].Offset(cts)) + (.[J4] * .[J29].Offset(cts)) + (.[J5] * .[J31].Offset(cts))
  19.                .[N1].Offset(cts) = 1 / (1 + Exp(-.[L1].Offset(cts)))     '  outn1 = 1 / (1 + Exp(-intn1))
  20.            Next cts
  21.       
  22.            For cts = 0 To 1     '  errn = outn1 * (1 - outn1) * (tarn - outn1) ,   erro = outo1 * (1 - outo1) * (taro - outo1)
  23.                .[N5].Offset(cts) = .[N1].Offset(cts) * (1 - .[N1].Offset(cts)) * (.[L6].Offset(cts) - .[N1].Offset(cts))
  24.            Next cts
  25.       
  26.            For cts = 0 To 4     '  erri = outi1 * (1 - outi1) * (errn * neww81 + erro * neww82)   ~   errm = outm1 * (1 - outm1) * (errn * neww89 + erro * neww90)
  27.                .[P5].Offset(cts) = .[J1].Offset(cts) * (1 - .[J1].Offset(cts)) * (.[N5] * IIf(cts = 0, .[I32], .[J20].Offset(cts * 2 + 1))) + (.[N6] * .[J22].Offset(cts * 2 + 2))
  28.            Next cts
  29.       
  30.            For cts = 0 To 7     '  erra = outa1 * (1 - outa1) * (erri * w41 + errj * w42 + errk * w43 + errl * w44 + errm * w45)
  31.                 .Range("Z1:Z5").Clear    '  清除傳存運算資料欄之內容值
  32.             
  33.                 If (cts = 7) Then       '  7
  34.                    .[Z1] = .[I27]
  35.                    .[Z2] = .[I28]
  36.                 ElseIf (cts > 4) Then   '  5,6
  37.                    .[Z1] = .[H26].Offset((cts - 5) * 5)
  38.                    .[Z2] = .[H27].Offset((cts - 5) * 5)
  39.                 ElseIf (cts > 2) Then   '  3,4
  40.                    .[Z1] = .[G25].Offset((cts - 3) * 5)
  41.                    .[Z2] = .[G26].Offset((cts - 3) * 5)
  42.                 ElseIf (cts = 0) Then   '  0
  43.                    .[Z1] = .[E28]
  44.                    .[Z2] = .[E29]
  45.                    .[Z3] = .[E30]
  46.                 Else                    '  1,2
  47.                    .[Z1] = .[F24].Offset((cts - 1) * 5)
  48.                    .[Z2] = .[F25].Offset((cts - 1) * 5)
  49.                 End If

  50.                 If (cts > 5) Then       '  6,7
  51.                    .[Z3] = .[I24].Offset((cts - 6) * 5)
  52.                    .[Z4] = .[I25].Offset((cts - 6) * 5)
  53.                    .[Z5] = .[I26].Offset((cts - 6) * 5)
  54.                 ElseIf (cts = 5) Then   '  5
  55.                    .[Z3] = .[H28]
  56.                    .[Z4] = .[H24].Offset((cts - 5) * 5)
  57.                    .[Z5] = .[H25].Offset((cts - 5) * 5)
  58.                 ElseIf (cts > 3) Then    '  4
  59.                    .[Z3] = .[G27].Offset((cts - 4) * 5)
  60.                    .[Z4] = .[H24].Offset((cts - 4) * 5)
  61.                    .[Z5] = .[H25].Offset((cts - 4) * 5)
  62.                 ElseIf (cts = 3) Then    '  3
  63.                    .[Z3] = .[G27].Offset((cts - 3) * 5)
  64.                    .[Z4] = .[G26]
  65.                    .[Z5] = .[H25].Offset((cts - 3) * 5)
  66.                 ElseIf (cts > 1) Then    '  2
  67.                    .[Z3] = .[F26].Offset((cts - 2) * 5)
  68.                    .[Z4] = .[F27].Offset((cts - 2) * 5)
  69.                    .[Z5] = .[G24].Offset((cts - 2) * 5)
  70.                 ElseIf (cts = 0) Then    '  0
  71.                    .[Z3] = .[E30]
  72.                    .[Z4] = .[E31]
  73.                    .[Z5] = .[E32]
  74.                 Else                      '  1
  75.                    .[Z3] = .[F26].Offset((cts - 1) * 5)
  76.                    .[Z4] = .[F27].Offset((cts - 1) * 5)
  77.                    .[Z5] = .[F28]
  78.                 End If
  79.             
  80.             
  81.                 .[R5].Offset(cts) = .[F1].Offset(cts) * (1 - .[F1].Offset(cts)) * (.[P5] * .[Z1] + .[P6] * .[Z2] + .[P7] * .[Z3] + .[P8] * .[Z4] + .[P9] * .[Z5])
  82.                 '  檢驗測試結果
  83.                 '  .[V10].Offset(cts) = .[Z1]
  84.                 '  .[V10].Offset(cts, 1) = .[Z2]
  85.                 '  .[V10].Offset(cts, 2) = .[Z3]
  86.                 '  .[V10].Offset(cts, 3) = .[Z4]
  87.                 '  .[V10].Offset(cts, 4) = .[Z5]
  88.            Next cts
  89.    
  90.            .Range("Z1:Z5").Clear         '  清除傳存運算資料欄之內容值
  91.            '  .Range("V10:Z17").Clear    '  清除傳存運算資料欄之內容值

  92.            rp5 = -1: bf1 = 0
  93.            For nxt = 0 To 9         '  neww1 = neww1 + (erra * intA)   ~  neww54 = neww54 + (errl * outc1)
  94.                For cts = 0 To 8
  95.                    rp5 = rp5 + 1

  96.                    If ((nxt * 9 + cts + 1) > 80) Then          '  neww81 = neww81 + (errn * outi1) ~ neww90 = neww90 + (erro * outm1)
  97.                        If ((nxt * 9 + cts + 1) = 81) Then
  98.                            rp5 = 0
  99.                            bf1 = 0
  100.                        End If
  101.                   
  102.                        .[A24].Offset(cts, nxt) = .[A24].Offset(cts, nxt) + (.[N5].Offset(rp5) * .[J1].Offset(bf1))
  103.                   
  104.                        If (rp5 = 1) Then
  105.                            rp5 = -1
  106.                            bf1 = bf1 + 1
  107.                        End If
  108.                    ElseIf ((nxt * 9 + cts + 1) > 40) Then      '  neww41 = neww41 + (erri * outa1) ~ neww80 = neww80 + (errm * outh1)
  109.                        If ((nxt * 9 + cts + 1) = 41) Then
  110.                            rp5 = 0
  111.                            bf1 = 0
  112.                        End If
  113.                   
  114.                        .[A24].Offset(cts, nxt) = .[A24].Offset(cts, nxt) + (.[P5].Offset(rp5) * .[F1].Offset(bf1))
  115.                   
  116.                        If (rp5 = 4) Then
  117.                            rp5 = -1
  118.                            bf1 = bf1 + 1
  119.                        End If
  120.                    Else                                        '  neww1 = neww1 + (erra * intA) ~ neww40 = neww40 + (errh * intE)
  121.                        .[A24].Offset(cts, nxt) = .[A24].Offset(cts, nxt) + (.[R5].Offset(rp5) * .[B1].Offset(bf1))
  122.                        
  123.                        If (rp5 = 7) Then
  124.                            rp5 = -1
  125.                            bf1 = bf1 + 1
  126.                        End If
  127.                    End If
  128.                Next cts
  129.            Next nxt
  130.        Next i
  131.    End With
  132. End Sub
複製代碼

TOP

        靜思自在 : 吃苦了苦、苦盡廿來,享福了福、福盡悲來。
返回列表 上一主題