【问题标题】:CNTK Python API: access layers after loading modelCNTK Python API:加载模型后访问图层
【发布时间】:2019-06-19 18:45:31
【问题描述】:

加载模型后我无法访问图层。

我创建的模型如下:

def create_model(vocab_dim, hidden_dim):

    input_seq_axis1 = Axis('inputAxis1')
    input_sequence_before = sequence.input_variable(shape=vocab_dim, sequence_axis=input_seq_axis1, is_sparse = use_sparse)
    input_sequence_after = sequence.input_variable(shape=vocab_dim, sequence_axis=input_seq_axis1, is_sparse = use_sparse)
    e=Sequential([
        C.layers.Embedding(hidden_dim),
        Stabilizer()
        ],name='Embedding')
    a = Sequential([
        e,  
        C.layers.Recurrence(C.layers.LSTM(hidden_dim//2),name='ForwardRecurrence'),
        ],name='ForwardLayer')
    b = Sequential([
        e,  
        C.layers.Recurrence(C.layers.LSTM(hidden_dim//2),go_backwards=True),
       ],name='BackwardLayer')
    latent_vector = C.splice(a(input_sequence_before), b(input_sequence_after))

    bias = C.layers.Parameter(shape = (vocab_dim, 1), init = 0, name='Bias')
    weights = C.layers.Parameter(shape = (vocab_dim, hidden_dim), init = C.initializer.glorot_uniform(), name='Weights')
    z = C.times_transpose(weights, latent_vector,name='Transpose') + bias
    z = C.reshape(z, shape = (vocab_dim))

    return z

然后我加载模型:

def load_my_model(vocab_dim, hidden_dim):

    z=load_model("models/lm_epoch0.dnn")
    input_sequence_before = z.arguments[0]
    input_sequence_after = z.arguments[1]
    a=z.ForwardLayer
    b=z.BackwardLayer
    latent_vector = C.splice(a(input_sequence_before), b(input_sequence_after))

我得到一个错误:TypeError("argument ForwardRecurrence 的类型 SequenceOver[inputAxis1][Tensor[100]] 与传递的变量的类型 SequenceOver[inputAxis1][SparseTensor[50000]] 不兼容",)

看起来名称引用的层 (z.ForwardLayer) 表示来自层立即输入的函数。如何计算“latent_vector”(我需要这个变量来创建交叉熵和损失函数以继续训练)?

【问题讨论】:

    标签: python cntk


    【解决方案1】:

    根据错误,与 ForwardLayer 的预期 (100) 相比,您的输入 seq 的尺寸太大 (5000)。

    当您通过z.ForwardLayer 选择节点 ForwardLayer 时,您只会选择那个非常特定的节点/层,而不是与其连接的计算图的层/节点/其余部分。

    你应该做a = C.combine([z.ForwardLayer.owner]),你应该没问题。

    【讨论】:

    • 是的,100 的尺寸可能是 hidden_​​dim//2 - 该层的直接输入。但我需要将latent_vector 计算为模型输入的函数(50000)——就像在create_model 函数中所做的那样。
    • 原始模型的输入是否与当前输入(5000 维)相同?
    • 原始模型的两个输入(input_sequence_before 和 input_sequence_after)是 50000 维(vocab_dim)。加载模型的相同输入也是 50000 维。
    • @Andrey 我更新了我原来的答案,现在应该可以解决你的问题了
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多