Время обучения MNIST в CPU - PullRequest
0 голосов
/ 12 мая 2019

Я создал простую библиотеку нейронной сети с прямой связью в Java - и мне нужен тест для сравнения и устранения неполадок в моей библиотеке.

Характеристики компьютера:

  • 8-ядерный процессор AMD Ryzen 7 2700X
  • RAM 16,0 ГБ
  • ОС WINDOWS 10
  • Аргументы JVM: -Xms1024m -Xmx8192m

Обратите внимание, что я не использую графический процессор.

Пожалуйста, перечислите следующие характеристики:

  • Спецификации компьютера?
  • GPU или CPU (CPU предлагается, но GPU - хорошая информация)
  • Количество входов 784 (это фиксировано)
  • Для каждого слоя:
    • Сколько узлов?
    • Какая функция активации?
  • Выходной слой:
    • Сколько узлов? (10 если классификация или 1 как регрессия)
    • Какая функция активации?
  • Какая функция потери?
  • Какой алгоритм градиентного спуска (т.е. ваниль)
  • Какой размер партии?
  • Сколько эпох? (не итерации)
  • И, наконец, какое время и точность обучения?

Большое спасибо

Редактировать

Просто чтобы дать представление о том, с чем я имею дело. Я создал сеть с

  • 784 входных узла
  • 784 в скрытом слое 0
  • 256 в скрытом слое 1
  • 128 в скрытом слое 2
  • 1 выходных узла
  • размер мини-партии 5
  • 16 тем для backprop И он тренировался в течение ~ 8 часов и выполнил всего 694 итерации - это даже не 20% от одной эпохи.

Как это сделать за несколько минут, как я видел некоторые претензии?

1 Ответ

1 голос
/ 18 июля 2019

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));


}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...