【发布时间】:2017-09-20 01:33:14
【问题描述】:
我正在加载一个模型,现在我想独立于图形的其余部分来测试每个节点,因此我使用了 clone(CloneMethod.clone) 方法,但我发现这会重新创建整个模型.例如,当我克隆 BatchNormalization 层时,我得到了这个图。那么如何克隆 BatchNormalization 但将其与父减节点断开连接?
【问题讨论】:
标签: cntk
我正在加载一个模型,现在我想独立于图形的其余部分来测试每个节点,因此我使用了 clone(CloneMethod.clone) 方法,但我发现这会重新创建整个模型.例如,当我克隆 BatchNormalization 层时,我得到了这个图。那么如何克隆 BatchNormalization 但将其与父减节点断开连接?
【问题讨论】:
标签: cntk
您可以命名每个节点,然后通过它们的名称找到它们。 在下面的模型中:
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
【讨论】: