Лазанья: регуляризация L2 на скрытом слое возвращает NaN из функции потерь
Я пытаюсь собрать действительно простую трехслойную нейронную сеть в лазаньи. 30 входных нейронов, 10-нейронный скрытый слой, 1-нейронный выходной слой. Я использую функцию потери двоичной_кросентропии и сигмовидную нелинейность. Я хочу поместить l1 регуляризацию по краям, входящим в выходной слой, и l2 регуляризацию по краям от входа до скрытого слоя. Я использую код, очень близкий к коду примера на странице регуляризации документации lasagne.
Регуляризация L1, кажется, работает нормально, но всякий раз, когда я добавляю штрафной член регуляризации L2 к функции потерь, она возвращает nan. Все отлично работает, когда я удаляю термин l2_penalty * l2_reg_param
из последней строки ниже. Кроме того, я могу выполнить регуляризацию L1 на скрытом слое l_hid1
без проблем.
Это мой первый набег на theano и lasagne, поэтому я чувствую, что ошибка, вероятно, довольно проста, но я просто не знаю достаточно, чтобы ее увидеть.
Вот код настройки сети:
l_in = lasagne.layers.InputLayer(shape=(942,1,1,30),input_var=input_var)
l_hid1 = lasagne.layers.DenseLayer(l_in, num_units=10, nonlinearity=lasagne.nonlinearities.sigmoid, W=lasagne.init.GlorotUniform())
network = lasagne.layers.DenseLayer(l_hid1, num_units=1, nonlinearity=lasagne.nonlinearities.sigmoid)
prediction = lasagne.layers.get_output(network)
l2_penalty = regularize_layer_params(l_hid1, l2)
l1_penalty = regularize_layer_params(network, l1)
loss = lasagne.objectives.binary_crossentropy(prediction, target_var)
loss = loss.mean()
loss = loss + l1_penalty * l1_reg_param + l2_penalty * l2_reg_param
Любая помощь будет принята с благодарностью. Спасибо!!