环境: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列(这两个是代表将图按照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.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))