第一个深度学习笔记吧,看书有一阵子了,对理论知识仍然稀里糊涂的,不过一边实操一边记笔记一边查资料,希望逐步再深入到理论里去,凡事开头难,也不怕他人笑话。一般深度学习都是从手写数字识别开始的。
深度学习的简单步骤如下:
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次
#该程序是一个包含两个隐藏层的神经网络
#准备工作
#下载MNIST数据,https://pan.baidu.com/s/1jH6uFFC
#为能够展现Keras流程图,下载相关组件
# pip install graphviz
# pip install pydot
# from keras.utils.visualize_util import plot,已替换成 from keras.utils.vis_utils import plot_model
from __future__ import print_function
import numpy as np
from keras.models import Sequential
from keras.layers.core import Dense, Dropout, Activation
from keras.optimizers import SGD, Adam, RMSprop
from keras.utils import np_utils
from keras.utils.vis_utils import plot_model
np.random.seed(1337) # for reproducibility
#-------------------------------参数定义--------------------------------
batch_size = 128
nb_classes = 10
nb_epoch = 20
#-------------------------------加载数据--------------------------------
#加载MNIST数据集
def load_data(path='mnist.npz'):
# 下载MNIST数据集
# 通过本地目录加载MNIST数据集
# 返回Numpy数组Tuple `(x_train, y_train), (x_test, y_test)`.
path = 'D:/Python36/Coding/PycharmProjects/ttt/mnist.npz'
f = np.load(path)
x_train, y_train = f['x_train'], f['y_train']
x_test, y_test = f['x_test'], f['y_test']
f.close()
return (x_train, y_train), (x_test, y_test)
#通过互联网加载mnist数据集,速度很慢,预计至少一个小时以上,所以修改为从本地加载数据
#(X_train, y_train), (X_test, y_test) = mnist.load_data()
(X_train, y_train), (X_test, y_test) = load_data()
# X_train shape大小为(60000, 28, 28),数据格式为:
# [[[.....]
# [ 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]
# [ 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]
# [ 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]
# [.....]]
# [[][][]]
# ]
# y_train shape为(60000,)数据格式 为 [5 0 4 ... 5 6 8]
#-------------------------------数据转换--------------------------------
#将三维数组降阶为二维数组
X_train = X_train.reshape(60000, 784)
X_test = X_test.reshape(10000, 784)
#X_train reshape后,大小为(60000, 784),数据格式为
#[[0.0. 0. 0. 0. 0. ... 0. 0. 0.01176471 0.4627451 0.99215686 0.6313726 ... 0. 0. 0. 0. 0. 0.][]]
#修改Numpy数组数据类型为float,原来为int类型
X_train = X_train.astype('float32')
X_test = X_test.astype('float32')
#对X_train和X_test进行归一化处理
X_train /= 255
X_test /= 255
#打印X_train和X_test的样本数量
print(X_train.shape[0], 'train samples')
print(X_test.shape[0], 'test samples')
#60000 train samples
#10000 test samples
# 转换类标号
# to_categorical就是将类别向量转换为二进制(只有0和1)的矩阵类型表示。其表现为将原有的类别向量转换为独热编码的形式
#[[][0. 0. 0. 0. 1. 0. 0. 0. 0. 0.][0. 0. 0. 0. 0. 0. 1. 0. 0. 0.][]]
Y_train = np_utils.to_categorical(y_train, nb_classes)
Y_test = np_utils.to_categorical(y_test, nb_classes)
#-------------------------------建立模型--------------------------------
#使用Sequential
#顺序模型是多个网络层的线性堆叠。
model = Sequential()
# keras.layers.core.Dense是标准的一维全连接层
# keras.layers.core.Dense(
# units, #代表该层的输出维度
# activation=None, #激活函数.但是默认 liner
# use_bias=True, #是否使用b
# kernel_initializer='glorot_uniform', #初始化w权重,keras/initializers.py
# bias_initializer='zeros', #初始化b权重
# kernel_regularizer=None, #施加在权重w上的正则项,keras/regularizer.py
# bias_regularizer=None, #施加在偏置向量b上的正则项
# activity_regularizer=None, #施加在输出上的正则项
# kernel_constraint=None, #施加在权重w上的约束项
# bias_constraint=None #施加在偏置b上的约束项
# )
# 模型需要知道输入数据的shape,因此,Sequential的第一层需要接受一个关于输入数据shape的参数,
# 后面的各个层则可以自动的推导出中间数据的shape,因此不需要为每个层都指定这个参数。
model.add(Dense(512, input_shape=(784,)))
# 激活层对一个层的输出施加激活函数
# 激活函数可以通过设置单独的激活层实现,也可以在构造层对象时通过传递activation参数实现。
# 激活函数包括softmax、selu、softplus、softsign、relu、tanh、sigmoid、hard_sigmoid、linear等预定义激活函数
model.add(Activation('relu'))
#Dropout是神经网络和深度学习模型的简单而有效的正则化技术。
#Dropout是在训练期间随机选择的一些神经元忽略的技术。
# 他们随机“Dropout”。这意味着它们对下游神经元的激活的贡献暂时消除,并且在反向过程没有实施任何权重的更新。
model.add(Dropout(0.2))
#
model.add(Dense(512))
model.add(Activation('relu'))
model.add(Dropout(0.2))
model.add(Dense(10))
model.add(Activation('softmax'))
#打印模型
model.summary()
#_________________________________________________________________
#Layer (type) Output Shape Param #
#=================================================================
#dense_1 (Dense) (None, 512) 401920
#_________________________________________________________________
#activation_1 (Activation) (None, 512) 0
#_________________________________________________________________
#dropout_1 (Dropout) (None, 512) 0
#_________________________________________________________________
#dense_2 (Dense) (None, 512) 262656
#_________________________________________________________________
#activation_2 (Activation) (None, 512) 0
#_________________________________________________________________
#dropout_2 (Dropout) (None, 512) 0
#_________________________________________________________________
#dense_3 (Dense) (None, 10) 5130
#_________________________________________________________________
#activation_3 (Activation) (None, 10) 0
#=================================================================
#Total params: 669,706
#Trainable params: 669,706
#Non-trainable params: 0
#_________________________________________________________________
#-------------------------------训练与评估--------------------------------
# 编译模型
# 优化器 optimizer。
# 它可以是现有优化器的字符串标识符,如 rmsprop 或 adagrad,也可以是 Optimizer 类的实例。
# 损失函数 loss,模型试图最小化的目标函数。
# 它可以是现有损失函数的字符串标识符,如 categorical_crossentropy 或 mse,也可以是一个目标函数。
# 评估标准 metrics。
# 对于任何分类问题,你都希望将其设置为 metrics = ['accuracy']。评估标准可以是现有的标准的字符串标识符,也可以是自定义的评估标准函数。
model.compile(loss='categorical_crossentropy',
optimizer=RMSprop(),
metrics=['accuracy'])
# 迭代训练
# Keras 模型在输入数据和标签的 Numpy 矩阵上进行训练。为了训练一个模型,你通常会使用 fit 函数
history = model.fit(X_train, Y_train,
batch_size=batch_size, nb_epoch=nb_epoch,
verbose=1, validation_data=(X_test, Y_test))
#Epoch 1/20 已修改batch_size=10000
#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
#
#10000/60000 [====>.........................] - ETA: 6s - loss: 2.3152 - acc: 0.1043
#20000/60000 [=========>....................] - ETA: 4s - loss: 2.0347 - acc: 0.2875
#30000/60000 [==============>...............] - ETA: 3s - loss: 1.8885 - acc: 0.3784
#40000/60000 [===================>..........] - ETA: 2s - loss: 1.7168 - acc: 0.4421
#50000/60000 [========================>.....] - ETA: 1s - loss: 1.5993 - acc: 0.4859
#60000/60000 [==============================] - 6s 105us/step - loss: 1.5009 - acc: 0.5172 - val_loss: 0.8378 - val_acc: 0.7221
#模型评估
#在测试模式下返回模型的误差值和评估标准值。
score = model.evaluate(X_test, Y_test, verbose=0)
print('Test score:', score[0])
print('Test accuracy:', score[1])
#batch_size=128 and nb_epoch = 20
# Test score: 0.10767863920485406
# Test accuracy: 0.9835
#batch_size=10000 and nb_epoch = 20
#Test score: 0.12268436980396509
#Test accuracy: 0.9599
#batch_size=128 and nb_epoch = 10
#Test score: 0.08377455431289355
#Test accuracy: 0.9821
#-------------------------------神经网络可视化--------------------------------
plot_model(model, to_file='model.png',show_shapes=True)
#-------------------------------模型保存--------------------------------
model.save('mnist-mpl.h5')
#-------------------------------加载模型--------------------------------
#在现有的文件中加载模型
from keras.models import load_model
model = load_model('mnist-mpl.h5')
#打印模型
model.summary()
本文分享自 python与大数据分析 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!