我正在使用tensorflow运行cnn进行图像分类 . 我使用tensorflow cifar10 cnn实现 . (tensorflow cifar10)我想减少连接数,这意味着我想修剪低权重连接 . 如何在没有一些nuerones的情况下创建一个新的图形(子图)?
我正在使用tensorflow运行cnn进行图像分类 . 我使用tensorflow cifar10 cnn实现 . (tensorflow cifar10)我想减少连接数,这意味着我想修剪低权重连接 . 如何在没有一些nuerones的情况下创建一个新的图形(子图)?
4 回答
Tensorflow不允许您锁定/冻结我发现的特定图层的特定内核 . 我发现这是唯一使用tf.assign()函数,如图所示
How to freeze/lock weights of one Tensorflow variable (e.g., one CNN kernel of one layer
这是相当洞穴的人,但我没有看到其他解决方案有效 . 从本质上讲,您必须在遍历数据时经常使用.assign()值 . 由于这种方法非常优雅和蛮力,所以它非常慢 . 我每100批做一次.assign() .
有人请尽快发布更好的解决方案!
您指向的模型,就此而言,大多数使用TensorFlow编写的模型都不会直接在计算图中对单个神经元的权重(以及因此的连接)进行建模 . 例如,对于完全连接的层,两层之间的所有连接(例如,下面层中的
M
神经元)和上面层中的'N'神经元都由一个MxN
权重矩阵建模 . 如果你想从下面的层中完全删除一个神经元及其所有传出连接,你可以通过删除相关的行来简单地切出一个(M-1)xN
矩阵,并将其与神经元的相应M-1
激活相乘 .另一种方法是添加一个加法掩码来控制连接 .
在 tensorflow/contrib/model_pruning 下有一个修剪实现来修剪模型 . 希望这可以帮助您快速修剪模型 .
https://github.com/tensorflow/tensorflow/tree/master/tensorflow/contrib/model_pruning
我认为谷歌有一个更新的答案:https://github.com/tensorflow/tensorflow/tree/master/tensorflow/contrib/model_pruning
Removing pruning nodes from the trained graph:
我想cifar_pruned.pb会更小,因为删除了修剪过的“或零掩码”变量 .