Содержание
Запустить обучение — половина работы. Вторая половина: понять, почему компактная свёрточно-рекуррентная сеть (CRNN) на кропах ультразвукового контроля толщины (УЗТ) выдаёт не ту толщину, сменить один рычаг и снова измерить. Иначе вы одновременно крутите скорость обучения, аугментацию и глубину сети — и через неделю не знаете, что именно сработало.
Это третья полевая заметка того же пилота ai-vision, не учебник «как обучить нейросеть вообще». Архитектура головы MeasurementCrnn, алфавит и конфликт пустых внутри временного выравнивания (CTC) — в компактной замерной сети. Виды клетки до распознавания — в пустой клетке, повторе и зачёркивании. Каталог метрик по задачам — в метриках качества нейросетей. Здесь — цикл, которым мы двигаем качество уже существующей головы.
Проект в разработке; репозиторий закрытый — контур на странице портфолио. Цифры прогонов — измерения пилота, не норматив приёмки. Ошибка в десятых по-прежнему уходит в учётную систему предприятия (ERP).
Ключевые выводы
Сначала причина, потом архитектура. Низкое полное совпадение почти никогда не лечится «ещё одним слоем», пока не ясно: мало данных, кривые этикетки, недообучение, переобучение или неверная постановка (пустое поле внутри той же головы).
Нельзя улучшать то, что неправильно измеряем. Для замера важны полное совпадение строки и ложные срабатывания на пустых, а не только функция потерь и посимвольная оценка. Карта приборов — в соседней статье про метрики.
Один рычаг за прогон. Иначе журнал экспериментов превращается в фольклор.
Набор сильнее гиперпараметра. Разнообразие почерка, качество кропа и сложные отрицательные примеры двигают цифру чаще, чем смена оптимизатора.
Эпохи — честный первый рычаг недообучения. Модель могла просто не дойти. Больше эпох ≠ всегда лучше: смотрите разрыв обучения и проверки.
Когда простой рычаг упёрся — ищите узкое место. В пилоте после смешивания пустых это уже не «ещё 20 эпох», а отдельный классификатор «пусто / есть значение» и человек на хвосте.
Качество системы ≠ качество модели. Контур с уверенностью и проверкой оператора часто полезнее бесконечной охоты за 99% автоматики.
Почему «обучить» — не конец
На вход обучения влияет всё сразу: набор, архитектура, функция потерь, оптимизатор, скорость обучения, размер пакета, число эпох, предобработка, аугментация, регуляризация, схема проверки. Искушение — крутить это как пульт. Результат — красивый график потерь и неверная толщина 8,0 на пустой клетке.
Главный вопрос не «как запустить обучение», а как систематически улучшать качество. Сквозной пример тот же: кроп клетки → признаки свёртки → двунаправленная память → CTC → строка. Базовый компактный прогон: порядка тысячи числовых значений, около 19 минут, 70,9% полного совпадения и 89% по символам. Это исходная точка цикла, не приёмка цеха.
flowchart TB
data[Dataset_and_labels]
data --> train[Train]
train --> measure[Measure_exact_and_empty_FP]
measure --> why[Error_analysis]
why --> hyp[One_hypothesis]
hyp --> change[Change_one_lever]
change --> train
Что здесь считается качеством
Функция потерь CTC падает — сеть лучше выравнивает последовательность. Это не то же самое, что верная толщина. Эталон 58321, прогноз 58327: потери могли снизиться, замер целиком неверен. Оператору и ERP нужна строка.
Для оптического распознавания символов (OCR) в замерной клетке в пилоте смотрим:
- полное совпадение строки;
- точность по символам (диагностика, не приёмка);
- ложные срабатывания на пустых;
- отдельно — узкие колонки и каверзные кропы.
Карту доли верных ответов, полноты, ошибок символа и слова и производственных порогов не дублируем: она уже собрана в метриках качества. Здесь важнее ловушка нашего скрипта проверки: в train_crnn.py пустые эталоны на валидации пропускаются. Полное совпадение считается только по заполненным. Можно «улучшить» 70,9% и одновременно вырастить фантомы на пустых, если не гонять отдельный отчёт. Именно поэтому в первой заметке таблица пустых шла отдельной колонкой.
Сначала диагностика, не новая сеть
Низкое качество ветвится.
мало / однотипные данные
кривые или спорные этикетки
недообучение
переобучение
скорость обучения
предобработка кропа
не та постановка задачи
Не надо сразу менять архитектуру. В пилоте голова уже узкая: вход 48 × 160, порядка 640 тысяч параметров, AdamW 1e-3, затухание 1e-4, пакет 16, обрезка градиента 5, планировщик ReduceLROnPlateau, ранняя остановка с терпением 18 эпох при потолке 80. Это достаточный контур, чтобы сначала прочитать логи: потери обучения и проверки, полное совпадение, не растёт ли одно при падении другого.
Типичные картины.
| Симптом | Что это у нас | Что пробовать первым |
|---|---|---|
| Обучение и проверка обе низкие | недообучение | эпохи, скорость, данные |
| Обучение высокое, проверка отстаёт | переобучение | аугментация, затухание, ранняя остановка, больше разнообразия |
| Потери скачут | слишком крупный шаг | уменьшить скорость |
| Потери почти стоят | шаг мелкий или задача склеила два режима | скорость или развести пустое и цифру |
| Фантомы на пустых при росте цифр | конфликт в одной голове | не дожимать CTC, а вентиль вида клетки |
Разбор ошибок после каждого прогона важнее нового оптимизатора. Смотрим, какие клетки ломаются: последняя цифра, запятая, жирная сетка, бледный карандаш, повтор, который уехал в 1. Это очередь сложных примеров, а не повод немедленно ставить внимание и трансформер.
В логах обучения пишется эпоха, потери обучения и проверки, полное совпадение. Этого достаточно, чтобы отличить «ещё не дошли» от «уже запоминаем лист». Недостаточно, чтобы увидеть фантом на пустой клетке: его надо мерить отдельным отчётом. Если команда смотрит только одну колонку журнала, цикл имитирует науку и остаётся шаманством.
Набор — главный рычаг
Тысяча однотипных кропов одного почерка хуже нескольких сотен разных листов. Объём без разнообразия создаёт иллюзию обучения. Инженерия набора как продукта — в отдельной серии; здесь — то, что уже режет качество замерной головы.
Этикетки. Пара «картинка → 12,6» при реальном 12,5 учит сеть врать уверенно. Даже небольшая доля таких пар бьёт CTC сильнее, чем «не тот» размер пакета. В пилоте спорные кропы помечаются качеством (clean / hard); в обучение сложные можно включать, в чистую проверку — нет. Это уже дисциплина, не гиперпараметр.
Баланс. Редкая «проблема последней цифры» не лечится средним по всем символам. Если девяток мало, сеть будет хорошо читать восьмёрки и путать хвост. Очередь ошибок после прогона — честнее, чем искусственно размножить класс вслепую.
Сложные примеры. Код загрузчика уже умеет include_hard. Смысл не «добавить шум», а вернуть в обучение те кропы, на которых текущий чекпоинт врёт. Цикл: обучить → список ошибок → разметить / отфильтровать → снова обучить. Без журнала это превращается в бесконечное дообучение на всём подряд.
Смешивание пустых в ту же голову — отдельный рычаг, который мы уже измерили: фантомы падают, цифры тоже. Это не «ещё данные», а смена постановки. Повторять таблицу 85,4% / 100% ложных здесь не будем — она в первой заметке. Вывод для цикла: если узкое место — пустые, следующий эксперимент не «больше эпох на той же смеси».
Предобработка и аугментация — только как реальность входа
Одна и та же голова на другом кропе даёт другое качество. В пилоте цепочка узкая: серый, автоконтраст, холст 48 × 160, инверсия, слабый поворот и сдвиг, узкий контраст. Это имитация телефона и сетки, не «творческий шум».
Правило: аугментация должна быть похожа на то, что приедет с бланка. Наклон, тень, слабая резкость — да. Сильная упругая деформация, которой у оператора нет, — способ выучить несуществующий мир и уронить проверку.
Порог качества кропа (legacy / strict) — тоже предобработка в широком смысле: плохой вырез не должен спокойно ехать в обучение как «ещё один пример 12,3». Если геометрия клетки пляшет, сначала чинят контур зрения, а не увеличивают число фильтров.
Эпохи: модель могла просто не доучиться
Первый компактный прогон сел около 70,9% полного совпадения. В следующем цикле мы держали тот же контур и дали голове дойти дальше по эпохам: полное совпадение поднялось до 75,8%. Это не «магия планировщика» и не новая архитектура. Веса ещё не стояли в яме; градиентный спуск просто не закончил работу.
По умолчанию в коде потолок 80 эпох и ранняя остановка, если полное совпадение на проверке не растёт 18 эпох подряд. Планировщик режет скорость вдвое, если потери проверки не падают 5 шагов, но не ниже 1e-5. Имеет смысл смотреть, остановились ли мы рано по терпению, или упёрлись в потолок данных.
Больше эпох не всегда лучше.
обучение ████████████ высокое
проверка ████░░░░░░░░ отстаёт
Если разрыв растёт, вы запоминаете конкретные листы, а не учитесь читать почерк. Тогда рычаг — не «ещё 40 эпох», а аугментация, затухание, разнообразие, ранняя остановка на лучшем снимке, а не на последнем.
Скорость, пакет, оптимизатор — после причины
Скорость обучения — длина шага по поверхности потерь. Слишком крупная — потери скачут, сеть перепрыгивает узкий оптимум короткой строки. Слишком мелкая — 80 эпох не хватает, вы решаете, что «архитектура слабая». В пилоте старт 1e-3 плюс снижение по плато. Менять её одновременно с пакетом и числом эпох — запрещённый жест журнала.
Пакет 16 — компромисс стабильности градиента и размера выборки, не религия. Меньший пакет не «сам по себе лучше обобщает»; эффект связан со скоростью и шумом. Пока не закрыты данные и эпохи, сравнение 8 / 32 / 64 — дорогая очередь.
Оптимизатор AdamW с затуханием весов уже стоит. Менять его на классический стохастический спуск «потому что так в статье 2014 года» без гипотезы — шум. Регуляризация у нас уже в трёх местах: затухание, dropout 0,2 в памяти, ранняя остановка. Добавлять ещё одно, не видя переобучения, незачем.
Перенос весов с большой свёртки и ансамбль нескольких чекпоинтов в пилоте не закрыты. Пока узкое место — пустые клетки и разнообразие почерка, это поздние рычаги. Честно пишем: не делали, не выдумываем плюс три процента.
Журнал: одна строка — одно изменение
Без журнала цикл рассыпается. Минимальная таблица пилота (не лабораторный стенд на все оптимизаторы сразу):
| Прогон | Что меняли | Полное совпадение | Пустые, ложные |
|---|---|---|---|
| Базовый компактный | исходный контур, ~1000 чисел | 70,9% | не отделяли |
| Больше эпох | тот же контур | 75,8% | смотреть отдельно |
| Смесь пустых с нуля | отрицательные в той же голове | 78,6% на цифрах | 0,1% |
| Дообучение на пустых | смесь поверх цифровой головы | 83,2% на цифрах | 0,5% |
| База почти без пустых | для сравнения конфликта | 85,4% на цифрах | 100% |
Строки про пустые уже разобраны как конфликт постановки, не как победа обучения. Их держат в журнале, чтобы не повторить: «давайте ещё раз дообучим на пустых до победы». Аугментацию и планировщик в этой таблице не дописываем задним числом: не было отдельного прогона «только планировщик» с честной дельтой.
В черновике плана легко нарисовать красивую лестницу «эпохи → аугментация → планировщик → 80%». Без изолированного прогона это декорация. Мы сознательно не публикуем такие ступени: их нечем подтвердить. Журнал короче энциклопедии — и честнее.
Правило: не менять пять ручек сразу. Если 70,9% → 75,8% при прочих равных, прирост можно связать с эпохами. Если одновременно поменять набор, скорость и глубину — получите историю, которую нельзя воспроизвести.
Когда качество упёрлось — и когда модель уже не надо улучшать
После 70% рост относительно дешёвый. После 80% ошибки становятся редкими и патологическими: жирная сетка, чужой почерк, плохой кроп. Последние проценты часто требуют не новой головы, а другой системы: вентиль пустых, щит 80 мм, статус review, человек.
В пилоте простой рычаг эпох уже не закрывает фантомы. Следующее узкое место — вид клетки до распознавания и крошечный классификатор «пусто / есть значение», а не ансамбль трёх CRNN. Пока классификатора нет, честно держим хвост на проверке. Это уже системная заметка про бланк: модель не обязана отвечать всегда.
Иногда контур «95% автоматически + сомнительное человеку» лучше производственной системы, которая гонится за 99% молча. Цена пропуска толщины выше лишнего взгляда оператора — та же рамка, что в экономике сбоя.
Что сделать сегодня
Заведите журнал из пяти колонок: гипотеза, что не трогали, полное совпадение, фантомы пустых, решение (зафиксировать / откатить).
Прогоните текущий чекпоинт по ошибкам и выпишите десять клеток, которые ломаются одинаково. Это и есть следующий набор, а не «ещё случайные кропы».
Если обучение и проверка обе низкие — сначала добавьте эпохи или проверьте, не остановились ли рано. Если проверка отстаёт — не добавляйте слои.
Не сравнивайте архитектуры, пока на одном и том же наборе не закрыты этикетки, эпохи и один гиперпараметр.
Если после двух изолированных прогонов цифра стоит, не добавляйте третий «на всякий случай». Зафиксируйте чекпоинт, выпишите десять повторяющихся ошибок и смените слой системы: набор, вид клетки или порог для человека. Повторный запуск обучения без новой гипотезы только плодит файлы весов.
Частые вопросы
Почему не начать с подбора скорости обучения?
Потому что скорость отвечает на вопрос «как идти», а не «туда ли мы идём». Если в наборе перепутанные этикетки или пустые внутри CTC, любой шаг будет уверенно спускаться не туда.
Можно ли считать рост 70,9% → 75,8% доказательством, что эпохи — лучший рычаг навсегда?
Нет. Это один прогон при прочих равных. На другой выборке тот же рычаг упрётся раньше. Журнал фиксирует факт, не закон физики.
Зачем тогда вообще архитектура?
Когда данные, этикетки и режим обучения измерены и не хватает: другой почерк, другая длина строки, другой алфавит. До этого усложнение маскирует дыру в наборе.
Нужны ли ансамбль и аугментация на выводе?
В пилоте не измеряли. Пока дешевле не кормить распознаватель пустой клеткой, чем усреднять три поворота одной галлюцинации.
Как это стыкуется с облачной моделью зрения?
Локальная голова — массовый замер. Облако — шапка и сомнительные кропы. Цикл улучшения локальной головы не отменяет порог уверенности и отчёт оператора.
Типичные ошибки
Самая частая — крутить скорость обучения, пакет и аугментацию в одном прогоне, а потом спорить, «что сработало». Журнал с одной строкой на изменение дешевле второго чекпоинта.
Вторая — смотреть только функцию потерь. Потери CTC могут падать, пока последняя цифра стабильно врёт. Полное совпадение и фантомы пустых надо считать рядом, не «потом в отчёте для руководства».
Третья — дообучать ту же голову на пустых, потому что фантомы обидны. Мы уже измеряли: цифры тоже падают. Если узкое место — пустое поле, следующий эксперимент про вид клетки, не про ещё двадцать эпох.
Четвёртая — сравнивать архитектуры на разных наборах. Новый почерк в обучении и старая проверка выглядят как «трансформер лучше», хотя вы просто добавили данные.
Пятая — гнаться за автоматическими 99%, когда оператор всё равно смотрит серую подсветку. Система с порогом уверенности закрывает цех раньше, чем идеальная голова.
Что почитать дальше
Как устроена голова и почему пустые ломают CTC — компактная замерная сеть. Что делать с клеткой до обучения — классификатор содержимого. Какие метрики бывают вне нашей сетки — качество нейросетей. Как не смешивать обучение и оценку — инженерия наборов. Человек в петле на всём бланке — одной модели мало.
Заключение
Качество компактной CRNN на бланке УЗТ растёт не от повторного запуска обучения, а от цикла: измерить → понять ошибку → сменить один рычаг → снова измерить. В пилоте честный базовый уровень 70,9% полного совпадения сдвинулся к 75,8% за счёт эпох; конфликт пустых показал, что следующий рычаг уже не внутри той же головы.
Практический шаг на этой неделе — не новая архитектура, а журнал из одного изменения и список из десяти повторяющихся ошибок. Если список пустой, вы ещё не смотрели предсказания, вы смотрели среднее.


