2017-02-17 16 views
1

Я новичок в нейронных сетях и в пакете mxnet в Р. Я хочу сделать логистическую регрессию на своих предсказателях, так как мои наблюдения - это вероятности от 0 до 1. Я хотел бы весить свои наблюдения вектором obsWeights У меня есть , но я не уверен, где реализовать вес. Там, кажется, weight= вариант в mx.symbol.FullyConnected, но если я пытаюсь weight=obsWeights я получаю следующее сообщение об ошибкеКак оценивать наблюдения в mxnet?

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

Назначение полностью связанного аргумента веса не является тем, что вы хотите сделать в любом случае. Этот вес является ссылкой на параметры слоя; то есть то, что вы умножаете на входы, чтобы получить выходные значения. Это значения параметров, которые вы пытаетесь узнать.

Если вы хотите, чтобы некоторые образцы имели значение больше, чем другие, вам необходимо настроить функцию потерь. Например, умножьте обычную функцию потерь на ваши веса, чтобы они не вносили столько же вклада в общую среднюю потерю.

Я не верю, что стандартные функции потерь Mxnet имеют место для назначения весов (то есть LogisticRegressionOutput не будет охватывать это). Однако вы можете сделать свою собственную функцию стоимости. Это будет связано с передачей вашего последнего слоя с помощью функции активации сигмоида, чтобы сначала создать обычное выходное значение логистической регрессии. Затем передайте это в функцию потерь, которую вы определяете. Вы могли бы сделать квадратичной ошибки, но для логистической регрессии вы, вероятно, хотите использовать перекрестную функцию энтропии:

л * LOG (у) + (1 - л) * журнал (1 - у),

где 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]) 
+0

Это имеет большой смысл, я не знал, что вы можете определить свои собственные функции потерь. Позвольте мне сделать некоторые тесты, а затем я предоставлю свои результаты, чтобы вы могли редактировать свой код соответственно, и я могу принять этот ответ. Благодаря! – jgadoury

Смежные вопросы