Рубрики
Без рубрики

Дрель или без сверла? Создание текстового классификатора в Tensorflow

В котором я прохожу через процесс построения и развертывания текстового классификатора, который пытается определить, может ли твит из @dril или нет. Теги с Tensorflow, MachineLearning, Python, JavaScript.

Уже есть тонна разных постов Tensorflow в Интернете, и многие из них на самом деле хороши. Это не так. Это я, пишу дерьмовый маленький классификатор для того, что по существу сложный дерьмо.

В этом посте я пойду через тебя, как я построил Сверлить или без дрель Отказ

Обзор

Если вы не знаете, кто или что DRIL, посмотреть Отказ Если вы уже делаете, отлично. Если вы просто возвращаетесь – не так ли одно из самых странных учетных записей Twitter, которые вы не видели? В любом случае – стиль довольно отличительный, поэтому я подумал, что у меня может быть удар при создании классификатора, который пытается забрать то, что делает Dril Дрил Отказ

Для этого мне сначала нужно твиты. Много твитов, как от Dril, так и для других аккаунтов. Я закончил использовать себя, несколько моих друзей, которые согласились быть включены в модель, а премьер-министр (на момент написания этого пункта, лол) Тереза май.

Мне также нужна модель. Я закончил использовать модифицированную версию классификатора обзора IMDB от Tensorfow Docs Отказ

Наконец, поставить его в Интернете без чего-то заплатить, мне нужен путь к отправке моей модели в браузер с глюком. Это также имеет бонус сохранения всего текста, который вы вводите в этой коробке на вашем компьютере. Я достиг этого через Tensorflow.js, подмножество на основе браузера Tensorflow, которое работает на WebGL, производящих нагрузки предупреждений, потому что, действительно, WebGL не был разработан для использования таким образом.

Получение некоторых твитов

Первое, что нужно сделать, это получить несколько твитов. Для этого требуется учетная запись API Twitter, поэтому вы можете аутентифицироваться. Это то, что или делает некоторые хаки Scraping Scraping, но для удобства я застрял с API – возможно для моего ущерба. Я написал сценарий Python для скачивания всех этих твитов, которые были довольно легкими благодаря Tweepy Отказ Он загружает твиты и сохраняет их в базу данных SQLite3. Это даже поддерживает возобновление от самого раннего скачанного твита (важно в случае сбоев). Tweepy’s Cursor API также действительно аккуратно – вы можете повторять твиты, и он будет справиться с Pagination для вас:

cursor = tweepy.Cursor(api.user_timeline, id=args.account, max_id=max_id, include_rts=False)

for status in cursor.items():
    tweet = status_to_tuple(status)
    save_tweet(db, tweet)

Также здорово, что вы можете сказать Tweepy, чтобы автоматически ждать в случае реакции ограничения на скорость – хотя я не думаю, что я пока не стал в эту проблему:

def get_twitter_api():
    auth = tweepy.OAuthHandler(secrets.TW_API_KEY, secrets.TW_API_SECRET)
    auth.set_access_token(secrets.TW_TOKEN, secrets.TW_SECRET)
    return tweepy.API(auth, wait_on_rate_limit=True, wait_on_rate_limit_notify=True)

Затем я провел скрипт в несколько временных линий твиттера. Я использовал дрил, очевидно, а также некоторые примеры содержания не-миллиарда. Затем я посмотрел на количество твитов, которые я скачал и увидел несоответствие:

Оказывается, согласно Twitter API Документы Используется конечная точка возвращается только до 3200 самых последних твитов. Поэтому я предполагаю, что если вам действительно нужен этот архивный контент, вам придется реализовать эти хаки Scraping Scraping в конце концов. Я решил не беспокоить.

Установка Tensorflow

Поскольку это реальная проблема в области информатики (нужна цитата), теперь я собираюсь провести 5 абзацев, говорящих о том, как установить Tensorflow.

J/K, получить анаконда и пойти сюда: https://www.anaconda.com/blog/developer-blog/tensorflow-in-anaconda/ – Работает даже на экзотических платформах, таких как Windows.

Классификатор

