本文介绍了具有自定义损失函数(学生t分布)的TensorFlow 2的参数错误无效的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

这个问题是已经得到回答的以下问题的后续,我想在这里作为一个新的问题正式提出。原问题位于以下位置:

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

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

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

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_programmingpythonvirtualenvs	ensorflow-gpu-2libsite-packages	ensorflow_probabilitypythondistributionsmultivariate_student_t.py:265) ]] [Op:__inference_train_function_1471]

Function call stack:
train_function

这次定义损失函数的步骤如下:

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。

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

推荐答案

调用LinearOperator LowerTriangular时,比例矩阵需要为下三角,若要将张量转换为线性运算符,只需替换

sigma = tf.linalg.LinearOperatorLowerTriangular(tf.transpose([[sigma11, sigma12], [sigma12, sigma22]], perm=[2, 0, 1]))

发信人:

sigma = tf.linalg.LinearOperatorLowerTriangular(tf.transpose([[sigma11, tf.zeros_like(sigma12)], [sigma12, sigma22]], perm=[2, 0, 1]))

另外,学员-t的参数n为正,因此您应该在negative_t_layer_2函数中添加n = tf.keras.activations.softplus(n)

然后,它应该可以工作。

这篇关于具有自定义损失函数(学生t分布)的TensorFlow 2的参数错误无效的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

09-26 23:23