gpt4 book ai didi

tensorflow - 如何将 Keras 模型拟合到 Gamma 分布?

转载 作者:行者123 更新时间:2023-12-05 03:58:20 26 4
gpt4 key购买 nike

我正在尝试拟合一个输出变量始终为正的 keras 模型。我想使用 Gamma 分布来模拟这个问题。问题是损失总是输出 NAN。

我构建了以下 keras 模型:

model_max = tf.keras.Sequential([
tf.keras.layers.Dense(20,input_dim=10, activation="relu"),
tf.keras.layers.Dense(15,activation="relu"),
tf.keras.layers.Dense(10,activation="relu"),
tf.keras.layers.Dense(5,activation="relu"),
tf.keras.layers.Dense(2),
tfp.layers.DistributionLambda(lambda t:
tfd.Gamma(concentration = tf.math.softplus(0.005*t[...,:1])+0.001,
rate = tf.math.softplus(0.005*t[...,1:])+0.001)
),
])

请注意,我使用了 softplus,因为分布的两个参数都必须为正。我还添加了 0.001 以确保参数始终大于零。

我的损失函数如下:

def gamma_loss(y_true, my_dist):

dist_mean = my_dist.mean()
dist_stddev = my_dist.stddev()
alpha = (dist_mean / dist_stddev)**2
beta = dist_mean / dist_stddev**2
gamma_distr = tfd.Gamma(concentration=alpha, rate=beta)
return -tf.reduce_mean(gamma_distr.log_prob(y_true))

这个函数似乎工作正常。例如,如果我运行以下代码,它运行良好:

import tensorflow as tf
import tensorflow_probability as tfp
tfd = tfp.distributions

def gamma_loss(y_true, my_dist):

dist_mean = my_dist.mean()
dist_stddev = my_dist.stddev()
alpha = (dist_mean / dist_stddev)**2
beta = dist_mean / dist_stddev**2
#print(alpha)
gamma_distr = tfd.Gamma(concentration=alpha, rate=beta)
return -tf.reduce_mean(gamma_distr.log_prob(y_true)).numpy()

dist = tfd.Gamma(1,1)

gamma_loss(100, dist)

但是,如果我用下面一行编译它:

model_max.compile(optimizer=tf.optimizers.Adam(learning_rate = 0.001),loss=gamma_loss)

loss总是输出nan

我做错了什么?我尝试了不同的损失函数,但似乎没有任何效果。我认为这与浓度 论点有关,因为我已经有了一个与正态分布类似的模型。在该模型中,我没有对均值 (loc) 使用 softplus,因为该分布接受任何正值或负值。我使用标准偏差的确切结构,因为它在正态分布中也必须是正数。它工作得很好。为什么它不适用于 Gamma 分布?

感谢您向任何可以帮助我理解我做错了什么的人提供建议。

最佳答案

我想与您分享我为使我的代码正常工作所做的一切:

  1. 我确保每一层都有一个 kernel_initializer='random_uniform' 语句,并且,
  2. 我将整个 gamma_loss 函数变成了:lambda y, p_y: -p_y.log_prob(y)v

我不确定 gamma_loss 是否是问题所在,但我发现有人在做我正在做的同样事情的例子以及更简单的 lambda y, p_y: -p_y.log_prob(y) 功能运行良好,所以我同意了。我认为我的主要问题是权重没有被随机初始化。

此外,我想重复一下我在搜索答案时在网上找到的一些建议:尝试拟合一个示例并确保在使用真实训练数据之前它运行良好。在我的例子中,我通过采用一个训练示例并将该行复制数千次(创建一个所有行都相等的数据集)然后仅使用它来训练我的模型来实现这一点。当我的模型无法适应时,逐层分析每一层的结果应该是什么会更容易。

Brian Patton 给出的答案非常有帮助,因为它确实为我指明了正确的方向,即尝试理解每一层输出的内容并通过一个简单的示例测试您的假设。

为了将来引用,这是我的代码现在的样子:

model_max = tf.keras.Sequential(
[
tf.keras.layers.Dense(
20, input_dim=10, activation="relu", kernel_initializer="random_uniform"
),
tf.keras.layers.Dense(
15, activation="relu", kernel_initializer="random_uniform"
),
tf.keras.layers.Dense(
10, activation="relu", kernel_initializer="random_uniform"
),
tf.keras.layers.Dense(
5, activation="relu", kernel_initializer="random_uniform"
),
tf.keras.layers.Dense(2, kernel_initializer="random_uniform"),
tfp.layers.DistributionLambda(
lambda t: tfd.Gamma(
concentration=tf.math.softplus(t[:, 0]) + 1e-9,
rate=tf.math.softplus(t[:, 1]) + 1e-9,
),
),
]
)


negloglik = lambda y, p_y: -p_y.log_prob(y)

model_max.compile(optimizer=tf.optimizers.Adamax(learning_rate=1e-4), loss=negloglik)

关于tensorflow - 如何将 Keras 模型拟合到 Gamma 分布?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58089579/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com