|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
15.02.2016, 15:49 | #1 |
Пользователь
Регистрация: 01.09.2013
Сообщений: 83
|
База для нейросети
Привет. Такой вопрос. Как лучше хранить изображения для нейросети? Изображения черно-белые. Сейчас храню в .txt списком. Каждая строка - 513 символов, где 513 - значение. Строка состоит из 0 и 1.. Доступ быстрый, но при 100 потоках вылезает EOutOfResources - Error creating window device context..
|
15.02.2016, 15:59 | #2 |
Тот ещё
Старожил
Регистрация: 14.11.2007
Сообщений: 2,281
|
1. Изображение лучше всего хранить в виде изображения (монохромный bitmap)
2. Как так случилось, что создано 100 потоков? |
15.02.2016, 18:42 | #3 |
Пользователь
Регистрация: 01.09.2013
Сообщений: 83
|
Вы многопоточные приложения не видели? Мне интересно, как выполнить цикл по сравнению одного изображения с базой и сделать это наиболее быстрым и экономичным способом. Программа работает в несколько потоков, т.е. параллельно должны распозноваться несколько картинок
|
15.02.2016, 18:47 | #4 |
Лис
Старожил
Регистрация: 18.09.2015
Сообщений: 2,409
|
Изоброжение лучше хранить в бинарном виде . Bmp или любом другом.
Что касается вашей ошибки. EOutOfResources - ошибка возникает если вы пытаетесь одновременно открыть болен 40 файлов. Это фондументальное ограничение виндоуса. И потоков для домашнего ЦП перебор. Вычислительных потоков должно быть по числу ядер. Вот событино арентированных может быть много, но как правило их тоже чучуть.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал . |
15.02.2016, 19:13 | #5 | |
Старожил
Регистрация: 31.05.2010
Сообщений: 13,964
|
Цитата:
И ЯП-ов было два Асм и Си. И библиотек было только две - istream и ostream, а потоки уже были. Во - засада!
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder Последний раз редактировалось Smitt&Wesson; 15.02.2016 в 19:18. |
|
15.02.2016, 20:01 | #6 | ||
Лис
Старожил
Регистрация: 18.09.2015
Сообщений: 2,409
|
Цитата:
Для примера, пусть каждая задача длиться 1 час. Ты можешь дать рабочим 1, 10, 100 или 1000 задач. Но более чем в 10 раз ты ускорение не получишь. Вот рабочие это как ядра в процессоре. А потоки как задачи. Отсюда очевидно, что потоков должно быть по числу ядер. Но правда задачи бывают разные. Есть задачи вычислительные о которых шла речь до сего момента. А есть событийно ориентированные задачи. Такие что рабочий 55 минут курит бамбук ждёт пока не наступит событие(к примеру загорится зелёная лампочка) и 5 минут выполняет. Суммарно задача также длиться 1 час. Вот что-бы не тратить время и занять паузы. Можно сразу дать все задачи. Пусть вместо того что-бы курить бамбук. Рабочий выполняет другие задачи. Проблема в том что в виндоусе это сделано не лучшим образом. И более 100 потоков на задачу начинают тормозить. Вместо того чтобы по нормальному сделать WaitForMultipleObjects Подождать 1 мкс и переключиться наследующий. Но виндоус почему-то ждёт 16 мс. А теперь представь что 1 ядро отвлекает 100 курильщеков вроде 16 мс не много, но умножь на 100 получишь 1.6 секунды. Пока пройдёт очередь из 100 курильщиков и дойдёт до 1 рабочего пройдёт 1.6 секунды. А это отзывчивость системы. Поэтому потоков много лучше не делать. Вместо решения проблемы майкрософт создала, кучу костылей. Есть специальные функции которые умеют ждать 1 мкс. Есть пул потоков, который сам контролирует число потоков. Есть Fibers и функция ConvertThreadToFiber. Цитата:
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал . Последний раз редактировалось Pavia; 15.02.2016 в 20:04. |
||
15.02.2016, 20:54 | #7 | ||
Старожил
Регистрация: 31.05.2010
Сообщений: 13,964
|
Цитата:
Поток, это задание! Рабочие - это исполнители. Сколько заданий, столько и потоков. Сколько процессоров, столько и исполнителей! Господи, наставь его на путь Истинный! Перевернул всё с ног на голову! (Ну, не ты единственный). Цитата:
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder Последний раз редактировалось Smitt&Wesson; 15.02.2016 в 20:59. |
||
15.02.2016, 22:59 | #8 |
Тот ещё
Старожил
Регистрация: 14.11.2007
Сообщений: 2,281
|
Smitt&Wesson, молодец, садись, пять. Не мороч топикстартеру голову (нам ты её всёравно не заморочишь ). Для описаной задачи 100 потоков - это перебор (и не надо ля-ля про приостановленные потоки). Потоков должно быть в этой задачи N-1, где N - кол-во ядер (физических или логических? не знаю. тут, кажется, тонко). А картинки должны вставать в одну очередь, из которой потоки и будут их забирать.
Да вот, собственно, и всё. Последний раз редактировалось Sibedir; 15.02.2016 в 23:05. |
16.02.2016, 00:19 | #9 | |
Пользователь
Регистрация: 01.09.2013
Сообщений: 83
|
Цитата:
Код:
Вот мне и интересно, как уменьшить работу? Как сделать так, чтобы при сравнении программа оперировала с меньшим количеством данных? Может как нибудь приводить каждую строку в изображении к определенному весу? Как его тогда можно хранить? Количество темных пикселей хранить - полный бред. Вот и не знаю, как поступить.. Вот тут видел интересный пример: ВИДЕО. Человек реализует хранение через корень, но в c# плохо разбираюсь.. Последний раз редактировалось darkwellroad; 16.02.2016 в 00:24. |
|
16.02.2016, 08:54 | #10 |
Лис
Старожил
Регистрация: 18.09.2015
Сообщений: 2,409
|
1)
Третий раз в жизни вижу, что картинку переводят в строку! Внутренний формат надо выбирать так чтобы с ним было удобно работать. Для картинок это: - TBitmap - Аналоги из используемой библиотеке, к примету TBitmap32 из Graphics32. - Если все изображения одинакового размера, то удобно просто использовать массив к примеру TAImage1b=array [0..639] оf array [0..479] оf Byte; 2) Разделение проекта на функции части выполнена не верно. Преобразование из одного формата в другой надо вынести наружу. А правильно его выкинуть совсем. Правильный внутренний формат по может избавиться совсем от преобразования. Compare это сравнение. Правильно назвать вашу функцию search - поиск или pos - позиция, которая будет возвращать порядковый номер. 3) Ваш подход напоминает распознавание с использование СУБД. Но нет смысла копировать чужие решения. В SQL нет удобных типов для таких объектов. Вот автор и выкручивается со строками. 4) Код:
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал . |
|
Опции темы | Поиск в этой теме |
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Нейросети | stdensa | Фриланс | 1 | 11.10.2014 17:23 |
нейросети в делфи. | annuchka | Помощь студентам | 0 | 23.12.2013 17:51 |
нейросети С# | Екатерина777 | Помощь студентам | 0 | 18.12.2012 22:01 |
Нейросети | Kuzma_ua | Общие вопросы C/C++ | 0 | 04.02.2011 00:57 |
Scilab + нейросети | dox07 | Помощь студентам | 0 | 08.01.2011 18:28 |