вычисление потери расстояния хэширования в кератах - PullRequest
0 голосов
/ 07 ноября 2018

Я новичок в keras, и в tenorflow у меня есть проект с использованием keras, который хочет реализовать мою собственную функцию потерь. Я хочу применить целевые функции, как в ранжирование-хэширование , и реализовать в трех модальностях. Я хочу рассчитать потери на основе трех слоев вывода. например, a = [0,1,1,1,0], b = [0,1,1,0,0], подобие между a и b будет равно 2/3, поскольку sum (a AND b) = 2, а сумма (A ИЛИ B) = 3

  1. каждый выходной сигнал преобразуется в хеш-значение {0,1} ^ N, где N - длина выходного сигнала.
  2. для каждой пары хэшей, я вычисляю расстояние между ними на основе расстояния Хэмминга, затем беру среднее значение

Моя проблема в том, что в первую эпоху я получил очень маленький результат потери, который я считаю ненормальным, и я уверен, что в моем коде что-то не так, но я сейчас не знаю, как это исправить.

вот мой код для функции потери

def hash_lambda_func(args):
   y_true, y_pred, ingrs_rep, instrs_rep, imgs_rep = args
   def my_hash(x): # transforming layer's output into hash {0,1}
      return K.cast(K.round(x), dtype='float32')
   i = my_hash(ingrs_rep)
   j = my_hash(instrs_rep)
   k = my_hash(imgs_rep)

   #tensors = tf.map_fn(lambda i: i, x)

   ab = K.any([i,j], axis=0)
   ac = K.any([i,k], axis=0)
   bc = K.any([j,k], axis=0)
   ab = tf.reduce_sum(tf.cast(ab, tf.float32))
   ac = tf.reduce_sum(tf.cast(ac, tf.float32))
   bc = tf.reduce_sum(tf.cast(bc, tf.float32))

   ab1 = K.all([i,j], axis=0)
   ac1 = K.all([i,k], axis=0)
   bc1 = K.all([j,k], axis=0)
   ab1 = tf.reduce_sum(tf.cast(ab1, tf.float32))
   ac1 = tf.reduce_sum(tf.cast(ac1, tf.float32))
   bc1 = tf.reduce_sum(tf.cast(bc1, tf.float32))

   a = (tf.reduce_mean([ab1/ab,ac1/ac,bc1/bc])*(1-(y_true-y_pred)))**2
   return K.mean(a)

для потерь навесного оборудования в модели

y_true_input = Input(shape=(num_class,))
dense_y = Dense(20)(y_true_input)
merged = concatenate([glove_dense1, instrs_dense1, img2_dense1])
densex = Dense(20)(merged)
y_pred = Activation('softmax')(densex)
my_loss = Lambda(
    hash_lambda_func, output_shape=(1,),
    name='lambda_hash')([y_pred, y_true_input, glove_dense1, instrs_dense1, img2_dense1])
model_1 = Model(inputs=[glove_input, instrs_input, img2_input1, y_true_input],
            outputs=my_loss)

скомпилировать модель

model_1.compile(loss={'lambda_hash': lambda y_true, y_pred: y_pred}, optimizer='rmsprop', metrics=['accuracy', mean_pred])

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

история тренировок, похоже, моя функция потери не соответствует ожиданиям

Epoch 1/10
1521/2343 [==================>...........] - ETA: 23:36 - loss: 0.0141 - mean_pred: 0.9512
...