我一直在Neural Networks and Deep Learning经历Michael Nielsen,并试图在Rust中实现他的basic Python neural network。
特别是我似乎无法复制的一件事是,他在chapter 1中的书中尼尔森指出,如何使用以下方式运行神经网络:
net = network.Network([784, 30, 10])
net.SGD(training_data, 30, 10, 3.0, test_data=test_data)
产生以下输出:
Epoch 0: 9129 / 10000
Epoch 1: 9295 / 10000
Epoch 2: 9348 / 10000
...
Epoch 27: 9528 / 10000
Epoch 28: 9542 / 10000
Epoch 29: 9534 / 10000
当我使用以下命令运行网络时:
let mut neural_network = crate::core::NeuralNetwork::new(&[784,30,10]);
neural_network.train(&mut training_examples, 30, 1, 10usize, 3f64, &testing_examples);
应该注意的是,在尼尔森的情况下,他使用training_data
和test_data
而我使用training_examples
和test_examples
时,它们实际上是相同的,并且都来自{{ 3}}。值得注意的是,我还定义了网络记录其进度的频率,在这种情况下为1
,而在Nielson的代码中,他只记录了每个Epoch
,无论如何。
我得到了(我在输出中加入了cost
,我将Epoch
重命名为Iteration
,因为它对我来说更加直观,而且我输出了第30次迭代/时代):
Iteration: 1, Cost: 0.8194790, Classified: 1032/10000
Iteration: 2, Cost: 0.8194761, Classified: 1032/10000
Iteration: 3, Cost: 0.7396778, Classified: 1032/10000
...
Iteration: 27, Cost: 0.3409329, Classified: 1032/10000
Iteration: 28, Cost: 0.3409495, Classified: 1032/10000
Iteration: 29, Cost: 0.3409575, Classified: 1032/10000
Iteration: 30, Cost: 0.3409564, Classified: 1032/10000
值得注意的是,我发现正确分类的测试示例数量没有变化。但是奇怪的是,尽管正确分类的示例数量没有变化,但是成本似乎急剧下降。
我还要指出,我已经多次运行网络以产生相似的影响,而不仅仅是影响我的输出的权重和连接的随机值。
总体而言,我的网络似乎总体上有所改善,但我的最终印刷说明了这一变化:
Cost: 0.8999986 -> 0.3409564
Classified: 1032 -> 1032
Cost: -0.5590422
Classified: +0
我已经在学习一个简单的XOR门的过程中测试了我的网络,它可以完成。我已经仔细阅读了我的代码和Nielsen的代码,似乎无法发现任何功能差异。尽管我的代码在非功能性方式上明显不同,并且我相信它很容易理解(据我所知)。
我的代码:MNIST database of handwritten digits
[dependencies]
nalgebra = "0.18"
rand = "0.7"
在我的项目中,我包括MNIST测试和训练数据集(对问题中的巨型图像表示歉意):
我想请您原谅我,或者将我做过的任何不好的做法通知我,因为我还没有在Rust中工作过。
我将非常感谢任何人在确定我的代码在功能上与Nielsen有所不同的地方所提供的任何帮助,并导致无法正确识别示例数量的问题。
当然,如果您对我如何改善我的问题有任何建议,我也将不胜感激。
答案 0 :(得分:0)
奇怪的是,尽管正确分类的示例数量没有变化,但成本似乎急剧下降
所以让我们解决这个问题。由于成本函数的性质(抱歉,乳胶太重了),这可能是由于特定于框架的代码实现之外的原因。
从这里开始,我认为您可以理解为什么精度可能不会提高但成本函数可以提高的原因。成本的改进不到3倍,并且幅度远高于e-5或e-6,对于此类任务而言这是正常的。建议您专注于网络体系结构或数据预处理以进一步改善结果。