Ключевое слово
25 | 04 | 2025
Новости Библиотеки
Шахматы Онлайн
Welcome, Guest
Username: Password: Remember me

TOPIC: Практикум по нейронным сетям для шахмат №2

Практикум по нейронным сетям для шахмат №2 03 Апр 2025 10:14 #91

  • booot76
  • booot76's Avatar
  • OFFLINE
  • Чашник
  • Posts: 94
  • Thank you received: 7
  • Karma: 4
У меня не получается вашу модель загрузить (скорее всего у вас версия кераса новее - мне приходиться держать старую чтоб CUDA работала). Пришлите мне пожалуйста на почту финальный код в питоне + сам файлик с обучающей выборкой. Я у себя получу ту же структуру и поиграюсь с ней. Что-то мне не очень нравится что она у вас показывает.

Практикум по нейронным сетям для шахмат №2 03 Апр 2025 10:48 #92

  • alexlaw
  • alexlaw's Avatar
  • OFFLINE
  • Думный дьяк
  • Posts: 297
  • Thank you received: 13
  • Karma: 3
booot76 wrote:
"Переобучение"
На самом деле я подумал, что при загрузке модели я просто продолжил обучение.
Если в какой нибудь другой задачи дать новые данные и продолжить обучение.
Правда я не понял, после загрузки модели
alexlaw wrote: - нужно ли ее компилировать для оценки теста - model.predict(np.array([x[65283]]))
Last Edit: 03 Апр 2025 10:50 by alexlaw.

Практикум по нейронным сетям для шахмат №2 03 Апр 2025 13:05 #93

  • booot76
  • booot76's Avatar
  • OFFLINE
  • Чашник
  • Posts: 94
  • Thank you received: 7
  • Karma: 4
Нет, компилляция нужна на этапе "внесли изменения в архитектуру - скомпиллировали заново"

Практикум по нейронным сетям для шахмат №2 03 Апр 2025 15:03 #94

  • booot76
  • booot76's Avatar
  • OFFLINE
  • Чашник
  • Posts: 94
  • Thank you received: 7
  • Karma: 4
Нашел ошибочку.

1. Уберите у себя строчку x.dtype='byte'. Это так не работает - вы в уже созданном массиве меняете тип данных и ВСЯ память что раньше была зарезервирована по 8 байт на ячейку (по умолчанию тип float64 вроде) выделяется уже по 1 байту на ячейку типа байт. Ячеек сразу становится больше в 8 раз. Не 192, а 192*8. Так что убирайте : нам и float подойдет - все равно веса будут умножаться тоже в этом формате.
На будущее : тип данных массива numpy задается СРАЗУ при создании его. Типа x = np.zeros((223944, 192),dtype='byte')

2. При определении первого слоя Input лучше сразу имплицитно задавать формат ваших входных данных. Чтоб не было как у нас : ошибка в массиве + определение по типу "посмотришь как в массиве" дает совсем не то что мы хотим.Сеть раздувается до какого-то нереального количества параметров (у вас их 300+тысяч). Вместо строчки model.add(Input(x_train[0].shape)) дайте строчку
model.add(Input(shape=(192,)))

Сетка после всего этого должна иметь 53537 обучаемых параметров (суммари выводит их). Потом мы с вами их все ручками пересчитаем.

Переобучайте :-)
The following user(s) said Thank You: alexlaw

Практикум по нейронным сетям для шахмат №2 03 Апр 2025 16:34 #95

  • booot76
  • booot76's Avatar
  • OFFLINE
  • Чашник
  • Posts: 94
  • Thank you received: 7
  • Karma: 4
Теперь по переносу из питона в Делфи подробнее. Из сохраненной модели нам нужно перенести и смоделировать следующее:

1. Веса и биасы всех нейронов обученной нейросети. Это удобнее делать по слоям. У нас их 3 : 256-16-1. На вход каждого нейрона входного слоя поступает 192 значения. Значит у каждого из нейронов первого слоя 192 входа. В модели это все хранится в виде матриц. Матрица весов нейронов первого слоя (192,256) =49152 значения. Матрица биасов нейронов первого слоя - 256 значений. Для второго слоя матрица весов (256,16)=4096 значения. Матрица биасов второго слоя 16 значений. У последнего нейрона в выходном слое 16 весов и 1 биас. Если мы все эти количества просуммируем 49152+256+4096+16+16+1, то как раз получим все наши 53537 обученных параметра о которых говорит керас. Все их надо забрать у питона и перенести в Делфи и проверить, чтобы по дороге не потерялись. Опять все делаем через файлик.
Вот вам процедурка в питоне, которая опрашивает сохраненную обученную модель (процедура универсальна), выводит послойно информацию о ней и сохраняет все веса и биасы всех слоев послойно в общий файлик. Замените там имя-путь как там вам удобно. В конечной модели веса и биасы все хранятся в формате float32. 4 байта на параметр. Размер файла для нашей сети предсказуемо должен быть 53537*4=214148 байт.

