Не могу разобраться с teach_php

Печать RSS
246

В
Автор
Пришелец
0
Так, сделал 2 скрипта. 1-й берет фотку из папки 0, 1 или 2 и копирует его в папку temp/0, 1, 2. Далее делает 13 копий с различной яркостью. В результате имею ~ 1000 фото в сумме по 3-м папкам.

<?php

for ( $i = 0; $i < 3; $i++ )
{
    $d = dir("$i/");
    while($entry = $d->read())
    {
        if ( preg_match("/jpg/", $entry) )
        {
            $image = "$i/$entry";
            $dir = "/opt/work/new_way/temp";
            $new_image = "$dir/$image";

if (!copy($image, $new_image)) {
    echo "не удалось скопировать $file...\n";
    }
chdir("$dir/$i");
$input_image = $new_image;
$l = -90;

for ($l; $l <= 150; $l = $l+20) {
$image = imagecreatefromjpeg($input_image);


//третий параметр устанавливает уровень яркости изображения.
imagefilter($image, IMG_FILTER_BRIGHTNESS, $l);
//imagefilter($image, IMG_FILTER_MEAN_REMOVAL);
//imagefilter($image, IMG_FILTER_CONTRAST, -25);
imagejpeg($image, rand(10000,999999).'.jpg', 100);
imagedestroy($image);

}
chdir("/opt/work/new_way/");
}
}
}
?>
Изменил: Валерий (24.04.2012 / 11:20)
В
Автор
Пришелец
0
Запускаю второй скрипт, который как обычно перебирает фотки с разложением на пиксели и запихивает в массив.
<?php
$j = 0;
$my_example = array();

for ( $i = 0; $i < 3; $i++ )
{
    $index = array(0, 0, 0);
    $l = $i;
    $index[$l] = 1;
    $d = dir("/opt/work/new_way/temp/$i");
    while($entry = $d->read())
    {
        if ( preg_match("/jpg/", $entry) )
        {
            $im = imagecreatefromjpeg("/opt/work/new_way/temp/$i/$entry");

            $cur_array = array();
            $cnt = 0;
            for($y=0; $y<200; $y++)
            {
                for($x=0; $x < 200; $x++)
                {
                    $rgb = imagecolorat($im, $x, $y) / 16777215;
                    $cur_array[$cnt] = $rgb;
                    $cnt++;
                }
            }

            imagedestroy($im);
            $my_example[$j] = array($cur_array, array($index));
            $j++;
        }

    }
}

$ann = fann_create(array(40000, 200, 3), 1.0, 0.7);
if ( fann_train($ann, $my_example, 1000, 0.001, 1000) == FALSE)
exit('Could not train $ann.');

fann_save($ann, "my.ann");
?>
И тут столкнулся с проблемой - после того как скрипт висит пару минут (всмысле запущен и чего-то делает) выдает следующее:
php teach.php
Убито
Уменьшил к-во фото до 100-150-ти - все работает. Сначала подумал, что может что-то с "железом" (компьютер староват, если честно (х-ки: проц Pentium(R) Dual CPU E2200 @ 2.20GHz, память 4Гб, система Ubuntu 11.10 x64, винт IDE 40Gb)), ЖД, например или память. Решил протестировать, сделал MHDD - все норм. Память не проверял, так как сейчас пришла мысль, что может дело в том, что превышается какое-то значение времени на выполнение операции при выполнении скрипта, или ограничевается выделение ресурсов... В общем сейчас хочу копнуть в эту сторону, а то не могу даже затестить то что сделал теперь sad .
В
Автор
Пришелец
0
Вот заценил выделение ресурсов:
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1161 user 20 0 5160m 3.7g 1432 R 28 94.8 0:35.21 php

А вот как выглядит при обучении на 20-ти фото:
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1266 user 20 0 639m 380m 9480 R 100 9.6 1:05.10 php

Отличия: проц при малом к-ве фото загружен на 100% (1 ядро), память 10% (когда было чуть больше (около 100) фото - памяти до 30% выделялось). Теперь же проц на 80-100% загружен только первые секунд 10, пока память растет до 95%, после нагрузка падает до 20-30%. Постоянно растет параметр "VIRT", где-то когда он доходит до 6000+ выполнение скрипта и прерывается (если я правильно понимаю заканчивается и своп). Предполагаю 2 варианта решения: китайское и нормальное. Первое - сделать побольше своп (у меня 2Гб вроде, не помню). Ну а нормальное решение: это оптимизировать использование ресурсов (пока правда не особо представляю как это реализовать, т.к. с проблемой столкнулся впервые).
А

Оранжевые штаны
0
попробуй в начале написать
set_time_limit(0);
ini_set('memory_limit','1G');
А

