現在、ブロック機能であるノードは、クローンによって置き換えられません。おそらくこのモードをクローンに追加するでしょう。今のところ、グラフを平坦化しようとすることができます。次のコードは、おそらくほとんどのネットワークを平坦化するのに十分です。私は完全にそれをテストしていない:
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
こんにちは@Jonzhaと歓迎するスタックオーバーフロー!ここであなたのやり方を知るために(また、最初のバッジを獲得するため)、[ミニマル、コンプリート、そして検証可能な例](https://stackoverflow.com/help/mcve)をご覧になり、[How to Ask Good Questions](https://stackoverflow.com/help/how-to-ask)もチェックして、取得する機会を増やしてくださいフィードバックと有用な答え、今すぐあなたに役立つ情報が不足しています。 – DarkCygnus