【问题标题】:CNTK: cloning a single layerCNTK:克隆单层
【发布时间】:2018-02-02 12:05:13
【问题描述】:

我目前的目标是从已经训练好的模型中克隆一个层。

第一个问题是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 &'

【问题讨论】:

  • C.layers.Dense(node.shape, init=node.W.value, init_bias=node.W.value) 可能不正确,因为您正在尝试使用 node.W.value 初始化权重和偏差,但我自己尝试了一个小例子并得到了同样的错误,这很奇怪,因为python API 文档声明 init 和 init_bias 应该处理 np 数组
  • 哎呀,这是一个错字。我正确使用了node.b.value 并得到了那个错误。
  • 是的,我还创建了一个 MWE 并重新创建了确切的错误消息。有趣的是,虽然我能够对卷积层做同样的事情并且它工作正常

标签: python machine-learning deep-learning cntk


【解决方案1】:

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 定义的任何函数,我相信这就是您要寻找的。​​p>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-13
    • 1970-01-01
    • 2019-08-11
    • 1970-01-01
    • 2022-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多