CNTK Python API: доступ к слоям после загрузки модели

Я не могу получить доступ к слоям после загрузки модели.

Я создал модель следующим образом:

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("Аргумент ForwardRecurrence типа SequenceOver[inputAxis1][Tensor[100]] несовместим с типом SequenceOver[inputAxis1][SparseTensor[50000]] переданной переменной",)

Похоже, что слой, на который ссылается имя (z.ForwardLayer), представляет функцию из непосредственного ввода слоя. Как я могу рассчитать «latent_vector» (эта переменная нужна мне для создания функций перекрестной энтропии и потерь для продолжения обучения)?


person Andrey    schedule 19.06.2019    source источник


Ответы (1)


Основываясь на ошибке, размеры вашей входной последовательности слишком велики (5000) по сравнению с тем, что ожидает ваш ForwardLayer (100).

Когда вы выбираете узел ForwardLayer с помощью z.ForwardLayer, вы выбираете только этот конкретный узел/уровень, но не слои/узлы/остальные графы вычислений, которые к нему подключены.

Вы должны сделать a = C.combine([z.ForwardLayer.owner]), и все будет в порядке.

person snowflake    schedule 20.06.2019
comment
да, размер 100, вероятно, hidden_dim//2 - немедленный ввод в этот слой. Но мне нужно вычислить скрытый_вектор как функцию входа в модель (50000) - как это делается в функции create_model. - person Andrey; 20.06.2019
comment
Является ли ввод исходной модели таким же, как ваш текущий ввод (размер 5000)? - person snowflake; 20.06.2019
comment
Два входа в исходную модель (input_sequence_before и input_sequence_after) имеют размерность 50000 (vocab_dim). Те же входные данные для загруженной модели также имеют размерность 50000. - person Andrey; 20.06.2019
comment
@ Андрей, я обновил свой первоначальный ответ, теперь он должен решить вашу проблему. - person snowflake; 20.06.2019