首页 文章

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

提问于
浏览
1

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

4 回答

  • 1

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

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

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

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

  • 0

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

  • 0

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

    第一步是将掩码和阈值变量添加到需要进行修剪的图层中 . 变量掩模与图层的权重张量具有相同的形状,并确定哪些权重参与图的正向执行 .

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

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

  • 0

    我认为谷歌有一个更新的答案:https://github.com/tensorflow/tensorflow/tree/master/tensorflow/contrib/model_pruning

    Removing pruning nodes from the trained graph:

    $ 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会更小,因为删除了修剪过的“或零掩码”变量 .

相关问题