【问题标题】:Tensorflow Probability returns unstable PredictionsTensorFlow Probability 返回不稳定的预测
【发布时间】:2019-03-19 15:34:48
【问题描述】:

我正在使用 Tensorflow 概率模型。当然是概率结果,误差的导数不会为零(否则模型将是确定性的)。预测是不稳定的,因为我们在损失的导数中有一个范围,比如说在凸优化中,例如从 1.2 到 0.2。

每次训练模型时,此区间都会生成不同的预测。有时我得到了很好的拟合(红色=真实,蓝线=预测 +2 标准偏差和 -2 标准偏差):

有时不是,具有相同的超参数:

有时镜像:

出于商业目的,这是很成问题的,因为预计预测会提供稳定的输出。

代码如下:

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
import tensorflow as tf
import tensorflow_probability as tfp
np.random.seed(42)
dataframe = pd.read_csv('Apple_Data_300.csv').ix[0:800,:]
dataframe.head()

plt.plot(range(0,dataframe.shape[0]),dataframe.iloc[:,1])

x1=np.array(dataframe.iloc[:,1]+np.random.randn(dataframe.shape[0])).astype(np.float32).reshape(-1,1)

y=np.array(dataframe.iloc[:,1]).T.astype(np.float32).reshape(-1,1)

tfd = tfp.distributions

model = tf.keras.Sequential([
  tf.keras.layers.Dense(1,kernel_initializer='glorot_uniform'),
  tfp.layers.DistributionLambda(lambda t: tfd.Normal(loc=t, scale=1)),
  tfp.layers.DistributionLambda(lambda t: tfd.Normal(loc=t, scale=1)),
  tfp.layers.DistributionLambda(lambda t: tfd.Normal(loc=t, scale=1))
])
negloglik = lambda x, rv_x: -rv_x.log_prob(x)

model.compile(optimizer=tf.keras.optimizers.Adam(lr=0.0001), loss=negloglik)

model.fit(x1,y, epochs=500, verbose=True)

yhat = model(x1)
mean = yhat.mean()

init = tf.global_variables_initializer()

with tf.Session() as sess:
    sess.run(init)
    mm = sess.run(mean)    
    mean = yhat.mean()
    stddev = yhat.stddev()
    mean_plus_2_std = sess.run(mean - 2. * stddev)
    mean_minus_2_std = sess.run(mean + 2. * stddev)


plt.figure(figsize=(8,6))
plt.plot(y,color='red',linewidth=1)
#plt.plot(mm)
plt.plot(mean_minus_2_std,color='blue',linewidth=1)
plt.plot(mean_plus_2_std,color='blue',linewidth=1)

损失:

Epoch 498/500
801/801 [==============================] - 0s 32us/sample - loss: 2.4169
Epoch 499/500
801/801 [==============================] - 0s 30us/sample - loss: 2.4078
Epoch 500/500
801/801 [==============================] - 0s 31us/sample - loss: 2.3944

有没有办法控制概率模型的预测输出?损失停止在 1.42,甚至降低了学习率并增加了训练 epoch。我在这里错过了什么?

回答后的工作代码:

init = tf.global_variables_initializer()

with tf.Session() as sess:

    model = tf.keras.Sequential([
      tf.keras.layers.Dense(1,kernel_initializer='glorot_uniform'),
      tfp.layers.DistributionLambda(lambda t: tfd.Normal(loc=t, scale=1))
    ])
    negloglik = lambda x, rv_x: -rv_x.log_prob(x)

    model.compile(optimizer=tf.keras.optimizers.Adam(lr=0.0001), loss=negloglik)

    model.fit(x1,y, epochs=500, verbose=True, batch_size=16)

    yhat = model(x1)
    mean = yhat.mean()

    sess.run(init)
    mm = sess.run(mean)    
    mean = yhat.mean()
    stddev = yhat.stddev()
    mean_plus_2_std = sess.run(mean - 3. * stddev)
    mean_minus_2_std = sess.run(mean + 3. * stddev)

【问题讨论】:

  • 我找到了这个,还有你的tf.global_variables_initializer,非常有趣:Variable initializers must be run explicitly before other ops in your model can be run. The easiest way to do that is to add an op that runs all the variable initializers, and run that op before using the model.stackoverflow.com/questions/44433438/…。你运行tf.global_variables_initializer 太晚了吗?
  • @ScottSkiles 是和否,根据超参数,损失可能变为 1.42。是的,tf.global_variables_initializer 应该排在第一位。我有现在可以完美运行的代码。你想发布答案还是我可以用工作代码回答?
  • 已答复!随意使用工作代码进行编辑。
  • 谢谢!添加了代码。

标签: tensorflow tensorflow-probability


【解决方案1】:

你是不是跑tf.global_variables_initializer太晚了?

我在Understanding tf.global_variables_initializer的回答中发现了这个:

变量初始化器必须在你的其他操作之前显式运行 模型可以运行。最简单的方法是添加一个运行的操作 所有变量初始化器,并在使用模型之前运行该操作。

【讨论】:

    猜你喜欢
    • 2018-09-11
    • 1970-01-01
    • 2021-12-04
    • 1970-01-01
    • 2019-12-31
    • 2019-05-04
    • 1970-01-01
    • 1970-01-01
    • 2020-06-10
    相关资源
    最近更新 更多