Keras是Python中以CNTK、Tensorflow或者Theano为计算后台的一个深度学习建模环境。相对于其他深度学习的计算软件,如:Tensorflow、Theano、Caffe等,Keras在实际应用中有一些显著的优点,其中最主要的优点就是Keras已经高度模块化了,支持现有的常见模型(CNN、RNN等),更重要的是建模过程相当方便快速,加快了开发速度。

1.核心层(各层函数只介绍一些常用参数,详细参数介绍可查阅Keras文档)

1.1全连接层:神经网络中最常用到的,实现对神经网络里的神经元激活。

Dense(units, activation=’relu’, use_bias=True)

参数说明:

units: 全连接层输出的维度,即下一层神经元的个数。

activation:激活函数,默认使用Relu。

use_bias:是否使用bias偏置项。

1.2激活层:对上一层的输出应用激活函数。

Activation(activation)

参数说明:

Activation:想要使用的激活函数,如:’relu’、’tanh’、‘sigmoid’等。

1.3Dropout层:对上一层的神经元随机选取一定比例的失活,不更新,但是权重仍然保留,防止过拟合。

Dropout(rate)

参数说明:

rate:失活的比例,0-1的浮点数。

1.4Flatten层:将一个维度大于或等于3的高维矩阵,“压扁”为一个二维矩阵。即保留第一个维度(如:batch的个数),然后将剩下维度的值相乘作为“压扁”矩阵的第二个维度。

Flatten()

1.5Reshape层:该层的作用和reshape一样,就是将输入的维度重构成特定的shape。

Reshape(target_shape)

参数说明:

target_shape:目标矩阵的维度,不包含batch样本数。

如我们想要一个9个元素的输入向量重构成一个(None, 3, 3)的二维矩阵:

Reshape((3,3), input_length=(16, ))

1.6卷积层:卷积操作分为一维、二维、三维,分别为Conv1D、Conv2D、Conv3D。一维卷积主要应用于以时间序列数据或文本数据,二维卷积通常应用于图像数据。由于这三种的使用和参数都基本相同,所以主要以处理图像数据的Conv2D进行说明。

Conv2D(filters, kernel_size, strides=(1, 1), padding=’valid’)

参数说明:

filters:卷积核的个数。

kernel_size:卷积核的大小。

strdes:步长,二维中默认为(1, 1),一维默认为1。

Padding:补“0”策略,’valid‘指卷积后的大小与原来的大小可以不同,’same‘则卷积后大小与原来大小一致。

1.7池化层:与卷积层一样,最大统计量池化和平均统计量池化也有三种,分别为MaxPooling1D、MaxPooling2D、MaxPooling3D和AveragePooling1D、AveragePooling2D、AveragePooling3D,由于使用和参数基本相同,所以主要以MaxPooling2D进行说明。

MaxPooling(pool_size=(2,2), strides=None, padding=’valid’)

参数说明:

pool_size:长度为2的整数tuple,表示在横向和纵向的下采样样子,一维则为纵向的下采样因子。

padding:和卷积层的padding一样。

1.8循环层:循环神经网络中的RNN、LSTM和GRU都继承本层,所以该父类的参数同样使用于对应的子类SimpleRNN、LSTM和GRU。

Recurrent(return_sequences=False)

return_sequences:控制返回的类型,“False”返回输出序列的最后一个输出,“True”则返回整个序列。当我们要搭建多层神经网络(如深层LSTM)时,若不是最后一层,则需要将该参数设为True。

1.9嵌入层:该层只能用在模型的第一层,是将所有索引标号的稀疏矩阵映射到致密的低维矩阵。如我们对文本数据进行处理时,我们对每个词编号后,我们希望将词编号变成词向量就可以使用嵌入层。

Embedding(input_dim, output_dim, input_length)

参数说明:

Input_dim:大于或等于0的整数,字典的长度即输入数据的个数。

output_dim:输出的维度,如词向量的维度。

input_length:当输入序列的长度为固定时为该长度,然后要在该层后加上Flatten层,然后再加上Dense层,则必须指定该参数,否则Dense层无法自动推断输出的维度。

该层可能有点费解,举个例子,当我们有一个文本,该文本有100句话,我们已经通过一系列操作,使得文本变成一个(100,32)矩阵,每行代表一句话,每个元素代表一个词,我们希望将该词变为64维的词向量:

Embedding(100, 64, input_length=32)

则输出的矩阵的shape变为(100, 32, 64):即每个词已经变成一个64维的词向量。

2.Keras模型搭建

