CNTK“时间”功能到底如何工作?

Che*_*vas 5 python linear-algebra matrix-multiplication cntk

通过本教程,我正在自学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
Run Code Online (Sandbox Code Playgroud)

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

在此函数中,“ times”函数的第2个(右)参数为“ weight_param”,其第一个尺寸设置为与第一个(左)参数的第一个尺寸相同。这不会起作用,因为内部尺寸不匹配。

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

但是以某种方式,它运行得很好。更令人困惑的是,如果我将函数的最后一行更改为

return C.times_transpose(input_var, weight_param) + bias_param
Run Code Online (Sandbox Code Playgroud)

它产生exaclty相同的结果。

那么这是怎么回事?为什么这样做?为什么转置版本产生相同的结果?

PS:我正在与cntk同时教自己使用python,因此这些观察结果可能由python引起的。让我知道。

Ser*_*nko 0

input_var为 (nx 2),其中 n 表示批次轴。如果打印input_var,您将得到类似 的内容Input('Input7', [#], [2])#表示批处理轴。

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

所以内部尺寸匹配。

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