我正在使用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)
我猜测隐藏层中使用的非线性函数或学习方法可能存在问题。
答案 0 :(得分: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会预测第一个样本,每个类中的概率与不是任何类的成员相同
答案 1 :(得分:0)
我觉得你可以根据上述情况判断模型是否正确学习。
培训实例数量 你有4个训练实例。你构建的神经网络包含3 * 4 + 4 * 4 + 4 * 2 = 36个权重,它必须学习。更不用说你有4种不同类型的输出。网络肯定是不合适的,这可能解释了意想不到的结果。
如何测试模型是否正常工作 如果我想测试一个神经网络是否正确学习,我会测试一个工作数据集(如MNIST)并确保我的模型很有可能学习。 您也可以尝试与您已经编写过的另一个神经网络库或文献进行比较。 如果我真的想要微观,我会使用线性可分数据集进行增强。
如果您的模型仍然没有正确学习,那么我会担心。