【问题标题】:Keras-surgeon: For pruning and Model optimizationKeras-surgeon:用于修剪和模型优化
【发布时间】:2019-12-04 09:08:24
【问题描述】:

我正在研究使用 Keras 构建的卷积神经网络。由于最终模型需要部署在处理能力较少的处理单元上,我开始寻找减少它消耗的资源的方法。幸运的是,我在 Keras 中发现了这个库,Keras-surgeon,它有助于修改经过训练的 Keras 模型。

我正在尝试删除其中一个 Conv Net 层中的通道(并将在其他层上继续进行)。虽然,文档非常简单明了,用过的人也赞不绝口,但当我尝试使用它时,它返回了一个奇怪的类型错误:

from kerassurgeon import Surgeon

surgeon = Surgeon(model_final)
layer_1 = model_final.layers[1] # selecting 2nd layer

surgeon.add_job('delete_channels', layer_1, channels=[4,7,3])
new_model = surgeon.operate()

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-292-77c377538a52> in <module>
      5 
      6 surgeon.add_job('delete_channels', layer_1, channels=[4,7,3])
----> 7 new_model = surgeon.operate()

~/anaconda3/envs/Learning/lib/python3.6/site-packages/kerassurgeon/surgeon.py in operate(self)
    150         for node in sorted_nodes:
    151             # Rebuild submodel up to this node
--> 152             sub_output_nodes = utils.get_node_inbound_nodes(node)
    153             outputs, output_masks = self._rebuild_graph(self.model.inputs,
    154                                                         sub_output_nodes)

~/anaconda3/envs/Learning/lib/python3.6/site-packages/kerassurgeon/utils.py in get_node_inbound_nodes(node)
     88 def get_node_inbound_nodes(node):
     89     return [get_inbound_nodes(node.inbound_layers[i])[node_index]
---> 90             for i, node_index in enumerate(node.node_indices)]
     91 
     92 

TypeError: 'int' object is not iterable
  1. 我到底做错了什么?

  2. 另外,谁能指出我可以用来运行 keras 模型的任何东西,以查看其资源消耗(内存和 CPU 等)? (这将是一个很大的帮助!)

  3. 还有哪些其他方法可以让模型在不影响准确性的情况下占用更少的资源?

任何帮助将不胜感激..!

【问题讨论】:

    标签: python optimization keras conv-neural-network pruning


    【解决方案1】:

    definition of add_job 是:

    def add_job(self, job, layer, *,
                channels=None, new_layer=None, node_indices=None):
      # ...
    

    函数参数中的* 旨在强制您显式使用命名参数。 您必须按如下方式致电add_job

    surgeon.add_job('delete_channels', layer_1, channels=[4,7,3])
    

    【讨论】:

    • 好的,谢谢!它有所帮助,但我仍然遇到另一个错误。 “TypeError: 'int' object is not iterable” 让我编辑问题以添加 Traceback。
    【解决方案2】:

    使用 tfkerassurgeon 将解决问题。

    pip install tfkerassurgeon
    

    【讨论】:

      【解决方案3】:

      当某些函数需要一个 int(或对象)列表并且我传递一个 int(或对象)时,我看到了此错误。也许试试 surgeon.add_job('delete_channels', [layer_1], channels=[4,7,3]) 代替 surgeon.add_job('delete_channels', layer_1, channels=[4,7,3])

      【讨论】:

        猜你喜欢
        • 2020-08-25
        • 2019-12-12
        • 1970-01-01
        • 2020-06-19
        • 2019-05-29
        • 1970-01-01
        • 2019-02-17
        • 1970-01-01
        • 2018-01-14
        相关资源
        最近更新 更多