Оранжевые штаны
0
для оптимизации процессора можно заменить preg_match("/jpg/", $entry) на strpos($entry, 'jpg')!==false т.к во вложеном цикле же находится. попробуй записать полученный массив сначала в file_put_contents('filename', serialize($my_example)); а потом в другом отдельном скрипте обучить из ($my_example = unserialize(file_get_contents())
В
Автор
Пришелец
0
Вставил/заменил:
set_time_limit(0);
ini_set('memory_limit','1G');
//        if ( preg_match("/jpg/", $entry) )
        if ( strpos($entry, 'jpg')!==false )
file_put_contents('filename', serialize($my_example));
if ( fann_train($ann, ($my_example = unserialize(file_get_contents('filename'))), 1000, 0.001, 100) == FALSE)

Результат:
От ограничения памяти пока пришлось отказаться - когда файл достигал 136 мегабайт выдавало следующее сообщение:
PHP Fatal error: Allowed memory size of 1073741824 bytes exhausted (tried to allocate 137971915 bytes) in /opt/work/new_way/teach.php on line 36
Строка 36
file_put_contents('filename', serialize($my_example));


Без ограничения памяти работает уже более получаса, но ее выделение растет! Думаю, когда файл дорастет до примерно 500 Мб память кончится, а работает так долго сейчас из-за того, что выполнение операции гораздо медленнее, так как постоянно идет загрузка этого файла массива в память и выгрузка.
Изменил: Валерий (24.04.2012 / 13:52)
А

Оранжевые штаны
0
Там же вообще можно учить понемногу, "If fann_create is called with a sole string argument, it will attempt to load an ANN created with fann_save from the file at filename."(http://leenissen.dk/fann/fann_1_2_0/r2555.html ) если у fann_create первый параметр будет строкой, то она откроет файл сети после сохранения из fann_save. пожалуй самый нормальный вариант учить по пару десятков фоток за 1 раз.
Изменил: Александр (24.04.2012 / 14:07)
В
Автор
Пришелец
0
Вроде как доучивать... Сейчас почитаю, попробую.
В
Автор
Пришелец
0
В общем оптимизировать работу с мегамассивом мне не удалось и я решил разбить обучающий скрипт на 2 скрипта. Первый будет обрабатывать все фото, загонять их в my_example по сто штук и сохранять массив с сотней фоток в файлы именем filename"НОМЕРпоследнегоЭЛЕМЕНТАмассива". Нагрузка следующая: проц на 100% одно ядро, память 25-30% (1Gb-1,5Gb). время на почти 1000 фото - 3-4 минуты.
Получаю несколько файлов:
Скрытый контент: Для выполнения действия необходимо авторизоваться!

Вот такой скрипт:

cat get_array.php 
<?

set_time_limit(0);
//ini_set('memory_limit','1G');

$j = 0;
$c = 0;
$my_example = array();

for ( $i = 0; $i < 3; $i++ )
{
    $index = array(0, 0, 0);
    $l = $i;
    $index[$l] = 1;
    $d = dir("/opt/work/new_way/temp/$i");
    while($entry = $d->read())
    {

        if ( strpos($entry, 'jpg')!==false )
            {
            $im = imagecreatefromjpeg("/opt/work/new_way/temp/$i/$entry");

            $cur_array = array();
            $cnt = 0;
            for($y=0; $y<200; $y++)
            {
                for($x=0; $x < 200; $x++)
                {
                    $rgb = imagecolorat($im, $x, $y) / 16777215;
                    $cur_array[$cnt] = $rgb;
                    $cnt++;
                }
            }

            imagedestroy($im);
            $my_example[$j] = array($cur_array, array($index));
            $c++;
           if ( $c == 100)
           {
            file_put_contents("filename$j", serialize($my_example));
            unset($my_example);
            $c=0;
            $j++;
           }
            else {$j++;}
        }


    }

}

        $j--;
        file_put_contents("filename$j", serialize($my_example));
        unset($my_example);

?>

Второй скрипт будет обучать/дообучать сеть на основании этих файлов или же восстановленных из них массивов..... Или даже так! - я могу собрать 1 массив из этих файлов и использовать его для обучения. Нужно подумать, какой вариант лучше (учитывая, что в дообучение я пока еще не вникалsmile ).
В
Автор
Пришелец
0
Набросал второй скрипт. Все ли я правильно понял в плане работы fann_train, fann_save ?
<?

set_time_limit(0);
//ini_set('memory_limit','1G');

$j = 1;
$my_example = array();

// Китайская переменная
$array1 = array('filename99', 'filename199', 'filename299', 'filename399', 'filename499', 'filename599', 'filename699', 'filename799', 'filename899', 'filename923');


$ann = fann_create(array(40000, 200, 3), 1.0, 0.7);
//if ( fann_train($ann, $my_example, 1000, 0.001, 1000) == FALSE)
if ( fann_train($ann, ($my_example = unserialize(file_get_contents('filename99'))), 1000, 0.001, 100) == FALSE)
exit('Could not train $ann.');

fann_save($ann, "my.ann");
unset($my_example);

while ( $j <= count ($array1))
{
$ann = fann_create("my.ann");
if ( fann_train($ann, ($my_example = unserialize(file_get_contents($array1[$j]))), 1000, 0.001, 100) == FALSE)
exit('Could not train $ann.');

fann_save($ann, "my.ann");
unset($my_example);
$j++;
}
?>

Запустил. Предположительно будет выполняться чуть более 100 минут (много времени занимает загрузка в массив данных из файлов filename).
В общем завтра посмотрю, что получилось.
Стикеры / Теги / Правила / Топ тем / Топ постов / Поиск