Mnożenie wartości double różnych tablic w pętli - nie oczekiwane wyniki

Mnożenie wartości double różnych tablic w pętli - nie oczekiwane wyniki
  • Rejestracja: dni
  • Ostatnio: dni
0

Witam Was ponownie,
tym razem zrobiłem lwią część skalowalnej sieci neuronowej z tablicami dwu wymiarowymi.
W metodzie double[]

Kopiuj
delty_wag_h() 

chcę mnożyć 3 wartości przyrostu wag neuronów: wsp_korekcji/uczenia * syg_bledu_h[x] * funkc_aktyw_hide[x] ale to się żle mnoży.

Kopiuj
        public double[] delty_wag_h(){
            for(int x=0; x<syg_bled_H.length; x++){
                delta_wag_h[x] = wsp_kor * syg_bled_H[x]*(fa_hide_tab[x]);
            }
            return delta_wag_h;
        }

Próbowałem też tak ale wyniki nadal są nie prawidłowe - zawyżone:

Kopiuj
        public double[] delty_wag_h(){
            for(int x=0; x<syg_bled_H.length; x++){
                delta_wag_h[x] = wsp_kor;
                tmp[x] = delta_wag_h[x]*fa_hide_tab[x];
                delta_wag_h[x] *= tmp[x];
            }
            return delta_wag_h;
        }

Czekam na jakieś sugestie bo sam nie wiem już co wymyślić.

  • Rejestracja: dni
  • Ostatnio: dni
0

Edit: wkradła mi się "literówka" powinno być w drugiej metodzie:

Kopiuj
       public double[] delty_wag_h(){
            for(int x=0; x<syg_bled_H.length; x++){
                delta_wag_h[x] = wsp_kor;
                tmp[x] = syg_bled_H[x] * fa_hide_tab[x];  // tu była zła tablica ale to i tak nie działa poprawnie
                delta_wag_h[x] *= tmp[x];
            }
            return delta_wag_h;
        }
Bumcykowy
  • Rejestracja: dni
  • Ostatnio: dni
0

Czy w delta_wag_h ma się znajdować ostateczny błąd który zostanie użyty podczas aktualizowania wag neuronów? Czy to jest algorytm backpropagation?

  • Rejestracja: dni
  • Ostatnio: dni
0

Tak ostateczny, który jest już oczywiście częścią prop. wstecznej.

Ale to nie oto chodzi.
Jak policzyłem na kalkulatorze to równanie to mi wyszło ok mnożąc je osobno.
Tu chodzi o sposób mnożenia double na tablicach.

Bumcykowy
  • Rejestracja: dni
  • Ostatnio: dni
0

Chodzi ci o to że mnożenie double * double daje ci inny wynik niż kiedy te double były by w tablicy(tab[0] * tab[0])?

  • Rejestracja: dni
  • Ostatnio: dni
0

Z grubsza jak weźmiesz 0.1 * (-0.0082)= -0.00082 * 0.7892 = -0.000647144 i taki wynik ma wyjść. Indeksy tablic mi się zgadzają. Zobaczymy jutro dziś jestem już zmęczony.

  • Rejestracja: dni
  • Ostatnio: dni
0

A czy to ma sens?

Kopiuj
       double a = 0.0;
       public double delta_wag(){
            a= 0.1 * (-0.0082);
            return a; 
        }

Wyniki:
-8.200000000000001E-4

Co to w ogóle jest? WTF?

PK
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 51
1

A moze sprobuj uzyc do tego klasy BigDecimal?

  • Rejestracja: dni
  • Ostatnio: dni
0

Wielkie dzięki kolego :)

Bumcykowy
  • Rejestracja: dni
  • Ostatnio: dni
0

Moim zdaniem BigDecimal tutaj nie ma sensu używać, lepiej znajdź przyczynę dlaczego podstawowe działanie daje ci zły wynik. Ja bym zaczął od ponownej instalacji jdk.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.