2013-11-10 109 views
2

我正在训练一个神经网络来分类图像,并且完成一次迭代需要很长的时间...大约五分钟,但仍然没有完成。我正在使用Encog 3.1。我的代码有问题吗?Encog神经网络训练java太慢

BasicNetwork network = new BasicNetwork(); 
     network.addLayer(new BasicLayer(null,true,5625)); 
     network.addLayer(new BasicLayer(new ActivationSigmoid(),true,(intIdealCount+5625)/2)); 
     network.addLayer(new BasicLayer(new ActivationSigmoid(),true,intIdealCount)); 
     network.getStructure().finalizeStructure(); 

这里是我的训练代码:

final ResilientPropagation train = new ResilientPropagation(network, trainingSet); 

     int epoch = 1; 

     do { 
      train.iteration(); 
      System.out.println("Epoch #" + epoch + " Error:" + train.getError()); 
      epoch++; 
     } while(train.getError() > 0.01); 

任何响应将不胜感激。谢谢。

+0

我不熟悉这个库,但熟悉机器学习和它的应用成像。这可能需要很长时间... –

+0

嗨,对OT很抱歉,但我开始使用encog,并且我有一些我不完全理解的东西。我可以问你一点时间吗?如果是的话,请检查我的问题问题:http://stackoverflow.com/questions/21847695/c-sharp-encog-svm-classification-with-my-own-dataset。谢谢 – user2886091

回答

4

你的代码看起来不错,但是根据你的数据,培训可以任意长。从你的网络规模可以推断出,你正在使用图像 - 现在如果你有很多图像 - 即使最有效的实现将永远存在。 Encog是相当好的一段代码 - 默认情况下它适用于所有可用的内核,但FANN似乎是目前最快的ANN库。

你有〜5000个输入神经元,假设你有〜10个输出神经元,你有〜2500个隐藏的神经元。所以你的网络有(5000 + 1)* 2500 +(2500 + 1)* 10的权重(约12,500,000)。现在,假设您的训练集中有N幅图像 - 一个时期需要计算(和更新)12,500,000 * N个值。所以即使你只有200张图像,它也是25亿次更新来计算的。

至少有三种可能的方式:

  • 尝试FANN库,这是最有效率的
  • 例如使用PCA(减少您的图片维度之一,作为一个结果 - 减少网络的大小)
  • 您确定需要2500个隐藏节点吗?这是相当多的
+0

你建议隐藏多少层?我正在通过图像识别进行皮肤疾病诊断。 –

+0

我建议尽可能小。更大的数量不仅意味着更长的计算,而且更可能是过度拟合。简单地从一些小的开始,并在必要时增加它的大小 - 而不是相反。 – lejlot

+0

我以前从未使用过Encog - 但那不是完整的图片。虽然是一个很大的数字 - 那只有2.5 GigaFLOPs。一个(不花哨)的核心2 Q6600可以每秒38个GigaFLOPs。即使假设Java对原始吞吐量的惩罚比C/C++要慢 - 应该可以在合理的时间内完成1个时期。 –