keras入门之手写字识别python代码
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代码相关推荐
- python手写汉字识别_TensorFlow 2.0实践之中文手写字识别
问题导读: 1.相比于简单minist识别,汉字识别具有哪些难点? 2.如何快速的构建一个OCR网络模型? 3.读取的时候有哪些点需要注意? 4.如何让模型更简单的收敛? 还在玩minist?fash ...
- Pytorch入门练习2-kaggle手写字识别神经网络(CNN)实现
目录 数据预处理 自定义数据集 构建网络结构 对卷积神经网络进行训练和评估 对数据进行预测 保存预测数据,提交代码 SNN由于无法考虑到图片数据的维度关系,在预测精度上会被限制,本章我们采用CNN卷积 ...
- Pytorch入门练习-kaggle手写字识别神经网络(SNN)实现
采用pytorch搭建神经网络,解决kaggle平台手写字识别问题. 数据来源:https://www.kaggle.com/competitions/digit-recognizer/data 参考 ...
- 基于tensorflow的MNIST手写字识别
一.卷积神经网络模型知识要点卷积卷积 1.卷积 2.池化 3.全连接 4.梯度下降法 5.softmax 本次就是用最简单的方法给大家讲解这些概念,因为具体的各种论文网上都有,连推导都有,所以本文主要 ...
- TensorFlow基于minist数据集实现手写字识别实战的三个模型
手写字识别 model1:输入层→全连接→输出层softmax model2:输入层→全连接→隐含层→全连接→输出层softmax model3:输入层→卷积层1→卷积层2→全连接→dropout层→ ...
- .net 数字转汉字_TensorFlow 2.0 中文手写字识别(汉字OCR)
TensorFlow 2.0 中文手写字识别(汉字OCR) 在开始之前,必须要说明的是,本教程完全基于TensorFlow2.0 接口编写,请误与其他古老的教程混为一谈,本教程除了手把手教大家完成这个 ...
- 在Windows上调试TensorFlow 2.0 中文手写字识别(汉字OCR)
在Windows上调试TensorFlow 2.0 中文手写字识别(汉字OCR) 一.环境的搭建 Windows+1080Ti+Cuda10.1 Tsorflow2.0.0 Numpy1.16.4 注 ...
- 用TensorFlow教你手写字识别
1.MNIST数据集 基于MNIST数据集实现手写字识别可谓是深度学习经典入门必会的技能,该数据集由60000张训练图片和10000张测试图片组成,每张均为28*28像素的黑白图片.关于数据集的获取, ...
- 基于Opencv的手写字识别
关于之前已经写过一篇文章了,是关于字符提取的与识别的,本篇文章与上次的文章内容大致一致,只是比对数据库变更了,并且不仅只通过轮廓,还可以通过模板图的方式来进行手写字提取! 函数介绍,以及轮廓提取和识别 ...
最新文章
- 【平行驾驶】王飞跃 | 人工智能与智能汽车:在CPSS中驶向第三轴心时代
- [转]让.NET应用秒变微服务
- 20150210--Smarty1-02
- 容器技术之快速了解K8S各抽象资源及组件架构
- STM32那点事(4)_DMA(下)
- es6 import 命令
- 5个让IT开发效率提高200%的工具,最后一个很实用,你用过几个
- java面试排序都考哪几种排序_java算法面试题:排序都有哪几种方法?
- 杭电计算机2016年机试真题详解
- bootchart.jar 编译过程
- [转]在WPF中打开网页方法总结
- 如何删除Slader 大数智图PDF阅读器
- AH快递单打印软件(顺丰申通圆通韵达中通天天EMS) 3.77
- Java项目:ssm+mysql医药进销存系统
- 2022安全员-B证考试题及在线模拟考试
- 计算机二级字处理题根据参考样式,全国计算机等级考试二级officeword字处理题目...
- 5个步骤,教你学会商业数据分析
- QQ文件传输攻击工具
- android连接ios热点超时,Android19连接iOS13个人热点失败
- Elasticsearch与java客户端交互的二种使用
热门文章
- patent filter
- RDC Lent ifm IP Analysis Exercise
- what to try on on idiscover?
- QUESTION-PRINCIPLE-ANSWER(SOLUTION) RELATIONSHIP
- 剑桥大学eap入学测试准备!!!救命稻草
- 一切成功的秘诀都蕴含在这个公式里面
- C#调用C++ memcpy实现各种参数类型的内存拷贝 VS marshal.copy的实现 效率对比
- shell和linux的认识
- 以用户体验为导向的设计表现
- 实战:搭建CA认证中心,使用CA证书搭建HTTPS