2017-01-26 3 views
1

Я только начинаю изучать cntk. Однако у меня есть основной вопрос, который удерживает меня от прогресса. У меня есть следующий тест, который проходит:Почему непоследовательные формы numpy vs 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) не выполняется.

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

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

ответ

2

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

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

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