具有自定义损失函数的 TensorFlow 2 的无效参数错误(学生 t 分布)
Invalid argument error with TensorFlow 2 with self-defined loss function (Student t distribution)
这个问题是以下已经回答的问题的后续问题,我想在这里正式提出一个新问题。原始问题位于此处:
如前所述,我目前正在训练 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:_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
这次定义损失函数的过程如下:
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”).
我使用的操作系统是Windows10,Python版本是3.6。示例代码中列出的所有库都是最新的,包括tensorflow-gpu。
如能解决问题,将不胜感激。该主题与金融部门特别相关,因为此类分布在这里起着重要作用,尤其是在风险管理中。
调用LinearOperatorLowerTriangular时尺度矩阵需要是下三角矩阵,将张量转换为线性算子,只需替换
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]))
另外Student-t的参数n是正数,所以在negative_t_layer_2
函数中加上n = tf.keras.activations.softplus(n)
那么,它应该可以工作了。
这个问题是以下已经回答的问题的后续问题,我想在这里正式提出一个新问题。原始问题位于此处:
如前所述,我目前正在训练 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:_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
这次定义损失函数的过程如下:
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”).
我使用的操作系统是Windows10,Python版本是3.6。示例代码中列出的所有库都是最新的,包括tensorflow-gpu。
如能解决问题,将不胜感激。该主题与金融部门特别相关,因为此类分布在这里起着重要作用,尤其是在风险管理中。
调用LinearOperatorLowerTriangular时尺度矩阵需要是下三角矩阵,将张量转换为线性算子,只需替换
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]))
另外Student-t的参数n是正数,所以在negative_t_layer_2
函数中加上n = tf.keras.activations.softplus(n)
那么,它应该可以工作了。