前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >关于深度学习系列笔记(一)

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

作者头像
python与大数据分析
发布2022-03-11 13:28:20
3580
发布2022-03-11 13:28:20
举报
文章被收录于专栏:python与大数据分析

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

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

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次

代码示例

代码语言:javascript
复制
#该程序是一个包含两个隐藏层的神经网络
#准备工作
#下载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()
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-04-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 python与大数据分析 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 代码示例
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档