讲完了一些常用层的语法后,通过模型搭建来说明Keras的方便性。Keras中设定了两类深度学习的模型,一类是序列模型(Sequential类);一类是通用模型(Model类),接下来我们通过搭建下图模型进行讲解。

假设我们有一个两层神经网络,其中输入层为784个神经元,隐藏层为32个神经元,输出层为10个神经元,隐藏层使用relu激活函数,输出层使用softmax激活函数。分别使用序列模型和通用模型实现如下:

下图是通用模型实现。

使用通用模型,首先要使用Input函数将输入转化为一个tensor,然后将每一层用变量存储后,作为下一层的参数,最后使用Model类将输入和输出作为参数即可搭建模型。

从以上两类模型的简单搭建,都可以发现Keras在搭建模型比起Tensorflow等简单太多了,如Tensorflow需要定义每一层的权重矩阵,输入用占位符等,这些在Keras中都不需要,我们只要在第一层定义输入维度,其他层定义输出维度就可以搭建起模型,通俗易懂,方便高效,这是Keras的一个显著的优势。

3.模型优化和训练

3.1compile(optimizer, loss, metrics=None)

参数说明:

optimizer:优化器,如:’SGD‘,’Adam‘等。

loss:定义模型的损失函数,如:’mse’,’mae‘等。

metric:模型的评价指标,如:’accuracy‘等。

3.2fit(x=None, y=None, batch_size=None, epochs=1, verbose=1, validation_split=0.0)

参数说明:

x:输入数据。

y:标签。

batch_size:梯度下降时每个batch包含的样本数。

epochs:整数,所有样本的训练次数。

verbose:日志显示,0为不显示,1为显示进度条记录,2为每个epochs输出一行记录。

validation_split:0-1的浮点数,切割输入数据的一定比例作为验证集。

import numpy as np
import tensorflow as tf
from keras.datasets import mnist
from keras.models import Sequential
from keras.layers import Dense, Dropout, Flatten
from keras.layers.convolutional import Conv2D, MaxPooling2D
# 获得MNIST数据集
(X_train, y_train), (X_test, y_test) = mnist.load_data()
#print(X_train[0].shape)
#print(y_train[0])
X_train = X_train.reshape(X_train.shape[0], 28, 28, 1).astype('float32')
X_test = X_test.reshape(X_test.shape[0], 28, 28, 1).astype('float32')
# 归一化
X_train /= 255
X_test /= 255# 独热编码
def tran_y(y):y_ohe = np.zeros(10)y_ohe[y] = 1return y_ohe# 把标签进行独热编码
y_train_ohe = np.array([tran_y(y_train[i]) for i in range(len(y_train))])
y_test_ohe = np.array([tran_y(y_test[i]) for i in range(len(y_test))])
print(X_train.shape)
# 创建序列模型
model = Sequential()
# 添加卷积层,64个滤波器,卷积核大小3x3,平移步长1,填充方式:补零,设定输入层维度,激活函数relu
model.add(Conv2D(filters=64, kernel_size=(5, 5), strides=(1, 1), padding='same', input_shape=(28, 28, 1), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))   # 池化层,取2x2格子中的最大值
model.add(Dropout(0.5))                     # dropout层,概率0.5,防止过拟合,提高泛化能力
model.add(Conv2D(128, kernel_size=(3, 3), strides=(1, 1), padding='same', activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.5))
model.add(Conv2D(256, kernel_size=(3, 3), strides=(1, 1), padding='same', activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.5))
# 把当前层节点展平
model.add(Flatten())
# 添加全连接层
model.add(Dense(128, activation='relu'))
model.add(Dense(64, activation='relu'))
model.add(Dense(32, activation='relu'))
model.add(Dense(10, activation='softmax')) # 10个神经元,对应输出层
# 编译模型,指定损失函数(一般分类问题的损失函数都采用交叉熵),优化器,度量
model.compile(loss='categorical_crossentropy', optimizer= 'rmsprop', metrics=['accuracy'])
# 放入批量样本进行,训练模型
model.fit(X_train, y_train_ohe, validation_data=(X_test, y_test_ohe), epochs=20, batch_size=128)
# 在测试集上评估模型的准确度
scores = model.evaluate(X_test, y_test_ohe, verbose=0)

参考资料:http://www.tensorflownews.com/2018/03/15/使用keras进行深度学习%ef%bc%9a%ef%bc%88一%ef%bc%89keras-入门/

