第一个深度学习笔记吧,看书有一阵子了,对理论知识仍然稀里糊涂的,不过一边实操一边记笔记一边查资料,希望逐步再深入到理论里去,凡事开头难,也不怕他人笑话。一般深度学习都是从手写数字识别开始的。

关于深度学习系列笔记(一)_深度学习

深度学习的简单步骤如下:

1. 载入训练数据和测试数据

2. 训练数据和测试数据预处理,比如向量化等。

3. 构造学习模型,添加全连接层、激活层、Dropout层

4. 模型编译,选择优化器 optimize、损失函数loss、评估标准 metrics

5. 模型训练,在输入数据和标签的 Numpy 矩阵上进行训练

6. 模型评估,在测试模式下返回模型的误差值和评估标准值

7  最后就是模型可视化、保存模型等等之类的


关于深度学习中epoch、 iteration和batchsize,这三个概念的区别:

(1)batchsize:批大小。在深度学习中,一般采用SGD训练,即每次训练在训练集中取batchsize个样本训练;

     简单点说,批量大小将决定我们一次训练的样本数目。batch_size将影响到模型的优化程度和速度。

     batchsize的正确选择是为了在内存效率和内存容量之间寻找最佳平衡

 本案例batchsize=128,实际执行的时候大概在384和256左右,60000个样本,执行一轮epoch,大概在170次

(2)iteration:1个iteration等于使用batchsize个样本训练一次;

     =全部训练样本/batchsize

 本案例iteration基本为170次

(3)epoch:1个epoch等于使用训练集中的全部样本训练一次;

 本案例的epoch为20次

