Skip to main content

Keras 的深度集成

项目描述

Keras 深度集成实现

这是 Lakshminarayanan 等人的实现。Keras 中的深度合奏论文。它创建了一组可以预测不确定性的模型。您提供一个输出两个值(均值、方差)的模型,该库将对您的数据进行集成和重新采样以进行集成训练。我们做了一些修改,将在即将发表的论文中更全面地描述。请不要独家新闻。

安装

pip install kdeepensemble

快速开始

此示例在函数内部创建 Keras 模型,然后对数据进行整形以进行集成训练。请注意,DeepEnsemble模型的行为就像 Keras 模型。

import kdens
import tensorflow as tf

# this is where you define your model
def make_model():
    i = tf.keras.Input((None,))
    x = tf.keras.layers.Dense(10, activation="relu")
    mean = tf.keras.layers.Dense(1)(x)
    # this activation makes our variance strictly positive
    var = tf.keras.layers.Dense(1, activation='softplus')(x)
    out = tf.squeeze(tf.stack([muhat, stdhat], axis=-1))
    model = tf.keras.Model(inputs=inputs, outputs=out)
    return model

# prepare data for ensemble training
resampled_idx = kdens.resample(y)
x_train = x[idx]
y_train = y[idx]

deep_ens = kdens.DeepEnsemble(make_model)

deep_ens.compile(loss=kdens.neg_ll)
deep_ens.fit(x_train, y_train)

deep_ens(x)

模型输出

输出是 shape (N, 3),其中最后一个轴是均值、方差和认知方差。认知方差来自模型的分歧,反映了模型的不确定性。方差包括认知方差和任意方差。它代表模型对不确定性的最佳估计。

保存/加载

您可以使用 序列化模型model.save,但请注意训练将无法继续。要继续训练,请使用load_weightssave_weights方法。

张量流数据集

您可以在使用map_reshapeTensorFlow 数据集时使用。它将如果您的数据已经批处理,请添加is_batched=True参数。

# data is a tf.data.Dataset

data = data.map(kdens.map_reshape()).batch(8)
deep_ens = kdens.DeepEnsemble(make_model)
deep_ens.compile(loss=kdens.neg_ll)
deep_ens.fit(data)

请注意,map_reshape不会重新采样,只是重塑。如果您想平衡标签,请考虑rejection_sample.

使用多个输入

该库确实支持具有多个输入的 Keras 模型,但具有以下限制:

  1. 输入必须是元组(不支持列表和字典)。
  2. 对抗步骤将仅在输入元组的第一个元素上完成。

这是一个例子

# make a model that takes three inputs as a tuple
x = np.random.randn(100, 10).astype(np.float32)
t = np.random.randn(100, 10, 3).astype(np.float32)
z = np.random.randn(100, 10, 3).astype(np.float32)
y = np.random.randn(100).astype(np.float32)

# can still use map_reshape with tuples
data = tf.data.Dataset.from_tensor_slices(
    ((x, t, z), y)).map(map_reshape()).batch(8)

def build():
    xi = tf.keras.layers.Input(shape=(10,))
    ti = tf.keras.layers.Input(shape=(10, 3))
    zi = tf.keras.layers.Input(shape=(10, 3))
    x = tf.keras.layers.Dense(2)(xi)
    return tf.keras.Model(inputs=(xi, ti, zi), outputs=x)

deep_ens = kdens.DeepEnsemble(make_model)
deep_ens.compile(loss=kdens.neg_ll)
deep_ens.fit(data, epochs=2)
deep_ens.evaluate((x, t, z), y)

API

见 API

引文

深度合奏论文:

@article{lakshminarayanan2017simple,
  title={Simple and scalable predictive uncertainty estimation using deep ensembles},
  author={Lakshminarayanan, Balaji and Pritzel, Alexander and Blundell, Charles},
  journal={Advances in neural information processing systems},
  volume={30},
  year={2017}
}

项目详情


下载文件

下载适用于您平台的文件。如果您不确定要选择哪个,请了解有关安装包的更多信息。

源分布

kdeepsemble-0.3.2.tar.gz (7.5 kB 查看哈希

已上传 source

内置分布

kdeepensemble-0.3.2-py3-none-any.whl (8.1 kB 查看哈希

已上传 py3