我通过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个矩阵相乘时,只有在内部尺寸匹配时才有意义。更明确地说,左侧的第二维必须等于右侧的第一维。
在此函数中,'times'函数的第二(右)参数是'weight_param',它的第一个维度设置为与第一个(左)参数的第一个维度相同。这不应该起作用,因为内部尺寸不匹配。
我不确定input_var是(n x 2)还是(2 x n),但无论哪种方式都会导致错误。如果是(n×2)则weight_param是(n×2)并且(n×2)*(n×2)不应该计算。如果是(2×n)则weight_param是(2×2)并且(2×n)*(2×2)不应该计算。
但不知何故,这运行得很好。更令人困惑的是,如果我将函数的最后一行更改为
return C.times_transpose(input_var, weight_param) + bias_param
它产生完全相同的结果。
那么这里发生了什么?为什么这样做?为什么转置版本会产生相同的结果?
PS:我在和cntk同时教我自己python所以这些观察结果可能是关于python的。让我知道。
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。
你所遵循的cntk教程只是解释如何构建逻辑回归模型,用数据提供它并做预测。代码并不是那么详尽(你可能会发现一个变量“功能”和“功能”,这是不正确的等等...)您应该始终打印变量和张量的形状以使其清晰,对于时间运算符,简而言之,它执行以下操作:
时间(A,B)计算A * B.
times.transpose_transpose(A,B)计算(A ^ T)* B,内积
你必须始终确定形状,明确事情是非常重要的