Keras中的自定义损失函数:初始化并向循环中的张量追加值

2024-10-03 09:07:01 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用Keras和Tensorflow后端函数在Keras中编写一个自定义损失函数。我想最小化f(y_真)和f(y_pred)之间的均方误差,其中f(y)是一个非线性函数

f(y)=[f1(y)f2(y)…f12(y)],和fk(y)=Xi_k*Theta_k(y),k=1,2,…,12。Xi_k和Theta_k(y)是秩1的张量

由于y_true和y_pred的大小是(batchSize x 15),我需要为训练批中的所有样本计算循环上的f(y)值(我认为避免循环是不可能的)。循环操作的输出将是大小为(batchSize x 12)的张量

[[f(y_true[1,:])],[f(y_true[2,:])],...,[f(y_true[batchSize,:])]]

[[f(y_pred[1,:])],[f(y_pred[2,:])],...,[f(y_pred[batchSize,:])]]

通常,在处理数组或矩阵时,我们初始化所需大小的矩阵并在循环中为其赋值,或者创建一个空矩阵并在循环中向其追加值。但我们如何用张量做同样的事情呢

下面是自定义损失函数的简化形式(仅计算f1(y_true)和f1(y_pred))。初始化和附加函数不起作用,因为它们不是tf/Keras操作,我应该用什么来代替它们,使其与张量一起工作

matd = spio.loadmat('LPVmodel_iVarDeg.mat', squeeze_me=True) 
mate = spio.loadmat('PNLSS_model_modified.mat', squeeze_me=True)

def custom_loss_fn(y_true, y_pred):
    iVarDeg1 = tf.convert_to_tensor(matd['iVarDeg1'], dtype=tf.float32) # (XiSize(1) x 15)
    Xi1 = tf.convert_to_tensor(mate['Xim1'], dtype=tf.float32) # (XiSize(1) x 1) 

    batchSize = m 
    fy_true = [] # initialization
    fy_pred = [] # initialization

    for i in range(batchSize):
        yin = y_true[i,:]  # (1 x 15) network output
        tin = y_pred[i,:]  # (1 x 15) target
    
        ypowerD = tf.math.pow(yin,iVarDeg1) # element wise power (XiSize(1)x15)
        monomial = tf.math.reduce_prod(ypowerD) # column wise product of elements (XiSize(1)x1)
        Theta1 = monomial  # nonlinear basis for state eq 1 (XiSize(1)x1)
    
        ypowerD = tf.math.pow(tin,iVarDeg1)
        monomial = tf.math.reduce_prod(ypowerD)
        Gamma1 = monomial

        temp = tf.math.reduce_sum(tf.math.multiply(Xi1,Theta1)) # sum(element wise prod) 
        fy_true.append(temp)
    
        temp = tf.math.reduce_sum(tf.math.multiply(Xi1,Gamma1))
        fy_pred.append(temp)
    

    return Kb.mean(Kb.sum(Kb.square(fy_pred - fy_true))

Tags: 函数truereducetfmathtempkerassum
1条回答
网友
1楼 · 发布于 2024-10-03 09:07:01

在图形模式下,如果要在循环(如列表)中填充张量,可以使用TensorArray:

“初始化”,例如:

ta = tf.TensorArray(tf.float32, size=0, dynamic_size=True, clear_after_read=False)

“附加”到:

ta = ta.write(1, 20)

要将TensorArray转换为tensor,请执行以下操作:

ta.stack()

相关问题 更多 >