【问题标题】:Why inconsistent shapes numpy vs cntk?为什么numpy与cntk的形状不一致?
【发布时间】:2017-01-26 03:51:24
【问题描述】:

我刚开始学习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数据不一致?

谢谢你, 稻谷

【问题讨论】:

    标签: cntk


    【解决方案1】:

    这在Function.forward 的“参数”描述中有所解释。另一种描述是here。您感到困惑的原因可能是 CNTK 进行了一些“有用”的转换。

    如果您将输入指定为 (1,3),那么您需要提供 (1,3) 数组列表,以防小批量没有序列轴或 (x,1,3) 数组列表具有序列轴的 minibatch 的情况(其中 x 对于 minibatch 中的每个序列可能不同)。同样,如果您将输入指定为 (3,),则您需要提供 (3,) 向量列表或 (x,3) 向量列表。

    这种混淆可能是由于没有提供列表的情况引起的。在这种情况下,CNTK 迭代提供的张量的引导轴,并从这些元素中创建一个列表,例如一个 (5,1,3) 张量变成一批 5 个元素,每个元素的形状为 (1,3)。

    【讨论】:

      猜你喜欢
      • 2021-07-31
      • 2014-08-25
      • 2019-09-30
      • 1970-01-01
      • 2022-06-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多