/** * Обучение перцептрона * * @param path * @param n - количество циклов обучения */ public void teach(String path, int n) { class JPGFilter implements FilenameFilter { public boolean accept(File dir, String name) { return (name.endsWith(".jpg")); } } // загрузка всех тестовых изображений в массив img[] String[] list = new File(path + "/").list(new JPGFilter()); Image[] img = new Image[list.length]; MediaTracker mediaTracker = new MediaTracker(new Container()); int i = 0; for (String s : list) { img[i] = java.awt.Toolkit.getDefaultToolkit().createImage(path + "/" + s); mediaTracker.addImage(img[i], 0); try { mediaTracker.waitForAll(); } catch (InterruptedException ex) { Logger.getLogger(Teacher.class.getName()).log(Level.SEVERE, null, ex); } i++; } // инициализация начальных весов, если ещё не были проинициализированы if (!perceptron.isWeightsWasInitialized()) { perceptron.initWeights(); } // получение пиксельных массивов каждого изображения // и обучение n раз каждой выборке PixelGrabber pg; int[] pixels, x, y; int w, h, k = 0; while (n-- > 0) { for (int j = 0; j < img.length; j++) { w = img[j].getWidth(null); h = img[j].getHeight(null); if (w * h > perceptron.getM()) continue; pixels = new int[w * h]; pg = new PixelGrabber(img[j], 0, 0, w, h, pixels, 0, w); try { pg.grabPixels(); } catch (InterruptedException ex) { Logger.getLogger(Teacher.class.getName()).log(Level.SEVERE, null, ex); } // получение векторов и обучение перцептрона x = getInVector(pixels); y = getOutVector(Integer.parseInt(String.valueOf(list[j].charAt(0)))); perceptron.teach(x, y); } } }
/** * Генерация правильного выходного вектора * * @param n - цифра, в соответствии с которой нужно построить вектор, другими словами: на каком * месте должна быть 1, остальные 0 * @return - выходной вектор для перцептрона */ private int[] getOutVector(int n) { int[] y = new int[perceptron.getN()]; for (int i = 0; i < y.length; i++) { if (i == n) y[i] = 1; else y[i] = 0; } return y; }