Главная › Моддинг › Обученные сети
Глава 10

Обученные сети

Зачем мозгу поставлять .oann, целочисленная арифметика, слои, запуск сети, oa-tool brain net, лимиты и что показывает Библиотека.

Эта глава кратко пересказывает docs/brains/oabrain-standard.md, docs/brains/authoring.md и docs/playing-with-brains.md. Нормативный текст — в этих документах.

Зачем мозгу сеть

Сеть обучается где-то ещё и поставляется в пакете. Скрипт вызывает её, когда ему нужно обученное решение. Это выбор автора. Собственный компьютерный игрок движка остаётся игроком по умолчанию, а мозг с весами по-прежнему включается только по выбору: одно место компьютера на машине, которая его выполняет.

.oann и целочисленная арифметика

Файл сети — это .oann формата 1. Тип тензора — int8, int16 или int32. Хранимая экспонента — от -48 до 16. Входы и активации — int16. Выходы — int16, кроме выхода argmax, который int32. Одинаковые входы дают одинаковые выходы на любой машине.

Дайджест проверяется при упаковке, при установке и ещё раз, когда место загружает мозг, до открытия песочницы. Сеть, которая вывела бы место за 64 МиБ, отклоняется до выделения памяти. Место удаляется, и за него продолжает играть встроенный компьютерный игрок. Загрузка не входит ни в одну фазу.

Слои

Виды слоёв в таком порядке. Входы и активации — int16.

СлойЧто делает
denseВыход — int16.
conv2dВыход — int16.
maxpoolВыход — int16.
reluВыход — int16.
leaky_reluВыход — int16.
tanhВыход — int16.
sigmoidВыход — int16.
addВыход — int16.
concatВыход — int16.
flattenВыход — int16.
softmaxВыход — int16.
argmaxВыход — int32.
embeddingВыход — int16.

Запуск сети

brain.network(id) возвращает дескриптор. brain.tensor создаёт неизменяемый тензор из 1–4 194 304 чисел. net:run принимает таблицу ровно с именами входов сети и возвращает новую таблицу. Выход int16 — это тензор. Выход argmax — это целое Lua. brain.grid создаёт квадратный тензор из 1–10 таких имён слоёв размером 8, 16, 32, 64 или 128, по умолчанию 64: sight, explored, water, height, metal, own, allies, enemies, threat и radar. Пример из стандарта записывает один образец:

brain.record{
  features = { sectors = brain.grid({"own", "explored"}, 8) },
  decision = 0
}

features — от 1 до 16 тензоров. decision — целое или тензор. Вызов пишет обучающий образец, когда матч записывается, а когда файл не открыт, выполняет те же проверки и списания. Параметр может оставить сеть неиспользуемой: читайте me.options и пропускайте вызов, когда игрок её выключил. Сеть всё равно загружается вместе с пакетом.

Создание сети через oa-tool brain net

oa-tool brain net читает модель ONNX с opset от 11 до 21 и пишет .oann. Вот команда, которую печатает руководство:

oa-tool brain net MODEL.onnx --calibrate DATA [--out FILE] [--weights int8|int16] [--max-difference X] [--force] [--json]

Веса — int8, если не задано --weights int16. --calibrate — файл со строками JSON. Отчёт — наибольшая разница на каждом выходе или доля образцов, на которых совпадает argmax. --max-difference отклоняет разницу больше заданной и ничего не пишет. Укажите файл в networks с его sha256. Хеш байтов должен совпадать с этим дайджестом.

Лимиты

Файл, запуск и запись не выходят за эти размеры.

ЛимитЗначение
Файл .oannне больше 64 МиБ
Тензоров в одном файлеот 2 до 4 096
Слоёв в одном файлеот 1 до 1 024
Ранг тензора и одна размерностьранг от 1 до 4, размерность от 1 до 65 535
Элементов в одном тензоре файлане больше 16 777 216
веса dense, conv2d и embedding вместене больше 8 388 608 элементов
Операций за один запускне больше 268 435 456
Память сетей, отдельно от предела Lua64 МиБ (67 108 864 байт)
Чисел в одном brain.tensorот 1 до 4 194 304
brain.gridот 1 до 10 имён слоёв, размер 8, 16, 32, 64 или 128. По умолчанию 64
Один brain.record и файл записиот 1 до 16 тензоров, не больше 4 194 304 элементов. Файл ограничен 1 ГиБ

Что видит игрок

Библиотека помечает мозг с весами меткой Сеть и строкой Использует обученную сеть ({size}). В записи также указаны уровни мозга, с чем он работает и есть ли у него полный обзор. Встроенный компьютерный игрок по-прежнему стоит в списке первым и остаётся игроком по умолчанию, пока игрок не выберет другой.