Вверх ↑
Этот топик читают: Гость
Ответов: 2059
Рейтинг: 132
#1: 2022-06-28 21:28:28 ЛС | профиль | цитата
Тут такое дело...
Делаю компоненты(не для себя!), все в плане нейронных сетей.
Конечно громко сказано, - копиапстю с 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
карма: 6

0
Ответов: 2059
Рейтинг: 132
#2: 2022-06-28 23:07:02 ЛС | профиль | цитата
Чтобы было понятней
В активном параметре надо писать 0.05, а не целые числа и нужно не real, а Single.
Single - выбрано в этой сети из за скорости.
Нужно чего то типа StrToFloat, или Str2Double.
Нужна функция Str2Single, но такой нет!



Передачу входных и выходных массивов of Single между кубиками вроде решил...

Редактировалось 3 раз(а), последний 2022-06-29 11:55:02
карма: 6

0
Ответов: 8927
Рейтинг: 823
#3: 2022-06-29 12:21:37 ЛС | профиль | цитата
flint2, процессоры в видеокарте работают именно с четырёхбайтным форматом с плавающей точкой.
Можно использовать DataToFileEx от Галкова, в нём есть и Single.


Add(MainForm,2953706,84,84)
{
}
Add(Edit,7698724,147,84)
{
Left=55
Top=40
Text="0.0625"
ClearAfterEnter=1
link(onEnter,10311024:doEvent1,[])
}
Add(DataToFileEx,14540020,273,112)
{
Type=1
DataSize=4
Point(doPosition)
link(onGet,10257857:doString,[])
link(Stream,12899703:Stream,[])
}
Add(MemoryStream,12899703,273,56)
{
}
Add(Label,9380020,371,112)
{
Left=145
Top=45
}
Add(Hub,10311024,189,91)
{
OutCount=4
link(onEvent1,12899703:doClear,[(263,97)(263,69)])
link(onEvent2,14540020:doPut,[(263,104)(263,125)])
link(onEvent3,6352210:doData,[(214,111)(214,132)])
link(onEvent4,14540020:doGet,[])
}
Add(DoData,6352210,224,126)
{
link(onEventData,14540020:doPosition,[])
}
Add(FormatStr,10257857,322,112)
{
Mask="%1 байта, значение %2"
link(onFString,9380020:doText,[])
link(Str1,12899703:Size,[(328,103)(286,103)])
}

карма: 19

0
Ответов: 2059
Рейтинг: 132
#4: 2022-06-29 12:46:00 ЛС | профиль | цитата
Леонид, спасибо!
Сейчас буду посмотреть, а пока сделал так.
Add(MainForm,4098603,210,91)
{
Width=291
Height=530
}
Add(InlineCode,9268460,378,182)
{
WorkPoints=#6:doWork|
EventPoints=#6:onTrue|0:|
DataPoints=#6:Param1|6:Param2|
Code=#15:unit HiAsmUnit;|0:|9:interface|0:|21:uses Share,Kol,Debug;|0:|4:type|28: THiAsmClass = class(TDebug)|10: private|8: |10: public|21: Param1: THI_Event;|22: Param2: THI_Event; |19: onTrue: THI_Event;|3: |49: Procedure doWork(var _Data:TData; Index:Word); |0:|5: end;|0:|2: |15: implementation|0:|3: |29:Procedure THiAsmClass.doWork;|18: var text: String;|13: Sn : Single;|0:|5:begin|28:text:=ToStringEvent(Param1);|21:Sn:=Str2Double(text);|21:text:=Double2Str(Sn);|30: _hi_OnEvent(onTrue,text) ;|7: end;|0:|0:|4:end.|
link(onTrue,11707526:doAdd,[])
link(Param1,2611930:Text,[])
}
Add(Button,575765,294,182)
{
Left=25
Top=470
link(onClick,9268460:doWork,[])
}
Add(Memo,11707526,469,182)
{
Left=5
Top=10
Width=270
Height=140
}
Add(Edit,2611930,378,63)
{
Left=10
Top=170
Width=105
Text="0.075"
}

Но не знаю на сколько это приемлемо.
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

0
Ответов: 8927
Рейтинг: 823
#5: 2022-06-29 14:51:29 ЛС | профиль | цитата
flint2, а это что?
Посмотрите как у Галкова в DataToFileEx
А_это_что.jpg
карма: 19

0
Ответов: 2059
Рейтинг: 132
#6: 2022-06-29 15:04:31 ЛС | профиль | цитата
Леонид, а это шум.
Потому что Double2Str берёт ещё четыре байта хрен знает чего.
То есть Str2Double для Single вроде работает, а вот наоборот всегда будет погрешность ведь Str2Double делает 8 байт, вот от туда и хвостик. Но мне Str2Double, или Str2Single не нужны, потому что выхлоп будет в виде текста предложений, или в виде картинки, либо в виде куска звуков - в зависимости чего обрабатываем.
Да, я уже немного переделал как в DataToFileEx с учётом узкой специализации - только под Single, потому что боюсь применять Str2Double. Куда ещё четыре байта захреначит и чего попортит это неизвестно?

