Как получить доступ к представлению скрытых слоев в 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 ответ

Под представлением вы имеете в виду доступ к функциям скрытых слоев правильно? Я создал пример кода, чтобы показать его. Я проверил два подхода: первый основан на том, что вы сделали, а второй использует функциональный API CNTK, который я предпочитаю.

Самый простой способ получить доступ к функциям - вернуть их:

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)})))
Другие вопросы по тегам