我有一堆小型神经网络(例如,5 到 50 个前馈神经网络,只有两个隐藏层,每个隐藏层有 10-100 个神经元),它们仅在权重初始化方面有所不同。我想在同一个较小的数据集(比如 10K 行)上训练它们,批量大小为 1。这样做的目的是通过平均结果将它们组合成一个集合。
现在,我当然可以在 TensorFlow/Keras 中将整个集成构建为一个神经网络,如下所示:
def bagging_ensemble(inputs: int, width: int, weak_learners: int):
r'''Return a generic dense network model
inputs: number of columns (features) in the input data set
width: number of neurons in the hidden layer of each weak learner
weak_learners: number of weak learners in the ensemble
'''
assert width >= 1, 'width is required to be at least 1'
assert weak_learners >= 1, 'weak_learners is required to be at least 1'
activation = tf.keras.activations.tanh
kernel_initializer = tf.initializers.GlorotUniform()
input_layer = tf.keras.Input(shape=(inputs,))
layers = input_layer
hidden = tf.keras.layers.Dense(units=width, activation=activation, kernel_initializer=kernel_initializer)\
(input_layer)
hidden = []
# add hidden layer as a list of weak learners
for i in range(weak_learners):
weak_learner = tf.keras.layers.Dense(units=width, activation=activation, kernel_initializer=kernel_initializer)\
(input_layer)
weak_learner = tf.keras.layers.Dense(units=1, activation=tf.keras.activations.sigmoid)(weak_learner)
hidden.append(weak_learner)
output_layer = tf.keras.layers.Average()(hidden) # add an averaging layer at the end
return tf.keras.Model(input_layer, output_layer)
example_model = bagging_ensemble(inputs=30, width=10, weak_learners=5)
tf.keras.utils.plot_model(example_model)
但是,模型的训练速度很慢,而且由于批量大小为 1,GPU 并不能真正加快这个过程。在 TensorFlow 2 中训练这样的模型时,如何更好地利用 GPU,而不使用更大的批量?
[使用这种集成的动机如下:特别是对于小型数据集,每个小型网络会因为不同的随机初始化而产生不同的结果。通过如此处所示的 bagging,生成的模型的质量大大提高。如果您对这种技术所源自的彻底的神经网络建模方法感兴趣,请查找 HG Zimmermann 的作品。]
