我一直试图使用pymc3使用keras(theano后端)模型拟合正弦曲线。我一直在使用[http://twiecki.github.io/blog/2016/07/05/bayesian-deep-learning/]作为参考点。
单独使用优化的Keras实现很好,但是来自pymc3的Hamiltonian Monte Carlo和Variational采样不适合数据。跟踪卡在先前启动的位置。当我移动之前后移动到同一个位置。单元格59中贝叶斯模型的后验预测几乎没有得到正弦波,而非贝叶斯拟合模型在单元格63中接近完美。我在这里创建了一个笔记本:https://gist.github.com/tomc4yt/d2fb694247984b1f8e89cfd80aff8706显示代码和结果。以下是该模型的片段......
class GaussWeights(object):
def __init__(self):
self.count = 0
def __call__(self, shape, name='w'):
return pm.Normal(
name, mu=0, sd=.1,
testval=np.random.normal(size=shape).astype(np.float32),
shape=shape)
def build_ann(x, y, init):
with pm.Model() as m:
i = Input(tensor=x, shape=x.get_value().shape[1:])
m = i
m = Dense(4, init=init, activation='tanh')(m)
m = Dense(1, init=init, activation='tanh')(m)
sigma = pm.Normal('sigma', 0, 1, transform=None)
out = pm.Normal('out',
m, 1,
observed=y, transform=None)
return out
with pm.Model() as neural_network:
likelihood = build_ann(input_var, target_var, GaussWeights())
# v_params = pm.variational.advi(
# n=300, learning_rate=.4
# )
# trace = pm.variational.sample_vp(v_params, draws=2000)
start = pm.find_MAP(fmin=scipy.optimize.fmin_powell)
step = pm.HamiltonianMC(scaling=start)
trace = pm.sample(1000, step, progressbar=True)
答案 0 :(得分:1)
模型包含正常噪声,固定标准为1:
out = pm.Normal('out', m, 1, observed=y)
但数据集没有。预测后验与数据集不匹配是很自然的,它们是以非常不同的方式生成的。为了使其更逼真,您可以向数据集添加噪声,然后估计sigma:
mu = pm.Deterministic('mu', m)
sigma = pm.HalfCauchy('sigma', beta=1)
pm.Normal('y', mu=mu, sd=sigma, observed=y)
您现在正在做的事情类似于从网络中获取输出并添加标准正常噪音。
一些不相关的评论:
out
不是可能性,它只是数据集。HamiltonianMC
代替NUTS
,则需要自行设置步长和积分时间。默认值通常不常用。