Классы, никогда не встречавшиеся ранее на моделях глубокого обучения

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

var _ = require('underscore');
var async = require('async');

function findPaginated(filter, opts, cb) {
  var defaults = {skip : 0, limit : 10};
  opts = _.extend({}, defaults, opts);

  filter = _.extend({}, filter);

  var cntQry = this.find(filter);
  var qry = this.find(filter);

  if (opts.sort) {
    qry = qry.sort(opts.sort);
  }
  if (opts.fields) {
    qry = qry.select(opts.fields);
  }

  qry = qry.limit(opts.limit).skip(opts.skip);

  async.parallel(
    [
      function (cb) {
        cntQry.count(cb);
      },
      function (cb) {
        qry.exec(cb);
      }
    ],
    function (err, results) {
      if (err) return cb(err);
      var count = 0, ret = [];

      _.each(results, function (r) {
        if (typeof(r) == 'number') {
          count = r;
        } else if (typeof(r) != 'number') {
          ret = r;
        }
      });

      cb(null, {totalCount : count, results : ret});
    }
  );

  return qry;
}

Прикрепите его к вашей схеме модели.

MySchema.statics.findPaginated = findPaginated;
0
задан Nikhil Mishra 16 January 2019 в 05:37
поделиться

1 ответ

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

Большинство контролируемых алгоритмов машинного обучения классификации предназначены для отображения входных данных в одном из некоторого фиксированного числа классов. Этот тип классификации называется классификация замкнутого мира .
Например.

  • MNIST - классификация рукописных цифр
  • Классификация кошек и собак

Когда в классификации участвуют некоторые немаркированные / неизвестные классы, подход называется классификацией открытого мира. Опубликованы различные работы [ 1 , 2 , 3 ].

Я объясню свое решение, используя решение, предложенное в 3 . Существует два варианта применения классификации открытого мира (здесь я буду ссылаться на OWC) к рассматриваемой проблеме.

  1. Классификация всех новых классов как одного класса
  2. Классификация всех новых классов как одного класса, затем дальнейшая группировка похожих выборок в один класс и различные выборки в разные классы.

1. Классификация всех новых классов как одного класса

Хотя может быть много типов моделей, которые могли бы соответствовать этому типу классификации (Одним из может быть первое решение, предложенное вопросом.) Я бы обсудил модель [119 ] 3 . Здесь сеть сначала решает классифицировать или отклонить ввод. В идеале, если образец взят из видимых классов, тогда сеть будет классифицироваться как один из видимых классов. В противном случае сеть отклоняет. Авторы 3 назвали эту сеть открытой классификационной сетью (OCN). Реализация OCN в Keras могла бы быть такой (я упростил сеть, чтобы сосредоточиться только на выводе модели.

inputs = keras.layers.Input(shape=(28, 28,1))
x = keras.layers.Conv2D(64, 3, activation="relu")(inputs)
x = keras.layers.Flatten()(x)

embedding = keras.layers.Dense(256, activation="linear", name="embedding_layer")(x)
reject_output = keras.layers.Dense(1, activaton="sigmoid", name="reject_layer")(embedding)

classification_output = keras.layers.Dense(num_of_classes, activaton="softmax", name="reject_layer")(embedding)

ocn_model = keras.models.Model(inputs=inputs, outputs=[reject_output, classification_output)

Модель обучена таким образом, что совместно оптимизирует потери reject_output и classification_output .

2. Классификация всех новых классов как одного класса, затем дальнейшая группировка аналогичных

Авторы 3 использовали другую сеть для поиска сходства между выборками. Они назвали сеть Парная классификационная сеть (PCN). PCN классифицирует, являются ли два входа из одного и того же класса или разных классов. Мы можем использовать embedding первого решения и использовать попарные метрики подобия для создания сети PCN. В PCN веса делятся для обоих Это может быть реализовано с использованием keras

embedding_model = keras.layers.Sequential([
    keras.layers.Conv2D(64, 3, activation="relu", input_shape=(28, 28,1))
    keras.layers.Flatten(),
    embedding = keras.layers.Dense(256, activation="linear", name="embedding_layer")
])

input1 = keras.layers.Input(shape=(28, 28, 1))
input2 = keras.layers.Input(shape=(28, 28, 1))

embedding1 = embedding_model(input1)
embedding2 = embedding_model(input2)

merged = keras.layers.Concatenate()([embedding1, embedding2])
output = keras.layers.Dense(1, activation="sigmoid")(merged)

pcn_model = keras.models.Model(inputs=[input1, input2], outputs=output)

Модель PCN будет обучена уменьшать расстояние от одного и того же и увеличивать расстояние между различными классами.

После обучения сети PCN автоматически -encoder обучен изучению полезных представлений от невидимых классов. Алгоритм используется для группировки (кластеризации) невидимых классов с использованием модели PCN в качестве функции расстояния.

0
ответ дан Mitiku 16 January 2019 в 05:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: