Size: a a a

Natural Language Processing

2020 July 10

YB

Yuri Baburov in Natural Language Processing
Anton K.
друзья, есть ли готовые решения для разметки текста на фотографии? у меня есть изображения и координаты найденных кусочков текста. хочу дать возможность пользователям выбирать область и вписывать туда текст, который в этой области
на JS такое быстро пишется, а вот готового именно такого я не видел: все аннотаторы требуют определённых классов, а вот если произвольные тексты, то не умеют.
источник

AK

Anton K. in Natural Language Processing
Yuri Baburov
на JS такое быстро пишется, а вот готового именно такого я не видел: все аннотаторы требуют определённых классов, а вот если произвольные тексты, то не умеют.
принял, спасибо
одним js тут не отделаешься - персистентное хранилище еще потребуется
источник

YB

Yuri Baburov in Natural Language Processing
Anton K.
принял, спасибо
одним js тут не отделаешься - персистентное хранилище еще потребуется
да, конечно. на js проще всего использовать mongodb для этого.
источник

YB

Yuri Baburov in Natural Language Processing
в общем, первую версию для внутреннего употребления вам фронтендщик за день наверное сделает.
источник

AK

Anton K. in Natural Language Processing
ну да, там ничего военного
источник

AK

Anton K. in Natural Language Processing
еще хотел бы больше теоретический вопрос задать. я тренирую сейчас модель на синтетических данных. собрал релевантных моей задаче бэкграунды, примерно подобрал шрифты, поставил рандом и сгенерил 2кк изображений.
нейронка уже на 600 эпохе из 20к train loss показывает меньше единицы, то есть, если я верно понимаю, переобучилась.
в итоге синтетические данные распознает очень хорошо, но как только подашь что-то из реального мира - сразу выдает какую-то чушь.
верно ли я понимаю причинно-следственную связь и как принято с такими проблемами бороться?
источник

VF

Vadim Fomin in Natural Language Processing
Alexander
вот и не могу примера найти как его для эмбедингов предложений Bert использовать
по-моему, можно примерно так.
сначала создать собственный класс "датасет", унаследовав его от torch.utils.data.Dataset. у этого класса должны быть определены методы __getitem__ и __len__ .
__getitem__ на вход принимает какое-то число и на выход отдаёт объект из датасета, соответствующий этому числу (например, если прилетело число 10, то отдаётся десятый текст из датасета).
__len__ на вход ничего не принимает, а отдаёт общее число объектов в датасете.
потом надо создать объект этого класса  и засунуть в даталоадер. он автоматически будет формировать батчи.
мб, примерно так будет выглядеть:
class MyDataset(torch.utils.data.Dataset):
  def __init__(self, input_ids, attention_mask)
     self.input_ids = input_ids
     self.attention_mask = attention_mask
 
  def __getitem__(self, key):
     return self.input_ids[key], self.attention_mask[key]

  def ___len___(self):
     return len(self.input_ids)

dataset = MyDataset(input_ids=token_ids, attention_masks=attention_masks)
dataloader = torch.utils.data.DataLoader(dataset, batch_size=32)
for input_ids, attention_mask in dataloader:
  #и вот тут делаешь что тебе нужно
источник

YB

Yuri Baburov in Natural Language Processing
Anton K.
еще хотел бы больше теоретический вопрос задать. я тренирую сейчас модель на синтетических данных. собрал релевантных моей задаче бэкграунды, примерно подобрал шрифты, поставил рандом и сгенерил 2кк изображений.
нейронка уже на 600 эпохе из 20к train loss показывает меньше единицы, то есть, если я верно понимаю, переобучилась.
в итоге синтетические данные распознает очень хорошо, но как только подашь что-то из реального мира - сразу выдает какую-то чушь.
верно ли я понимаю причинно-следственную связь и как принято с такими проблемами бороться?
разницу в качестве train-test всегда называют переобучением, да, но причины могут быть разные.
- может быть вообще ошибка уровня "забыл отключить dropout/batchnorm" (перевести модель в eval-режим)
- может быть какая-то другая ошибка самого обучения или метрики.
- если ошибок нет, то если аугментации помогут лучше приблизиться к тестовому домену, начинай с них.
- иначе нужно предобучаться на train, а часть данных из *тестового домена разметить и использовать для точной настройки под домен.
источник

AK

