python - 如何在 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 后端跟踪的方法?
谢谢!
解决方案
只是想知道,这行不通吗?
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
推荐阅读
- php - 嵌套而表选择只给出一个结果
- r - 使用 glmulti 进行模型选择
- r - 为脚本中的所有 ggplot 对象全局添加标题
- sql-server - 通过 sp_send_cdosysmail 生成的邮件正文中出现意外的空格
- php - PHP MYSQL 打印
- database - 如何为firestore创建自动删除机制?(时间段后删除数据)
- html - 子元素超过父div的长度
- graph - TinkerPop/Graph:遍历边,然后按结果顶点和遍历边分组
- java - 误解main方法/“public static void main(String[] args)”的要点
- bash - 将字符串从串行复制到文件的 Bash 脚本