Keras框架神经网络算法训练MNIST分类准确率(实验) CNN-手写体识别

本文主要是介绍Keras框架神经网络算法训练MNIST分类准确率(实验) CNN-手写体识别,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

MNIST数据集信息参考:http://yann.lecun.com/exdb/mnist/index.html
MNIST是手写数字0~10图片数据集,每一张图片包含28*28个像素。
MNIST训练数据集包含:(1.)60000张图片的像素信息,因为神经网络的输入层表示特征的维度,所以将图像表示成一个[60000,28,28]的pixel张量;(2.)60000张图片的标签信息,表示成一个[60000,10]的矩阵,因为图片的标签是介于0-9的数字,把标签分为10类进行one-hot编码(一个one-hot向量除了某一位数字是1以外,其余维度数字都是0),比如标签0将表示为([1,0,0,0,0,0,0,0,0,0])。
MNIST测试数据集包含10000张图片的像素信息,同训练数据集一样,将这10000张图片的像素信息,表示成一个[10000,28,28]的张量,将10000张图片的标签表示成[10000,10]的矩阵。

此外,还需要把每张图片的像素信息转化成向量形式,即将[28,28]的矩阵按行拉平成[1,784]的向量,即把数据集转成 [60000, 784]才能放到网络中训练。 第一个维度数字用来索引图片,第二个维度数字用来索引每张图片中的像素点。 一般还需要把图片中的像素数组归一化为0-1之间。

1. 修改模型编译compile信息


import numpy as np
from keras.datasets import mnist
from keras.utils import np_utils
from keras.models import Sequential
from keras.layers import Dense
from keras.optimizers import SGD#载入数据
(x_train,y_train),(x_test,y_test)=mnist.load_data()
#60000,28,28
print('x_shape:',x_train.shape)
print('y_shape:',y_train.shape)
#Output:
#x_shape: (60000, 28, 28)
#y_shape: (60000,)
#重新定义数据格式
#60000,784及归一化
x_train=x_train.reshape(x_train.shape[0],-1)/255.0
x_test=x_test.reshape(x_test.shape[0],-1)/255.0#转one-hot标签
y_train=np_utils.to_categorical(y_train,num_classes=10)
y_test=np_utils.to_categorical(y_test,num_classes=10)#创建模型,输入784个神经元,输出10个神经元
model=Sequential([Dense(units=10,input_dim=784,bias='one',activation='softmax')])
#定义优化器
sgd=SGD(lr=0.2)
#定义loss func
model.compile(optimizer=sgd,loss='mse',metrics=['accuracy'])#训练模型
model.fit(x_train,y_train,batch_size=32,epochs=10)#评估模型
loss,accuracy=model.evaluate(x_test,y_test)print('loss:',loss)
print('accuracy:',accuracy)



1.1. 修改目标函数

loss=’mse’ ——> loss=’categorical_crossentropy’


import numpy as np
from keras.datasets import mnist
from keras.utils import np_utils
from keras.models import Sequential
from keras.layers import Dense
from keras.optimizers import SGD
#载入数据
(x_train,y_train),(x_test,y_test)=mnist.load_data()
#重新定义数据格式
#60000,784及归一化
x_train=x_train.reshape(x_train.shape[0],-1)/255.0
x_test=x_test.reshape(x_test.shape[0],-1)/255.0#转one-hot标签
y_train=np_utils.to_categorical(y_train,num_classes=10)
y_test=np_utils.to_categorical(y_test,num_classes=10)#创建模型,输入784个神经元,输出10个神经元
model=Sequential([Dense(units=10,input_dim=784,bias='one',activation='softmax')])
#定义优化器
sgd=SGD(lr=0.2)
#定义loss func
#crossentropy比mse收敛快
model.compile(optimizer=sgd,loss='categorical_crossentropy',metrics=['accuracy'])#训练模型
model.fit(x_train,y_train,batch_size=32,epochs=10)#评估模型
loss,accuracy=model.evaluate(x_test,y_test)print('loss:',loss)
print('accuracy:',accuracy)



1.2. 修改优化器

optimizer=sgd ——> optimizer=adam


