首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >具有自定义损失函数的TensorFlow 2的无效参数错误(学生t分布)

具有自定义损失函数的TensorFlow 2的无效参数错误(学生t分布)
EN

Stack Overflow用户
提问于 2021-11-12 13:53:09
回答 1查看 124关注 0票数 0

这个问题是对已经回答的以下问题的后续,我想在此正式提出一个新问题。原来的问题是:

Invalid argument error with TensorFlow 2 with self-defined loss function, although everything seems to be correct

如前所述,我目前正在训练TensorFlow模型来预测不同分布的参数。为此,我创建了适当的层并修改了损失函数。

不幸的是,当我使用多元t分布(tfp.distributions.MultivariateStudentTLinearOperator),时,会出现以下错误:

代码语言:javascript
复制
InvalidArgumentError:  Input matrix is not invertible.
     [[node negative_t_loss_2/negative_t_loss_2_MultivariateStudentTLinearOperator/log_prob/LinearOperatorLowerTriangular/solve/triangular_solve/MatrixTriangularSolve (defined at d:\20_programming\python\virtualenvs\tensorflow-gpu-2\lib\site-packages\tensorflow_probability\python\distributions\multivariate_student_t.py:265) ]] [Op:__inference_train_function_1471]

Function call stack:
train_function

这一次,确定损失函数的程序如下:

代码语言:javascript
复制
def negative_t_loss_2(y_true, y_pred):
    # Separate the parameters
    n, mu1, mu2, sigma11, sigma12, sigma22 = tf.unstack(y_pred, num=6, axis=-1)
    mu = tf.transpose([mu1, mu2], perm=[1, 0])
    sigma = tf.linalg.LinearOperatorLowerTriangular(tf.transpose([[sigma11, sigma12], [sigma12, sigma22]], perm=[2, 0, 1]))
    dist = tfp.distributions.MultivariateStudentTLinearOperator(df=n, loc=mu, scale=sigma)
    nll = tf.reduce_mean(-dist.log_prob(y_true))
    return nll

我已经将完整的(更广泛的)代码和所需的数据复制到

https://drive.google.com/drive/folders/1IIAtKDB8paWV0aFVFALDUAiZTCqa5fAN?usp=sharing

(笔记本"normdist_2D_not_working_t.ipynb")。

我使用的操作系统是Windows 10,Python版本是3.6。示例代码中列出的所有库都是最新的,包括tensorflow-gpu。

如果能解决这个问题,我将不胜感激。这一专题与金融部门特别相关,因为这类分布在这方面发挥着重要作用,特别是在风险管理方面。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-11-12 16:07:24

当调用LinearOperatorLowerTriangular时,标度矩阵需要是下三角形,若要将张量转换为线性算子,只需替换

代码语言:javascript
复制
sigma = tf.linalg.LinearOperatorLowerTriangular(tf.transpose([[sigma11, sigma12], [sigma12, sigma22]], perm=[2, 0, 1]))

出自:

代码语言:javascript
复制
sigma = tf.linalg.LinearOperatorLowerTriangular(tf.transpose([[sigma11, tf.zeros_like(sigma12)], [sigma12, sigma22]], perm=[2, 0, 1]))

同时,学生-t的参数n是正的,所以您应该在n = tf.keras.activations.softplus(n)函数中添加negative_t_layer_2

那么,它应该能起作用。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69943995

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档