Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.02.2016, 15:49   #1
darkwellroad
Пользователь
 
Регистрация: 01.09.2013
Сообщений: 83
Смущение База для нейросети

Привет. Такой вопрос. Как лучше хранить изображения для нейросети? Изображения черно-белые. Сейчас храню в .txt списком. Каждая строка - 513 символов, где 513 - значение. Строка состоит из 0 и 1.. Доступ быстрый, но при 100 потоках вылезает EOutOfResources - Error creating window device context..
darkwellroad вне форума Ответить с цитированием
Старый 15.02.2016, 15:59   #2
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,281
По умолчанию

1. Изображение лучше всего хранить в виде изображения (монохромный bitmap)
2. Как так случилось, что создано 100 потоков?
Sibedir вне форума Ответить с цитированием
Старый 15.02.2016, 18:42   #3
darkwellroad
Пользователь
 
Регистрация: 01.09.2013
Сообщений: 83
По умолчанию

Цитата:
Сообщение от Sibedir Посмотреть сообщение
1. Изображение лучше всего хранить в виде изображения (монохромный bitmap)
2. Как так случилось, что создано 100 потоков?
Вы многопоточные приложения не видели? Мне интересно, как выполнить цикл по сравнению одного изображения с базой и сделать это наиболее быстрым и экономичным способом. Программа работает в несколько потоков, т.е. параллельно должны распозноваться несколько картинок
darkwellroad вне форума Ответить с цитированием
Старый 15.02.2016, 18:47   #4
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

Изоброжение лучше хранить в бинарном виде . Bmp или любом другом.
Что касается вашей ошибки.
EOutOfResources - ошибка возникает если вы пытаетесь одновременно открыть болен 40 файлов. Это фондументальное ограничение виндоуса.
И потоков для домашнего ЦП перебор. Вычислительных потоков должно быть по числу ядер. Вот событино арентированных может быть много, но как правило их тоже чучуть.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .
Pavia вне форума Ответить с цитированием
Старый 15.02.2016, 19:13   #5
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,964
По умолчанию

Цитата:
Сообщение от Pavia Посмотреть сообщение
Вычислительных потоков должно быть по числу ядер. Вот событино арентированных может быть много, но как правило их тоже чучуть.
Это с какого бодуна? Поток, это самостоятельная единица вычислительного процесса. Есть обычные. Есть - привилегированные. Понятие поток, появилось за долго, до появления винды. Ещё в ОС ЕС-NNN, было такое понятие. Занимался потоками - супервизор. И процессор (единственный) весил тогда килограмм 800.
И ЯП-ов было два Асм и Си. И библиотек было только две - istream и ostream, а потоки уже были. Во - засада!
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder

Последний раз редактировалось Smitt&Wesson; 15.02.2016 в 19:18.
Smitt&Wesson вне форума Ответить с цитированием
Старый 15.02.2016, 20:01   #6
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

Цитата:
Сообщение от Smitt&Wesson Посмотреть сообщение
Это с какого бодуна? Поток, это самостоятельная единица вычислительного процесса. Есть обычные. Есть - привилегированные. Понятие поток, появилось за долго, до появления винды. Ещё в ОС ЕС-NNN, было такое понятие. Занимался потоками - супервизор. И процессор (единственный) весил тогда килограмм 800.
И ЯП-ов было два Асм и Си. И библиотек было только две - istream и ostream, а потоки уже были. Во - засада!
Вот представь у тебя 10 рабочих.
Для примера, пусть каждая задача длиться 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.

Цитата:
И процессор (единственный) весил тогда килограмм 800.
Видел-видел. В том году утилизировали.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .

Последний раз редактировалось Pavia; 15.02.2016 в 20:04.
Pavia вне форума Ответить с цитированием
Старый 15.02.2016, 20:54   #7
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,964
По умолчанию

Цитата:
Сообщение от Pavia Посмотреть сообщение
Вот представь у тебя 10 рабочих.
Для примера, пусть каждая задача длиться 1 час.
Ты можешь дать рабочим 1, 10, 100 или 1000 задач.
Но более чем в 10 раз ты ускорение не получишь.
Ой. МАМА! Откуда ускорение? И при чём здесь рабочие?
Поток, это задание! Рабочие - это исполнители. Сколько заданий, столько и потоков. Сколько процессоров, столько и исполнителей!
Господи, наставь его на путь Истинный!
Перевернул всё с ног на голову! (Ну, не ты единственный).

