Тут такое дело...
Делаю компоненты(не для себя!), все в плане нейронных сетей.
Конечно громко сказано, - копиапстю с C++, но всё пережито, проверено, поправлено в боевых условиях.
Собственно вопросы:
1. Надо в ini прописать параметр:Single.
То есть надо установить ошибку, например, _prop_DesiredError:= 0.075
Дело в том, что 0.08 и 0.06 даёт совсем не те результаты. Пример: (Чего то не правильно перекидывает по ссылке, по этому лучше открыть её отдельно, предварительно скопировав!) http://fantasts.ru/forum/index.php?showtopic=12949&view=findpost&p=737997 генерил на этой сети с параметром DesiredError:= 0.075 - это чуть ли не алхимия, или пляски с бубном.
Переделывать dll из исходников - легче застрелится! (Потом будут в Cardinal и DOUBLE).
Из integer делать Single как то не комильфо даже в процентном представлении. - или не обойтись без деления и умножения? Тогда как красивше сделать?
И на будущее - Правильно я понимаю, что DOUBLE = real?
2. И второе:
Допустим сейчас сделал так:
{$ifdef FIXEDFANN}
const DLL_FILE = 'fannfixed.dll';
{$ELSEIF DOUBLEFANN}
const DLL_FILE = 'fanndouble.dll';
{$ELSE}
const DLL_FILE = 'fannfloat.dll';
{$ENDIF}
а так не работает,
{$IF Defined(FIXEDFANN)}
const DLL_FILE = 'fannfixed.dll';
{$ELSEIF Defined(DOUBLEFANN)}
const DLL_FILE = 'fanndouble.dll';
{$ELSE}
const DLL_FILE = 'fannfloat.dll';
{$IFEND} но не суть.
А хотелось бы в ini задавать - это понятно?
Получается, но как правой рукой левое ухо чесать через затылок.
Может лучше три компонента сделать, раз три разных dll?
Тему буду продолжать - в стволе ещё самоорганизующиеся карты Кохонена, методы спектрального и последовательного анализа, вейвлет преобразование, сеть Хопфилда(есть разница для определённых задач) и самопальный Word2vec и Текст‹=›Смысл в одном флаконе. - работа более пяти лет.
Редактировалось 9 раз(а), последний 2022-06-28 22:33:42
Этот топик читают: Гость
Ответов: 2059
Рейтинг: 132
|
|||
карма: 6 |
|
Ответов: 2059
Рейтинг: 132
|
|||
Чтобы было понятней
В активном параметре надо писать 0.05, а не целые числа и нужно не real, а Single. Single - выбрано в этой сети из за скорости. Нужно чего то типа StrToFloat, или Str2Double. Нужна функция Str2Single, но такой нет! ![]() Передачу входных и выходных массивов of Single между кубиками вроде решил... Редактировалось 3 раз(а), последний 2022-06-29 11:55:02 |
|||
карма: 6 |
|
Ответов: 8903
Рейтинг: 823
|
|||
flint2, процессоры в видеокарте работают именно с четырёхбайтным форматом с плавающей точкой.
Можно использовать DataToFileEx от Галкова, в нём есть и Single. ![]()
|
|||
карма: 19 |
|
Ответов: 2059
Рейтинг: 132
|
|||
Леонид, спасибо!
Сейчас буду посмотреть, а пока сделал так.
P.S. Может кому то будет интересно: ![]() function VarToHex(const aVar; const aVarSize : Integer) : String; begin SetLength(Result, aVarSize * 2); BinToHex(PChar(@aVar), PChar(Result), aVarSize); end; procedure HexToVar(const aHex : String; const aVar); begin HexToBin(PChar(aHex), PChar(@aVar), Length(aHex) div 2); end; //Пример. procedure TForm1.Button1Click(Sender: TObject); var Db : Double; Sn : Single; S, SHex : String; begin //Double. Db := 1.12345; SHex := VarToHex(Db, SizeOf(Db)); ShowMessage(FloatToStr(Db) + ' -> ' + SHex); HexToVar(SHex, Db); ShowMessage(SHex + ' -> ' + FloatToStr(Db)); //Single. Sn := 1.12345; SHex := VarToHex(Sn, SizeOf(Sn)); ShowMessage(FloatToStr(Sn) + ' -> ' + SHex); HexToVar(SHex, Sn); ShowMessage(SHex + ' -> ' + FloatToStr(Sn)); //String. S := 'АБВГД'; SHex := VarToHex(S[1], Length(S) * SizeOf(Char)); ShowMessage(S + ' -> ' + SHex); HexToVar(SHex, S[1]); ShowMessage(SHex + ' -> ' + S); end; Редактировалось 1 раз(а), последний 2022-06-29 12:50:30 |
|||
карма: 6 |
|
Ответов: 8903
Рейтинг: 823
|
|||
flint2, а это что?
Посмотрите как у Галкова в DataToFileEx ![]() ![]() |
|||
карма: 19 |
|
Ответов: 2059
Рейтинг: 132
|
|||
Леонид, а это шум.
Потому что Double2Str берёт ещё четыре байта хрен знает чего. То есть Str2Double для Single вроде работает, а вот наоборот всегда будет погрешность ведь Str2Double делает 8 байт, вот от туда и хвостик. Но мне Str2Double, или Str2Single не нужны, потому что выхлоп будет в виде текста предложений, или в виде картинки, либо в виде куска звуков - в зависимости чего обрабатываем. Да, я уже немного переделал как в DataToFileEx с учётом узкой специализации - только под Single, потому что боюсь применять Str2Double. Куда ещё четыре байта захреначит и чего попортит это неизвестно? Вечером освобожусь, потом доложу. Редактировалось 4 раз(а), последний 2022-06-29 15:32:00 |
|||
карма: 6 |
|
Ответов: 8903
Рейтинг: 823
|
|||
flint2 писал(а): а это шум![]() Картинка в помощь: ![]() |
|||
карма: 19 |
|
Ответов: 2059
Рейтинг: 132
|
|||
Леонид писал(а): Картинка в помощь:Я о чём то подобном догадывался, но не знал нюансов. Вот чего у меня получилось после упрощения: function THIDataToFileEx.dtReal; var fl:single; begin if val = nil then begin st.read(fl,sizeof(single)); Share.dtReal(Result,fl); end else begin fl := ToReal(val^); st.Write(fl,sizeof(single)); end; end; Но не понятно как избавится от чтения и записи в поток? Делать через поток слишком громоздко. Надо подумать, может быть сделать на ассемблере Str2Single и наоборот. И где можно посмотреть про Share.XXXXXX? |
|||
карма: 6 |
|
Разработчик
Ответов: 26100
Рейтинг: 2124
|
|||
flint2 писал(а): И где можно посмотреть про Share.XXXXXX?В файле Share.pas |
|||
карма: 22 |
|
Ответов: 2059
Рейтинг: 132
|
|||
nesco писал(а): В файле Share.pasЧего то меня заклинело. ![]() |
|||
карма: 6 |
|
Ответов: 2059
Рейтинг: 132
|
|||
Оказалось всё просто!
![]() function Str2Single( const S: String ): Single;
var I: Integer; M, Pt: Boolean; Sn: Single; Ex: Integer; begin Result := 0.0; if S = '' then Exit; M := FALSE; I := 1; if S[ 1 ] = '-' then begin M := TRUE; Inc( I ); end; if S[ 1 ] = '+' then Inc( I ); Pt := FALSE; Sn := 1.0; while I <= Length( S ) do begin case S[ I ] of '.': if not Pt then Pt := TRUE else break; '0'..'9': if not Pt then Result := Result * 10.0 + Integer( S[ I ] ) - Integer( '0' ) else begin Sn := Sn * 0.1; Result := Result + (Integer( S[ I ] ) - Integer( '0' )) * Sn; end; 'e', 'E': begin Ex := Str2Int( CopyEnd( S, I + 1 ) ); Result := Result * IntPower( 10.0, Ex ); break; end; else break; end; Inc( I ); end; if M then Result := -Result; end; Потом нарисую, а то уже спать надо. |
|||
карма: 6 |
|
Ответов: 5227
Рейтинг: 587
|
|||
String->HEX->Single Шедевр
![]() Это в С++ изучают ![]() Редактировалось 2 раз(а), последний 2022-06-30 07:51:25 |
|||
карма: 4 |
|
Ответов: 2059
Рейтинг: 132
|
|||
andrestudio писал(а): String->HEX->Single ШедеврDouble->HEX.....HEX->Single По теме:
Редактировалось 2 раз(а), последний 2022-06-30 11:56:24 |
|||
карма: 6 |
|
Ответов: 2059
Рейтинг: 132
|
|||
Продолжаем разговор.
Обучение из файла(всё в текстовом представлении) сделал, всё пашет, как часы и даже автоматическое построение\добавление промежуточных слоёв, пока не будет нужного результата. Training File (xor.data): 4 2 1 -1 -1 -1 -1 1 1 1 -1 1 1 1 -1 То есть, задаём входные данные и выходные, а промежуточную архитектуру компонент достраивает сам. Дальше запутался. function THIFannNetwork.Train(Input, Output:single): single; 'Будет исполнять одну итерацию обучения с набором входных данных и набором желаемых выходных данных. @param Входной массив со значением каждого входа сети @param Выходной массив со значением каждого желаемого выхода сети @return Среднеквадратическая ошибка после обучения' Этот момент очень важен для того, чтобы понять - Той ли дорогой идёшь товарисчь!? Тут целый день думал-думал, думал-думал как лучше сделать пока не получил пенсию, сходил в магазин, но не забылся! Не секрет, что успех решения задачи на сетке зависит как мы представим входные данные, помимо того, что мы подберём для обучения, и осмысленные выходные данные - что хотим получить. Например со звуком нет проблем - из BASSа напрямую можно брать single, да и из 3D графики. С текстом тоже нет проблем. (Понятно, что не буквы передаём, а индексы слов из словаря+спряжение\склонение в четырёх байтах. Я использую конфигурацию от 1 до 0.) А картинки? И тут вроде всё работает, тем более будет вариант с Cardinal. Но пока мы говорим о варианте с single. И вот такие вопросы:..., может кто идею подкинет? Из за Прокрустова ложа HiAsm в плане передачи данных между точками начинаются неудобства. 1. Мысль первая и самая идиотская. Делать все преобразования внутри компонента к single. Понятно, что никакой критики не выдерживает. А была такая мысль. ![]() 2. Сделать hiSingleArray из hiRealArray - думаю десять минут работы? И брать из точек Input := ReadArray(_data_Array); где Input: PArray; 3. Третий вариант - замесить всё на Stream. Это самый демократичный вариант - пиши в него чего хочешь! То есть интерфейсом будет Stream, а не Array, и не точка заполнения внутреннего массива через строчные значения. Но это отодвигает проблему дальше не периферию и её решать другим. А надо? Понятно почему не делаю переменное число входных и выходных точек для нейронов? Потому, что это может быть не предложение, а целый рассказ, или картинка. 4. Ну и четвёртое, как мне кажется, что все проблемы снимает. const data_null = 0; data_int = 1; data_str = 2; //data_data = 3; //data_combo = 4; //data_list = 5; data_icon = 6; data_real = 7; //data_color = 8; //data_script = 9; data_stream = 10; data_bitmap = 11; //data_wave = 12; data_array = 13; //data_comboEx= 14; data_font = 15; data_matr = 16; data_jpeg = 17; data_menu = 18; //data_code = 19; data_object = 20; data_break = 21; //!!! признак неподключенности точки data_types = 22; Помоему здесь дыр полно. Совсем не рационально впихнуть сюда single! И не обязательно привязывать к какому нибудь типу, а достаточно размерности Но такого не может быть - потому что не может быть никогда! ![]() А себе я сделаю для пробы. P.S. String->HEX->Single Шедевр Вот Дон Педро, не в рюшечках дело и не в штанах с люриксом.Это в С++ изучают И не главное градиет наискосок пустить. Дальше по Чехову. Редактировалось 21 раз(а), последний 2022-07-02 00:53:36 |
|||
карма: 6 |
|
Ответов: 2059
Рейтинг: 132
|
|||
Пока пьяный(старый стал с полтора 0.7 +(две банки девятки: водка без пива - деньги на ветер) на разговор потянуло(закусывать надо...), раньше 3*0.7 только повод поговорить).
Тут такое дело... Когда кот Васька поймал и загрыз птичку, которая в помещение залетела - тёщу, царство ей небесное(но я же хоронил) спасло почти из морга, но тогда не случай и всё образумилось. А если птица бьётся в окно - тоже проходили и не одного сбоя. .... |
|||
карма: 6 |
|