keras中的自定义损失函数,用于将可变长度的输入向量映射到可变长度的输出向量



我有一个关于使用将输入映射到输出的keras进行监督学习的一般问题。可以通过插入一些映射中不考虑的伪变量(或将映射到其他伪变量(来改变输入和输出向量的长度。所以基本上映射应该是这样的(v:value,d:dummy(

输入矢量1[v,v,v、v,v]->输出矢量1[v,v,v、v、v]

输入矢量2[v,v,v、v,v]->输出矢量2[v,v,v、v、v]

输入矢量3[v,v,v、d,d]->输出矢量3[v,v,v、d、d]

输入矢量4[v,v,d,d,d]->输出矢量4[v,v,d,d,d]

输入矢量5[v,d,d,d]->输出矢量5[v,d,d,d]

输入和输出矢量的长度为5,具有5个值。然而,有时只有大小为例如3的矢量(其基本上是具有2个伪变量的长度为5的矢量(应该被映射到长度为3的输出矢量。因此,在训练后,ANN应该知道,例如,如果它得到长度为3的输入向量,它应该产生长度为3。

这可能和keras在一起吗?这样一个映射的自定义损失函数会是什么样子。也许是这样的(假设y_true是一个二维向量[Batchsize,5]:

def my_loss_fn(y_true, y_pred):
for i in range (0, len(y_true)):
for j in range (0, len(y_true[i]):
if y_true[i][j] ==d:
squared_difference = 0
else: 
squared_difference = tf.square(y_true[i][j] - y_pred[i][j])
return tf.reduce_mean(squared_difference, axis=-1)  
def my_loss_fn(y_true, y_pred):
mask = y_true != d
loss = tf.reduce_mean((y_true - y_pred) ** 2 * tf.cast(mask, dtype=y_true.dtype), axis=-1)
return loss 

p.S.可能最好像一样将长度传递给损失

y_true = {"value": value, "length": length}

和使用CCD_ 1。例如:

import tensorflow as tf
max_length = 5
def my_loss_fn(y_true, y_pred):
y_true_value = y_true["value"]
y_true_length = y_true["length"]

mask = tf.sequence_mask(lengths=y_true_length, maxlen=max_length)
loss = tf.reduce_mean((y_true_value - y_pred) ** 2 * tf.cast(mask, dtype=y_pred.dtype), axis=-1)
return loss 
batch_size = 2
y_true={
"value": tf.random.normal(shape=[batch_size, max_length]), 
"length": tf.random.uniform(shape=[batch_size], maxval=max_length, dtype=tf.int32) + 1
}
y_pred=tf.random.normal(shape=[batch_size, max_length])
my_loss_fn(y_true=y_true, y_pred=y_pred)

最新更新