我通过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的。让我知道。答案 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,内积
您必须始终确保形状,将事情弄清楚非常重要