CNN, gpu, deep network, dropout, ensembles
输入层: 图像像素值
输出层: 0-9
CNN结构很不一样, 输入是一个二维的神经元 (28x28):
保持二维输入(并不像从前转为一维向量)28*28
定义一个n*n(5*5)小部分成为local recepetive fields
小方块连接起来25神经元与下一个神经元相连接
local receptives
构建另外一个神经元, 向右移动一个单元,构建下一层,第一个隐藏层比第一个输入小。
stride:每次移动多少。(每次移动想读多少)
共享权重与偏向;每个activation*w
加权求和共享二十五个权重
从输入到输出,映射方法转化,第一个隐藏层得到三个层。
pooling运算
featrue map是一个模子
减少尺寸24*24,2*2最大值向右移动,长和宽缩小一倍
信息浓缩
取5*5(25个权重)取b,用不同的feature24*24*24
通过某一个初始化权重b,对输入层更新并且得到新的mix。有20个24*24
pooling进一步浓缩图像信息,对于24*24变为2*2的map中每四个像素求最大值,映射到一个新的矩阵中。对于图像来讲图像的相对位置比较重要。
加一百个神经元,和十个神经元两两相连。
import network3 >>> from network3 import Network >>> from network3 import ConvPoolLayer, FullyConnectedLayer, SoftmaxLayer >>> training_data, validation_data, test_data = network3.load_data_shared() >>> mini_batch_size = 10 >>> net = Network([ FullyConnectedLayer(n_in=784, n_out=100), SoftmaxLayer(n_in=100, n_out=10)], mini_batch_size) >>> net.SGD(training_data, 60, mini_batch_size, 0.1, validation_data, test_data) 结果: 97.8 accuracy (上节课98.04% 这次: 没有regularization, 上次有 这次: softmax 上次: sigmoid + cross-entropy
net = Network([ ConvPoolLayer(image_shape=(mini_batch_size, 1, 28, 28), filter_shape=(20, 1, 5, 5), poolsize=(2, 2)), FullyConnectedLayer(n_in=20*12*12, n_out=100), SoftmaxLayer(n_in=100, n_out=10)], mini_batch_size) >>> net.SGD(training_data, 60, mini_batch_size, 0.1, validation_data, test_data) 准确率: 98.78 比上次有显著提高
再加入一层convolution (共两层):
>>> net = Network([ ConvPoolLayer(image_shape=(mini_batch_size, 1, 28, 28), filter_shape=(20, 1, 5, 5), poolsize=(2, 2)), ConvPoolLayer(image_shape=(mini_batch_size, 20, 12, 12), filter_shape=(40, 20, 5, 5), poolsize=(2, 2)), FullyConnectedLayer(n_in=40*4*4, n_out=100), SoftmaxLayer(n_in=100, n_out=10)], mini_batch_size) >>> net.SGD(training_data, 60, mini_batch_size, 0.1, validation_data, test_data) 准确率: 99.06% (再一次刷新)
用Rectified Linear Units代替sigmoid: f(z) = max(0, z)
#不同学习率变化特别大的变化。
net = Network([ ConvPoolLayer(image_shape=(mini_batch_size, 1, 28, 28), filter_shape=(20, 1, 5, 5), poolsize=(2, 2), activation_fn=ReLU), ConvPoolLayer(image_shape=(mini_batch_size, 20, 12, 12), filter_shape=(40, 20, 5, 5), poolsize=(2, 2), activation_fn=ReLU), FullyConnectedLayer(n_in=40*4*4, n_out=100, activation_fn=ReLU), SoftmaxLayer(n_in=100, n_out=10)], mini_batch_size) >>> net.SGD(training_data, 60, mini_batch_size, 0.03, validation_data, test_data, lmbda=0.1) 准确率: 99.23 比之前用sigmoid函数的99.06%稍有提高 库大训练集: 每个图像向上,下,左,右移动一个像素 总训练集: 50,000 * 5 = 250,000
$ python expand_mnist.py
expanded_training_data, _, _ = network3.load_data_shared( "../data/mnist_expanded.pkl.gz") >>> net = Network([ ConvPoolLayer(image_shape=(mini_batch_size, 1, 28, 28), filter_shape=(20, 1, 5, 5), poolsize=(2, 2), activation_fn=ReLU), ConvPoolLayer(image_shape=(mini_batch_size, 20, 12, 12), filter_shape=(40, 20, 5, 5), poolsize=(2, 2), activation_fn=ReLU), FullyConnectedLayer(n_in=40*4*4, n_out=100, activation_fn=ReLU), SoftmaxLayer(n_in=100, n_out=10)], mini_batch_size) >>> net.SGD(expanded_training_data, 60, mini_batch_size, 0.03, validation_data, test_data, lmbda=0.1)
加入一个100个神经元的隐藏层在fully-connected层:
>>> net = Network([ ConvPoolLayer(image_shape=(mini_batch_size, 1, 28, 28), filter_shape=(20, 1, 5, 5), poolsize=(2, 2), activation_fn=ReLU), ConvPoolLayer(image_shape=(mini_batch_size, 20, 12, 12), filter_shape=(40, 20, 5, 5), poolsize=(2, 2), activation_fn=ReLU), FullyConnectedLayer(n_in=40*4*4, n_out=100, activation_fn=ReLU), FullyConnectedLayer(n_in=100, n_out=100, activation_fn=ReLU), SoftmaxLayer(n_in=100, n_out=10)], mini_batch_size) >>> net.SGD(expanded_training_data, 60, mini_batch_size, 0.03, validation_data, test_data, lmbda=0.1) 结果: 99.43%, 并没有大的提高
有可能overfit
加上dropout到最后一个fully-connected层:
>>> expanded_training_data, _, _ = network3.load_data_shared( "../data/mnist_expanded.pkl.gz")
>>> net = Network([
ConvPoolLayer(image_shape=(mini_batch_size, 1, 28, 28), filter_shape=(20, 1, 5, 5), poolsize=(2, 2), activation_fn=ReLU), ConvPoolLayer(image_shape=(mini_batch_size, 20, 12, 12), filter_shape=(40, 20, 5, 5), poolsize=(2, 2), activation_fn=ReLU), FullyConnectedLayer( n_in=40*4*4, n_out=1000, activation_fn=ReLU, p_dropout=0.5), FullyConnectedLayer( n_in=1000, n_out=1000, activation_fn=ReLU, p_dropout=0.5), SoftmaxLayer(n_in=1000, n_out=10, p_dropout=0.5)], mini_batch_size) >>> net.SGD(expanded_training_data, 40, mini_batch_size, 0.03, validation_data, test_data) 结果: 99.60% 显著提高 epochs: 减少到了40 隐藏层有 1000 个神经元 Ensemble of network: 训练多个神经网络, 投票决定结果, 有时会提高
为何只对最后一层用dropout?
CNN本身的convolution层对于overfitting有防止作用: 共享的权重造成convolution filter强迫对于整个图像进行学习
为什么可以克服深度学习里面的一些困难?
用CNN大大减少了参数数量
用dropout减少了overfitting
用Rectified Linear Units代替了sigmoid, 避免了overfitting, 不同层学习率差别大的问题
用GPU计算更快, 每次更新较少, 但是可以训练很多次
目前的深度神经网络有多深? (多少层)?
最多有20多层
如何实现cnn