Двумя неделями ранее мы запустили Cutouts на producthunt (мы вошли в пятерку лучших продуктов дня! Зацените нас здесь.) Мы получили много запросов от людей написать о создании модели машинного обучения для браузера. так вот и мы!

Мы хотели, чтобы вырезы были ориентированы на конфиденциальность, но при этом обеспечивали пользователям потрясающий пользовательский интерфейс. О тегах и поиске нужно было позаботиться с помощью машинного обучения, и, учитывая все ограничения, нам было ясно, что мы должны запускать модели машинного обучения в браузере. В комплекте идет Tensorflow.js, который позволяет вам использовать машинное обучение прямо в браузере. Но Tensorflow js все еще очень новый, поэтому он ограничивает наши возможности с его помощью.

Неправильный путь

Из-за моих ограниченных знаний о среде TF-js, моя первоначальная гипотеза заключалась в том, что мы могли бы написать любую модель на обычном Python и преобразовать в tf-js с помощью tenorflow js converter, и единственным ограничением было то, что размер модели должен быть небольшим. чтобы иметь возможность запускать в браузере. Я использовал концентратор Keras для загрузки крошечной 20-размерной модели Language Embedding и прикрепил к ней плотный слой. Это был код для создания этой модели -

model = "https://tfhub.dev/google/tf2-preview/gnews-swivel-20dim/1"
embedding_layer = hub.KerasLayer(model, output_shape=[20], input_shape=[], dtype=tf.string, trainable=False)

def create_model():
  model = tf.keras.Sequential([
    #tf.keras.layers.Input(shape=[], dtype=tf.string),
    embedding_layer,
    tf.keras.layers.Dense(64, activation="relu"),
    tf.keras.layers.Dense(16, activation="relu"),
    tf.keras.layers.Dense(4,activation='softmax'),
  ])
  model.compile(loss=tf.losses.CategoricalCrossentropy(from_logits=Tru
e),
      optimizer="adam", metrics=['accuracy'])
  return model

model = create_model()

А затем я попытался преобразовать это в модель на основе JS с помощью преобразователя тензорного потока.

После нескольких часов битья головой, я наконец сдался. На данный момент Tensorflow js не поддерживает keras hub (а также множество настраиваемых слоев, которые люди реализовали в Интернете).

Что теперь?

Как у нас это работает

Мы поняли, что нам нужна модель LM, которая была доступна как в репозитории TFjs, так и в виде реализации на Python. Мы обнаружили, что облегченная реализация универсального кодировщика предложений доступна как для Tfjs, так и для python.

Следующим шагом было создание векторов внедрения для текстовых данных с использованием реализации USE lite на python. Я использовал реализацию, предоставленную USE-документами tensorflow (я запускал их партиями для более быстрых результатов)

all_embeddings = []

for i in range(0,len(text_data),256):
    print(i)
    messages = text_data[i:i+256]
    
    values, indices, dense_shape = process_to_IDs_in_sparse_format(sp, messages)

    with tf.Session() as session:
      session.run([tf.global_variables_initializer(),           tf.tables_initializer()])
      message_embeddings = session.run(
          encodings,
          feed_dict={input_placeholder.values: values,
                    input_placeholder.indices: indices,
                    input_placeholder.dense_shape: dense_shape})

    all_embeddings.append(np.array(message_embeddings))

Краткое примечание. Реализация python USE lite находится в tf версии 1.15, а не в последней. Обязательно используйте -

import tensorflow.compat.v1 as tf
tf.disable_v2_behavior()

. Вектор вложения имеет форму (1,512). Затем мы обучили небольшую телекомпанию CNN самому встраиванию текста.

model = tf.keras.Sequential()
model.add(tf.keras.layers.Conv1D(32,
                 kernel_size=3,
                 activation='tanh',
                 strides=1,input_shape=(512,1)))

model.add(tf.keras.layers.Flatten())

# We add a vanilla hidden layer:
model.add(tf.keras.layers.Dense(16,activation='relu'))
model.add(tf.keras.layers.Dense(5, activation='softmax'))
model.compile(loss=tf.losses.SparseCategoricalCrossentropy(from_logits=True),
      optimizer="adam", metrics=['accuracy']

А затем вы можете просто использовать преобразователь тензорного потока, чтобы на самом деле сохранить только эту модель CNN, используя -

tf.keras.models.save_model(
    model, 'saved_models/text_classifier_cnn/', overwrite=True, include_optimizer=True, save_format='tf',
    signatures=None, options=None
)

Вот и все. Ваша JS-модель готова.

Реализация на стороне браузера

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

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

Далее - создание моделей браузера для поиска, обучение ранжированию и добавление тегов к изображениям / видео. Будьте на связи!

Попробуйте наше приложение и поделитесь с нами отзывами! Вырезки - это бесплатно и безопасно - https://cutouts.app/