2013-11-10 3 views
2

Я тренирую нейронную сеть, чтобы классифицировать изображения, и для завершения одной итерации требуется слишком много времени ... около пяти минут, и это еще не сделано. Я использую Encog 3.1. Что-то не так с моим кодом?Тренировка нейронной сети Encog слишком медленная

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 изображений, это 2,500,000,000 обновлений для вычисления.

Есть по крайней мере три возможных пути:

  • Попробуйте библиотеку FANN, которая является одним из наиболее эффективных из них
  • Сократить размерности изображений с использованием, например PCA (и как следствие - уменьшить размер сети)
  • Вы уверены, что вам нужны 2500 скрытых узлов? Это довольно много
+0

Сколько скрытых слоев вы предлагаете? Я работаю над диагностикой заболеваний кожи с помощью распознавания образов. –

+0

Я предлагаю как можно меньше. Большее количество не только означает более длительные вычисления, но и более вероятную переоснащение. Просто начните с небольшого размера и при необходимости увеличьте его размер, а не наоборот. – lejlot

+0

Я никогда раньше не использовал Encog, но это не полная картина. В то время как большое число - это всего лишь 2,5 GigaFLOP. A (не причудливое) ядро ​​2 Q6600 может выполнять 38 GigaFLOP в секунду. Даже если предположить, что для Java медленнее, чем C/C++, для обеспечения пропускной способности - должно быть возможно завершить 1 эпоху в разумные сроки. –

Смежные вопросы