如何在mxnet中加权观察?

时间:2017-02-17 18:14:54

标签: r mxnet

我是神经网络的新手和R中的mxnet包。我想对我的预测因子进行逻辑回归,因为我的观察结果是0到1之间的概率。我想要加权我的我有一个向量obsWeights的观察,但我不知道在哪里实现权重。 weight=中似乎有mx.symbol.FullyConnected选项,但如果我尝试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)

1 个答案:

答案 0 :(得分: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')

然后,您需要将权重向量输入权重变量以及正常输入数据和标签。

作为补充说明,通过MakeLoss自定义丢失的mxnet网络输出会输出损失,而不是预测。你可能在实践中想要两者,在这种情况下,将损失与预测的梯度阻止版本分组是有用的,这样你就可以得到两者。你是这样做的:

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