基于mnist数据集-手写数字识别

环境:tensorflow 2.3 pycharm
(mnist)数据集:
链接:https://pan.baidu.com/s/1z7R7_jnDKZm9F7M6n8hiIw
提取码:rn8z

一个简单的手写数字识别

导入库

import tensorflow as tf
import matplotlib.pyplot as plt
import numpy as np
import os

第一个是深度学习框架的库
第二个是绘图库
第三个是数据分析库
第四个是操作系统功能接口库

data = tf.keras.datasets.mnist
(train_images,train_labels),(test_images,test_labels) = data.load_data()

获取mnist数据集,这篇博客也有总结获取mnist数据集的其他方法,这个需要参考你的tensorflow的版本,1.x和2.x的函数有许多是变了

#归一化
train_images = train_images/255.0 
test_images = test_images/255.0
#这一部分是为了测试显示样例所用
#为了产生5*5大小的框框,可以修改
plt.figure(figsize=(5,5))
class_name = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']
for i in range(25):
    plt.subplot(5,5,i+1) #类似matlab中画图的函数,就是5行,5列(这两个是代表将图按照55列的方式显示,i+1表示图存放的位置)
    plt.xticks([])#坐标轴
    plt.yticks([])
    plt.grid(True,axis='x')#网格
    plt.imshow(train_images[i],cmap=plt.cm.binary)#下面详细说说
    plt.xlabel(class_name[train_labels[i]])#去对应的标签
plt.show()#显示图片
plt.imshow(train_images[i],cmap=plt.cm.binary)

第一个参数就是显示第几张图片
第二个参数cmap = colormap
设置cmap的参数有以下几种方式

plt.imshow(image, cmap=plt.get_cmap('gray_r'))
plt.imshow(image, cmap='gray_r')
plt.imshow(image, cmap=plt.cm.binary)

参数作用

训练和保存模型
if os.path.exists('./model.h5'):						#如果该路径下存在该模块,则加载模块,否则训练模型并保存
    model = tf.keras.models.load_model('./model.h5')
else:
    model = tf.keras.models.Sequential([		#搭建网络结构
        tf.keras.layers.Flatten(input_shape=(28,28)),#拉直层可以变换张量的尺寸,把输入特征拉直为一维数组==1*784维向量
        tf.keras.layers.Dense(128,activation='relu'),#第一个参数神经元个数,第二个参数‘激活函数’
        tf.keras.layers.Dropout(0.2),
        tf.keras.layers.Dense(10,activation='softmax')
    ])
    model.compile(optimizer='adam',loss='sparse_categorical_crossentropy',metrics=['accuracy'])
    model.fit(train_images,train_labels,epochs=10)
    model.save('model.h5')

使用tf.keras.model.Sequential搭建分类模型主要包括七个步骤:
1.导入包模块
2.加载数据集
3.切分训练集和验证集
4.对数据进行归一化处理
5.搭建分类模型
6.训练模型
7.将模型应用于测试集
前面4个之前已做,因此到了第5个搭建分类模型以及训练模型

tf.keras.layers.Dense(128,activation='relu'...)

后面还有参数的,只是 你不选择的话就会默认方式:#第一个参数神经元个数,第二个参数‘激活函数’,第三个参数‘正则化方式’
激活函数activation可以选择relu,softmax,sigmod,tanh等等,按照需要选择
正则化方式:tf.keras.regularzers.l1() tf.keras.regularzers.l2()…

tf.keras.layers.Dropout(0.2)

tf.keras.layers.Dropout(rate=0.5, noise_shape=None, seed=None, training=False, name=None)
rate:可选,默认为 0.5,即 dropout rate,如设置为 0.1,则意味着会丢弃 10% 的神经元。
noise_shape:可选,默认为 None,int32 类型的一维 Tensor,它代表了 dropout mask 的 shape,dropout mask 会与 inputs 相乘对 inputs 做转换,例如 inputs 的 shape 为 (batch_size, timesteps, features),但我们想要 droput mask 在所有 timesteps 都是相同的,我们可以设置 noise_shape=[batch_size, 1, features]。
seed:可选,默认为 None,即产生随机熟的种子值。
training:可选,默认为 False,布尔类型,即代表了是否标志位 training 模式。
name:可选,默认为 None,dropout 层的名称。

