Python 千层面:隐藏层上的L2正则化从损失函数返回NaN

Python 千层面:隐藏层上的L2正则化从损失函数返回NaN,python,lasagne,Python,Lasagne,我正试图在千层面上构建一个非常简单的三层神经网络。30个输入神经元,10个神经元隐藏层,1个神经元输出层。我用的是二元熵损失函数和S形非线性。我想对进入输出层的边进行l1正则化,对从输入到隐藏层的边进行l2正则化。我使用的代码与千层面文档的正则化页面上的示例代码非常接近 L1正则化似乎工作得很好,但每当我将L2正则化的惩罚项添加到损失函数时,它都返回nan。当我从下面最后一行中删除术语l2_惩罚*l2_reg_参数时,一切正常。此外,我能够在隐藏层l_hid1上执行L1正则化,没有任何问题 这是

我正试图在千层面上构建一个非常简单的三层神经网络。30个输入神经元,10个神经元隐藏层,1个神经元输出层。我用的是二元熵损失函数和S形非线性。我想对进入输出层的边进行l1正则化,对从输入到隐藏层的边进行l2正则化。我使用的代码与千层面文档的正则化页面上的示例代码非常接近

L1正则化似乎工作得很好,但每当我将L2正则化的惩罚项添加到损失函数时,它都返回nan。当我从下面最后一行中删除术语
l2_惩罚*l2_reg_参数
时,一切正常。此外,我能够在隐藏层
l_hid1
上执行L1正则化,没有任何问题

这是我第一次尝试西亚诺和千层面,所以我觉得错误可能很简单,但我只是不知道怎么看

以下是网络设置代码:

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

任何帮助都将不胜感激。谢谢

您使用的输入数据是
942x1x1x30
?实际上只有942个样本,每个样本有30个功能。从这些例子中,我认为千层面总是希望它的数据是(num_样本x通道x行x列)。你认为奇怪的维度可能会偏离l2正则化吗?奇怪的是,其他一切似乎都正常工作,包括l1正则化器。您正在查看的千层面示例可能涉及图像分类,它们表示为(通道、高度、宽度)。第一个维度是批量大小。因此典型的输入是
(32,3,128,128)
。这将是32个128x128色图像。如果您的数据只有30个要素,那么输入可以是(批量大小,30)。无法访问您的数据,但很难说这是否是问题的原因。它们是图像分类的示例。事实上,我还没有找到很多不是这样的例子。我对此进行了更深入的研究,发现函数
lasagne.regularization.l2
在30x10 numpy数组上运行良好,但当我将隐藏层的30x10权重矩阵赋予该函数时,它会出错:
'/usr/local/lib/python2.7/dist-packages/lasagne/regularization.pyc,在l2(x)80平方l2范数中(元素的平方值之和)81”“-->82返回T.sum(x**2)83类型错误:不支持**或pow()的操作数类型:“CudaNdarray”和“int”
忽略我之前的评论,当我生成错误消息时,我给它的参数是错误的。我回到了不知道为什么这不起作用的状态。我有一部分很想切换到辍学去进行正则化,但另一部分太顽固了。