克隆CNTK节点以单独测试它

时间:2017-09-20 01:33:15

标签: cntk

我正在加载一个模型,现在我想要从图的其余部分单独测试每个节点,所以我使用克隆(CloneMethod.clone)方法,但我发现这个重建整个模型。例如,当我克隆BatchNormalization图层时,我得到了这个图。那么如何克隆BatchNormalization但将其与父Minus节点断开连接?

enter image description here

1 个答案:

答案 0 :(得分:1)

您可以为每个节点命名,然后按名称查找它们。 在下面的模型中:

def create_model():
    with C.layers.default_options(initial_state=0.1):
        return C.layers.Sequential([
            C.layers.Embedding(emb_dim, name='embed'),
            C.layers.Recurrence(C.layers.LSTM(hidden_dim), go_backwards=False),
            C.layers.Dense(num_labels, name='classify')
        ])

你可以打电话

z = create_model()
print(z.embed.E.shape)
print(z.classify.b.value)

您可以尝试使用克隆方法克隆特定节点。您可以在许多教程中找到按节点名称查询CNTK图的示例。您还可以看到如何在CNTK 206教程中有选择地处理子图。

一些示例代码

import cntk as C
x = C.input_variable(5)
m = C.layers.Dense(4, name='foo')(x)
n = C.layers.Dense(3, name='baz')(m)
z = C.layers.Dense(2, name='bar')(n)
n_clone = z.baz.clone(method='share')

这将克隆从n连接到输入x的所有图层。人们可以通过声明一个新的变量y来获得名为baz的图层。     y = C.input.variable(4)     n_clone_baz = n_clone(y)

可以使用更通用的克隆方法here

clone_method可以让您克隆子图。

def clone_model(base_model, from_node_names, to_node_names, clone_method):
    from_nodes = [find_by_name(base_model, node_name) for node_name in from_node_names]
    if None in from_nodes:
        print("Error: could not find all specified 'from_nodes' in clone.")
    to_nodes = [find_by_name(base_model, node_name) for node_name in to_node_names]
    if None in to_nodes:
        print("Error: could not find all specified 'to_nodes' ...... ")

    input_placeholders = dict(zip(from_nodes, [placeholder() for x in from_nodes]))    
    cloned_net = combine(to_nodes).clone(clone_method, input_placeholders)
    return cloned_net