【问题标题】:How to weight observations in mxnet?如何在 mxnet 中加权观察?
【发布时间】:2017-02-17 18:14:53
【问题描述】:

我是神经网络和 R 中的 mxnet 包的新手。我想对我的预测变量进行逻辑回归,因为我的观察结果的概率在 0 和 1 之间变化。我想用一个向量来加权我的观察结果obsWeights 我有,但我不确定在哪里实现权重。 mx.symbol.FullyConnected 中似乎有一个weight= 选项,但如果我尝试weight=obsWeights,我会收到以下错误消息

Error in mx.varg.symbol.FullyConnected(list(...)) : 
  Cannot find argument 'weight', Possible Arguments:
----------------
num_hidden : int, required
  Number of hidden nodes of the output.
no_bias : boolean, optional, default=False
  Whether to disable bias parameter.

我应该如何权衡我的观察结果?这是我目前的代码。

# Prepare data
train.mm = model.matrix(obs ~ . , data = train_data)
train_label = train_data$obs

# Normalize
train.mm = apply(train.mm, 2, function(x) (x-min(x))/(max(x)-min(x)))

# Create MXDataIter compatible iterator
batch_size = 128
train.iter = mx.io.arrayiter(data=t(train.mm), label=train_label, 
                               batch.size=batch_size, shuffle=T)

# Symbolic model definition
data = mx.symbol.Variable('data')
fc1 = mx.symbol.FullyConnected(data=data, num.hidden=128, name='fc1')
act1 = mx.symbol.Activation(data=fc1, act.type='relu', name='act1')
final = mx.symbol.FullyConnected(data=act1, num.hidden=1, name='final')
logistic = mx.symbol.LogisticRegressionOutput(data=final, name='logistic')

# Run model
mxnet_train = mx.model.FeedForward.create(
                symbol = logistic,
                X = train.iter,
                initializer = mx.init.Xavier(rnd_type = 'gaussian', factor_type = 'avg', magnitude = 2),
                num.round = 25)

【问题讨论】:

    标签: r mxnet


    【解决方案1】:

    无论如何,分配全连接权重参数并不是您想要做的。该权重是对层参数的引用;即,你在输入中乘以得到输出值这些是你想要学习的参数值。

    如果您想让某些样本比其他样本更重要,那么您需要调整损失函数。例如,将通常的损失函数乘以您的权重,这样它们对整体平均损失的贡献就不会那么大。

    我不相信标准的 Mxnet 损失函数有分配权重的地方(即 LogisticRegressionOutput 不会涵盖这一点)。但是,您可以制作自己的成本函数。这将涉及通过 sigmoid 激活函数传递您的最后一层,以首先生成通常的逻辑回归输出值。然后将其传递给您定义的损失函数。您可以计算平方误差,但对于逻辑回归,您可能需要使用交叉熵函数:

    l * log(y) + (1 - l) * log(1 - y),

    其中 l 是标签,y 是预测值。

    理想情况下,您应该编写一个有效定义梯度的符号(Mxnet 具有交叉熵函数,但它用于 softmax 输入,而不是二进制输出。您​​可以使用 softmax 将输出转换为两个输出作为替代,但在这种情况下似乎不太容易使用),但最简单的方法是让 Mxnet 对其进行自动比较。然后将交叉熵损失乘以权重。

    我没有测试过这段代码,但你最终会得到这样的东西(这是你在 python 中所做的,在 R 中应该类似):

    label = mx.sym.Variable('label')
    out = mx.sym.Activation(data=final, act_type='sigmoid')
    ce = label * mx.sym.log(out) + (1 - label) * mx.sym.log(1 - out)
    weights = mx.sym.Variable('weights')
    loss = mx.sym.MakeLoss(weigths * ce, normalization='batch')
    

    然后你想将你的权重向量连同你的正常输入数据和标签一起输入到 weights 变量中。

    作为附加提示,具有自定义损失的 mxnet 网络的输出通过 MakeLoss 输出损失,而不是预测。在实践中,您可能需要两者,在这种情况下,将损失与预测的梯度阻止版本分组很有用,这样您就可以获得两者。你会这样做:

    pred_loss = mx.sym.Group([mx.sym.BlockGrad(out), loss])
    

    【讨论】:

    • 这很有意义,我不知道您可以定义自己的损失函数。让我做一些测试,然后我会提供我的结果,以便您可以相应地编辑您的代码,我可以接受这个答案。谢谢!
    猜你喜欢
    • 2012-04-09
    • 1970-01-01
    • 2019-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-23
    相关资源
    最近更新 更多