model.compile(optimizer='adam',loss='sparse_categorical_crossentropy',metrics=['accuracy'])

目标函数,或称损失函数,是网络中的性能函数,也是编译一个模型必须的两个参数之一。
optimizer:优化器,如Adam
loss:计算损失,这里用的是交叉熵损失
metrics: 列表,包含评估模型在训练和测试时的性能的指标,典型用法是metrics=[‘accuracy’]。如果要在多输出模型中为不同的输出指定不同的指标,可向该参数传递一个字典,例如metrics={‘output_a’: ‘accuracy’}

model.fit(train_images,train_labels,epochs=10)

epochs = 10;训练模型10次

ef preprocess_image(image):
    image = tf.image.decode_jpeg(image,channels=1)
    image = tf.image.resize(image,[28,28])
    image = image/255.0
    image = tf.reshape(image,[28,28])
    return image

将图片裁剪至合适大小,并归一化,最后改变形状

def load_and_preprocess_image(path):
    image = tf.io.read_file(path)
    return preprocess_image(image)

读一个路径下的图片
测试:

filepath = './3.jpg'
test_my_image = load_and_preprocess_image(filepath)
test_my_image = (np.expand_dims(test_my_image,0))
my_result = model.predict(test_my_image)
print('自己的图片预测值 = %i ; 文件名 = ', (np.argmax(my_result[0]), filepath))

结果:
在这里插入图片描述
在这里插入图片描述

完整代码

import tensorflow as tf
import matplotlib.pyplot as plt
import numpy as np
import os

data = tf.keras.datasets.mnist
(train_images,train_labels),(test_images,test_labels) = data.load_data()
train_images = train_images/255.0 #归一化
test_images = test_images/255.0

plt.figure(figsize=(5,5))
class_name = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']
for i in range(25):
    plt.subplot(5,5,i+1)
    plt.xticks([])
    plt.yticks([])
    plt.grid(True,axis='x')
    plt.imshow(train_images[i],cmap=plt.cm.binary)
    plt.xlabel(class_name[train_labels[i]])
    # plt.ylabel(class_name[train_labels[i]])
plt.show()
#训练和保存模型
if os.path.exists('./model.h5'):
    model = tf.keras.models.load_model('./model.h5')
else:
    model = tf.keras.models.Sequential([
        tf.keras.layers.Flatten(input_shape=(28,28)),
        tf.keras.layers.Dense(128,activation='relu'),
        tf.keras.layers.Dropout(0.2),
        tf.keras.layers.Dense(10,activation='softmax')
    ])
    model.compile(optimizer='adam',loss='sparse_categorical_crossentropy',metrics=['accuracy'])
    model.fit(train_images,train_labels,epochs=10)
    model.save('model.h5')

print('在测试集上评估')
test_loss,test_acc = model.evaluate(test_images,test_labels,verbose=2)
print('看看测试及测试结果')
predictions = model.predict(test_images)
print('预测值 = %i;正确值 = %i' % (np.argmax(predictions[0]),test_labels[0]))

def preprocess_image(image):
    image = tf.image.decode_jpeg(image,channels=1)
    image = tf.image.resize(image,[28,28])
    image = image/255.0
    image = tf.reshape(image,[28,28])
    return image

def load_and_preprocess_image(path):
    image = tf.io.read_file(path)
    return preprocess_image(image)

filepath = './3.jpg'
test_my_image = load_and_preprocess_image(filepath)
test_my_image = (np.expand_dims(test_my_image,0))
my_result = model.predict(test_my_image)
print('自己的图片预测值 = %i ; 文件名 = ', (np.argmax(my_result[0]), filepath))


  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值