开始使用
优质
小牛编辑
134浏览
2023-12-01
安装
pip install edward
Edward中的概率建模使用简单的随机变量。 这里我们将展示一个贝叶斯神经网络。 它是一个神经网络,其权具有先验分布。
import numpy as np
x_train = np.linspace(-3, 3, num=50)
y_train = np.cos(x_train) + np.random.normal(0, 0.1, size=50)
x_train = x_train.astype(np.float32).reshape((50, 1))
y_train = y_train.astype(np.float32).reshape((50, 1))
接下来,定义一个双层贝叶斯神经网络。 在这里,我们定义tanh
神经网络。
import tensorflow as tf
from edward.models import Normal
W_0 = Normal(mu=tf.zeros([1, 2]), sigma=tf.ones([1, 2]))
W_1 = Normal(mu=tf.zeros([2, 1]), sigma=tf.ones([2, 1]))
b_0 = Normal(mu=tf.zeros(2), sigma=tf.ones(2))
b_1 = Normal(mu=tf.zeros(1), sigma=tf.ones(1))
x = x_train
y = Normal(mu=tf.matmul(tf.tanh(tf.matmul(x, W_0) + b_0), W_1) + b_1,
sigma=0.1)
接下来,从数据中推断出模型。 我们将使用变分推理。 指定权重和偏差之间的正态逼近。
qW_0 = Normal(mu=tf.Variable(tf.zeros([1, 2])),
sigma=tf.nn.softplus(tf.Variable(tf.zeros([1, 2]))))
qW_1 = Normal(mu=tf.Variable(tf.zeros([2, 1])),
sigma=tf.nn.softplus(tf.Variable(tf.zeros([2, 1]))))
qb_0 = Normal(mu=tf.Variable(tf.zeros(2)),
sigma=tf.nn.softplus(tf.Variable(tf.zeros(2))))
qb_1 = Normal(mu=tf.Variable(tf.zeros(1)),
sigma=tf.nn.softplus(tf.Variable(tf.zeros(1))))
定义tf.Variable允许变量因子的参数变化。 它们都被初始化为0。根据 softplus 变换,标准偏差参数被约束为大于零。
现在,使用 相对熵 运行变分推理,以推断模型的潜在变量给定的数据。 我们指定1000
次迭代。
import edward as ed
inference = ed.KLqp({W_0: qW_0, b_0: qb_0,
W_1: qW_1, b_1: qb_1}, data={y: y_train})
inference.run(n_iter=500)
最后来评价一下模型。 贝叶斯神经网络定义了神经网络的分布,因此我们可以执行图形检查。将结果直接用可视化的方式来呈现。