def analyze_model(model):
f=open('net.dat','wb')
kol=len(model.layers)
print('Model has ',kol,' layers.')
for i in range(kol):
if len(model.layers.get_weights()) > 0:
w,b = model.layers.get_weights()
print(i,model.layers.name,w.shape,w.dtype,b.shape,b.dtype)
f.write(w.tobytes())
f.write(b.tobytes())
f.close()

Вам останется только все это прогрузить в Делфи в предварительно созданные массивы тоже типа float32. Ну и сравнить, конечно, желательно.Глазами или еще как.


2. Перенести активационную функцию (sigmoid). Она в каждом нейроне нашей будущей нейросети в Делфи будет вызываться после функции суммирования. Но тут проще : result:=1/(1+exp(-x))

3. Воспроизвести процедуры перемножения матриц по всем 3 слоям, пропустить их результаты через функцию-сигмоиду и полученные результаты, опять же, сравнить с тем что питон дает. Но это чуть позже. Сначала давайте 2 первых пункта.

Практикум по нейронным сетям для шахмат №2 03 Апр 2025 18:03 #96

  • alexlaw
  • alexlaw's Avatar
  • OFFLINE
  • Думный дьяк
  • Posts: 297
  • Thank you received: 13
  • Karma: 3
Переобучил (150 эпох)
Теперь все супер :)

dwg54.jpg

Практикум по нейронным сетям для шахмат №2 03 Апр 2025 18:49 #97

  • booot76
  • booot76's Avatar
  • OFFLINE
  • Чашник
  • Posts: 94
  • Thank you received: 7
  • Karma: 4
Неплохо предсказівает :-). Я смотрю мой код питоновский без табуляций передался. Если не получится самостоятельно расставить - обращайтесь

Практикум по нейронным сетям для шахмат №2 03 Апр 2025 19:42 #98

  • alexlaw
  • alexlaw's Avatar
  • OFFLINE
  • Думный дьяк
  • Posts: 297
  • Thank you received: 13
  • Karma: 3
К сожалению обнаружил еще одну ошибку у себя.
y = 1 - (res/100)
if (res == 252) or (res == 253):
y = 0
if (res == 254):
y = 1


Надо так
if (res == 252) or (res == 253) or (res == 0):

А то получилось при ранге 0, сеть выдает 1
Исправлю, главное обнаружил

Практикум по нейронным сетям для шахмат №2 03 Апр 2025 19:54 #99

  • booot76
  • booot76's Avatar
  • OFFLINE
  • Чашник
  • Posts: 94
  • Thank you received: 7
  • Karma: 4
Да - я тоже проглядел. Это серьезная ошибка

Практикум по нейронным сетям для шахмат №2 04 Апр 2025 05:54 #100

  • Vladimirovich
  • Vladimirovich's Avatar
  • OFFLINE
  • Инквизитор
  • Posts: 111644
  • Thank you received: 2314
  • Karma: 112
booot76 wrote:
Я смотрю мой код питоновский без табуляций передался.
Он должен неправильно работать с неправильными табуляциями :)
Каждому - своё.

Практикум по нейронным сетям для шахмат №2 04 Апр 2025 08:53 #101

  • alexlaw
  • alexlaw's Avatar
  • OFFLINE
  • Думный дьяк
  • Posts: 297
  • Thank you received: 13
  • Karma: 3
booot76 wrote:
1. Веса и биасы всех нейронов обученной нейросети.
Проверте, надеюсь правильно :)
Warning: Spoiler! [ Click to expand ]



Warning: Spoiler! [ Click to expand ]

Практикум по нейронным сетям для шахмат №2 04 Апр 2025 09:51 #102

  • booot76
  • booot76's Avatar
  • OFFLINE
  • Чашник
  • Posts: 94
  • Thank you received: 7
  • Karma: 4
ДА вроде как вопросов нет - отработала процедурка. Вы проверьте еще раз что выдает результатом сеть в заведомо ничейных позициях если короля белых в центр доски поставить. На всякий.

Практикум по нейронным сетям для шахмат №2 04 Апр 2025 11:04 #103

  • alexlaw
  • alexlaw's Avatar
  • OFFLINE
  • Думный дьяк
  • Posts: 297
  • Thank you received: 13
  • Karma: 3
