2

我是神经网络和mxnetR 中的包的新手。我想对我的预测变量进行逻辑回归,因为我的观察结果的概率在 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)
4

1 回答 1

2

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

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

我不相信标准的 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')

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

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

pred_loss = mx.sym.Group([mx.sym.BlockGrad(out), loss])
于 2017-02-19T03:33:17.230 回答