[关闭]
@cleardusk 2015-11-27T11:39:23.000000Z 字数 2770 阅读 1550

DL 在线书籍源码阅读(三)

GjzCVCode


2.2 CNN

该书的 CNN 实现源码是基于 Theano 实现的,源码我只是大概浏览了一遍,没有细看,与之前两个版本的区别有些大。该书作者的实现也借鉴了别人的代码。

This program incorporates ideas from the Theano documentation on
convolutional neural nets (notably,
http://deeplearning.net/tutorial/lenet.html ), from Misha Denil's
implementation of dropout (https://github.com/mdenil/dropout ), and
from Chris Olah (http://colah.github.io )self.

细读代码我还需要花点时间,也需要简单地了解一下 Theano。时间仓促,就大概写一下自己对 DNN 及 CNN 的认识。

2.2.1 DNN

作者在倒数第二章讲的主题是:为什么 Deep neuron network 训练这么难?之前一只用的是单层的隐藏网络,用了多层后,按理说效果应该会好一点,类似这样的网络。

  1. training_data, validation_data, test_data = \
  2. mnist_loader.load_data_wrapper()
  3. net = network2.Network([784, 30, 30, 30, 30, 10], cost=network2.CrossEntropyCost)
  4. net.default_weight_initializer() # use another weight initialization method
  5. net.SGD(training_data, 30, 10, 0.1, lmbda=5.0, evaluation_data=validation_data,
  6. monitor_evaluation_accuracy=True)

但结果是,这样简单地叠加多层网络并不能改善准确率,当然,准确率也没有下降。

在分析 DNN 的训练过程中,会发现有 vanishing gradient 和 exploding gradient 的 problem,就是每一层网络训练的速度不一致,有时候底层比高层网络快,有时候慢。

最后总结了一些 DNN 的阻碍:

2.2.2 CNN

当然,上面提到的一些问题被很好地解决了,比如 DNN 的其中一个模型:CNN。CNN 有三个特征,这也决定了它的网络结构。

完整的一个应用于 MNIST 的一个简单的 CNN model
smple conv

至于为什么 CNN 能工作起来,效果这么好,文中说是 CNN 的 ConvNet 层能够学习数据(这里是图像)的 spatial structure,也就是 feature。从 low level 到 high level 的 feature 的训练,让 CNN 能够发挥作用。当然,我并不是很明白 how it can work so well。

2.2.3 一些 Tricks

2.2.4 Run

之前测试了一两个,发现跑的太慢了,干脆选了个效果最好的扔那跑,结果跑了 6.7 个小时(cpu mode)。test data 上最好的准确率是 99.59%。

代码

  1. def test_best():
  2. """
  3. One epoch takes 1196.6 s.
  4. """
  5. epoch = 20
  6. training_data, validation_data, test_data = network3.load_data_shared()
  7. expanded_training_data, _, _ = network3.load_data_shared(
  8. "../data/mnist_expanded.pkl.gz")
  9. mini_batch_size = 10
  10. net = Network([
  11. ConvPoolLayer(image_shape=(mini_batch_size, 1, 28, 28),
  12. filter_shape=(20, 1, 5, 5),
  13. poolsize=(2, 2),
  14. activation_fn=ReLU),
  15. ConvPoolLayer(image_shape=(mini_batch_size, 20, 12, 12),
  16. filter_shape=(40, 20, 5, 5),
  17. poolsize=(2, 2),
  18. activation_fn=ReLU),
  19. FullyConnectedLayer(n_in=40*4*4, n_out=1000,
  20. activation_fn=ReLU, p_dropout=0.5),
  21. FullyConnectedLayer(n_in=1000, n_out=1000,
  22. activation_fn=ReLU, p_dropout=0.5),
  23. SoftmaxLayer(n_in=1000, n_out=10, p_dropout=0.5)],
  24. mini_batch_size)
  25. time_begin = time.clock()
  26. net.SGD(expanded_training_data, epoch, mini_batch_size, 0.03, validation_data,
  27. test_data)
  28. time_end = time.clock()
  29. print '%d epoch takes %.1f s' % (epoch, (time_end - time_begin))

结果
结果

暂时写到这,有时间会继续更新。


添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注