Цитата:
Пока пройдёт очередь из 100 курильщиков и дойдёт до 1 рабочего пройдёт 1.6 секунды. А это отзывчивость системы.
Традиционный вопрос на программёрсе: Чё курим? Не! Я такого не хочу! Мне и водки хватает за глаза!
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder

Последний раз редактировалось Smitt&Wesson; 15.02.2016 в 20:59.
Smitt&Wesson вне форума Ответить с цитированием
Старый 15.02.2016, 22:59   #8
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,281
По умолчанию

Smitt&Wesson, молодец, садись, пять. Не мороч топикстартеру голову (нам ты её всёравно не заморочишь ). Для описаной задачи 100 потоков - это перебор (и не надо ля-ля про приостановленные потоки). Потоков должно быть в этой задачи N-1, где N - кол-во ядер (физических или логических? не знаю. тут, кажется, тонко). А картинки должны вставать в одну очередь, из которой потоки и будут их забирать.

Цитата:
Сообщение от Pavia Посмотреть сообщение
EOutOfResources - ошибка возникает если вы пытаетесь одновременно открыть болен 40 файлов. Это фондументальное ограничение виндоуса.
Да вот, собственно, и всё.

Последний раз редактировалось Sibedir; 15.02.2016 в 23:05.
Sibedir вне форума Ответить с цитированием
Старый 16.02.2016, 00:19   #9
darkwellroad
Пользователь
 
Регистрация: 01.09.2013
Сообщений: 83
По умолчанию

Цитата:
Сообщение от Sibedir Посмотреть сообщение
Smitt&Wesson, молодец, садись, пять. Не мороч топикстартеру голову (нам ты её всёравно не заморочишь ). Для описаной задачи 100 потоков - это перебор (и не надо ля-ля про приостановленные потоки). Потоков должно быть в этой задачи N-1, где N - кол-во ядер (физических или логических? не знаю. тут, кажется, тонко). А картинки должны вставать в одну очередь, из которой потоки и будут их забирать.


Да вот, собственно, и всё.
Но.. я не пытаюсь открыть несколько файлов. Вся ошибка происходит в функции.. При запуске программы подгружаю TStringList, где построчно сохранены картинки при обучении. Строки из 0 и 1. Далее функцией сравниваю изображение со всем листом:
Код:
function Compare(const Intro: TStringList; const IntroLetter: TImage): string;
var
  LetterText, str1ng: string;
  X, Y: Byte;
  I, I2, total, sum, Number: Integer;
begin
  try
    LetterText := '';
    sum := 0;
    total := 0;
    Number := 0;
    for X := 0 to IntroLetter.Width - 1 do
      for Y := 0 to IntroLetter.Height - 1 do
        if IntroLetter.Canvas.Pixels[X, Y] = clBlack then
          LetterText := Concat(LetterText, '1')
        else
          LetterText := Concat(LetterText, '0');
    for I := 0 to Intro.Count - 1 do
      begin
        str1ng := Intro[I];
        for I2 := 1 to Length(str1ng) - 1 do
          if LetterText[I2] = str1ng[I2] then
            Inc(sum);
        if sum > total then
          begin
            total := sum;
            Number := I;
          end;
        sum := 0;
      end;
    Result := Copy(Intro[Number], Length(Intro[Number]), 1);
  finally
    LetterText := '';
    str1ng := '';
  end;
end;
И ошибка вываливается там.. Может в функции что-то не так? Или просто приложение не справляется с таким напором на этот несчастный TStringList?

Вот мне и интересно, как уменьшить работу? Как сделать так, чтобы при сравнении программа оперировала с меньшим количеством данных? Может как нибудь приводить каждую строку в изображении к определенному весу? Как его тогда можно хранить? Количество темных пикселей хранить - полный бред. Вот и не знаю, как поступить.. Вот тут видел интересный пример: ВИДЕО. Человек реализует хранение через корень, но в c# плохо разбираюсь..

Последний раз редактировалось darkwellroad; 16.02.2016 в 00:24.
darkwellroad вне форума Ответить с цитированием
Старый 16.02.2016, 08:54   #10
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 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)
Код:
  try
  finally
    LetterText := '';
    str1ng := '';
  end;
Это лишнее. Автоматический сборщик мусора сам очищает строки объявленные в локальных переменных.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .
Pavia вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Нейросети 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