Не могу разобраться с teach_php - Visavi.net
https://visavi.net/
RSS - Visavi.nethttps://visavi.net/assets/img/images/logo_small.pngRSS - Visavi.net
https://visavi.net/
[email protected] (admin)[email protected] (admin)Fri, 10 Jan 2025 16:38:30 +0300Мысль понял. Я правда думал, что так как массив двумерный, то как раз благодаря второму элементу сеть и понимала бы, к какой папке относится данный элемент (я про array($index)). Буду пробовать.
https://visavi.net/topics/31269/545014
Не могу разобраться с teach_php ВалерийThu, 26 Apr 2012 00:43:57 +0400Сообщенияhttps://visavi.net/topics/31269/545014<blockquote class="blockquote">Не совсем понял, для чего одинаковые фото, различающиеся по яркости запихивать в 1 массив.</blockquote> если А - это фотка без обработки, а а1-а10 это фотки полученные после обработки А с яркостью от -100% до +100%, после обработки и чб, получились разные данные. если а1-а10 в разных массивах то сеть будет ставить вероятность для каждой не зная что это от одной фотки данные, из-за этого сильно снизится распознаваемость т.к при определённой яркости фотки разных людей станут одинаковыми(получается что то в виде if(a1 || a2 || a3) истина то всё - это этот человек), а если их объединить то таких ошибок будет намного меньше(тогда будет "и" а не "или"), а умножать 40000 надо будет если запихнешь а1-а10 в массив, пикселей то увеличится, вот и умножить не забудь.<br>
<br>
<em><span style="font-size:x-small">Добавлено через 01:02 сек.</span></em><br>
собственно наверняка из-за этого и не работает.<br>
<br>
<em><span style="font-size:x-small">Добавлено через 06:46 сек.</span></em><br>
и ещё некоторые вещи подбираются экспериментальным путём, тут $ann = fann_create(array(40000, 200, 3), 1.0, 0.7); вместо 200 попробуй больше(раз в 10) поставить, будет хуже меньше. тут , 1000, 0.001, 100) вместо 0.001(попробуй сначала 0.01 и 0.0001) тоже попробуй поэкспериментировать, и количество фоток с яркостью лучше не больше 10 делай сначала, если будет плохо работать, тоже поэкспериментируй.
https://visavi.net/topics/31269/544982
Не могу разобраться с teach_php АлександрWed, 25 Apr 2012 23:13:07 +0400Сообщенияhttps://visavi.net/topics/31269/544982Ну пока дообучалась моя сеть, проверил. Не работает нормально: на все три типа фото из обучающего материала примерно одно и то же говорит:<br>
<blockquote class="blockquote"><br>
php ran.php<br>
Array<br>
(<br>
[0] => 1<br>
[1] => 0<br>
[2] => 0.022985305637121<br>
)<br>
<br>
</blockquote> Так что даже не знаю... идея в этот раз была такая: 3 папки, и сеть должна была понимать, на фото из какой папки входящее фото похоже, если ничего похожего нет, то грубо говоря 0 0 0. В исходном скрипте, по которому я начинал, было только 2 папки - свои и чужие. Не знаю как, но вроде как работало.. А тут ни в какую <img src="https://visavi.net/uploads/stickers/sad.gif" alt="sad"> . Может я все таки ошибочно понимаю логику этого всего?<br>
Не совсем понял, для чего одинаковые фото, различающиеся по яркости запихивать в 1 массив.. И если так, то у меня в каждой папке получится примерно по 40 массивов. И еще не понял, зачем 40000 умножать на к-во фото, мне что, надо в my_array запихивать эти 3*40 массивов?
https://visavi.net/topics/31269/544956
Не могу разобраться с teach_php ВалерийWed, 25 Apr 2012 22:27:39 +0400Сообщенияhttps://visavi.net/topics/31269/544956судя по коду фотки с разной яркостью обрабатываются как отдельные, надо вместе, либо соедини их в 1 фотку либо читай все одинаковые фото но с разной яркостью в 1 массив, если так сделаешь не забудь поправить 40000, умножив на количество фоток с яркостью.<br>
<blockquote class="blockquote">Набросал второй скрипт. Все ли я правильно понял в плане работы fann_train, fann_save ?</blockquote> работать будет.<br>
и код можно проще написать, примерно так.<br>
<pre class="prettyprint">
<?
set_time_limit(0);
//ini_set('memory_limit','1G');
//если переменные из папки то можно использовать glob("*.txt") он умеет искать по шаблону что то вроде
$array1 = glob('foto/filename*');//всё что начинается с filename
// Китайская переменная
//$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)
fann_train($ann, unserialize(file_get_contents('filename99')), 1000, 0.001, 100) or exit('Could not train $ann.');
fann_save($ann, "my.ann");
foreach($array1 as $val) //или с китайской переменной и так => ($c = count ($array1), $j = 1; $j <= $c; $j++){
$ann = fann_create("my.ann");
fann_train($ann, unserialize(file_get_contents( $val)), 1000, 0.001, 100) or exit('Could not train $ann.');
fann_save($ann, "my.ann");
}
?>
</pre>
https://visavi.net/topics/31269/544938
Не могу разобраться с teach_php АлександрWed, 25 Apr 2012 20:58:25 +0400Сообщенияhttps://visavi.net/topics/31269/544938Набросал второй скрипт. Все ли я правильно понял в плане работы fann_train, fann_save ?<br>
<pre class="prettyprint"><?
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++;
}
?>
</pre>
<br>
Запустил. Предположительно будет выполняться чуть более 100 минут (много времени занимает загрузка в массив данных из файлов filename).<br>
В общем завтра посмотрю, что получилось.
https://visavi.net/topics/31269/544910
Не могу разобраться с teach_php ВалерийWed, 25 Apr 2012 19:58:43 +0400Сообщенияhttps://visavi.net/topics/31269/544910В общем оптимизировать работу с мегамассивом мне не удалось и я решил разбить обучающий скрипт на 2 скрипта. Первый будет обрабатывать все фото, загонять их в <strong>my_example</strong> по сто штук и сохранять массив с сотней фоток в файлы именем filename"НОМЕРпоследнегоЭЛЕМЕНТАмассива". Нагрузка следующая: проц на 100% одно ядро, память 25-30% (1Gb-1,5Gb). время на почти 1000 фото - 3-4 минуты.<br>
Получаю несколько файлов:<br>
<div class="hidden-text">
<span class="fw-bold">Скрытый контент:</span> Для выполнения действия необходимо авторизоваться!</div>
<br>
Вот такой скрипт:<br>
<br>
<pre class="prettyprint">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);
?>
</pre>
<br>
Второй скрипт будет обучать/дообучать сеть на основании этих файлов или же восстановленных из них массивов..... Или даже так! - я могу собрать 1 массив из этих файлов и использовать его для обучения. Нужно подумать, какой вариант лучше (учитывая, что в дообучение я пока еще не вникал<img src="https://visavi.net/uploads/stickers/smile.gif" alt="smile"> ).
https://visavi.net/topics/31269/544876
Не могу разобраться с teach_php ВалерийWed, 25 Apr 2012 16:56:50 +0400Сообщенияhttps://visavi.net/topics/31269/544876Вроде как доучивать... Сейчас почитаю, попробую.
https://visavi.net/topics/31269/544468
Не могу разобраться с teach_php ВалерийTue, 24 Apr 2012 14:14:30 +0400Сообщенияhttps://visavi.net/topics/31269/544468Там же вообще можно учить понемногу, "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 раз.
https://visavi.net/topics/31269/544465
Не могу разобраться с teach_php АлександрTue, 24 Apr 2012 14:04:55 +0400Сообщенияhttps://visavi.net/topics/31269/544465Вставил/заменил:<br>
<pre class="prettyprint">set_time_limit(0);
ini_set('memory_limit','1G');
</pre>
<pre class="prettyprint">// if ( preg_match("/jpg/", $entry) )
if ( strpos($entry, 'jpg')!==false )
</pre>
<pre class="prettyprint">
file_put_contents('filename', serialize($my_example));
</pre>
<pre class="prettyprint">if ( fann_train($ann, ($my_example = unserialize(file_get_contents('filename'))), 1000, 0.001, 100) == FALSE)</pre>
<br>
Результат:<br>
От ограничения памяти пока пришлось отказаться - когда файл достигал 136 мегабайт выдавало следующее сообщение:<br>
<blockquote class="blockquote">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</blockquote>
Строка 36<br>
<blockquote class="blockquote">file_put_contents('filename', serialize($my_example));</blockquote>
<br>
<br>
Без ограничения памяти работает уже более получаса, но ее выделение растет! Думаю, когда файл дорастет до примерно 500 Мб память кончится, а работает так долго сейчас из-за того, что выполнение операции гораздо медленнее, так как постоянно идет загрузка этого файла массива в память и выгрузка.
https://visavi.net/topics/31269/544463
Не могу разобраться с teach_php ВалерийTue, 24 Apr 2012 13:51:44 +0400Сообщенияhttps://visavi.net/topics/31269/544463для оптимизации процессора можно заменить preg_match("/jpg/", $entry) на strpos($entry, 'jpg')!==false т.к во вложеном цикле же находится. попробуй записать полученный массив сначала в file_put_contents('filename', serialize($my_example)); а потом в другом отдельном скрипте обучить из ($my_example = unserialize(file_get_contents())
https://visavi.net/topics/31269/544434
Не могу разобраться с teach_php АлександрTue, 24 Apr 2012 12:03:53 +0400Сообщенияhttps://visavi.net/topics/31269/544434попробуй в начале написать<br>
set_time_limit(0);<br>
ini_set('memory_limit','1G');
https://visavi.net/topics/31269/544431
Не могу разобраться с teach_php АлександрTue, 24 Apr 2012 11:52:11 +0400Сообщенияhttps://visavi.net/topics/31269/544431Вот заценил выделение ресурсов:<br>
<blockquote class="blockquote">PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND <br>
1161 user 20 0 5160m 3.7g 1432 R 28 94.8 0:35.21 php </blockquote>
<br>
А вот как выглядит при обучении на 20-ти фото:<br>
<blockquote class="blockquote">PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND<br>
1266 user 20 0 639m 380m 9480 R 100 9.6 1:05.10 php </blockquote>
<br>
Отличия: проц при малом к-ве фото загружен на 100% (1 ядро), память 10% (когда было чуть больше (около 100) фото - памяти до 30% выделялось). Теперь же проц на 80-100% загружен только первые секунд 10, пока память растет до 95%, после нагрузка падает до 20-30%. Постоянно растет параметр "VIRT", где-то когда он доходит до 6000+ выполнение скрипта и прерывается (если я правильно понимаю заканчивается и своп). Предполагаю 2 варианта решения: китайское и нормальное. Первое - сделать побольше своп (у меня 2Гб вроде, не помню). Ну а нормальное решение: это оптимизировать использование ресурсов (пока правда не особо представляю как это реализовать, т.к. с проблемой столкнулся впервые).
https://visavi.net/topics/31269/544430
Не могу разобраться с teach_php ВалерийTue, 24 Apr 2012 11:45:08 +0400Сообщенияhttps://visavi.net/topics/31269/544430Запускаю второй скрипт, который как обычно перебирает фотки с разложением на пиксели и запихивает в массив.<br>
<pre class="prettyprint"><?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");
?>
</pre>
И тут столкнулся с проблемой - после того как скрипт висит пару минут (всмысле запущен и чего-то делает) выдает следующее:<br>
<blockquote class="blockquote">php teach.php <br>
Убито<br>
</blockquote>
Уменьшил к-во фото до 100-150-ти - все работает. Сначала подумал, что может что-то с "железом" (компьютер староват, если честно (х-ки: проц Pentium(R) Dual CPU E2200 @ 2.20GHz, память 4Гб, система Ubuntu 11.10 x64, винт IDE 40Gb)), ЖД, например или память. Решил протестировать, сделал MHDD - все норм. Память не проверял, так как сейчас пришла мысль, что может дело в том, что превышается какое-то значение времени на выполнение операции при выполнении скрипта, или ограничевается выделение ресурсов... В общем сейчас хочу копнуть в эту сторону, а то не могу даже затестить то что сделал теперь <img src="https://visavi.net/uploads/stickers/sad.gif" alt="sad"> .
https://visavi.net/topics/31269/544423
Не могу разобраться с teach_php ВалерийTue, 24 Apr 2012 11:20:47 +0400Сообщенияhttps://visavi.net/topics/31269/544423Так, сделал 2 скрипта. 1-й берет фотку из папки 0, 1 или 2 и копирует его в папку temp/0, 1, 2. Далее делает 13 копий с различной яркостью. В результате имею ~ 1000 фото в сумме по 3-м папкам.<br>
<br>
<pre class="prettyprint"><?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/");
}
}
}
?>
</pre>
https://visavi.net/topics/31269/544422
Не могу разобраться с teach_php ВалерийTue, 24 Apr 2012 11:19:37 +0400Сообщенияhttps://visavi.net/topics/31269/544422imagejpeg($im, rand(10000,999999).'.jpg'); сохраняет картинку в папку со случайным именем, что бы можно было посмотреть пригодна ли она после фильтров для обучения. <br>
<blockquote class="blockquote"> цикл с разложением на пиксели вообще убрать? </blockquote> нет, просто с начало в цикле сделай один раз как в статье(просто в чб), потом увеличь яркость например на 20% и опять в чб, увеличь ещё на 20% и опять как в статье, соедини все результаты, при меньшей яркости будет больше 1 (серый стал 1(потеря полезной инфы)), потом например увеличил яркость получилось(тот серый цвет стал 0), теперь инфы потерялось меньше, вот зачем это надо. кстати а почему бы не отставит грации серого и переводить каждый цвет в двоичную систему, тогда проблемы как запихнуть картинку внутрь отпадают. (256 > 11111111 и в сеть) 256*200*200=10 240 000, многовато, лучше ещё уменьшить количество цветов (хотя тоже должно работать довольно быстро). Если так сделаешь то можно не менять тип сети, но куда лучше будет использовать предназначенную для этого нейросеть(лучше пожалуй сверточную). <br>
<blockquote class="blockquote">Кстати я даже не в курсе какая сеть</blockquote>
У тебя скорее всего обычная однослойная нейросеть. Ещё пожалуй стоит поменять тип обучения <a href="http://leenissen.dk/fann/fann_1_2_0/r1996.html" target="_blank" rel="nofollow">http://leenissen.dk/fann/fann_1_2_0/r1996.html</a>
https://visavi.net/topics/31269/542586
Не могу разобраться с teach_php АлександрThu, 19 Apr 2012 19:38:50 +0400Сообщенияhttps://visavi.net/topics/31269/542586