import numpy as np
from keras.datasets import mnist
from keras.utils import np_utils
from keras.models import Sequential
from keras.layers import Dense
from keras.optimizers import SGD,Adam   #导入不同优化器
#载入数据
(x_train,y_train),(x_test,y_test)=mnist.load_data()
#重新定义数据格式
#60000,784及归一化
x_train=x_train.reshape(x_train.shape[0],-1)/255.0
x_test=x_test.reshape(x_test.shape[0],-1)/255.0#转one-hot标签
y_train=np_utils.to_categorical(y_train,num_classes=10)
y_test=np_utils.to_categorical(y_test,num_classes=10)#创建模型,输入784个神经元,输出10个神经元
model=Sequential([Dense(units=10,input_dim=784,bias='one',activation='softmax')])
#定义优化器
sgd=SGD(lr=0.2)
adam=Adam(lr=0.001)
#定义loss func
#crossentropy比mse收敛快
model.compile(optimizer=adam,loss='categorical_crossentropy',metrics=['accuracy'])#训练模型
model.fit(x_train,y_train,batch_size=32,epochs=10)#评估模型
loss,accuracy=model.evaluate(x_test,y_test)print('loss:',loss)
print('accuracy:',accuracy)



2. 修改模型网络层信息

import numpy as np
from keras.datasets import mnist
from keras.utils import np_utils
from keras.models import Sequential
from keras.layers import Dense
from keras.optimizers import SGD
#载入数据
(x_train,y_train),(x_test,y_test)=mnist.load_data()
#重新定义数据格式
#60000,784及归一化
x_train=x_train.reshape(x_train.shape[0],-1)/255.0
x_test=x_test.reshape(x_test.shape[0],-1)/255.0#转one-hot标签
y_train=np_utils.to_categorical(y_train,num_classes=10)
y_test=np_utils.to_categorical(y_test,num_classes=10)#创建模型,输入784个神经元,输出10个神经元
model=Sequential([Dense(units=200,input_dim=784,bias='one',activation='tanh'),Dense(units=100,bias='one',activation='tanh'),Dense(units=10,bias='one',activation='softmax')])
#定义优化器
sgd=SGD(lr=0.2)
#定义loss func
model.compile(optimizer=sgd,loss='mse',metrics=['accuracy'])#训练模型
model.fit(x_train,y_train,batch_size=32,epochs=10)#评估模型
loss,accuracy=model.evaluate(x_test,y_test)print('test loss:',loss)
print('test accuracy:',accuracy)print('train loss:',loss)
print('train accuracy:',accuracy)

这里写图片描述

2.1. 防止过拟合,选用Dropout策略
import numpy as np
from keras.datasets import mnist
from keras.utils import np_utils
from keras.models import Sequential
from keras.layers import Dense,Dropout
from keras.optimizers import SGD
#载入数据
(x_train,y_train),(x_test,y_test)=mnist.load_data()
#重新定义数据格式
#60000,784及归一化
x_train=x_train.reshape(x_train.shape[0],-1)/255.0
x_test=x_test.reshape(x_test.shape[0],-1)/255.0#转one-hot标签
y_train=np_utils.to_categorical(y_train,num_classes=10)
y_test=np_utils.to_categorical(y_test,num_classes=10)#创建模型,输入784个神经元,输出10个神经元(Dropout=0.4表示让前一层40%神经元不工作)
model=Sequential([Dense(units=200,input_dim=784,bias='one',activation='tanh'),Dropout(0.4),Dense(units=100,bias='one',activation='tanh'),Dropout(0.4),Dense(units=10,bias='one',activation='softmax')])
#定义优化器
sgd=SGD(lr=0.2)
#定义loss func
model.compile(optimizer=sgd,loss='mse',metrics=['accuracy'])#训练模型
model.fit(x_train,y_train,batch_size=32,epochs=10)#评估模型
loss,accuracy=model.evaluate(x_test,y_test)print('test loss:',loss)
print('test accuracy:',accuracy)print('train loss:',loss)
print('train accuracy:',accuracy)

这里写图片描述

2.2. 防止过拟合,选用正则化方法
import numpy as np
from keras.datasets import mnist
from keras.utils import np_utils
from keras.models import Sequential
from keras.layers import Dense
from keras.optimizers import SGD
from keras.regularizers import l2
#载入数据
(x_train,y_train),(x_test,y_test)=mnist.load_data()
#重新定义数据格式
#60000,784及归一化
x_train=x_train.reshape(x_train.shape[0],-1)/255.0
x_test=x_test.reshape(x_test.shape[0],-1)/255.0#转one-hot标签
y_train=np_utils.to_categorical(y_train,num_classes=10)
y_test=np_utils.to_categorical(y_test,num_classes=10)#创建模型,输入784个神经元,输出10个神经元
model=Sequential([Dense(units=200,input_dim=784,bias='one',activation='tanh',kernel_regularizer=l2(0.003)),Dense(units=100,bias='one',activation='tanh',kernel_regularizer=l2(0.003)),Dense(units=10,bias='one',activation='softmax',kernel_regularizer=l2(0.003))])
#定义优化器
sgd=SGD(lr=0.2)
#定义loss func
model.compile(optimizer=sgd,loss='mse',metrics=['accuracy'])#训练模型
model.fit(x_train,y_train,batch_size=32,epochs=10)#评估模型
loss,accuracy=model.evaluate(x_test,y_test)print('test loss:',loss)
print('test accuracy:',accuracy)print('train loss:',loss)
print('train accuracy:',accuracy)

