【问题标题】:Mxnet element wise multiplyMxnet 元素明智地相乘
【发布时间】:2017-08-07 06:49:59
【问题描述】:

在 MXNet 中,如果我想创建一个与每个输入相乘的权重向量,即拥有w*x_i,然后反向传播权重w,我该怎么做?

我试过了:

 y_hat = input
 w1 = mx.sym.Variable("w1")
 y_hat = mx.symbol.broadcast_mul(w1, y_hat)

【问题讨论】:

  • 提供一些输入并显示/询问您想要的预期输出
  • 假设x = [[1, 2, 3], [4, 5, 6]]y=[12, 30],我想要一个参数w,我可以训练它使得y=w*x,所以如果w=2然后w*x=[[2,4,6],[8,10,12]]一个元素明智向量w #size=(num_features, 1)x中样本的每个特征相乘

标签: python mxnet


【解决方案1】:

您可以将计算转换为点积:

x = mx.nd.array([[1, 2, 3], [4, 5, 6]])
w = mx.nd.array([2,2,2])
mx.nd.dot(w, x.T)

如你所愿,将产生 [12. 30.]。

现在只需随机初始化w,计算输出和目标输出之间的损失,然后反向传播。您可以为此使用新的gluon 接口 (http://gluon.mxnet.io/)。

具体来说,让我们看一个适应http://mxnet.io/tutorials/gluon/gluon.htmlhttp://gluon.mxnet.io/P01-C05-autograd.html 的最小示例

准备数据

label = mx.nd.array([12,30])
x = mx.nd.array([[1, 2, 3], [4, 5, 6]])
w = random weights
w.attach_grad()

训练

with autograd.record():
    output = mx.nd.dot(w, x.T)
    loss = gluon.loss.L2Loss(output, label)
    loss.backward()

不要忘记updating the weights 与您在反向传播中计算的梯度。渐变将在w.grad 中提供。在循环中运行训练代码和权重更新,因为单个更新可能不足以收敛。

【讨论】:

  • 有具体的例子吗?我认为你必须初始化(我认为它称为绑定,一些渐变参数,用于任何你想要反向支持的东西).. 它如何知道要反向支持哪个变量?
  • 如果您使用符号 API,确实需要这样做。符号 API 的优点是速度更快。然而,我在上面提到的新引入的 gluon API 更容易开发,所以我建议你首先让你的想法在那里工作。我正在编辑上面的帖子,为示例添加更多信息。
  • 我的大型代码库中没有任何胶子依赖性。胶子可以和 MXNet 一起玩吗?我只想添加一个参数,因此将所有代码库复杂化可能太多了。更不用说,速度对我来说已经是个问题了。只是好奇,我将如何在类符号 API 中做到这一点?
  • Gluon 是 mxnet 的一部分(尽管仅在 master 分支中,直到下一个版本发布)。对于符号 API,您可以采用相同的方法,只需使用 mx.sym.dot 代替 mx.nd.dot 并为 x、y 和 w 定义变量。要获得相对于 w 的梯度,您需要使用模块的 get_input_grads(),因为 w 被视为“输入数据”。或者,要将 mxnet 管理为权重数组,您需要定义自己的运算符。根据您的代码库,将命令式/gluon API 与现有代码库混合可能是最简单的。没有问题。
  • 是否有将 w 定义为运算符的示例?无论哪种方式看起来都很复杂
猜你喜欢
  • 1970-01-01
  • 2015-03-27
  • 1970-01-01
  • 2020-11-07
  • 2021-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多