首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >混合密度网络(MDN)仅返回概率1.0和0.0

混合密度网络(MDN)仅返回概率1.0和0.0
EN

Stack Overflow用户
提问于 2020-07-10 21:52:42
回答 1查看 300关注 0票数 0

我正在构建一个混合密度网络,试图预测一个变量在两个协变量上的分布。其中一个协变量具有每小时的数据,而另一个在一天中不会变化(即每日数据)。以前的工作表明,两个发行版应该会呈现出良好的结果,所以我也使用了两个发行版。

对于损失函数,我对正态分布使用了自定义的负对数似然,并对其应用了log-sum-exp技术。

我使用了两个隐藏层,具有relu激活功能和60个神经元,一批60个,以及e-4学习率。

但是,结果总是显示其中一个分布的概率为1,另一个分布的概率为0。无论我是否增加纪元数都没有区别。注意,概率为1.0的分布的结果是完全合理的,但是考虑到之前在这个主题上的工作,我很难相信在60K+小时内,没有一个单独的分布包含两个不同的分布。

任何关于如何纠正概率或什么可能是0-1概率的原因的建议都将受到高度赞赏。

代码语言:javascript
运行
复制
from tensorflow.keras import backend as bk

# reading inputs, etc.

components = 2 # Number of normal distributions in mixture
no_parameters = 3 # Number of parameters of the mixtures (weight, mean, std. dev)
neurons = 60 # Number of neurons per layer
SB = 1 # Number of outputs we want to predict

# Make the input tensor: two covariates-- quantity & price.
inputs = ks.Input(shape=(X_train.shape[1],))

h1 = ks.layers.Dense(neurons, activation="relu",
                     kernel_initializer='ones', bias_initializer='ones')(inputs)
h2 = ks.layers.Dense(neurons, activation="relu",
                     kernel_initializer='ones', bias_initializer='ones')(h1)
alphas = ks.layers.Dense(components, activation="softmax", name="alphas",
                         kernel_initializer='ones', bias_initializer='ones')(h2)
mus = ks.layers.Dense(components, name="mus")(h2)
sigmas = ks.layers.Dense(components, activation="relu", name="sigmas",
                         kernel_initializer='ones', bias_initializer='ones')(h2)
outputVector = ks.layers.Concatenate(name="output")([alphas, mus, sigmas])

model = ks.Model(inputs=inputs, outputs=outputVector)

def slice_parameter_vectors(parameter_vector):
    """ Returns an unpacked list of parameter vectors. """
    return [parameter_vector[:, i * components:(i + 1) * components] for i in range(no_parameters)]

def log_sum_exp(x, axis=None):
    """Log-sum-exp trick implementation"""
    x_max = bk.max(x, axis=axis, keepdims=True)
    return bk.log(bk.sum(bk.exp(x - x_max),
                         axis=axis, keepdims=True)) + x_max

def mean_log_Gaussian_like2(y, parameter_vector):
    """ Computes the mean negative log-likelihood loss of the observed price given the mixture parameters. """
    alpha, mu, sigma = slice_parameter_vectors(parameter_vector)  # Unpack parameter vectors
    mu = tf.keras.backend.reshape(mu, [-1, SB, 2])
    alpha = bk.softmax(bk.clip(alpha, 1e-8, 1.))
    exponent = bk.log(alpha) - .5 * float(SB) * bk.log(2 * np.pi) \
               - float(SB) * bk.log(sigma) \
               - bk.sum((bk.expand_dims(y, 2) - mu) ** 2, axis=1) / (2 * (sigma) ** 2)
    log_likelihood = log_sum_exp(exponent, axis=1)
    return -bk.mean(log_likelihood)

model.compile(optimizer=ks.optimizers.Adam(learning_rate=1e-4, clipvalue=1.0), # , clipvalue=0.5
              loss= mean_log_Gaussian_like2,
              metrics=['accuracy'])

model.fit(X_train, y_train, batch_size=60, epochs=500)

y_pred = model.predict(X_test)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-08-12 03:42:47

我解决了这个问题。解决方案是从重新定义alphas中删除softmax函数。即α= bk.softmax(bk.clip( alpha,1e-8,1.))应为alpha = bk.clip(alpha,1e-8,1.)。谢谢大家。

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

https://stackoverflow.com/questions/62835805

复制
相关文章

相似问题

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