2017-07-20 5 views
1

model.clone()を使用してグラフの一部のノードを置き換えようとしています。 times_nodes = find_all_with_name(model、name、-1) 問題のノードは、グラフの深さ0にありません。私は、クローンを次のように呼び出すと気付きました。 model = model.clone( 'clone'、substitutions = subst) 実際にどのノードも置き換えられません。これを行う方法はありますか、これは意図された動作ですか?CNTK:深さのないノードのmodel.clone()

+0

こんにちは@Jonzhaと歓迎するスタックオーバーフロー!ここであなたのやり方を知るために(また、最初のバッジを獲得するため)、[ミニマル、コンプリート、そして検証可能な例](https://stackoverflow.com/help/mcve)をご覧になり、[How to Ask Good Questions](https://stackoverflow.com/help/how-to-ask)もチェックして、取得する機会を増やしてくださいフィードバックと有用な答え、今すぐあなたに役立つ情報が不足しています。 – DarkCygnus

答えて

0

現在、ブロック機能であるノードは、クローンによって置き換えられません。おそらくこのモードをクローンに追加するでしょう。今のところ、グラフを平坦化しようとすることができます。次のコードは、おそらくほとんどのネットワークを平坦化するのに十分です。私は完全にそれをテストしていない:

def break_a_block(root): 
    blocks = C.logging.graph.depth_first_search(root, lambda node: isinstance(node, C.cntk_py.Function) and node.is_block, depth=-1) 
    if len(blocks) == 0: 
     return False, root 
    block = blocks[0] 
    composite = C.as_composite(block.block_root) 
    output_dict = dict(zip(block.outputs, composite.outputs)) 
    mapping = dict(block.block_arguments_mapping) 
    items = list(mapping.items()) 
    owners = set(C.as_composite(arg.owner) for _, arg in items if arg.is_output) 
    for owner in owners:  
     clone = owner.clone('share', output_dict) 
     out = dict(zip(owner.outputs,clone.outputs)) 
     for p,a in items: 
      if mapping[p] in out: 
       mapping[p] = out[mapping[p]] 
    composite.replace_placeholders(mapping) 
    return True, root.clone('share',output_dict) 

def flatten(root): 
    changed, root = break_a_block(root) 
    while changed: 
     changed, root = break_a_block(root) 
    return root 
関連する問題