代码示例

  1. #该程序是一个包含两个隐藏层的神经网络

  2. #准备工作

  3. #下载MNIST数据,https://pan.baidu.com/s/1jH6uFFC

  4. #为能够展现Keras流程图,下载相关组件

  5. # pip install graphviz

  6. # pip install pydot

  7. # from keras.utils.visualize_util import plot,已替换成 from keras.utils.vis_utils import plot_model

  8. from __future__ import print_function

  9. import numpy as np

  10. from keras.models import Sequential

  11. from keras.layers.core import Dense, Dropout, Activation

  12. from keras.optimizers import SGD, Adam, RMSprop

  13. from keras.utils import np_utils

  14. from keras.utils.vis_utils import plot_model

  15. np.random.seed(1337) # for reproducibility

  16. #-------------------------------参数定义--------------------------------

  17. batch_size = 128

  18. nb_classes = 10

  19. nb_epoch = 20

  20. #-------------------------------加载数据--------------------------------

  21. #加载MNIST数据集

  22. def load_data(path='mnist.npz'):

  23. # 下载MNIST数据集

  24. # 通过本地目录加载MNIST数据集

  25. # 返回Numpy数组Tuple `(x_train, y_train), (x_test, y_test)`.

  26. path = 'D:/Python36/Coding/PycharmProjects/ttt/mnist.npz'

  27. f = np.load(path)

  28. x_train, y_train = f['x_train'], f['y_train']

  29. x_test, y_test = f['x_test'], f['y_test']

  30. f.close()

  31. return (x_train, y_train), (x_test, y_test)

  32. #通过互联网加载mnist数据集,速度很慢,预计至少一个小时以上,所以修改为从本地加载数据

  33. #(X_train, y_train), (X_test, y_test) = mnist.load_data()

  34. (X_train, y_train), (X_test, y_test) = load_data()

  35. # X_train shape大小为(60000, 28, 28),数据格式为:

  36. # [[[.....]

  37. # [ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]

  38. # [ 0 0 0 0 0 0 0 0 0 0 3 118 253 161 0 0 0 0 0 0 0 0 0 0 0 0 0 0]

  39. # [ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]

  40. # [.....]]

  41. # [[][][]]

  42. # ]

  43. # y_train shape为(60000,)数据格式 为 [5 0 4 ... 5 6 8]

  44. #-------------------------------数据转换--------------------------------

  45. #将三维数组降阶为二维数组

  46. X_train = X_train.reshape(60000, 784)

  47. X_test = X_test.reshape(10000, 784)

  48. #X_train reshape后,大小为(60000, 784),数据格式为

  49. #[[0.0. 0. 0. 0. 0. ... 0. 0. 0.01176471 0.4627451 0.99215686 0.6313726 ... 0. 0. 0. 0. 0. 0.][]]

  50. #修改Numpy数组数据类型为float,原来为int类型

  51. X_train = X_train.astype('float32')

  52. X_test = X_test.astype('float32')

  53. #对X_train和X_test进行归一化处理

  54. X_train /= 255

  55. X_test /= 255

  56. #打印X_train和X_test的样本数量

  57. print(X_train.shape[0], 'train samples')

  58. print(X_test.shape[0], 'test samples')

  59. #60000 train samples

  60. #10000 test samples

  61. # 转换类标号

  62. # to_categorical就是将类别向量转换为二进制(只有01)的矩阵类型表示。其表现为将原有的类别向量转换为独热编码的形式

  63. #[[][0. 0. 0. 0. 1. 0. 0. 0. 0. 0.][0. 0. 0. 0. 0. 0. 1. 0. 0. 0.][]]

  64. Y_train = np_utils.to_categorical(y_train, nb_classes)

  65. Y_test = np_utils.to_categorical(y_test, nb_classes)

  66. #-------------------------------建立模型--------------------------------

  67. #使用Sequential

  68. #顺序模型是多个网络层的线性堆叠。

  69. model = Sequential()

  70. # keras.layers.core.Dense是标准的一维全连接层

  71. # keras.layers.core.Dense(

  72. # units, #代表该层的输出维度

  73. # activation=None, #激活函数.但是默认 liner

  74. # use_bias=True, #是否使用b

  75. # kernel_initializer='glorot_uniform', #初始化w权重,keras/initializers.py

  76. # bias_initializer='zeros', #初始化b权重

  77. # kernel_regularizer=None, #施加在权重w上的正则项,keras/regularizer.py

  78. # bias_regularizer=None, #施加在偏置向量b上的正则项

  79. # activity_regularizer=None, #施加在输出上的正则项

  80. # kernel_constraint=None, #施加在权重w上的约束项

  81. # bias_constraint=None #施加在偏置b上的约束项

  82. # )

  83. # 模型需要知道输入数据的shape,因此,Sequential的第一层需要接受一个关于输入数据shape的参数,

  84. # 后面的各个层则可以自动的推导出中间数据的shape,因此不需要为每个层都指定这个参数。

  85. model.add(Dense(512, input_shape=(784,)))

  86. # 激活层对一个层的输出施加激活函数

  87. # 激活函数可以通过设置单独的激活层实现,也可以在构造层对象时通过传递activation参数实现。

  88. # 激活函数包括softmax、selu、softplus、softsign、relu、tanh、sigmoid、hard_sigmoid、linear等预定义激活函数

  89. model.add(Activation('relu'))

  90. #Dropout是神经网络和深度学习模型的简单而有效的正则化技术。

  91. #Dropout是在训练期间随机选择的一些神经元忽略的技术。

  92. # 他们随机“Dropout”。这意味着它们对下游神经元的激活的贡献暂时消除,并且在反向过程没有实施任何权重的更新。

  93. model.add(Dropout(0.2))

  94. #

  95. model.add(Dense(512))

  96. model.add(Activation('relu'))

  97. model.add(Dropout(0.2))

  98. model.add(Dense(10))

  99. model.add(Activation('softmax'))

  100. #打印模型

  101. model.summary()

  102. #_________________________________________________________________

  103. #Layer (type) Output Shape Param #

  104. #=================================================================

  105. #dense_1 (Dense) (None, 512) 401920

  106. #_________________________________________________________________

  107. #activation_1 (Activation) (None, 512) 0

  108. #_________________________________________________________________

  109. #dropout_1 (Dropout) (None, 512) 0

  110. #_________________________________________________________________

  111. #dense_2 (Dense) (None, 512) 262656

  112. #_________________________________________________________________

  113. #activation_2 (Activation) (None, 512) 0

  114. #_________________________________________________________________

  115. #dropout_2 (Dropout) (None, 512) 0

  116. #_________________________________________________________________

  117. #dense_3 (Dense) (None, 10) 5130

  118. #_________________________________________________________________

  119. #activation_3 (Activation) (None, 10) 0

  120. #=================================================================

  121. #Total params: 669,706

  122. #Trainable params: 669,706

  123. #Non-trainable params: 0

  124. #_________________________________________________________________

  125. #-------------------------------训练与评估--------------------------------

  126. # 编译模型

  127. # 优化器 optimizer。

  128. # 它可以是现有优化器的字符串标识符,如 rmsprop 或 adagrad,也可以是 Optimizer 类的实例。

  129. # 损失函数 loss,模型试图最小化的目标函数。

  130. # 它可以是现有损失函数的字符串标识符,如 categorical_crossentropy 或 mse,也可以是一个目标函数。

  131. # 评估标准 metrics。

  132. # 对于任何分类问题,你都希望将其设置为 metrics = ['accuracy']。评估标准可以是现有的标准的字符串标识符,也可以是自定义的评估标准函数。

  133. model.compile(loss='categorical_crossentropy',

  134. optimizer=RMSprop(),

  135. metrics=['accuracy'])

  136. # 迭代训练

  137. # Keras 模型在输入数据和标签的 Numpy 矩阵上进行训练。为了训练一个模型,你通常会使用 fit 函数

  138. history = model.fit(X_train, Y_train,

  139. batch_size=batch_size, nb_epoch=nb_epoch,

  140. verbose=1, validation_data=(X_test, Y_test))

  141. #Epoch 1/20 已修改batch_size=10000

  142. #2019-04-09 09:16:20.474056: I tensorflow/core/platform/cpu_feature_guard.cc:141] Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2

  143. #

  144. #10000/60000 [====>.........................] - ETA: 6s - loss: 2.3152 - acc: 0.1043

  145. #20000/60000 [=========>....................] - ETA: 4s - loss: 2.0347 - acc: 0.2875

  146. #30000/60000 [==============>...............] - ETA: 3s - loss: 1.8885 - acc: 0.3784

  147. #40000/60000 [===================>..........] - ETA: 2s - loss: 1.7168 - acc: 0.4421

  148. #50000/60000 [========================>.....] - ETA: 1s - loss: 1.5993 - acc: 0.4859

  149. #60000/60000 [==============================] - 6s 105us/step - loss: 1.5009 - acc: 0.5172 - val_loss: 0.8378 - val_acc: 0.7221

  150. #模型评估

  151. #在测试模式下返回模型的误差值和评估标准值。

  152. score = model.evaluate(X_test, Y_test, verbose=0)

  153. print('Test score:', score[0])

  154. print('Test accuracy:', score[1])

  155. #batch_size=128 and nb_epoch = 20

  156. # Test score: 0.10767863920485406

  157. # Test accuracy: 0.9835

  158. #batch_size=10000 and nb_epoch = 20

  159. #Test score: 0.12268436980396509

  160. #Test accuracy: 0.9599

  161. #batch_size=128 and nb_epoch = 10

  162. #Test score: 0.08377455431289355

  163. #Test accuracy: 0.9821

  164. #-------------------------------神经网络可视化--------------------------------

  165. plot_model(model, to_file='model.png',show_shapes=True)

  166. #-------------------------------模型保存--------------------------------

  167. model.save('mnist-mpl.h5')

  168. #-------------------------------加载模型--------------------------------

  169. #在现有的文件中加载模型

  170. from keras.models import load_model

  171. model = load_model('mnist-mpl.h5')

  172. #打印模型

  173. model.summary()

关于深度学习系列笔记(一)_深度学习_02