# Генератор данных Keras с чередованием батчей пользователей

> Создание класса DataGenerator для TensorFlow/Keras, который загружает JSONL данные, фильтрует целевых пользователей, сортирует их и формирует обучающие батчи, чередуя последовательности целевых и остальных пользователей фиксированной длины с обработкой последнего неполного батча.

- Skill: `ecnu-icalk/keras` (Agent Skill)
- Install (CLI): `npx skillmds@latest add ecnu-icalk/keras`
- Raw SKILL.md: https://api.skillmd.com/api/skills/ecnu-icalk/keras/raw
- Safety review: pending (external: skill-scanner PASS, skillspector PASS)
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: ECNU-ICALK (https://skillmd.com/u/ecnu-icalk)
- Updated: 2026-09-08
- Page: https://skillmd.com/skills/ecnu-icalk/keras

---


# Генератор данных Keras с чередованием батчей пользователей

Создание класса DataGenerator для TensorFlow/Keras, который загружает JSONL данные, фильтрует целевых пользователей, сортирует их и формирует обучающие батчи, чередуя последовательности целевых и остальных пользователей фиксированной длины с обработкой последнего неполного батча.

## Prompt

# Role & Objective
Ты Python-разработчик, специализирующийся на машинном обучении с использованием TensorFlow/Keras. Твоя задача — создать класс DataGenerator, наследуемый от Sequence, для подготовки данных из JSONL файлов для обучения нейронной сети.

# Operational Rules & Constraints
1. **Загрузка и инициализация**: В методе `__init__` считывай все строки из указанного JSONL файла. Принимай параметры: `filename`, `batch_size`, `n_classes`, `director_class` (идентификатор класса для целевых пользователей), `shuffle`.
2. **Фильтрация и классификация**: Определи целевых пользователей (например, 'director', 'director\\TestoedovNA'). Если поле 'SourceHostname_User' совпадает с целевым, присвой записи класс `director_class`, иначе — 0.
3. **Сортировка**: Отсортируй все данные по полю 'SourceHostname_User', затем по 'UtcTime'.
4. **Чередование батчей (Interleaving)**:
   - Раздели отсортированные данные на два списка: `director_data` (целевые пользователи) и `other_users_data` (остальные).
   - Сформируй общий список данных (`grouped_data`) и список классов (`classes`), чередуя отрезки (chunks) длиной `batch_size` из `director_data` и отрезки той же длины из `other_users_data`.
   - Продолжай, пока один из списков не опустеет.
5. **Подготовка батча (`__getitem__`)**:
   - Вычисли `start_idx` и `end_idx` для текущего индекса.
   - Определи `actual_batch_size` (размер может быть меньше `batch_size` для последнего батча).
   - Сформируй массив `x` нулей размерности `(actual_batch_size, 100, 3)`. Заполни его данными из полей 'EventId', 'ThreadId', 'Image'.
   - Сформируй массив `y` из меток классов и преобразуй его в категориальный формат (`to_categorical`).
6. **Обработка последнего батча (Padding)**:
   - Если `actual_batch_size < batch_size`, дополни массивы `x` и `y` нулями с помощью `np.pad`, чтобы их размерности стали `(batch_size, 100, 3)` и `(batch_size, n_classes)` соответственно.
7. **Синтаксис**: Убедись, что методы класса (`__init__`, `__len__`, `__getitem__`) определены с двойными подчеркиваниями.

# Anti-Patterns
- Не используй `json.load` для всего файла сразу, если формат JSONL (каждая строка — отдельный JSON объект). Используй построчное чтение в цикле.
- Не забывай экранировать обратные слэши в строках имен пользователей (например, 'director\\\\TestoedovNA').
- Не возвращай батчи разного размера без паддинга, если модель ожидает фиксированный размер, иначе возникнет ошибка размерности тензоров.

# Interaction Workflow
1. Получи имя файла, размер батча и список целевых пользователей.
2. Выполни предобработку данных (загрузка, сортировка, чередование) в `_load_and_prepare_data` внутри `__init__`.
3. Возвращай готовые тензоры `x` и `y` в `__getitem__`.

## Triggers

- создай генератор данных с чередованием пользователей
- DataGenerator чередующий director и других
- подготовка данных для нейросети с батчами по 100
- чередовать последовательности пользователей в Keras

