CNTK"时间"到底是怎样的?功能工作?

时间:2017-12-24 12:41:37

标签: python linear-algebra matrix-multiplication cntk

我通过this tutorial来教自己CNTK。

有一个定义为

的函数
def linear_layer(input_var, output_dim):

    input_dim = input_var.shape[0]
    weight_param = C.parameter(shape=(input_dim, output_dim))
    bias_param = C.parameter(shape=(output_dim))

    mydict['w'], mydict['b'] = weight_param, bias_param

    return C.times(input_var, weight_param) + bias_param

在线性代数中,当将2个矩阵相乘时,只有在内部尺寸匹配时才有意义。更明确地说,左侧的第二维必须等于右侧的第一维。

在此功能中,'次'的第二(右)参数。 function是' weight_param',它的第一个维度设置为与第一个(左)参数的第一个维度相同。这不应该起作用,因为内部尺寸不匹配。

我不确定input_var是(n x 2)还是(2 x n),但无论哪种方式都会导致错误。如果是(n×2)则weight_param是(n×2)并且(n×2)*(n×2)不应该计算。如果是(2 x n)则weight_param为(2 x 2)且(2 x n)*(2 x 2)不应计算。

但不知怎的,这运行得很好。更令人困惑的是,如果我将函数的最后一行更改为

return C.times_transpose(input_var, weight_param) + bias_param

它产生 exaclty 相同的结果。

那么这里发生了什么?为什么这样做?为什么转置版本会产生相同的结果?

PS:我和cntk同时教我自己的python,所以这些观察结果可能是关于python的。让我知道。

2 个答案:

答案 0 :(得分:0)

input_var为(n x 2),其中n代表批处理轴。 如果打印input_var,将得到类似Input('Input7', [#], [2])的信息,#表示批处理轴。

input_var.shape[0]返回2,因此weight_param的第一维为2(weight_param没有批处理轴,因为它是参数,而不是变量)。

所以内部尺寸匹配。

C.times_transpose产生相同的结果,因为在示例中output_dim也恰好是2。

答案 1 :(得分:-1)

您所关注的cntk教程仅说明了如何构建逻辑回归模型,向其提供数据并进行预测。代码并不是那么详尽(您可能会发现变量“功能”和“功能”不好等...) 您应该始终打印变量和张量的形状以使其清晰,对于“ times”运算符,简而言之,它会执行以下操作:

时间(A,B)计算A * B

times.transpose_transpose(A,B)计算(A ^ T)* B,内积

您必须始终确保形状,将事情弄清楚非常重要