首页 > 解决方案 > Andrew Ng 在 Keras 中的练习 4。

问题描述

我正在自己学习一些机器学习,并且正在(使用 Python)练习 Andrew Ng 所教授的课程作业。
手工完成第四个练习后,我硬着头皮在 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 个图像,我将获得 ax% 的训练精度。我的猜测是网络正在优化参数以仅识别第一个数字。
现在我的问题是:我错过了什么?为什么这不是上述神经网络的正确实现?

标签: pythonmachine-learningkeras

解决方案


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


推荐阅读