【发布时间】:2018-06-29 12:22:27
【问题描述】:
我正在尝试在 Keras 中实现 k-sparse autoencoder(以 Tensorflow 作为后端)。原论文的作者建议在训练过程中逐步增加中间层的稀疏度:
假设我们的目标是稀疏度 k = 15。 然后,我们从一个大的稀疏级别开始(例如 k = 100),k-稀疏自动编码器可以训练 所有隐藏单元。然后我们线性减少 第一个稀疏度从 k = 100 到 k = 15 时代的一半。这将自动编码器初始化为 一个好的制度,所有的隐藏单位都有 被选中的机会很大。然后,我们保持 k = 15 用于后半个时期。有了这个 调度,我们可以训练所有的过滤器,即使是低 稀疏级别。
我的自定义层看起来像这样,适用于所有时期的静态稀疏级别 k:
from keras.layers import Layer
from keras import backend as K
class KSparse(Layer):
def __init__(self, k=15, **kwargs):
self.k = k
self.uses_learning_phase = True
super().__init__(**kwargs)
def call(self, inputs):
return K.in_train_phase(self.k_sparsify(inputs), inputs)
def k_sparsify(self, inputs):
k = self.k
kth_smallest = K.tf.contrib.framework.sort(inputs)[..., K.shape(inputs)[-1]-1-k]
return inputs * K.cast(K.greater(inputs, kth_smallest[:, None]), K.floatx())
def compute_output_shape(self, input_shape):
return input_shape
我有一个每个纪元所需的稀疏级别数组和一个访问当前纪元的回调:
import numpy as np
from keras.callbacks import LambdaCallback
def sparsity_level_per_epoch(n_epochs):
return np.hstack((np.linspace(100, 15, n_epochs // 2, dtype=np.int),
np.repeat(15, n_epochs // 2)))
nth_epoch = LambdaCallback(on_epoch_begin=lambda epoch, logs: epoch)
在训练过程中,如何将当前epoch的稀疏度传递给KSparse?
【问题讨论】:
-
我正在处理同样的问题,我在this Github issue 上发现了一个类似的问题。回复者建议使用每个纪元更新的纪元计数器添加不可训练的权重。我仍在寻找如何实现它。如果我能够使其工作,将在此处发布答案
标签: python tensorflow keras