假设我有一个简单的模型。
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的表示?
答案 0 :(得分: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)})))