Почему несовместимые формы numpy vs cntk?

Я только начинаю изучать cntk. Однако у меня есть основной вопрос, который удерживает меня от прогресса. У меня есть следующий тест, который проходит:

import numpy as np
from cntk import input_variable, plus

def test_simple(self):

    x_input = np.asarray([[1, 2, 2]], dtype=np.int64)
    assert (1, 3) == x_input.shape

    y_input = np.asarray([[5, 3, 3]], dtype=np.int64)
    assert (1, 3) == y_input.shape

    x = input_variable(x_input.shape[1])
    assert (3, ) == x.shape

    y = input_variable(y_input.shape[1])
    assert (3, ) == y.shape

    x_plus_y = plus(x, y)
    assert (3, ) == x_plus_y.shape

    res = x_plus_y.eval({x: x_input, y: y_input})

    assert 6 == res[0, 0, 0]
    assert 5 == res[0, 0, 1]
    assert 5 == res[0, 0, 2]

Я понимаю, что форма вывода (1, 1, 3), поскольку первая и вторая оси являются динамической осью партии и по умолчанию соответственно.

Однако зачем мне задавать форму входных переменных как (3,) вместо (1, 3). Использование (1, 3) не работает.

Почему существует несоответствие между формой входного узла на графике и пустыми данными, используемыми в качестве входных данных для этого узла?

Спасибо, Падди.


person PaddyH6    schedule 26.01.2017    source источник


Ответы (1)


Это немного объясняется в описании «аргументов» для Function.forward. Другое описание находится здесь. Причина вашего замешательства, вероятно, в том, что CNTK выполняет некоторые «полезные» преобразования.

Если вы укажете свой ввод как (1,3), вам необходимо предоставить список массивов (1,3) в случае минипакета без оси последовательности или список массивов (x,1,3) в случае мини-пакет с осью последовательности (где x потенциально различен для каждой последовательности в мини-пакете). Точно так же, если вы укажете вход как (3,), вам нужно либо предоставить список (3,) векторов, либо список (x,3) векторов.

Путаница, вероятно, возникает из-за отсутствия списка. В этом случае CNTK перебирает ведущую ось предоставленного тензора и создает список из этих элементов, например. тензор (5,1,3) становится набором из 5 элементов, каждый из которых имеет форму (1,3).

person Nikos Karampatziakis    schedule 26.01.2017