Мультиклассовая регрессия в nolearn?
Я пытаюсь построить нейронную сеть, используя nolearn, которая может выполнять регрессию на нескольких классах.
Например:
net = NeuralNet(layers=layers_s,
input_shape=(None, 2048),
l1_num_units=8000,
l2_num_units=4000,
l3_num_units=2000,
l4_num_units=1000,
d1_p = 0.25,
d2_p = 0.25,
d3_p = 0.25,
d4_p = 0.1,
output_num_units=noutput,
output_nonlinearity=None,
regression=True,
objective_loss_function=lasagne.objectives.squared_error,
update_learning_rate=theano.shared(float32(0.1)),
update_momentum=theano.shared(float32(0.8)),
on_epoch_finished=[
AdjustVariable('update_learning_rate', start=0.1, stop=0.001),
AdjustVariable('update_momentum', start=0.8, stop=0.999),
EarlyStopping(patience=200),
],
verbose=1,
max_epochs=1000)
noutput - это количество классов, для которых я хочу сделать регрессию, если я установлю это в 1, все будет работать. Когда я использую 26 (количество классов здесь) в качестве output_num_unit, я получаю ошибку измерения Theano. (несоответствие размеров в args to gemm (128,1000)x(1000,26)->(128,1))
Метки Y являются переменными продолжения, соответствующими классу. Я попытался изменить Y-метки (строки, классы), но это означает, что я должен дать многим Y-меткам значение 0 (потому что значение для этого класса неизвестно). Есть ли способ сделать это, не устанавливая y_labels в 0?
1 ответ
Если вы хотите сделать мультиклассовую (или многоуровневую) регрессию с 26 классами, ваш вывод не должен иметь форму (1082,)
, но (1082, 26)
, Чтобы предварительно обработать ваш вывод, вы можете использовать sklearn.preprocessing.label_binarize
который преобразует ваш 1D выход в 2D выход.
Кроме того, ваша выходная нелинейность должна быть функцией softmax, чтобы строки вашего выходного значения были равны 1.