首页 > 解决方案 > 如何在 Keras 后端计算矩阵的轨迹?

问题描述

我在 Keras 中实现了一个自定义损失函数,我需要执行矩阵乘法,然后得到结果矩阵的踪迹。我可以采取以下两种方式之一,这两种方式都给我在 Keras 带来了麻烦:

选项 1:迭代 2 个矩阵的行(和列)。它们都具有相同的形状,并将相应行和列的点积相加:

# Define custom loss
def custom_loss(y_true,y_pred):
    batch_size = y_true.shape[0]
    X = K.log( K.dot(y_true, K.transpose(y_pred) ) )
    y = 0
    for i in range(0,int(batch_size)):
        y -= X[i,i]
    return y

错误:

文件“neural_net.py”,第 71 行,custom_loss for i in range(0,int(batch_size)): TypeError: int returned non-int (type NoneType)

奇怪的是矩阵的形状没有返回。

选项2:只需进行矩阵乘法并获得矩阵的轨迹:

# Define custom loss
def custom_loss(y_true,y_pred):
    X = K.log( K.dot(y_true, K.transpose(y_pred) ) )
    return -np.trace(X)

错误:

返回 asanyarray(a).trace(offset=offset, axis1=axis1, axis2=axis2, dtype=dtype, out=out) ValueError: diag 需要至少二维的数组

我相当肯定 X 是一个二维矩阵。我的批量大小是 32,输出层有 47 个节点。我看到输出显示两个矩阵都是 32 x 47,所以点积肯定是二维的。但我读到有一些关于访问矩阵大小和在 keras 后端使用 numpy 操作的问题,所以我希望trace在 keras 后端找到一个函数,但找不到。

有谁知道如何解决选项 1 迭代问题或计算 Keras 后端跟踪的方法?

谢谢!

标签: pythontensorflowmatrixkeras

解决方案


只是想知道,这行不通吗?

def custom_loss(y_true,y_pred):
    batch_size = y_true.shape[0]
    X = K.log( K.dot(y_true, K.transpose(y_pred) ) )
    y = - tf.trace(X)
    return y

推荐阅读