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

Внимательная свертка с keras

Я реализовал слой внимательной свертки в keras, как описано в этой статье.

Вы можете увидеть код для этого gist

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

Я использую keras 2.1.3 и tensorflow 1.5 в качестве серверной части.

Спасибо


  • Почему вы везде используете tf.map_fn?? Они абсолютно не нужны. 05.02.2018

Ответы:


1

Я не понимаю, почему вы используете tf.map_fn, вы можете избегать его везде...

Вот несколько советов (которые могут сделать код быстрее, а могут и нет).

Трансляция

Вам действительно нужно привести значения к float? Если (по крайней мере) x[0] является вложением, это уже число с плавающей запятой, верно? (Не уверен в природе «контекста»)

Строки 37 и 38:

text = x[0]
context = x[1]

Почему функции сопоставления, которые уже поддерживаются в keras?

Например, зачем это делать (L42):

weighted_attentive_context = tf.map_fn(self._compute_attentive_context, (text, context), dtype=K.floatx())

Когда ты сможешь это сделать?

weighted_attentive_context = self._compute_attentive_context(text,context)

С:

def _comput_attentive_context(self,text,context):

Предложение для _compute_attentive_context:

def _compute_attentive_context(self, text, context):

    #computes the context-score for every vector like equation 2
    temp = tf.matmul(text, self.We)
    scores = tf.matmul(temp, K.transpose(context))

    #why not?
    scores_softmax = K.softmax(scores)


    #computes the context featur_map like equation 4
    res = tf.matmul(scores_softmax, context)

    #why not?
    res = self._weight_for_output(res)
    return res

А почему бы не использовать K.conv1D вместо всех этих сложных повторов, конкатенаций и т. д.?

def _conv(self, x):
    return K.conv1D(x, self.W1, padding='same')

    #if you have special reasons for what you're doing, please share them in the comments,
    #please also share the exact shapes of the inputs and desired outputs
    #here, you should make self.W1 with shape (filterLength, em_dim, desired_output_dim)   

Предложение для call:

def call(self, x, mask=None):
    #x is a list of two tensors
    text = x[0]
    context = x[1]

    #applies bilinear energy funtion (text * We * context)
    #and weights the computed feature map like in equation 6 (W2 * ci)
    weighted_attentive_context = self._compute_attentive_context(text, context)

    #does the actual convolution, this is still kind of hacky
    conv = K.conv1D(text,self.W1,padding='same')

    added = conv + weighted_attentive_context
    batch = K.bias_add(added, self.bias)
    return batch

Пакетное умножение матриц

Для этих умножений вы можете использовать K.dot(), следуя этому:

  • Если партия x весит: K.dot(x, self.W)
  • Если вес x партия: K.permute_dimensions(K.dot(self.W,x),(1,0,2))

Учитывая, что у вас есть эти формы:

  • Если вес партии x -> x: (партия, слова, наложение) | W: (наб., любая)
  • Если веса x партия -> W: (любые, слова) | x: (партия, слова, вставка)

Результаты будут:

  • Если партия х весит: (слова, любые) ‹- это кажется логичным выбором
  • Если вес x партия: (любая, наб)
05.02.2018
  • Спасибо за ваши предложения. Я внес некоторые изменения в суть и добавил некоторые комментарии по размерам и т. д. 05.02.2018
  • Смотрите подсказку для умножения матриц в конце моего ответа. (Тем не менее, вы можете удалить все tf.map_fn, они вам нигде не нужны. 05.02.2018
  • Спасибо за Ваш ответ. Я реализовал ваши предложения (см. Суть), но это привело к другой ошибке (см. простой-пользовательский-слой">вопрос) 08.02.2018
  • Новые материалы

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

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

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

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

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

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

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