booot76 wrote:
Вы проверьте еще раз что выдает результатом сеть
Думая сейчас предсказывает в пределах mae.
Epoch 150/150
6999/6999 ━━━━━━━━━━━━━━━━━━━━ 20s 3ms/step - loss: 2.7751e-04 - mae: 0.0026
Проверял в разных позициях.








8/8/8/2K5/8/8/k6Q/8 w - - 0 1
Warning: Spoiler! [ Click to expand ]

Практикум по нейронным сетям для шахмат №2 04 Апр 2025 11:14 #104

  • alexlaw
  • alexlaw's Avatar
  • OFFLINE
  • Думный дьяк
  • Posts: 297
  • Thank you received: 13
  • Karma: 3
Мне кажется, если сделать наоборот, чем ближе к 0, тем ближе мат, сеть будет точнее.
Но это предположение интуитивно.
Прим
Наверное чушь сказал :)
Last Edit: 04 Апр 2025 11:16 by alexlaw.

Практикум по нейронным сетям для шахмат №2 04 Апр 2025 13:14 #105

  • booot76
  • booot76's Avatar
  • OFFLINE
  • Чашник
  • Posts: 94
  • Thank you received: 7
  • Karma: 4
Я думаю что разницы как раз не будет. Ей все равно какие там цифры :-). Но это всегда можно проверить переобучив сеть и изменив пару строк кода.

Практикум по нейронным сетям для шахмат №2 04 Апр 2025 13:16 #106

  • booot76
  • booot76's Avatar
  • OFFLINE
  • Чашник
  • Posts: 94
  • Thank you received: 7
  • Karma: 4
Ну что : переносите это в Делфи и проверяйте чтобы веса и биасы для всех нейронов совпали. Так как мы выгружали матрицы побайтно, то и загружать их в Делфи можно точно так же побайтно. Предварительно определив аналогичные по размерности и по типу.

Практикум по нейронным сетям для шахмат №2 05 Апр 2025 09:53 #107

  • alexlaw
  • alexlaw's Avatar
  • OFFLINE
  • Думный дьяк
  • Posts: 297
  • Thank you received: 13
  • Karma: 3
Для начала загрузил данные сети из файла просто в массив Делфи, чтобы проверить правильно или это работает.
Ну и сохранил данные сети тексовой файл, чтобы был с чем сравнивать
Warning: Spoiler! [ Click to expand ]


Первые 256 значений
Warning: Spoiler! [ Click to expand ]


Делфи

Warning: Spoiler! [ Click to expand ]

Первые 256 значений Делфи
Warning: Spoiler! [ Click to expand ]


На первый взгляд все правильно

Практикум по нейронным сетям для шахмат №2 05 Апр 2025 10:53 #108

  • booot76
  • booot76's Avatar
  • OFFLINE
  • Чашник
  • Posts: 94
  • Thank you received: 7
  • Karma: 4
Похоже :-). Загрузите последовательно все и проверьте биасы - их проще руками просмотреть. Если все будет ок - реализуйте сигмоиду процедурой и начинаем реализацию процедур прохода "вперед" по нейросети.

Математически у нас идет преобразование в оценку нашей входной матрицы (1,192) с ноликами и единичками (в Делфи нас интересует оценка только по одной позиции за раз).
1 слой - умножение (1,192)*(192,256)=(1,256). В цикле в Делфи перемножайте строчку на каждый столбец и не забудьте добавить биасы для каждого из 256 полученных результатов. Лучше всего - дать сумматору в цикле сразу начальное значения соответствующего биаса. После пропустить все 256 полученных результатов через функцию сигмоиду и получить выходы нейронов первого слоя.
2 слой - умножение (1,256)*(256,16)=(1,16). То же самое. Не забываем снова про 16 биасов и пропустить все в конце через сигмоиду.
Выходной слой - последний нейрон умножение (1,16)*(16,1)=(1). Снова не забываем биас и последнюю сигмоиду. На выходе как раз и будет результат - float32 число.

Останется только выборочно сравнить ответ от одной и той же позиции в питоне и в Делфи. Должно быть очень похоже :-)

Практикум по нейронным сетям для шахмат №2 05 Апр 2025 18:28 #109

  • alexlaw
  • alexlaw's Avatar
  • OFFLINE
  • Думный дьяк
  • Posts: 297
  • Thank you received: 13
  • Karma: 3
Девушка-программер едет в трамвае, читает книгу.
Старушка смотрит на девушку, смотрит на книгу, крестится и в ужасе выбегает на следующей становке.
Девушка читала книгу "Язык Ада".


Я не заморачивался пока что с матрицами, взял готовое решение от Автор: Andrew M. Omutov

Матрицы в Delphi

Мне интересен сейчас результат работы сети для задачи неприкосновенный король.
Поискал матричный калькулятор (надо же проверять, как работает реализация Автор: Andrew M. Omutov.
Не нашел такой калькулятор, работающий с большими матрицами.
А Copyright:(c) 2011, Michael R. . All rights reserved. - у меня сходу не пошло, поэтому оставил их в покое :)

Практикум по нейронным сетям для шахмат №2 06 Апр 2025 13:31 #110

  • alexlaw
  • alexlaw's Avatar
  • OFFLINE
  • Думный дьяк
  • Posts: 297
  • Thank you received: 13
  • Karma: 3
Сделал для себя памятку.

Warning: Spoiler! [ Click to expand ]


Получил массивы -
//row column
//строка столбец
pos_dat := CreateMatrix(1,192);
dense_0 := CreateMatrix(192,256);
bias_0 := CreateMatrix(256,1);
Warning: Spoiler! [ Click to expand ]

dense_1 := CreateMatrix(256,16);
bias_1 := CreateMatrix(16,1);
Warning: Spoiler! [ Click to expand ]

dense_2 := CreateMatrix(16,1);
bias_2 := CreateMatrix(1,1);
Warning: Spoiler! [ Click to expand ]


Осталось все правильно математически просчитать.
Наверное для задачи о короле, можно просчитать заранее для всех позиций (как в эндшпильной таблице), а не на лету и составить таблицу.

Прим
Кто хочет(может) составить все это в виде формулы? :)
Last Edit: 06 Апр 2025 14:17 by alexlaw.

Практикум по нейронным сетям для шахмат №2 06 Апр 2025 13:37 #111

  • booot76
  • booot76's Avatar
  • OFFLINE
  • Чашник
  • Posts: 94
  • Thank you received: 7
  • Karma: 4
Я обычно с настороженностью отношусь к чужим решениям. Особенно в критически важных к произвоительности местах.

Практикум по нейронным сетям для шахмат №2 06 Апр 2025 13:39 #112

  • booot76
  • booot76's Avatar
  • OFFLINE
  • Чашник
  • Posts: 94
  • Thank you received: 7
  • Karma: 4
За вас это все питон просчитает. Просто возьмите несколько позиций , и через нейросеть их пропустите. С ответом нейросети ответ Делфи и сравнивайте.

Практикум по нейронным сетям для шахмат №2 06 Апр 2025 16:51 #113

  • alexlaw
  • alexlaw's Avatar
  • OFFLINE
  • Думный дьяк
  • Posts: 297
  • Thank you received: 13
  • Karma: 3
booot76 wrote:
ответ Делфи

1. 1 слой - умножение (1,192)*(192,256)=(1,256)
Правильно ли я понимаю дальше?
2. Прибавить каждому элементу матрицы (1,256) соответствующий биас.
3. Каждому элементу матрицы с прибавленными биасами применить сигмоид.
и т.д.

Практикум по нейронным сетям для шахмат №2 06 Апр 2025 18:03 #114

  • booot76
  • booot76's Avatar
  • OFFLINE
  • Чашник
  • Posts: 94
  • Thank you received: 7
  • Karma: 4
У вас на входе строка данных длинной 192 значения. В первом слое вы эту строку умножаете поэлементно с каждым из 256 столбцов матрицы весов (складывая результаты). Так же не забываете прибавить соответствующий биас (для первого столба - 1-й биас, для второго столбца - второй и так далее. У вас их ровно 256 по количеству столбцов ). После того как вы обработали все 256 столбцов и получили на выходе 256 результатов вы все эти 256 результатов пропускаете через сигмоиду. Получая таким образом выходы первого слоя. И уже их отправляете на вход второго слоя , умножая (1,256)*(256,16)=(1,16)

Практикум по нейронным сетям для шахмат №2 06 Апр 2025 18:09 #115

  • alexlaw
  • alexlaw's Avatar
  • OFFLINE
  • Думный дьяк
  • Posts: 297
  • Thank you received: 13
  • Karma: 3
booot76 wrote:
Я обычно с настороженностью отношусь к чужим решениям.
Я тоже, поэтому добавляю реализацию от Автор: Andrew M. Omutov по частям и стараюсь проверить как это работает.
Например в структуре
Матрицы в Delphi
Delphi , Синтаксис , Массивы
Матрицы в Delphi
	Автор: Andrew M. Omutov

Unit Matrix;

interface

