0

我正在使用 Lasagne 包构建一个简单的 3 层神经网络,并在一个非常简单的数据集(只有 4 个示例)上对其进行测试。

X = np.array([[0,0,1],
              [0,1,1],
              [1,0,1],
              [1,1,1]])         

y = np.array([[0, 0],[1, 0],[1, 1],[0, 1]])

然而,它未能学习到这一点,并导致预测:

pred = theano.function([input_var], [prediction])
np.round(pred(X), 2)
array([[[ 0.5 ,  0.5 ],
        [ 0.98,  0.02],
        [ 0.25,  0.75],
        [ 0.25,  0.75]]])

完整代码:

def build_mlp(input_var=None):
    l_in = lasagne.layers.InputLayer(shape=(None, 3), input_var=input_var)
    l_hid1 = lasagne.layers.DenseLayer(
        l_in, num_units=4,
        nonlinearity=lasagne.nonlinearities.rectify,
        W=lasagne.init.GlorotUniform())
    l_hid2 = lasagne.layers.DenseLayer(
        l_hid1, num_units=4,
        nonlinearity=lasagne.nonlinearities.rectify,
        W=lasagne.init.GlorotUniform())
    l_out = lasagne.layers.DenseLayer(
        l_hid2, num_units=2,
        nonlinearity=lasagne.nonlinearities.softmax)
    return l_out

input_var = T.lmatrix('inputs')
target_var = T.lmatrix('targets')

network = build_mlp(input_var)

prediction = lasagne.layers.get_output(network, deterministic=True)
loss = lasagne.objectives.squared_error(prediction, target_var)
loss = loss.mean()

params = lasagne.layers.get_all_params(network, trainable=True)
updates = lasagne.updates.nesterov_momentum(
    loss, params, learning_rate=0.01, momentum=0.9)

train_fn = theano.function([input_var, target_var], loss, updates=updates)
val_fn = theano.function([input_var, target_var], [loss])

训练:

num_epochs = 1000
for epoch in range(num_epochs):
    inputs, targets = (X, y)
    train_fn(inputs, targets)   

我猜隐藏层中使用的非线性函数或学习方法可能存在问题。

4

2 回答 2

0

我觉得你无法根据上述情况来判断模型是否正确学习。

  1. 训练实例数 您有 4 个训练实例。您构建的神经网络包含 3*4 + 4*4 + 4*2 = 36 个必须学习的权重。更不用说你有 4 种不同类型的输出。网络肯定是欠拟合的,这可能解释了意想不到的结果。

  2. 如何测试模型是否正常工作 如果我想测试神经网络是否正确学习,我会在工作数据集(如 MNIST)上进行测试,并确保我的模型以高概率学习。您还可以尝试与您已经编写的另一个神经网络库或文献进行比较。如果我真的想变微,我会使用带有线性可分数据集的 boosting。

如果您的模型仍然无法正确学习,那么我会担心。

于 2016-03-27T06:22:18.720 回答
0

这是我对这个问题的猜测,

首先,我不知道为什么会有这样的输出[0,0]?这是否意味着样本不能归入所有类别?

其次,您在最后一层使用 Softmax,通常用于分类,您是否构建此网络用于分类?如果你对输出感到困惑,输出实际上是每个类的概率所以我认为输出是正确的:

  • 第二个样本预测是[0.98 0.02]这样的,这意味着第二个样本属于第一类,就像你的目标一样[1 0]

  • 第三个样本预测是[0.25 0.75]这样的,这意味着第三个样本属于第二类,就像你的目标一样[1 1](不管你的第一类值,它是分类,所以它会被系统算作正确的分类)

  • 第四个样本预测是[0.25 0.75]这样的,这意味着第四个样本属于第二类,就像你的目标一样[0 1]

  • 第一个样本预测[0.5 0.5]这个对我来说似乎有点令人困惑,所以我猜 Lasagne 会预测第一个样本在每个类中具有相同概率而不是任何类的成员

于 2016-03-27T05:25:00.583 回答