Encog神经网络训练java太慢了

时间:2013-11-10 06:18:46

标签: java machine-learning neural-network encog

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

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

任何回复都将不胜感激。谢谢。

1 个答案:

答案 0 :(得分:4)

您的代码似乎很好,但根据您的数据,培训可能会变得很长。从您的网络规模可以推断,您正在使用图像 - 现在如果您有很多图像 - 即使是最有效的实施也将永远。 Encog是相当不错的代码 - 它默认适用于所有可用内核,但FANN现在似乎是最快的ANN库。

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

至少有三种可能的方式:

  • 尝试FANN库,这是最有效的库之一
  • 使用例如PCA降低图像的维度(结果 - 减少网络的大小)
  • 您确定需要2500个隐藏节点吗?这是非常多的