Я новичок в 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
- каждый выходной сигнал преобразуется в хеш-значение {0,1} ^ N, где N - длина выходного сигнала.
- для каждой пары хэшей, я вычисляю расстояние между ними на основе расстояния Хэмминга, затем беру среднее значение
Моя проблема в том, что в первую эпоху я получил очень маленький результат потери, который я считаю ненормальным, и я уверен, что в моем коде что-то не так, но я сейчас не знаю, как это исправить.
вот мой код для функции потери
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