MNIST在CPU中的训练时间

时间:2019-05-12 00:28:32

标签: python tensorflow neural-network mnist

我在readarray -t ADDR < <(ls -la) 中创建了一个简单的前馈神经网络库-我需要一个基准来对我的库进行比较和故障排除。

计算机规格:

  • AMD Ryzen 7 2700X八核处理器
  • RAM 16.0 GB
  • WINDOWS 10操作系统
  • JVM参数:Java -Xms1024m

请注意,我没有使用GPU。

请列出以下规格:

  • 计算机规格?
  • GPU或CPU(提供CPU,但GPU是很好的信息)
  • 输入数量784(固定)
  • 对于每一层:
    • 多少个节点?
    • 什么激活功能?
  • 输出层:
    • 多少个节点? (如果分类为10,则1为回归)
    • 什么激活功能?
  • 什么损失函数?
  • 什么是梯度下降算法(即:香草)
  • 什么批次大小?
  • 多少个时代? (不是迭代)
  • 最后,培训时间和准确性是多少?

非常感谢您

修改

只给我一个我正在处理的想法。我用

创建了一个网络
  • 784个输入节点
  • 隐藏层0中的784
  • 隐藏1层中有256个
  • 隐藏层2中的128个
  • 1个输出节点
  • 小批量5号
  • 16个用于反向传播的线程 它已经训练了大约8个小时,并且仅完成了694次迭代-甚至不到一个时期的20%。

在我看到一些要求后,如何在几分钟内完成?

2 个答案:

答案 0 :(得分:1)

  

784个输入节点   784位于隐藏层0   隐藏层1中的256   隐藏层2中的128   1个输出节点   迷你批量5

您可以做得更细:784 => 784 / 2、160、40,批处理大小至少为50。

是的,在Java中,是的,通常比较慢,天真的解决方案必须像几分钟 完成那样运行,意味着10〜20个纪元。

您如何实施它?不要告诉您有一个神经元类,并且每个神经元都由一个实例表示。

它不应该这么慢地运行。我知道的最优化是代表点转置的第二矩阵并使用strassen-vinograd算法,但是您在其他方面做错了

看看我的点实现:

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


}

答案 1 :(得分:0)

我不是很清楚您要寻找的基准,是从培训角度来看还是性能还是准确性?为了提高准确性,有一些工具可以将预测值与实际值进行比较,以便您评估效果