在CNTK中访问DNN的学习权重

时间:2017-03-20 02:08:02

标签: cntk

如何访问DNN的学习权重,如下所示:

lstm_network_output.save(model_path)

3 个答案:

答案 0 :(得分:3)

可以通过调用'lstm_network_output.parameters'来访问网络的权重/参数,该参数返回“参数”变量对象的列表。可以使用numpy数组形式的Parameter对象的'value'属性获取Parameter的值。参数的值可以通过'.value ='更新。

答案 1 :(得分:0)

如果您在创建模型时使用了name=属性,则还可以按名称识别图层。例如:

model = Sequential([Embedding(300, name='embed'), Recurrence(LSTM(500)), Dense(10)])
E = model.embed.E   # accesses the embedding matrix of the embed layer

要知道参数是.E,请参阅相应功能的文档字符串(例如help(Embedding))。 (在DenseConvolution中,参数为.W.b。)

上面的模式适用于使用as_block()创建的命名图层。您还可以命名中间变量,并以相同的方式访问它们。 E.g:

W = Parameter((13,42), init=0, name='W')
x = Input(13)
y = times(x, W, name='times1')
W_recovered = y.times1.W

# e.g. check the shape to see that they are the same
W_recovered.shape  # --> (13, 42)
W.shape            # --> (13, 42)

从技术上讲,这将搜索所有提供y的参数。如果网络更复杂,您最终可能会有多个同名参数。然后由于模糊性将引发错误。在这种情况下,您必须使用Anna的回复中提到的.parameters元组。

答案 2 :(得分:0)

此python代码对我有用,以可视化一些权重:

import numpy as np
import cntk as C

dnnFile = C.cntk_py.Function.load('Models\ConvNet_MNIST_5.dnn') # load model from MS example
layer8 = dnnFile.parameters()[8].value()
filter_num = 0
sliced = layer8.asarray()[ filter_num ][ 0 ] # shows filter works on input image
print(sliced)