- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
如何在 MXNET 中创建自定义损失函数?例如,我不想计算一个标签的交叉熵损失(使用标准 mx.sym.SoftmaxOutput 层计算交叉熵损失并返回一个可以作为损失符号传递给拟合函数的符号),而是计算每个可能标签的加权交叉熵损失。 MXNET 教程提到使用
mx.symbol.MakeLoss(scalar_loss_symbol, normalization='batch')
但是,当我使用 MakeLoss
函数时,标准 eval_metric - "acc"
不起作用(显然,因为模型不知道我的预测概率向量是什么)。因此我需要编写自己的eval_metric
。
此外,在预测时,我还需要预测概率向量,除非我将最终概率向量与损失符号和 block_grad
分组,否则无法访问概率向量。
最佳答案
下面的代码是对MXNET教程的修改http://mxnet.io/tutorials/python/mnist.html其中标准 SoftmaxOutput 损失函数被重写为自定义加权损失函数,并编写了所需的自定义 eval_metric。
import logging
logging.getLogger().setLevel(logging.DEBUG)
import mxnet as mx
import numpy as np
mnist = mx.test_utils.get_mnist()
batch_size = 100
weighted_train_labels =
np.zeros((mnist['train_label'].shape[0],np.max(mnist['train_label'])+ 1))
weighted_train_labels[np.arange(mnist['train_label'].shape[0]),mnist['train_label']] = 1
train_iter = mx.io.NDArrayIter(mnist['train_data'], {'label':weighted_train_labels}, batch_size, shuffle=True)
weighted_test_labels = np.zeros((mnist['test_label'].shape[0],np.max(mnist['test_label'])+ 1))
weighted_test_labels[np.arange(mnist['test_label'].shape[0]),mnist['test_label']] = 1
val_iter = mx.io.NDArrayIter(mnist['test_data'], {'label':weighted_test_labels}, batch_size)
data = mx.sym.var('data')
# first conv layer
conv1 = mx.sym.Convolution(data=data, kernel=(5,5), num_filter=20)
tanh1 = mx.sym.Activation(data=conv1, act_type="tanh")
pool1 = mx.sym.Pooling(data=tanh1, pool_type="max", kernel=(2,2), stride=(2,2))
# second conv layer
conv2 = mx.sym.Convolution(data=pool1, kernel=(5,5), num_filter=50)
tanh2 = mx.sym.Activation(data=conv2, act_type="tanh")
pool2 = mx.sym.Pooling(data=tanh2, pool_type="max", kernel=(2,2), stride=(2,2))
# first fullc layer
flatten = mx.sym.flatten(data=pool2)
fc1 = mx.symbol.FullyConnected(data=flatten, num_hidden=500)
tanh3 = mx.sym.Activation(data=fc1, act_type="tanh")
# second fullc
fc2 = mx.sym.FullyConnected(data=tanh3, num_hidden=10)
# softmax loss
#lenet = mx.sym.SoftmaxOutput(data=fc2, name='softmax')
label = mx.sym.var('label')
softmax = mx.sym.log_softmax(data=fc2)
softmax_output = mx.sym.BlockGrad(data = softmax,name = 'softmax')
ce = ce = -mx.sym.sum(mx.sym.sum(mx.sym.broadcast_mul(softmax,label),1))
lenet = mx.symbol.MakeLoss(ce, normalization='batch')
sym = mx.sym.Group([softmax_output,lenet])
print sym.list_outputs
def custom_metric(label,softmax):
return len(np.where(np.argmax(softmax,1)==np.argmax(label,1))[0])/float(label.shape[0])
eval_metrics = mx.metric.CustomMetric(custom_metric,name='custom-accuracy', output_names=['softmax_output'],label_names=['label'])
lenet_model = mx.mod.Module(symbol=sym, context=mx.gpu(),data_names=['data'], label_names=['label'])
lenet_model.fit(train_iter,
eval_data=val_iter,
optimizer='sgd',
optimizer_params={'learning_rate':0.1},
eval_metric=eval_metrics,#mx.metric.Loss(),#'acc',
#batch_end_callback = mx.callback.Speedometer(batch_size, 100),
num_epoch=10)
关于MXNET 自定义损失函数和 eval_metric,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45809154/
如何在 MXNET 中创建自定义损失函数?例如,我不想计算一个标签的交叉熵损失(使用标准 mx.sym.SoftmaxOutput 层计算交叉熵损失并返回一个可以作为损失符号传递给拟合函数的符号),而
我尝试在 XgBoost 中使用 eval_metric 参数,但收到此错误: TypeError: fit() got an unexpected keyword argument 'eval_me
我正在解决一个问题,并尝试使用 MXNet 来解决。我试图在代码中使用自定义指标。相同的代码是: def calculate_sales_from_bucket(bucketArray): r
我正在尝试使用 XGBoost ,并将 eval_metric 优化为 auc(如 here 所述)。 这在直接使用分类器时工作正常,但在我尝试将其用作 pipeline 时失败了. 将 .fit 参
选择 auc、error 或 logloss 作为 XGBoost 的 eval_metric 对其性能有何影响?假设数据不平衡。它如何影响准确度、召回率和精确度? 最佳答案 在不同的评估矩阵 之间进
我是一名优秀的程序员,十分优秀!