2017-09-20 10 views
0

モデルをロードしていますが、各ノードをグラフの残りの部分と分離してテストしたいので、クローン(CloneMethod.clone)メソッドを使用していますが、私はこれがモデル全体を再現することを見出している。たとえば、BatchNormalizationレイヤーをクローンすると、このグラフが表示されます。だから私はどのようにBatchNormalizationをクローンしますが、親のマイナスノードから切断しますか?CNTKノードをクローンで分離してテストする

enter image description here

答えて

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') 
     ]) 

あなたはcloneメソッドを使用して、特定のノードのクローンを作成しようとすることができ

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') 

これは入力xnから接続されたすべての層のクローンを作成します。新しい変数である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 
関連する問題