这里写图片描述

3. 更优模型探索

3.1. RNN
import numpy as np
from keras.datasets import mnist
from keras.utils import np_utils
from keras.models import Sequential
from keras.layers import Dense
from keras.layers.recurrent import SimpleRNN
from keras.optimizers import Adam
# 数据长度-一行有28个像素
input_size = 28
# 序列长度-一共有28行
time_steps = 28
# 隐藏层cell个数
cell_size = 50 # 载入数据
(x_train,y_train),(x_test,y_test) = mnist.load_data()
# (60000,28,28)
x_train = x_train/255.0
x_test = x_test/255.0
# 换one hot格式
y_train = np_utils.to_categorical(y_train,num_classes=10)
y_test = np_utils.to_categorical(y_test,num_classes=10)#one hot# 创建模型
model = Sequential()# 循环神经网络
model.add(SimpleRNN(units = cell_size, # 输出input_shape = (time_steps,input_size), #输入
))# 输出层
model.add(Dense(10,activation='softmax'))# 定义优化器
adam = Adam(lr=1e-4)# 定义优化器,loss function,训练过程中计算准确率
model.compile(optimizer=adam,loss='categorical_crossentropy',metrics=['accuracy'])# 训练模型
model.fit(x_train,y_train,batch_size=64,epochs=10)# 评估模型
loss,accuracy = model.evaluate(x_test,y_test)print('test loss',loss)
print('test accuracy',accuracy)

这里写图片描述

3.2. CNN
import numpy as np
from keras.datasets import mnist
from keras.utils import np_utils
from keras.models import Sequential
from keras.layers import Dense,Dropout,Convolution2D,MaxPooling2D,Flatten
from keras.optimizers import Adam# 载入数据
(x_train,y_train),(x_test,y_test) = mnist.load_data()# (60000,28,28)->(60000,28,28,1)
x_train = x_train.reshape(-1,28,28,1)/255.0
x_test = x_test.reshape(-1,28,28,1)/255.0
# 换one hot格式
y_train = np_utils.to_categorical(y_train,num_classes=10)
y_test = np_utils.to_categorical(y_test,num_classes=10)# 定义顺序模型
model = Sequential()# 第一个卷积层
# input_shape 输入平面
# filters 卷积核/滤波器个数
# kernel_size 卷积窗口大小
# strides 步长
# padding padding方式 same/valid
# activation 激活函数
model.add(Convolution2D(input_shape = (28,28,1),filters = 32,kernel_size = 5,strides = 1,padding = 'same',activation = 'relu'
))
# 第一个池化层
model.add(MaxPooling2D(pool_size = 2,strides = 2,padding = 'same',
))# 第二个卷积层
model.add(Convolution2D(64,5,strides=1,padding='same',activation = 'relu'))
# 第二个池化层
model.add(MaxPooling2D(2,2,'same'))
# 把第二个池化层的输出扁平化为1维
model.add(Flatten())# 第一个全连接层
model.add(Dense(1024,activation = 'relu'))
# Dropout
model.add(Dropout(0.5))
# 第二个全连接层
model.add(Dense(10,activation='softmax'))# 定义优化器
adam = Adam(lr=1e-4)
# 定义优化器,loss function,训练过程中计算准确率
model.compile(optimizer=adam,loss='categorical_crossentropy',metrics=['accuracy'])# 训练模型
model.fit(x_train,y_train,batch_size=64,epochs=10)# 评估模型
loss,accuracy = model.evaluate(x_test,y_test)print('test loss',loss)
print('test accuracy',accuracy)

这里写图片描述

手写数字复杂网络层抽特征可视化工具http://scs.ryerson.ca/~aharley/vis/conv/


这篇关于Keras框架神经网络算法训练MNIST分类准确率(实验) CNN-手写体识别的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/218217

相关文章

不懂推荐算法也能设计推荐系统

本文以商业化应用推荐为例,告诉我们不懂推荐算法的产品,也能从产品侧出发, 设计出一款不错的推荐系统。 相信很多新手产品,看到算法二字,多是懵圈的。 什么排序算法、最短路径等都是相对传统的算法(注:传统是指科班出身的产品都会接触过)。但对于推荐算法,多数产品对着网上搜到的资源,都会无从下手。特别当某些推荐算法 和 “AI”扯上关系后,更是加大了理解的难度。 但,不了解推荐算法,就无法做推荐系

