CNTK“时代”功能究竟如何运作?

问题描述 投票:4回答:2

我通过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的。让我知道。

python linear-algebra matrix-multiplication cntk
2个回答
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
投票

你所遵循的cntk教程只是解释如何构建逻辑回归模型,用数据提供它并做预测。代码并不是那么详尽(你可能会发现一个变量“功能”和“功能”,这是不正确的等等...)您应该始终打印变量和张量的形状以使其清晰,对于时间运算符,简而言之,它执行以下操作:

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

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

你必须始终确定形状,明确事情是非常重要的

© www.soinside.com 2019 - 2024. All rights reserved.