Чтобы создать классификатор, вам сначала нужно загрузить данные в формат, который принимает Tensorflow, и есть только один такой формат – Numpy массивы. Это также первый шаг, который вам нужно будет принять решение о том, как вы хотите представлять текст, который вы помещаете, потому что вы не можете просто бросать струны в нейронной сети.

Существует ряд способов, которыми вы можете представлять собой компактный кусок текста, например, с помощью подход для слов которые только сохраняет частоты слов или, кодирующие каждое слово как число, как и в случае набора данных TF/KERAS IMDB. Вы также можете попытаться сделать причудливые вещи, такие как отбрасывание самых популярных слов, таких как «A», «The», и «HyperLoop – это хорошая идея». В моем примере я не делаю ни одного из этого, и вместо этого я беру необработанные байты каждого персонажа и засунуте их в 240-элементный наменный массив, прокладывая оставшееся пространство с нулями. Идея состоит в том, что любая другая предварительная обработка может удалить нюанс о стиле этих твитов. Также я ленивый.

def to_padded_bytes(tweet):
    bts = np.array([ord(c) for c in tweet])
    return np.pad(bts, (0, 240 - bts.shape[0]), mode='constant')

Это все еще означало, что мне нужно было иметь встраивать слой в моей сети, что извлекли особенности из байтовых значений, но это было немного отлично, чем в примере.

Наконец, этикетки представлены как 2-мерные векторы. Дрил Tweet маркируется как [1, 0] , тогда как не дрил Tweet – [0, 1] . Это так, что в конце процесса я могу получить доверие от сети – это обычно ответит с вектором, как [0,98, 0,02] Что означает «Мне 90% уверены, что это дрил Tweet, и только 2% уверены, что это не». Или обратный. Или где-то между ними.

Сама модель выглядит следующим образом:

model = keras.Sequential([
    keras.layers.Embedding(255, 16, input_length=240),
    keras.layers.Conv1D(140, 3, padding='valid', activation='relu', strides=1),
    keras.layers.GlobalAveragePooling1D(),
    keras.layers.Dense(512, activation='relu'),
    keras.layers.Dense(2, activation='softmax')
])

Я бросил на сверточный стадию, потому что надеюсь, что он может забрать стилистические различия между типами твитера, но до сих пор он в основном узнал, что более короткие твиты, скорее всего, будут дрил, и что он не использует Emoji очень довольно часто. Тем не менее, при ~ 89% точность валидации я решил, что это достаточно хорошо для шутки.

Если бы я делал это правильно, я мог бы посмотреть на существующие архитектуры текстовых классификаций и попытаться на самом деле извлечь из них. Тогда, возможно, я добился этой 99% точности.

Вперед к JavaScript

Tensorflow.js немного ограничен. От Документы :

Слои Tensorflow.js в настоящее время поддерживает только модели KERAS с использованием стандартных конструкций KERAS. Модели с использованием неподдерживаемых OPS или слоев-E.G. Пользовательские слои, LAMBDA слои, пользовательские потери или пользовательские метрики – не могут быть автоматически импортированы, потому что они зависят от кода Python, который не может быть надежно переведен в JavaScript.

Это нормально, хотя моя модель это только с использованием стандартных конструкций. Первый шаг – сохранить его в файл H5, вы можете запустить преобразователь TensorFlowjs на нем. Чтобы получить конвертер, вы можете запустить PIP Установите Tensorflowjs в вашей кондейской среде. Обратите внимание, что, однако, что некоторые из установленных пакетов могут быть понижены по мере того, как зависимости немного не синхронизированы – это не должно быть слишком беспокоит, поскольку они все в пределах требования друг к другу. Конвертер будет генерировать каталог с двумя или более файлами: A model.json Файл, который описывает структуру модели, а некоторые Groupk-Shardnofm Файлы, которые содержат изученные атрибуты вашей модели (веса, в ML Lingo). Затем вы можете обслуживать эти файлы с веб-сервера и загрузить их на стороне клиента, как так:

// This assumes that model.json is in the same directory as the current document
const model = await tf.loadModel('model.json');