基于人工智能的图像分类系统

目录 引言项目背景环境准备 硬件要求软件安装与配置系统设计 系统架构关键技术代码示例 数据预处理模型训练模型预测应用场景结论 1. 引言 图像分类是计算机视觉中的一个重要任务,目标是自动识别图像中的对象类别。通过卷积神经网络(CNN)等深度学习技术,我们可以构建高效的图像分类系统,广泛应用于自动驾驶、医疗影像诊断、监控分析等领域。本文将介绍如何构建一个基于人工智能的图像分类系统,包括环境

康拓展开(hash算法中会用到)

康拓展开是一个全排列到一个自然数的双射(也就是某个全排列与某个自然数一一对应) 公式: X=a[n]*(n-1)!+a[n-1]*(n-2)!+...+a[i]*(i-1)!+...+a[1]*0! 其中,a[i]为整数,并且0<=a[i]<i,1<=i<=n。(a[i]在不同应用中的含义不同); 典型应用: 计算当前排列在所有由小到大全排列中的顺序,也就是说求当前排列是第

认识、理解、分类——acm之搜索

普通搜索方法有两种:1、广度优先搜索;2、深度优先搜索; 更多搜索方法: 3、双向广度优先搜索; 4、启发式搜索(包括A*算法等); 搜索通常会用到的知识点:状态压缩(位压缩,利用hash思想压缩)。

csu 1446 Problem J Modified LCS (扩展欧几里得算法的简单应用)

这是一道扩展欧几里得算法的简单应用题,这题是在湖南多校训练赛中队友ac的一道题,在比赛之后请教了队友,然后自己把它a掉 这也是自己独自做扩展欧几里得算法的题目 题意:把题意转变下就变成了:求d1*x - d2*y = f2 - f1的解,很明显用exgcd来解 下面介绍一下exgcd的一些知识点:求ax + by = c的解 一、首先求ax + by = gcd(a,b)的解 这个

综合安防管理平台LntonAIServer视频监控汇聚抖动检测算法优势

LntonAIServer视频质量诊断功能中的抖动检测是一个专门针对视频稳定性进行分析的功能。抖动通常是指视频帧之间的不必要运动,这种运动可能是由于摄像机的移动、传输中的错误或编解码问题导致的。抖动检测对于确保视频内容的平滑性和观看体验至关重要。 优势 1. 提高图像质量 - 清晰度提升:减少抖动,提高图像的清晰度和细节表现力,使得监控画面更加真实可信。 - 细节增强:在低光条件下,抖

【数据结构】——原来排序算法搞懂这些就行,轻松拿捏

前言:快速排序的实现最重要的是找基准值,下面让我们来了解如何实现找基准值 基准值的注释:在快排的过程中,每一次我们要取一个元素作为枢纽值,以这个数字来将序列划分为两部分。 在此我们采用三数取中法,也就是取左端、中间、右端三个数,然后进行排序,将中间数作为枢纽值。 快速排序实现主框架: //快速排序 void QuickSort(int* arr, int left, int rig

阿里开源语音识别SenseVoiceWindows环境部署

SenseVoice介绍 SenseVoice 专注于高精度多语言语音识别、情感辨识和音频事件检测多语言识别: 采用超过 40 万小时数据训练,支持超过 50 种语言,识别效果上优于 Whisper 模型。富文本识别:具备优秀的情感识别,能够在测试数据上达到和超过目前最佳情感识别模型的效果。支持声音事件检测能力,支持音乐、掌声、笑声、哭声、咳嗽、喷嚏等多种常见人机交互事件进行检测。高效推

poj 3974 and hdu 3068 最长回文串的O(n)解法(Manacher算法)

求一段字符串中的最长回文串。 因为数据量比较大,用原来的O(n^2)会爆。 小白上的O(n^2)解法代码:TLE啦~ #include<stdio.h>#include<string.h>const int Maxn = 1000000;char s[Maxn];int main(){char e[] = {"END"};while(scanf("%s", s) != EO

图神经网络模型介绍(1)

我们将图神经网络分为基于谱域的模型和基于空域的模型,并按照发展顺序详解每个类别中的重要模型。 1.1基于谱域的图神经网络         谱域上的图卷积在图学习迈向深度学习的发展历程中起到了关键的作用。本节主要介绍三个具有代表性的谱域图神经网络:谱图卷积网络、切比雪夫网络和图卷积网络。 (1)谱图卷积网络 卷积定理:函数卷积的傅里叶变换是函数傅里叶变换的乘积,即F{f*g}