Anton K. in Natural Language Processing
Yuri Baburov
разницу в качестве train-test всегда называют переобучением, да, но причины могут быть разные.
- может быть вообще ошибка уровня "забыл отключить dropout/batchnorm" (перевести модель в eval-режим)
- может быть какая-то другая ошибка самого обучения или метрики.
- если ошибок нет, то если аугментации помогут лучше приблизиться к тестовому домену, начинай с них.
- иначе нужно предобучаться на train, а часть данных из *тестового домена разметить и использовать для точной настройки под домен.
аугментация в данном контексте что значит?
источник

AK

Anton K. in Natural Language Processing
то есть обучаю до какого-то уровня модель на синтетических данных, потом уже можно на более мелком объеме дообучить на реальных примерах?
источник

YB

Yuri Baburov in Natural Language Processing
Anton K.
аугментация в данном контексте что значит?
аугментации — модификации (тренировочных) изображений. ты используешь какие-то варианты, попробуй ещё
1) изменения цвета
2) добавление зернистости / клякс
3) ресайзинг
4) растяжения по сетке
источник

AK

Anton K. in Natural Language Processing
а, понял, спасибо
источник

М

Марк in Natural Language Processing
Anton K.
еще хотел бы больше теоретический вопрос задать. я тренирую сейчас модель на синтетических данных. собрал релевантных моей задаче бэкграунды, примерно подобрал шрифты, поставил рандом и сгенерил 2кк изображений.
нейронка уже на 600 эпохе из 20к train loss показывает меньше единицы, то есть, если я верно понимаю, переобучилась.
в итоге синтетические данные распознает очень хорошо, но как только подашь что-то из реального мира - сразу выдает какую-то чушь.
верно ли я понимаю причинно-следственную связь и как принято с такими проблемами бороться?
Скорее всего модель выучивает специфичные особенности сгенерированных данных.
Как выше Юрий написал, добавьте аугментации.
В вашем случае скорее всего хорошо зайдут размытие, наложение шумов, изменение цвета.
источник

М

Марк in Natural Language Processing
Можно взять LIME и посмотреть какие части изображения наиболее информативны для вашей переобученной модели. Возможно натолкнет на мысль, какие еще аугментации добавить.
источник

A

Alexander in Natural Language Processing
Vadim Fomin
по-моему, можно примерно так.
сначала создать собственный класс "датасет", унаследовав его от torch.utils.data.Dataset. у этого класса должны быть определены методы __getitem__ и __len__ .
__getitem__ на вход принимает какое-то число и на выход отдаёт объект из датасета, соответствующий этому числу (например, если прилетело число 10, то отдаётся десятый текст из датасета).
__len__ на вход ничего не принимает, а отдаёт общее число объектов в датасете.
потом надо создать объект этого класса  и засунуть в даталоадер. он автоматически будет формировать батчи.
мб, примерно так будет выглядеть:
class MyDataset(torch.utils.data.Dataset):
  def __init__(self, input_ids, attention_mask)
     self.input_ids = input_ids
     self.attention_mask = attention_mask
 
  def __getitem__(self, key):
     return self.input_ids[key], self.attention_mask[key]

  def ___len___(self):
     return len(self.input_ids)

dataset = MyDataset(input_ids=token_ids, attention_masks=attention_masks)
dataloader = torch.utils.data.DataLoader(dataset, batch_size=32)
for input_ids, attention_mask in dataloader:
  #и вот тут делаешь что тебе нужно
Спасибо Вадим, буду разбираться!
источник

AK

Anton K. in Natural Language Processing
Марк
Можно взять LIME и посмотреть какие части изображения наиболее информативны для вашей переобученной модели. Возможно натолкнет на мысль, какие еще аугментации добавить.
спасибо, посмотрю. размытия, наклоны, изменение цвета текста и фона есть
источник

VF

Vadim Fomin in Natural Language Processing
Alexander
Спасибо Вадим, буду разбираться!
ещё знаешь чё, attention_mask лучше прямо в дата лоадере вычислять, а не подаватть снаружи
источник

YB

Yuri Baburov in Natural Language Processing
Anton K.
то есть обучаю до какого-то уровня модель на синтетических данных, потом уже можно на более мелком объеме дообучить на реальных примерах?
да. если аугментации не помогают — то тебе придётся так делать.
источник

AK

Anton K. in Natural Language Processing
отличный план
источник

A

Alexander in Natural Language Processing
Vadim Fomin
ещё знаешь чё, attention_mask лучше прямо в дата лоадере вычислять, а не подаватть снаружи
Тогда его(dataloader) тоже нужно переписать самому? Или можно добавить функцию в Dataset getitem -> return inputs, get_mask()
источник