返回列表 上一主題 發帖

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 類神經運算模擬檔案

回復 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

回復 6# GBKEE


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

如圖所示


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


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

TOP

回復 8# GBKEE


    謝謝版主
幫小弟解答例題的寫法及方式。
讓我有個基本的架構 謝謝:)

我會試著解決一開始所提出的問題。
5x8x8x2  多層架構的形式  謝謝。:)

TOP

回復 10# c_c_lai


    謝謝大大
幫我解決一開始的問題。
我會好好研究學習這種寫法及測試。:)
謝謝!!!!!

如後續還有相關問題,還請大大不吝指教,謝謝。:)

TOP

本帖最後由 qwertyuio111 於 2015-11-30 12:42 編輯

回復 10# c_c_lai


    不好意思,這次測試這麼久,才上來再次詢問。
原因是 在自行學習修改解決「原始W」產生一次後,就「不變動」的程式碼。
(此部分)

以及在寫入設定 目標值(Target n,Target o) 與 輸出值(Out n,Out o),相等後會停止,跳出迴圈計算的問題。(不必計算到設定次數)
但始終改寫到一半產生錯誤,會自行跳出計算,或產生當機。
(此部分)
跳出迴圈.PNG
次數.PNG
再次懇求協助修改程式碼  謝謝!!!!!!!!!!!
新的EXCEL
類神經擴充 迴圈運算(新版).zip (44.32 KB)

TOP

回復 16# stillfish00


    謝謝大大指導
小弟 我連基本的「浮點數」收斂概念都不清楚。
我會先去多翻幾本書加強概念的。
今天學到重要的一課。  謝謝!!

TOP

本帖最後由 qwertyuio111 於 2015-11-30 21:41 編輯

回復 17# c_c_lai


    不好意思,我對浮點數要收斂到「完全相等是不可能的」。
這個概念我到剛才才了解到,我應該要設定為差值多少就跳出迴圈的方式才對。
「設定和目標小於多少誤差內就停止。」
只能逼近 不能完全相等 (因為有(指數)在裡面)
我會去多翻幾本基本概念的書的....

TOP

        靜思自在 : 君子如水,隨方就圓,無處不自在。
返回列表 上一主題