练习4,吴安德(Andrew Ng)在Keras中。

时间:2018-12-06 15:11:36

标签: python machine-learning keras

我正在独自学习一些机器学习,并且正在用Andrew Ng的课程作业(用Python进行练习)。
手动完成fourth exercise之后,我努力在Keras中进行练习,以便与图书馆一起练习。

在本练习中,我们有5000个手写数字图像,范围从0到9。每个图像都是20x20的矩阵。数据集存储在形状为5000x400的矩阵X中(每个图像均已“展开”),标签存储在形状为5000x10的矩阵y中。 y的每一行都是一个热一向量。
对于一个只有一个输入层,一个隐藏层和一个输出层的简单神经网络,练习要求实现反向传播以最大化对数可能性。隐藏层有25个神经元,输出层有10个神经元。我们将Sigmoid用作这两个层的激活。

我在Keras中的代码是

model=Sequential()
model.add(Dense(25,input_shape=(400,),use_bias=True,kernel_regularizer=regularizers.l2(1),activation='sigmoid',kernel_initializer='glorot_uniform'))
model.add(Dense(10,use_bias=True,kernel_regularizer=regularizers.l2(1),activation='sigmoid',kernel_initializer='glorot_uniform'))
model.compile(loss='categorical_crossentropy',optimizer='sgd',metrics=['accuracy'])
model.fit(X, y, batch_size=5000,epochs=100, verbose=1)

由于我希望它与赋值尽可能相似,因此我使用了与赋值相同的初始权重,相同的正则化参数,相同的激活和梯度下降作为优化程序(实际上,赋值使用了截断牛顿法但我认为我的问题不在这里)。

我以为我做的一切都正确,但是当我训练网络时,训练数据集的准确率达到了10%。即使稍微使用参数,精度也不会改变太多。为了更好地理解问题,我使用较小的数据集进行了测试。例如,如果我选择一个包含100个元素的子数据集,其中包含x个零图像和100-x个图像,则训练精度为x%。我的猜测是网络正在优化参数以仅识别第一位数字。
现在我的问题是:我想念什么?为什么这不是上面描述的神经网络的正确实现?

1 个答案:

答案 0 :(得分:1)

如果要在MNIST数据集上进行练习,则要对10位数字进行分类,则有10个类别可以预测。您应该在隐藏层(在您的情况下为第一层)中使用ReLU而不是Sigmoid,并在输出层上使用softmax激活。将分类交叉熵损失函数与adam或sgd优化器一起使用。