Python Keras修剪:将权重设置为零不会';不能加速推理吗?

Python Keras修剪:将权重设置为零不会';不能加速推理吗?,python,tensorflow,keras,neural-network,pruning,Python,Tensorflow,Keras,Neural Network,Pruning,我正在为tf.keras编写一个剪枝算法,它只是从层/过滤器中删除最低的x百分位权重。为此,我尝试将权重的值设置为零。阅读了其他资料后,我的印象是,这与从网络中“移除”权重具有相同的效果,但即使我将网络中的所有权重设置为零,推理时间也不会减少 如果我假设将层中的所有权重设置为零,代码如下: flat_weights = np.array(self.model.layers[layer_index].get_weights()[0]).flatten() weight_index

我正在为tf.keras编写一个剪枝算法,它只是从层/过滤器中删除最低的x百分位权重。为此,我尝试将权重的值设置为零。阅读了其他资料后,我的印象是,这与从网络中“移除”权重具有相同的效果,但即使我将网络中的所有权重设置为零,推理时间也不会减少

如果我假设将层中的所有权重设置为零,代码如下:

    flat_weights = np.array(self.model.layers[layer_index].get_weights()[0]).flatten()

    weight_index = 0 
    for weight in flat_weights:
        #if weight < self.delta_percentiles[index]:
        flat_weights[weight_index] = 0
        weight_index += 1

    weights[0] = np.reshape(flat_weights, original_shape)
    weights[1] = np.zeros(np.shape(weights[1]))

    self.model.layers[index].set_weights(weights)
flat\u weights=np.array(self.model.layers[layer\u index].get\u weights()[0])。flant()
权重指数=0
对于单位重量的重量:
#如果体重<自身delta_百分位数[指数]:
单位权重[权重指数]=0
权重指数+=1
权重[0]=np.重塑(平面权重,原始形状)
权重[1]=np.零(np.形状(权重[1]))
self.model.layers[index]。设置权重(权重)

理论上,以这种方式修剪的模型的推理时间应该减少,但没有发现任何变化。我修剪得对吗

将权重设置为零与删除权重是一样的,因为如果您具有相同的体系结构,但权重相同,且该层中的神经元数量较少,则网络在功能上是等效的。你得到的预测是一样的

但正如您所注意到的,它对计算性能没有影响。为了改变计算时间,您必须定义一个新的网络,减少一个权重,然后从另一个体系结构加载权重。你现在想象这样做并不容易,这就是为什么我们通常不做评估的原因,因为我们想知道预测性能(如准确性或均方误差)如何随着权重的削减而变化


因此,为了获得修剪的计算优势,您必须做的不仅仅是将权重设置为零。

我认为将权重设置为零不会产生与删除权重相同的效果。首先,显然会有内存消耗差异。你能分享一下你在哪里读到的吗?为什么推断时间会改变?乘零所花费的时间和乘其他任何东西所花费的时间一样长……是的,我理解这有点不合逻辑,但其中一个来源是TensorFlow:。“权重修剪意味着消除权重张量中不必要的值。我们实际上是将神经网络参数的值设置为零,以消除我们估计的神经网络各层之间不必要的连接”。我相信我也找到了一些其他地方这样说,如果需要的话,我会找到他们,谢谢你的回复-我想你救了我,让我免于陷入考虑实现稀疏Conv2D层的困境。澄清一下——如果我想从一个层中删除x个权重,我必须创建一个新模型,该层中的权重要少x个。从这里开始,我必须从旧模型的权重矩阵中删除这些权重,然后将其复制到新模型中?