784 входных узла
784 в скрытом слое 0
256 в скрытом слое 1
128 в скрытом слое 2
1 выходной узел
размер мини-партии 5
Вы можете сделать тоньше: 784 => 784/2, 160, 40, размер партии не менее 50.
И да, событие в Java, что обычно медленно, наивное решение должно работать как несколько минут для ПОЛНОГО поезд означает 10 ~ 20 эпох.
Как вы это реализовали? Не говорите, что у вас есть класс нейронов, и каждый нейрон представлен экземпляром.
Не стоит бежать так ужасно медленно. Оптимизация, которую я знаю, состоит в том, чтобы представить вторую матрицу транспонированной точки и использовать алгоритм Штрассена-Винограда, но вы делаете что-то неправильно
Посмотрите на мою точечную реализацию:
import java.util.Arrays;
public class JTensor {
private float [] data;// contains data.length
private int width;
public static void dot_T(double [] out, double [] x, double [] y, int wy) {
int iOut = 0;
for (int ix = 0; ix < x.length; ix+=wy) {
for (int iy = 0; iy < y.length;) {
int ixv = ix;
int iyLimit = iy + wy;
double summ = 0;
for(;iy <iyLimit;) {
summ += x[ixv++] * y[iy++];
}
out[iOut++] = summ;
}
}
}
public static void main(String[] args) {
System.out.println("generate random");
int size = 1000;
double []x = new double [size * size];
double []y = new double [size * size];
double []out = new double [size * size];
for (int i = 0; i < x.length; i++) {
x[i] = (double)i ;
}
for (int i = 0; i < y.length; i++) {
y[i] = (double)i ;
}
System.out.println("start ");
long start = System.nanoTime();
JTensor.dot_T(out, x,y,size);
long end = System.nanoTime();
System.out.println("elapsed " + ((end- start)/ (1000.0*1000*1000)));
//System.out.println(Arrays.toString( x));
//System.out.println(Arrays.toString( y));
//System.out.println(Arrays.toString( out));
}