我当前的目标是从一个已训练的模型中克隆单一层。
第一个问题是clone()
方法会克隆从指定节点开始的整个图,这并不是我想要的效果。
所以我尝试手动克隆它(在这种情况下是一个Dense层),通过从节点中获取其权重,如下所示:
node = C.logging.graph.find_by_name(model, 'node')C.layers.Dense(node.shape, init=node.W.value, init_bias=node.b.value)
不幸的是,这不起作用,因为我得到了以下模糊的错误:
TypeError: in method 'random_initializer_with_rank', argument 1 of type 'CNTK::ParameterInitializer const &'
回答:
clone()
方法并不一定克隆整个图。它允许你通过substitutions
参数“切出”图的一部分。substitutions
参数指定了你想克隆的图部分的输入节点;基本上是你想要切断的地方。
例如,要克隆堆栈中间的一层,确定
- 它的根节点,我们称之为
layer_root
- 它的输入。假设有一个输入节点,你将其存储为
layer_input
然后你应该能够根据以下代码草图仅克隆这一部分:
substitutions = { layer_input : C.placeholder(name='cloned_layer_input')}cloned_layer = layer_root.clone(clone_method, substitutions)
substitutions
将导致clone()
一旦碰到layer_input
就停止克隆,并在克隆中用占位符替换它。
结果将是一个可调用的对象,就像层库中的任何层(如C.Dense()
)或任何用@C.Function
定义的函数一样,我相信这就是你所寻找的。