type
   MatrixPtr = ^MatrixRec;
   MatrixRec = record
     MatrixRow   : byte;
     MatrixCol   : byte;
     MatrixArray : pointer;
   end;
   MatrixElement = real;

Я изменил на
interface
 type
   MatrixPtr = ^MatrixRec;
   MatrixRec = record
     MatrixRow   : integer;
     MatrixCol   : integer;
     MatrixArray : pointer;
   end;
   MatrixElement = Single;

Самому с нуля написать мне нужно достаточно много времени, а я бы хотел сосредоточиться на другом.
И скорость для меня сейчас не важна, важна правильность.
Last Edit: 06 Апр 2025 18:12 by alexlaw.

Практикум по нейронным сетям для шахмат №2 06 Апр 2025 18:15 #116

  • alexlaw
  • alexlaw's Avatar
  • OFFLINE
  • Думный дьяк
  • Posts: 297
  • Thank you received: 13
  • Karma: 3
booot76 wrote:
(складывая результаты).
Я не понял этот момент
Прим
Теперь наверное понял :)
Last Edit: 06 Апр 2025 19:28 by alexlaw.

Практикум по нейронным сетям для шахмат №2 06 Апр 2025 19:59 #117

  • booot76
  • booot76's Avatar
  • OFFLINE
  • Чашник
  • Posts: 94
  • Thank you received: 7
  • Karma: 4
Так что там писать-то? Загрузили веса и биасы и создали 3 небольших процедуры по числу слоев. Каждая на 2 вложенных цикла for.

"Я не понял этот момент
Прим
Теперь наверное понял "

Просто представьте что делает нейрон с данными : x1*d1+x2*d2+....Xn*Dn +bias. Вот собственно эту функцию нейрона вы и реализовываете. В цикле попарно перемножая данные (в входной строке) с весами (в столбце весов) для каждого из 256 нейронов входного слоя Все результаты от этих перемножений 192 пар складываете вместе и добавляете к результату биас соответствующего нейрона. 256 нейронов - 256 биасов - 256 столбцов одинаковой длины со строкой данных (192) все один к одному :-).
Last Edit: 06 Апр 2025 20:04 by booot76.

Практикум по нейронным сетям для шахмат №2 06 Апр 2025 20:18 #118

  • booot76
  • booot76's Avatar
  • OFFLINE
  • Чашник
  • Posts: 94
  • Thank you received: 7
  • Karma: 4
Ну вот чтоб на пальцах: Пусть веса первого слоя у вас лежат в

w1 : array [0..255,0..191] of float32;

a биасы в

b1: array[0..255] of float32;

тогда обявляете массив (строку) входных данных как

data: array[0..191] of float32; (там 0 и 1 но чтоб делфи не ругалось типы делаете одинаковыми - не суть )

обьявляете массив результатов (выходы первого слоя):

o1: array[0..255] of float32;

Тогда вся процедура у вас для первого слоя будет что-то типа :

for i:=0 to 255 do
begin
o1{i}:=b1{i}; сразу биасом будущую общую сумму очередного нейрона проинициализировали в начале и вперед :
for j:=0 to 191 do
o1{i}:=o1{i}+data{j}*w1{i,j};
o1{i}:=Sigmoid(o1{i}); и сразу после сумматора активационную функцию нейрона, чтобы не бегать 2 раза
end;


ВСЕ! Скобки {} специально выбрал такие чтобы форум их за теги не принимал и не коверкал
Last Edit: 06 Апр 2025 20:21 by booot76.

Практикум по нейронным сетям для шахмат №2 07 Апр 2025 12:30 #119

  • alexlaw
  • alexlaw's Avatar
  • OFFLINE
  • Думный дьяк
  • Posts: 297
  • Thank you received: 13
  • Karma: 3
booot76 wrote:
Ну вот чтоб на пальцах
Интересно было попробовать в colab.
Попробовал для входных данных и 1 слоя, чтобы было потом с чем сравнивать.
Warning: Spoiler! [ Click to expand ]


Результат
Warning: Spoiler! [ Click to expand ]

Практикум по нейронным сетям для шахмат №2 07 Апр 2025 16:50 #120

  • alexlaw
  • alexlaw's Avatar
  • OFFLINE
  • Думный дьяк
  • Posts: 297
  • Thank you received: 13
  • Karma: 3
Пока не понял, выдает разные результаты перемножение матриц от Автор: Andrew M. Omutov и dot numpy :(
bias_0.txt
dense_0.txt
pos_dat.txt
Moderators: Grigoriy
Рейтинг@Mail.ru

Научно-шахматный клуб КвантоФорум