Nano Hash - криптовалюты, майнинг, программирование

Вычисление попарного расстояния с помощью TensorFlow

Я пытаюсь реализовать эту статью: http://ronan.collobert.com/pub/matos/2008_deep_icml.pdf В частности, уравнение (3) из раздела 2.

Вскоре я хочу произвести попарное вычисление расстояния для характеристик каждой мини-партии и вставить эти потери в общие потери в сети. У меня есть только Tesnor партии (16 образцов), тензор меток партии и функция Tensor партии.

После долгих поисков я все еще не мог понять следующее:

1) Как разделить пакет на положительные (т. Е. Одинаковые метки) и отрицательные пары. Поскольку тензор не повторяется, я не могу понять, как получить, какой образец имеет какую метку, а затем разделить мой вектор или узнать, какие индексы тензора принадлежат каждому классу.

2) Как я могу рассчитать попарное расстояние для некоторых индексов в тензоре партии?

3) Мне также нужно определить новую функцию расстояния для отрицательных примеров.

В целом, мне нужно выяснить, какие индексы к какому классу принадлежат, выполнить расчет положительного попарного расстояния для всех положительных пар. И сделаем еще один расчет для всех отрицательных пар. Затем просуммируйте все это и добавьте к потерям в сети.

Любая помощь (по одному из трех вопросов) будет принята с благодарностью.


  • Если ваша метрика расстояния евклидова, вы можете использовать tf.gather для создания матрицы только из интересующих векторов, а затем есть эффективный способ вычислить все попарные расстояния, как в здесь 28.05.2016

Ответы:


1

1) Вы должны выполнить выборку пар перед загрузкой данных в сеанс. Обозначьте каждую пару логической меткой, скажем, y = 1 для согласованной пары, в противном случае - 0.

2) 3) Просто вычислите оба положительных / отрицательных члена для каждой пары и позвольте 0-1 пометить y, чтобы выбрать, что добавить к потере.


Сначала создайте заполнители, y_ для логических меток.

dim = 64
x1_ = tf.placeholder('float32', shape=(None, dim))
x2_ = tf.placeholder('float32', shape=(None, dim))
y_ = tf.placeholder('uint8', shape=[None])   # uint8 for boolean

Тогда тензор потерь может быть создан функцией.

def loss(x1, x2, y):
    # Euclidean distance between x1,x2
    l2diff = tf.sqrt( tf.reduce_sum(tf.square(tf.sub(x1, x2)),
                                    reduction_indices=1))

    # you can try margin parameters
    margin = tf.constant(1.)     

    labels = tf.to_float(y)

    match_loss = tf.square(l2diff, 'match_term')
    mismatch_loss = tf.maximum(0., tf.sub(margin, tf.square(l2diff)), 'mismatch_term')

    # if label is 1, only match_loss will count, otherwise mismatch_loss
    loss = tf.add(tf.mul(labels, match_loss), \
                  tf.mul((1 - labels), mismatch_loss), 'loss_add')

    loss_mean = tf.reduce_mean(loss)
    return loss_mean

loss_ = loss(x1_, x2_, y_)

Затем загрузите свои данные (например, сгенерированные случайным образом):

batchsize = 4
x1 = np.random.rand(batchsize, dim)
x2 = np.random.rand(batchsize, dim)
y = np.array([0,1,1,0])

l = sess.run(loss_, feed_dict={x1_:x1, x2_:x2, y_:y})
27.05.2016
  • Это сработало! Большое спасибо! Кстати, лучше использовать reLu вместо max. Но остальной код я использовал как есть. Спасибо! 29.05.2016
  • каким должно быть значение margin? 15.05.2017
  • @Mithun - это параметр, который вы можете настроить. Я не уверен, что сейчас лучше всего, но по умолчанию в Caffe установлено 1.0 (caffe .berkeleyvision.org / tutorial / Layers / contrastiveloss.html). 15.05.2017

  • 2

    Короткий ответ

    Я думаю, что самый простой способ сделать это - выполнить выборку пар в автономном режиме (то есть вне графика TensorFlow).
    Вы создаете tf.placeholder для партии пар вместе с их метками (положительными или отрицательными, т.е. тот же класс или другой класс), а затем вы можете вычислить в TensorFlow соответствующие потери.


    С кодом

    1. Вы пробуете пары в автономном режиме. Вы выбираете batch_size пары входов и выводите batch_size левые элементы пар формы [batch_size, input_size]. Вы также выводите метки пар (положительных или отрицательных) формы [batch_size,]
    pairs_left = np.zeros((batch_size, input_size))
    pairs_right = np.zeros((batch_size, input_size))
    labels = np.zeros((batch_size, 1))  # ex: [[0.], [1.], [1.], [0.]] for batch_size=4
    
    1. Затем вы создаете заполнители Tensorflow, соответствующие этим входам. В вашем коде вы передадите предыдущие входные данные этим заполнителям в feed_dict аргументе sess.run()
    pairs_left_node = tf.placeholder(tf.float32, [batch_size, input_size])
    pairs_right_node = tf.placeholder(tf.float32, [batch_size, input_size])
    labels_node = tf.placeholder(tf.float32, [batch_size, 1])
    
    1. Теперь мы можем выполнить прямую связь с входными данными (допустим, ваша модель является линейной).
    W = ...   # shape [input_size, feature_size]
    output_left = tf.matmul(pairs_left_node, W)  # shape [batch_size, feature_size]
    output_right = tf.matmul(pairs_right_node, W)  # shape [batch_size, feature_size]
    
    1. Наконец, мы можем вычислить парные потери. «Потеря»
    l2_loss_pairs = tf.reduce_sum(tf.square(output_left - output_right), 1)
    positive_loss = l2_loss_pairs
    negative_loss = tf.nn.relu(margin - l2_loss_pairs)
    final_loss = tf.mul(labels_node, positive_loss) + tf.mul(1. - labels_node, negative_loss)
    

    Вот и все ! Теперь вы можете оптимизировать эту потерю с помощью хорошей автономной выборки.

    27.05.2016
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

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

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..