Вечером освобожусь, потом доложу.

Редактировалось 4 раз(а), последний 2022-06-29 15:32:00
карма: 6

0
Ответов: 8927
Рейтинг: 823
#7: 2022-06-29 23:07:10 ЛС | профиль | цитата
flint2 писал(а):
а это шум

Картинка в помощь:
Sing_Doub.jpg
карма: 19

0
Ответов: 2059
Рейтинг: 132
#8: 2022-06-29 23:52:30 ЛС | профиль | цитата
Леонид писал(а):
Картинка в помощь:

Я о чём то подобном догадывался, но не знал нюансов.

Вот чего у меня получилось после упрощения:
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

0
Разработчик
Ответов: 26161
Рейтинг: 2127
#9: 2022-06-30 02:23:40 ЛС | профиль | цитата
flint2 писал(а):
И где можно посмотреть про Share.XXXXXX?

В файле Share.pas
карма: 22

0
Ответов: 2059
Рейтинг: 132
#10: 2022-06-30 02:37:27 ЛС | профиль | цитата
nesco писал(а):
В файле Share.pas

Чего то меня заклинело.
карма: 6

0
Ответов: 2059
Рейтинг: 132
#11: 2022-06-30 04:33:13 ЛС | профиль | цитата
Оказалось всё просто!
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;
Но есть решение ещё круче!!! Через Hex чего угодно, во что угодно, хоть массивы. VarToHex и HexToVar.
Потом нарисую, а то уже спать надо.
карма: 6

0
Ответов: 5227
Рейтинг: 587
#12: 2022-06-30 07:50:50 ЛС | профиль | цитата
String->HEX->Single Шедевр
Это в С++ изучают

Редактировалось 2 раз(а), последний 2022-06-30 07:51:25
карма: 4
Мой форум - http://hiasm.bbtalk.me/ схемы, компоненты...
0
Ответов: 2059
Рейтинг: 132
#13: 2022-06-30 10:32:13 ЛС | профиль | цитата
andrestudio писал(а):
String->HEX->Single Шедевр

Double->HEX.....HEX->Single

По теме:
Add(MainForm,4098603,210,91)
{
Width=291
Height=530
}
Add(InlineCode,9268460,378,168)
{
WorkPoints=#6:doWork|
EventPoints=#6:onTrue|0:|
DataPoints=#6:Param1|6:Param2|
Code=#15:unit HiAsmUnit;|0:|9:interface|0:|21:uses Share,Kol,Debug;|0:|4:type|28: THiAsmClass = class(TDebug)|10: private|8: |10: public|21: Param1: THI_Event;|22: Param2: THI_Event; |19: onTrue: THI_Event;|3: |49: Procedure doWork(var _Data:TData; Index:Word); |0:|5: end;|0:|2: |15: implementation|1: |47:function Str2Single( const S: String ): Single;|15:var I: Integer;|19: M, Pt: Boolean;|15: Sn: Single;|16: Ex: Integer;|5:begin|16: Result := 0.0;|22: if S = '' then Exit;|13: M := FALSE;|9: I := 1;|22: if S[ 1 ] = '-' then|7: begin|14: M := TRUE;|13: Inc( I );|6: end;|32: if S[ 1 ] = '+' then Inc( I );|14: Pt := FALSE;|12: Sn := 1.0;|27: while I <= Length( S ) do|7: begin|18: case S[ I ] of|46: '.': if not Pt then Pt := TRUE else break;|28: '0'..'9': if not Pt then|77: Result := Result * 10.0 + Integer( S[ I ] ) - Integer( '0' )|18: else|19: begin|31: Sn := Sn * 0.1;|77: Result := Result + (Integer( S[ I ] ) - Integer( '0' )) * Sn;|18: end;|19: 'e', 'E': begin|53: Ex := Str2Int( CopyEnd( S, I + 1 ) );|56: Result := Result * IntPower( 10.0, Ex );|22: break;|18: end;|15: else break;|8: end;|13: Inc( I );|6: end;|11: if M then|22: Result := -Result;|4:end;|0:|46:function Extended2Str4( E: Extended ): String;|75: function UnpackFromBuf( const Buf: array of Byte; N: Integer ): String;|28: var I, J, K, L: Integer;|9: begin|29: SetLength( Result, 8 );|13: J := 1;|28: for I := 7 downto 0 do|11: begin|28: K := Buf[ I ] shr 4;|44: Result[ J ] := Char( Ord('0') + K );|17: Inc( J );|29: K := Buf[ I ] and $F;|44: Result[ J ] := Char( Ord('0') + K );|17: Inc( J );|10: end;|0:|44: Assert( Result[ 1 ] = '0', 'error!' );|29: Delete( Result, 1, 1 );|0:|20: if N <= 0 then|11: begin|22: while N < 0 do|13: begin|33: Result := '0' + Result;|19: Inc( N );|12: end;|32: Result := '0.' + Result;|9: end|12: else|34: if N < Length( Result ) then|11: begin|72: Result := Copy( Result, 1, N ) + '.' + CopyEnd( Result, N + 1 );|9: end|12: else|11: begin|37: while N > Length( Result ) do|13: begin|33: Result := Result + '0';|12: end;|13: Exit;|10: end;|0:|28: L := Length( Result );|20: while L > 1 do|11: begin|53: if not (Result[ L ] in ['0','.']) then break;|17: Dec( L );|44: if Result[ L + 1 ] = '.' then break;|10: end;|67: if L < Length( Result ) then Delete( Result, L + 1, MaxInt );|0:|8: end;|0:|3:var|13: S: Boolean;|16:var F: Extended;|15: N: Integer;|32: Buf1: array[ 0..9 ] of Byte;|17: I10: Integer;|5:begin|16: Result := '0';|21: if E = 0 then Exit;|13: S := E < 0;|20: if S then E := -E;|0:|10: N := 15;|12: F := 5E12;|12: I10 := 10;|16: while E < F do|7: begin|13: Dec( N );|17: E := E * I10;|6: end;|16: if N = 15 then|20: while E >= 1E13 do|7: begin|13: Inc( N );|17: E := E / I10;|6: end;|0:|15: while TRUE do|7: begin|7: asm|16: FLD [E]|19: FBSTP [Buf1]|8: end;|33: if Buf1[ 7 ] <> 0 then break;|17: E := E * I10;|13: Dec( N );|6: end;|0:|37: Result := UnpackFromBuf( Buf1, N );|0:|35: if S then Result := '-' + Result;|4:end;|0:|42:function Single2Str( Sn: Single ): String;|5:begin|32: Result := Extended2Str4( Sn );|5:end; |1: |0:|0:|3: |29:Procedure THiAsmClass.doWork;|18: var text: String;|13: Sn : Single;|8: R:Real;|5:begin|30:text := ToStringEvent(Param1);|23:Sn:=Str2Single( text );|11://Sn:=1.05;|23:text := Single2Str(Sn);|30: _hi_OnEvent(onTrue,text) ;|4:end;|0:|0:|4:end.|
link(onTrue,11707526:doAdd,[(440,174)(440,181)])
link(Param1,2611930:Text,[])
}
Add(Button,575765,294,182)
{
Left=25
Top=470
link(onClick,7295647:doEvent1,[])
}
Add(Memo,11707526,469,175)
{
Left=5
Top=10
Width=270
Height=140
}
Add(Edit,2611930,378,63)
{
Left=10
Top=170
Width=105
Text="0.075"
}
Add(Hub,7295647,343,182)
{
link(onEvent1,11707526:doClear,[])
link(onEvent2,9268460:doWork,[(367,195)(367,174)])
}


Редактировалось 2 раз(а), последний 2022-06-30 11:56:24
карма: 6

0
Ответов: 2059
Рейтинг: 132
#14: 2022-07-01 19:44:12 ЛС | профиль | цитата
Продолжаем разговор.
Обучение из файла(всё в текстовом представлении) сделал, всё пашет, как часы и даже автоматическое построение\добавление промежуточных слоёв, пока не будет нужного результата.
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!
И не обязательно привязывать к какому нибудь типу, а достаточно размерности 4 байта, тогда и другие типы заработали бы. (Ну и 8, 16 и так далее байта. Всего одна цифирь из этого списка, которая означает бестиповый вариант передачи. Было бы круто) А чего берём из стека это потребитель определяет, так в байткоде делается и в бестипных языках.(Есть по крайней мере три протокола передачи). Понимаем, и система не рассыплется.
Но такого не может быть - потому что не может быть никогда!
А себе я сделаю для пробы.
P.S.
String->HEX->Single Шедевр
Это в С++ изучают
Вот Дон Педро, не в рюшечках дело и не в штанах с люриксом.
И не главное градиет наискосок пустить. Дальше по Чехову.

Редактировалось 21 раз(а), последний 2022-07-02 00:53:36
карма: 6

0
Ответов: 2059
Рейтинг: 132
#15: 2022-07-02 14:47:05 ЛС | профиль | цитата
Пока пьяный(старый стал с полтора 0.7 +(две банки девятки: водка без пива - деньги на ветер) на разговор потянуло(закусывать надо...), раньше 3*0.7 только повод поговорить).
Тут такое дело...
Когда кот Васька поймал и загрыз птичку, которая в помещение залетела - тёщу, царство ей небесное(но я же хоронил) спасло почти из морга, но тогда не случай и всё образумилось.
А если птица бьётся в окно - тоже проходили и не одного сбоя.
....
карма: 6

0
Сообщение
...
Прикрепленные файлы
(файлы не залиты)