keras入门之手写字识别python代码相关推荐

  1. python手写汉字识别_TensorFlow 2.0实践之中文手写字识别

    问题导读: 1.相比于简单minist识别,汉字识别具有哪些难点? 2.如何快速的构建一个OCR网络模型? 3.读取的时候有哪些点需要注意? 4.如何让模型更简单的收敛? 还在玩minist?fash ...

  2. Pytorch入门练习2-kaggle手写字识别神经网络(CNN)实现

    目录 数据预处理 自定义数据集 构建网络结构 对卷积神经网络进行训练和评估 对数据进行预测 保存预测数据,提交代码 SNN由于无法考虑到图片数据的维度关系,在预测精度上会被限制,本章我们采用CNN卷积 ...

  3. Pytorch入门练习-kaggle手写字识别神经网络(SNN)实现

    采用pytorch搭建神经网络,解决kaggle平台手写字识别问题. 数据来源:https://www.kaggle.com/competitions/digit-recognizer/data 参考 ...

  4. 基于tensorflow的MNIST手写字识别

    一.卷积神经网络模型知识要点卷积卷积 1.卷积 2.池化 3.全连接 4.梯度下降法 5.softmax 本次就是用最简单的方法给大家讲解这些概念,因为具体的各种论文网上都有,连推导都有,所以本文主要 ...

  5. TensorFlow基于minist数据集实现手写字识别实战的三个模型

    手写字识别 model1:输入层→全连接→输出层softmax model2:输入层→全连接→隐含层→全连接→输出层softmax model3:输入层→卷积层1→卷积层2→全连接→dropout层→ ...

  6. .net 数字转汉字_TensorFlow 2.0 中文手写字识别(汉字OCR)

    TensorFlow 2.0 中文手写字识别(汉字OCR) 在开始之前,必须要说明的是,本教程完全基于TensorFlow2.0 接口编写,请误与其他古老的教程混为一谈,本教程除了手把手教大家完成这个 ...

  7. 在Windows上调试TensorFlow 2.0 中文手写字识别(汉字OCR)

    在Windows上调试TensorFlow 2.0 中文手写字识别(汉字OCR) 一.环境的搭建 Windows+1080Ti+Cuda10.1 Tsorflow2.0.0 Numpy1.16.4 注 ...

  8. 用TensorFlow教你手写字识别

    1.MNIST数据集 基于MNIST数据集实现手写字识别可谓是深度学习经典入门必会的技能,该数据集由60000张训练图片和10000张测试图片组成,每张均为28*28像素的黑白图片.关于数据集的获取, ...

  9. 基于Opencv的手写字识别

    关于之前已经写过一篇文章了,是关于字符提取的与识别的,本篇文章与上次的文章内容大致一致,只是比对数据库变更了,并且不仅只通过轮廓,还可以通过模板图的方式来进行手写字提取! 函数介绍,以及轮廓提取和识别 ...

最新文章

  1. 【平行驾驶】王飞跃 | 人工智能与智能汽车:在CPSS中驶向第三轴心时代
  2. [转]让.NET应用秒变微服务
  3. 20150210--Smarty1-02
  4. 容器技术之快速了解K8S各抽象资源及组件架构
  5. STM32那点事(4)_DMA(下)
  6. es6 import 命令
  7. 5个让IT开发效率提高200%的工具,最后一个很实用,你用过几个
  8. java面试排序都考哪几种排序_java算法面试题:排序都有哪几种方法?
  9. 杭电计算机2016年机试真题详解
  10. bootchart.jar 编译过程
  11. [转]在WPF中打开网页方法总结
  12. 如何删除Slader 大数智图PDF阅读器
  13. AH快递单打印软件(顺丰申通圆通韵达中通天天EMS) 3.77
  14. Java项目:ssm+mysql医药进销存系统
  15. 2022安全员-B证考试题及在线模拟考试
  16. 计算机二级字处理题根据参考样式,全国计算机等级考试二级officeword字处理题目...
  17. 5个步骤,教你学会商业数据分析
  18. QQ文件传输攻击工具
  19. android连接ios热点超时,Android19连接iOS13个人热点失败
  20. Elasticsearch与java客户端交互的二种使用

热门文章

  1. patent filter
  2. RDC Lent ifm IP Analysis Exercise
  3. what to try on on idiscover?
  4. QUESTION-PRINCIPLE-ANSWER(SOLUTION) RELATIONSHIP
  5. 剑桥大学eap入学测试准备!!!救命稻草
  6. 一切成功的秘诀都蕴含在这个公式里面
  7. C#调用C++ memcpy实现各种参数类型的内存拷贝 VS marshal.copy的实现 效率对比
  8. shell和linux的认识
  9. 以用户体验为导向的设计表现
  10. 实战:搭建CA认证中心,使用CA证书搭建HTTPS