修剪张量流连接和权重(使用cifar10 cnn)

时间:2016-02-14 15:54:41

标签: tensorflow

我正在使用tensorflow运行cnn进行图像分类。 我使用tensorflow cifar10 cnn实现。(tensorflow cifar10) 我想减少连接数,这意味着我想修剪低权重连接。 如何在没有一些nuerones的情况下创建一个新的图形(子图)?

4 个答案:

答案 0 :(得分:1)

Tensorflow不允许您锁定/冻结我找到的特定图层的特定内核。我唯一发现这样做是使用tf.assign()函数,如

所示

How to freeze/lock weights of one Tensorflow variable (e.g., one CNN kernel of one layer

这是一个相当洞穴的人,但我没有看到其他解决方案有效。从本质上讲,您必须在遍历数据时经常使用.assign()值。由于这种方法非常优雅和蛮力,因此速度非常慢。我每100批做一次.assign()。

有人请尽快发布更好的解决方案!

答案 1 :(得分:0)

您指向的cifar10模型,就此而言,大多数使用TensorFlow编写的模型不会直接在计算图中对单个神经元的权重(以及连接)进行建模。例如,对于完全连接的层,两层之间的所有连接(例如,下面层中的M神经元和上面层中的'N'神经元)都由一个MxN重量建模矩阵。如果您想从下面的图层中完全删除神经元及其所有传出连接,您可以通过删除相关行来简单地切出(M-1)xN矩阵,并将其与相应的M-1激活相乘神经元。

答案 2 :(得分:0)

另一种方法是添加一个加法掩码来控制连接。

  

第一步是将掩码和阈值变量添加到   需要进行修剪的图层。变量掩码是相同的   形状作为图层的权重张量并确定哪个权重   参与图表的正向执行。

tensorflow / contrib / model_pruning 下有一个修剪实现来修剪模型。希望这可以帮助您快速修剪模型。

https://github.com/tensorflow/tensorflow/tree/master/tensorflow/contrib/model_pruning

答案 3 :(得分:0)

我认为google在这里有更新的答案:https://github.com/tensorflow/tensorflow/tree/master/tensorflow/contrib/model_pruning

从训练好的图形中删除修剪节点:

$ bazel build -c opt contrib/model_pruning:strip_pruning_vars
$ bazel-bin/contrib/model_pruning/strip_pruning_vars --checkpoint_path=/tmp/cifar10_train --output_node_names=softmax_linear/softmax_linear_2 --filename=cifar_pruned.pb

我想cifar_pruned.pb会更小,因为删除了修剪过的“或零掩码”变量。