Funktioniert das Neurale Netz so?

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Funktioniert das Neurale Netz so?

    Ich programmiere gerade ein neurales netz für gamemaker, bin mir aber nicht sicher ob das so funktioniert:

    CREATE

    GML-Quellcode

    1. ​energy = 1000
    2. speed = 0
    3. direction = random(360)
    4. input_c = 2 //direction of next good food //direction of next bad food
    5. lay1_c = 15
    6. lay2_c = 10
    7. out_c = 3
    8. lay1 = ds_grid_create(input_c,lay1_c)
    9. for (i=0;i<input_c;i++){
    10. for (j=0;j<lay1_c;j++){
    11. ds_grid_add(lay1,i,j,random(1))
    12. }
    13. }
    14. lay2 = ds_grid_create(lay1_c,lay2_c)
    15. for (i=0;i<lay1_c;i++){
    16. for (j=0;j<lay2_c;j++){
    17. ds_grid_add(lay2,i,j,random(1))
    18. }
    19. }
    20. out = ds_grid_create(lay2_c,out_c)
    21. for (i=0;i<lay2_c;i++){
    22. for (j=0;j<out_c;j++){
    23. ds_grid_add(out,i,j,random(1))
    24. }
    25. }
    Alles anzeigen

    STEP

    GML-Quellcode

    1. ​in[0] = -1
    2. in[1] = -1
    3. if (instance_number(food_good)!=0){
    4. good = instance_nearest(x,y,food_good)
    5. in[0] = point_direction(x,y,good.x,good.y)
    6. }
    7. if (instance_number(food_bad)!=0){
    8. bad = instance_nearest(x,y,food_bad)
    9. in[1] = point_direction(x,y,bad.x,bad.y)
    10. }
    11. lay1L = ds_list_create()
    12. ds_list_add(lay1L,0)
    13. for (i=0;i<lay1_c;i++)
    14. ds_list_add(lay1L,0)
    15. lay2L = ds_list_create()
    16. for (i=0;i<lay2_c;i++)
    17. ds_list_add(lay2L,0)
    18. outL = ds_list_create()
    19. ds_list_add(outL,0)
    20. for (i=0;i<out_c;i++)
    21. ds_list_add(outL,0)
    22. for (i=0;i<input_c;i++){
    23. for (j=0;j<lay1_c;j++){
    24. ds_list_replace(lay1L,j,in[i]*ds_grid_get(lay1,i,j))
    25. }
    26. }
    27. for (i=0;i<lay1_c;i++){
    28. for (j=0;j<lay2_c;j++){
    29. ds_list_replace(lay2L,j, ds_list_find_value(lay1L,i)*ds_grid_get(lay2,i,j))
    30. }
    31. }
    32. for (i=0;i<lay2_c;i++){
    33. for (j=0;j<out_c;j++){
    34. ds_list_replace(outL,j,ds_list_find_value(lay2L,i)*ds_grid_get(out,i,j))
    35. }
    36. }
    37. //for (i=0;i<out_c;i++){
    38. // show_debug_message(string(ds_list_find_value(outL,i)))
    39. //}
    40. direction += ds_list_find_value(outL,0)
    41. direction -= ds_list_find_value(outL,1)
    42. speed = ds_list_find_value(outL,2)*(room_speed/60)
    43. energy -= speed*(room_speed/60)/2
    44. energy -= 1.8
    Alles anzeigen

    bei Berührung eines food_good wird der energy wert erhöht, umgekehrt beim food_bad.
    Wenn die Energie auf 0 sinkt, wird das objekt zerstört.
    Ein Control object erstellt immer wieder food_good und food_bad und neue entity objekte, wenn eines zerstört wird.
    Ich bin Aaron. :D
  • Eine Sache fällt mir gerade auf: Das Netz weiß nicht mal welche Richtung es selbst hat. Deshalb hat es auch nicht funktioniert. Als 3. Input muss noch die eigene Richtung gegeben sein. Aber würde es ansonsten klappen?
    Ich bin Aaron. :D
  • Kannst du den zweiten Code konnentieren? Sonst weiß ich nicht wo du dein Netzwerk benutzt/trainierst.
    Ein Bug ist mehr als nur ein Bug, es ist ein... Käfer!
    Egal, wie gut du eine Mauer baust, sie fällt um.... der klügere gibt nach :D

    Willst du mit mir auf Discord Chatten/Quatschen?
    Meine Husi's Tutorial Reihe
  • Hier der STEP Code in kommentiert:

    GML-Quellcode

    1. //input werte setzen
    2. in[0] = -1
    3. in[1] = -1
    4. in[2] = -1
    5. //input werte holen
    6. if (instance_number(food_good)!=0){
    7. good = instance_nearest(x,y,food_good)
    8. in[0] = point_direction(x,y,good.x,good.y)
    9. }
    10. if (instance_number(food_bad)!=0){
    11. bad = instance_nearest(x,y,food_bad)
    12. in[1] = point_direction(x,y,bad.x,bad.y)
    13. }
    14. in[2] = direction
    15. //liste mit neuron-werten erstellen
    16. lay1L = ds_list_create()
    17. ds_list_add(lay1L,0)
    18. for (i=0;i<lay1_c;i++)
    19. ds_list_add(lay1L,0)
    20. lay2L = ds_list_create()
    21. for (i=0;i<lay2_c;i++)
    22. ds_list_add(lay2L,0)
    23. outL = ds_list_create()
    24. ds_list_add(outL,0)
    25. for (i=0;i<out_c;i++)
    26. ds_list_add(outL,0)
    27. //die ergebnisse speichern - layer 1
    28. for (i=0;i<input_c;i++){
    29. for (j=0;j<lay1_c;j++){
    30. //ergebnis ist input*gewichtung + vorige werte
    31. ds_list_replace(lay1L,j,ds_list_find_value(lay1L,j)+in[i]*ds_grid_get(lay1,i,j))
    32. }
    33. }
    34. //layer 2
    35. for (i=0;i<lay1_c;i++){
    36. for (j=0;j<lay2_c;j++){
    37. //ergebnis ist layer 1 ergebnis mal gewichtung + vorige werte
    38. ds_list_replace(lay2L,j,ds_list_find_value(lay2L,j)+ds_list_find_value(lay1L,i)*ds_grid_get(lay2,i,j))
    39. }
    40. }
    41. //das selbe für den output
    42. for (i=0;i<lay2_c;i++){
    43. for (j=0;j<out_c;j++){
    44. ds_list_replace(outL,j,ds_list_find_value(outL,j)+ds_list_find_value(lay2L,i)*ds_grid_get(out,i,j))
    45. }
    46. }
    47. direction += ds_list_find_value(outL,0)
    48. direction -= ds_list_find_value(outL,1)
    49. speed = 2//ds_list_find_value(outL,2)*(room_speed/60) //hab ich zu testzwecken rausgenommen
    50. energy -= speed*(room_speed/60)/2
    51. energy -= 1.8
    Alles anzeigen
    Ich bin Aaron. :D