2017-11-25 2 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

표현이란 숨겨진 레이어의 기능에 액세스하는 것을 의미합니까? 그것을 보여주기위한 샘플 코드를 만들었습니다. 두 가지 접근 방식을 테스트했습니다. 첫 번째 방법은 사용자가 수행 한 작업을 기반으로하고 두 번째 방법은 내가 선호하는 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)}))) 
관련 문제