2017-11-25 9 views
0

私は単純なモデルを持っているとします。CNTK 2.2で隠れたレイヤの表現にアクセスする方法は?

def create_model(out_classes): 
    f1 = Dense(16, activation=C.relu,bias=True,init_bias=0,name='FLayer') 
    l1 = Dense(16, activation=C.relu, bias=True, init_bias=0, name='LLayer')(f1) 
    c1 = Dense(out_classes,name='CLayer')(l1) 
    return c1 

model = create_model(nClasses) 
z = model(feature) 

は、どのように私は私の訓練を受けたモデルのテスト中にFLayerまたはLLayerの表現にアクセスできますか?

答えて

1

表現では、隠れたレイヤーの機能にアクセスすることを意味しますか?私はそれを示すサンプルコードを作成しました。私は2つのアプローチをテストしました。最初のアプローチはあなたが行ったことに基づいており、2つ目のアプローチはCNTKの機能的APIを使用しています。

機能へのアクセスを取得する簡単な方法は、それらを返すことです:

import cntk 
import numpy as np 


def create_model(output_dimension): 
    l0 = cntk.layers.Dense(shape=1, activation=None, init=1, init_bias=1) 
    l1 = cntk.layers.Dense(shape=output_dimension, activation=None, init=1, init_bias=1)(l0) 
    l2 = cntk.layers.Dense(shape=output_dimension, activation=None, init=1, init_bias=1)(l1) 
    return l0, l1, l2 

input_dim = 1 
output_dim = 1 
l0, l1, l2 = create_model(output_dim) 
input = cntk.input_variable(shape=1) 
layer0 = l0(input) 
layer1 = l1(input) 
layer2 = l2(input) 

print("Non functional API") 
print("output of layer 0: {}".format(layer0.eval({input: np.array([0], dtype=np.float32)}))) 
print("output of layer 1: {}".format(layer1.eval({input: np.array([0], dtype=np.float32)}))) 
print("output of model: {}".format(layer2.eval({input: np.array([0], dtype=np.float32)}))) 

上記のモデルは、私はまた、重みとバイアスの設定次元1のベクトル次元1と出力の入力を受け取り、 1となるので、計算に従うのは簡単です。 create_model関数は、すべてのレイヤーを含むタプルを返します。これらのタプルは外部からアクセスできます。

私の意見では、機能的なAPIのアプローチが優れています。以下では、異なるレイヤーを含むリストを作成し、cntk.layers.Sequentialを使用してモデルを作成します。次に、create_model2は、エントリが1)すべてのレイヤを含むリストと2)最終モデルであるタプルを返します。これは、複数のレイヤーがある場合にはよりクリーンです。また、各レイヤーを使ってできることをよりよく制御できます。

def create_model2(output_dimension): 
    layers = [cntk.layers.Dense(shape=1, activation=None, init=1, init_bias=1), 
       cntk.layers.Dense(shape=output_dimension, activation=None, init=1, init_bias=1), 
       cntk.layers.Dense(shape=output_dimension, activation=None, init=1, init_bias=1)] 
    m = cntk.layers.Sequential(layers) 

    return m, layers 

m, layers = create_model2(output_dim) 
layer0 = layers[0](input) 
layer1 = layers[1](input) 
layer2 = layers[2](input) 
layer01 = cntk.layers.Sequential(layers[0:2])(input) 
layer012 = cntk.layers.Sequential(layers[0:3])(input) 
model = m(input) 

print("Functional API") 
print("output of layer 0: {}".format(layer0.eval({input: np.array([0], dtype=np.float32)}))) 
print("output of layer 1: {}".format(layer1.eval({input: np.array([0], dtype=np.float32)}))) 
print("output of layer 2: {}".format(layer2.eval({input: np.array([0], dtype=np.float32)}))) 
print("output of model: {}".format(model.eval({input: np.array([0], dtype=np.float32)}))) 
print("output of layer 0 and 1: {}".format(layer01.eval({input: np.array([0], dtype=np.float32)}))) 
print("output of layer 0 and 1 and 2: {}".format(layer012.eval({input: np.array([0], dtype=np.float32)}))) 
関連する問題