Если вы не знаете, что ждать Прочитает это: https://ponefoo.com/articles/underStanding-javascript-async-await. . Если вы сделаете и положительно, вы не можете использовать его, это все еще обещание, чтобы вы могли работать с этим вместо этого. Если вам нужно поддержать Internet Explorer, спросите своего доктора, если tensorflow.js подходит именно вам. В моем случае я решил, что быть совместимым с популярными браузерами для неудачников и просто используют Async/ждут, как они есть.

Сам проект глюков также очень прост – главная проблема получает текст от в тот же формат, что и в тренировке, а именно тензор 1×240. Код довольно похож на версию Python:

function tweetToTensor(tweet) {
  const array = new Uint8Array(240);
  for (let i = 0; i < tweet.length && i < array.length; i++) {
    array[i] = tweet.charCodeAt(i);
  }
  return tf.tensor1d(array);
}

// later...

const batch = tweetToTensor(text).reshape([1, 240]);
const prediction = model.predict(batch);
const result = prediction.reshape([2]);

Приятно, что мне не нужно явно прокладывать мои матрицы здесь, потому что выделение Uint8Array автоматически дает мне нулевой массив Поэтому мне нужно только копировать в соответствующих значениях байтов.

Есть один вопрос с хостингом все на глюк, хотя – поскольку Group-Shard-piece-что бы ни Файлы являются двоичными, Glitch загружает их к CDN и дает вам длинную ссылку на файл в его ведре. Это хорошо для изображений, но Tensorflow.js ожидает, что он сможет получить весовые файлы из одного базового URL-адреса в качестве файла model.json (например, если файл модели находится на https://Пример. com/models/model.json это будет ищет файлы, такие как https://example.com/models/group1-shard1of1 так далее). Однако, поскольку библиотека использует fetch () , также следует перенаправить, и легко настроить скрипт сервера, чтобы уловить запросы на весовые файлы и указать его на правильное место.

Ну, просто, если у вас есть один или два файла ; Если вам нужно больше, чем это, снова спросите своего доктора, если tensorflow.js и глюк подходят для вас.

Где код?

Классификатор и т. Д.: https://github.com/flamparski/dril-or-no-dril/blob/master/dril%20OR%20no%20Dril.ipynb – То же самое репо также содержит Tweet Scripts Scripts, но вам нужно будет предоставить свой собственный Secrets.py файл.

Сайт с Глюким: https://glitch.com/edit/#!/dril-or-noviril.

Учащиеся

От того, что по сути сложная шутка, я узнал или два о проведении экспериментов по изучению машин на данных, которые не были доставлены вам в аккуратном упаковке с инструкциями. Это жесткий мир, и большинство данных будут грязными и в неправильном формате. Около 2/3 (или более, не проверено) кода, которую я написал сделки с приобретением данных и подготовка его для модели. Если бы я должен был сделать это снова правильно Я также мог бы также изучить способы прохождения в Twitter API Tweet Lonvide и собрал гораздо больше не-миллионов материала. Поскольку он стоит, классификатор предвзявается к тому, чтобы вводиться, что вход с дрил. Я бы определенно посмотрел на разные модели обработки текста, как с точки зрения того, как фактически разработана нейронная сеть, и как кодировать данные, входящие в него. Идея вектора байтов не является ужасно эффективной и не будет хорошо масштабироваться до более длительных документов. Я мог бы даже быть соблазнен попробовать обслуживать эту модель с настоящего сервера вместо того, чтобы сбрасывать его в браузер пользователя, надеясь, что он будет работать (эти веса файлы могут быть ужасно большими …). Я слышу, что Google имеет предложение для производственных машин, обучающих приложениях. Или что-то.

Обсуждение

Я хотел бы услышать от вас, если у вас есть представление о том, что вы делаете для такого приложения, особенно если то, что вы делаете, это отличается и на самом деле работает. Я также хотел бы знать, какую самую эллистую машину, изученную вещь, которую вы сделали, и, проходите ли вы прогревать о том, чтобы выкладывать его в Интернете.

Правильно, до следующего раза!

Оригинал: “https://dev.to/minkovsky/dril-or-no-dril-building-a-text-classifier-in-tensorflow-208k”