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