0

Моя сеть достигает всего лишь 80%, но лучший результат - около 85%. Я использую те же входные данные и ту же инициализацию. Я не знаю, что случилось, поэтому я стараюсь, чтобы проверить мои градиенты и реализован, что рекомендуется для градиентной проверки: http://ufldl.stanford.edu/tutorial/supervised/DebuggingGradientChecking/Правильно ли мой метод проверки градиента и неправильный расчет градиента или наоборот?

Но им не уверен, если моя реализация является правильной:

 public void gradientchecking(double[] theta){ 
     System.out.println("Gradient Checking started"); 
     //costfunction returns cost and gradients 
     IPair<Double, double[]> org = costfunction(theta); 
     double[] theta_pos = new double[theta.length]; 
     double[] theta_neg = new double[theta.length]; 
     for (int i = 0; i < theta.length; i++) { 
      theta_pos[i]= theta[i]; 
      theta_neg[i]=theta[i]; 
     } 

     double mu = 1e-5; 
     for (int k = 0; k < 20; k++) { 
      theta_pos[k] = theta_pos[k] + mu; 
      theta_neg[k] = theta_neg[k] - mu; 
      IPair<Double, double[]> pos = costfunction(theta_pos); 
      IPair<Double, double[]> neg = costfunction(theta_neg); 
      System.out.println("Org: "+org.getSecond()[k] +" check:"+ ((pos.getSecond()[k]-neg.getSecond()[k])/(2*mu))); 
      //System.out.println("Org: "+org.getSecond()[k] +"check:"+ ((pos.getSecond()[k]-neg.getSecond()[k])/(2*mu))); 
      theta_pos[k] = theta_pos[k] - mu; 
      theta_neg[k] = theta_neg[k] + mu; 
     } 
    } 
} 

я получил следующий результат после того, как только что инициализирован тета:

Gradient Checking started 
Cost: 1.1287071297725055 | Wrong: 124 | start: Thu Jul 30 22:57:08 CEST 2015 |end: Thu Jul 30 22:57:18 CEST 2015 
Cost: 1.128707130295382 | Wrong: 124 | start: Thu Jul 30 22:57:18 CEST 2015 |end: Thu Jul 30 22:57:28 CEST 2015 
Cost: 1.1287071292496391 | Wrong: 124 | start: Thu Jul 30 22:57:28 CEST 2015 |end: Thu Jul 30 22:57:38 CEST 2015 
Org: 5.2287135944026004E-5 check:1.0184607936733826E-4 
Cost: 1.1287071299252593 | Wrong: 124 | start: Thu Jul 30 22:57:38 CEST 2015 |end: Thu Jul 30 22:57:47 CEST 2015 
Cost: 1.1287071296197628 | Wrong: 124 | start: Thu Jul 30 22:57:47 CEST 2015 |end: Thu Jul 30 22:57:56 CEST 2015 
Org: 1.5274823511207024E-5 check:1.141254586229615E-4 
Cost: 1.1287071299063134 | Wrong: 124 | start: Thu Jul 30 22:57:56 CEST 2015 |end: Thu Jul 30 22:58:05 CEST 2015 
Cost: 1.1287071296387077 | Wrong: 124 | start: Thu Jul 30 22:58:05 CEST 2015 |end: Thu Jul 30 22:58:14 CEST 2015 
Org: 1.3380293717695182E-5 check:1.0008639478696018E-4 
Cost: 1.1287071297943114 | Wrong: 124 | start: Thu Jul 30 22:58:14 CEST 2015 |end: Thu Jul 30 22:58:23 CEST 2015 
Cost: 1.1287071297507094 | Wrong: 124 | start: Thu Jul 30 22:58:23 CEST 2015 |end: Thu Jul 30 22:58:32 CEST 2015 
Org: 2.1800899147740388E-6 check:9.980780136716263E-5 

, который указывает, что мой градиент вычисления имеет ошибку, или метод gradientchecking(). Я не уверен, может кто-нибудь мне помочь?

ответ

1

В массивах Java используются ссылочные типы.

int[] arr = { 8,7,6,5,4,3,2,1,8}; 
int[] b = arr; 
b [0] = -10; 
for (int i:arr) { 
    System.out.print (' '); 
    System.out.print (i); 
} 

выходы -10 7 6 5 4 3 2 1 8

Так я означаю, что вы неправильно создание массивы

double[] theta_pos = theta; 
double[] theta_neg = theta; 

они просто ссылки на тета, а также путем изменения их содержимого, измените theta также, + mu-mu = 0. Используйте методы clone() во время копирования массива.

double[] theta_pos = theta.clone(); 
double[] theta_neg = theta.clone(); 

Но помните, что клон не может работать, как вы ожидали, в некоторых случаях, с простыми (не эталонными) типами она работает идеально. Посмотрите на это Does calling clone() on an array also clone its contents?

+0

Я изменил его соответствующим образом, но результаты также не так ожидаются – user3352632

+0

, вы думаете, что код верный прямо сейчас? – user3352632

+0

У вас всегда есть 20 элементов во втором цикле? Лучше использовать «k

Смежные вопросы