第T1周——实现mnist手写数字识别

目录

一、前言

二、环境

三、前期工作

1、导入依赖项并设置GPU

2、导入数据集

3、归一化

4、可视化图片

5、调整图片格式

四、构建简单的CNN网络

五、编译并训练模型

1、设置超参数

2、编写训练函数

六、预测

七、总结

1、model.compile函数

2、model.fit 函数

3、model.predict 函数

参考


一、 前言

       众所周知,MNIST是机器学习入门的hello word!它是一个大型的手写数字数据库,通常用于训练各种图像处理系统。MNIST 数据库包含 60,000 张训练图像和 10,000 张测试图像。

二、环境

  • 电脑系统:Windows 10
  • 语言环境:Python 3.8.5
  • 编译器:colab在线编译
  • 深度学习环境:TensorFlow

三、 前期工作

1、导入依赖项并设置GPU

import tensorflow as tf
gpus = tf.config.list_physical_devices("GPU")

if gpus:
  gpu0 = gpus[0]
  tf.config.experimental.set_memory_growth(gpu0, True)
  tf.config.set_visible_device([gpu0], "GPU")

2、导入数据集

import tensorflow as tf
from tensorflow.keras import datasets, layers, models
import matplotlib.pyplot as plt

(train_images, train_lables), (test_images, test_lables) = datasets.mnist.load_data()

3、归一化

train_images, test_images = train_images / 255.0, test_images / 255.0

train_images.shape, test_images.shape, train_lables.shape, test_lables.shape

4、可视化图片

#进行图像大小为10宽10长的绘图
plt.figure(figsize = (10, 10))

for i in range(20):
    plt.subplot(2, 10, i + 1)
    #设置不显示x轴刻度
    plt.xticks([])
    #设置不显示y轴刻度
	plt.yticks([])
	#设置不显示子图网络格
	plt.grid(False)
	#图像显示,cmap为颜色绘图,plt.cm.binary为matplotlib.cm的色表
	plt.imshow(train_images[i], cmap = plt.cm.binary)
	#设置x轴为标签显示的图片的对应的数字
	plt.xlabel(train_lables[i])

 5、调整图片格式

train_images = train_images.reshape((60000, 28, 28, 1))
test_images = test_images.reshape((10000, 28, 28, 1))

四、构建简单的CNN网络

#二、构建简单的CNN网络
# 创建并设置卷积神经网络
# 卷积层:通过卷积操作对输入图像进行降维和特征抽取
# 池化层:是一种非线性形式的下采样。主要用于特征降维,压缩数据和参数的数量,减小过拟合,同时提高模型的鲁棒性。
# 全连接层:在经过几个卷积和池化层之后,神经网络中的高级推理通过全连接层来完成。
model = models.Sequential([
    layers.Conv2D(32, (3, 3), activation = 'relu', input_shape= (28, 28, 1)),
    layers.MaxPooling2D((2, 2)),
    layers.Conv2D(64, (3, 3), activation = 'relu'),
    layers.MaxPooling2D((2, 2)),

    layers.Flatten(),
    layers.Dense(64, activation = 'relu'),
    layers.Dense(10)

])

model.summary()
#以上为简单的tf八股模板,可以看B站的北大老师曹健的tensorflow笔记

 

五、编译并训练模型

1、设置超参数

#这里设置优化器,损失函数以及metrics
model.compile(
	#设置优化器为Adam优化器
    optimizer = 'adam',
    #设置损失函数为交叉熵损失函数
    loss = tf.keras.losses.SparseCategoricalCrossentropy(from_logits = True),
    metrics = ['accuracy']
)

 2、编写训练函数

history = model.fit(
    train_images,
    train_lables,
    epochs = 10,
    validation_data = (test_images, test_lables)
)

 

六、预测

plt.imshow(test_images[1])

 

pre = model.predict(test_images)
pre[1]

七、总结

TenosorFlow实现mnist手写数字识别,学习了model.compile、model.fit和model.predict函数。

1、model.compile函数

compile(
    optimizer='rmsprop',
    loss=None,
    metrics=None,
    loss_weights=None,
    weighted_metrics=None,
    run_eagerly=None,
    steps_per_execution=None,
    jit_compile=None,
    **kwargs
)

参数解析:

optimizer字符串(优化器的名称)或优化器实例。参见 tf.keras.optimizers.
loss损失函数。可以是字符串(损失函数的名称),也可以是 tf.keras.losses.Loss 实例。
metrics模型在训练和测试期间要评估的指标列表。
loss_weights指定标量系数(Python 浮点数)以加权不同模型输出的损失贡献的可选列表或字典。
weighted_metrics在训练和测试期间要按sample_weightclass_weight评估和加权的指标列表。
run_eagerly布尔。默认为 False。如果True,则此Model的逻辑将不会包装在 tf.function 中。
steps_per_executionInt. 默认为 1。每个 tf.function 调用期间要运行的批数。在单个 tf.function 调用中运行多个批处理可以大大提高 TPU 或具有较大 Python 开销的小型模型的性能。每次执行最多运行一个完整的纪元。
jit_compile如果True,则使用 XLA 编译模型训练步骤。XLA 是机器学习的优化编译器。
**kwargs仅支持向后兼容的参数。

2、model.fit 函数

fit(
    x=None,
    y=None,
    batch_size=None,
    epochs=1,
    verbose='auto',
    callbacks=None,
    validation_split=0.0,
    validation_data=None,
    shuffle=True,
    class_weight=None,
    sample_weight=None,
    initial_epoch=0,
    steps_per_epoch=None,
    validation_steps=None,
    validation_batch_size=None,
    validation_freq=1,
    max_queue_size=10,
    workers=1,
    use_multiprocessing=False
)

 参数解析

x输入数据。如果模型只有一个输入,那么x的类型是numpy
array,如果模型有多个输入,那么x的类型应当为list,list的元素是对应于各个输入的numpy array
y标签,numpy array
batch_size整数,指定进行梯度下降时每个batch包含的样本数。训练时一个batch的样本会被计算一次梯度下降,使目标函数优化一步。
epochs整数,训练终止时的epoch值,训练将在达到该epoch值时停止,当没有设置initial_epoch时,它就是训练的总轮数,否则训练的总轮数为epochs - inital_epoch
verbose日志显示,0为不在标准输出流输出日志信息,1为输出进度条记录,2为每个epoch输出一行记录
callbackslist,其中的元素是keras.callbacks.Callback的对象。这个list中的回调函数将会在训练过程中的适当时机被调用,参考回调函数
validation_split

0~1之间的浮点数,用来指定训练集的一定比例数据作为验证集。验证集将不参与训练,并在每个epoch结束后测试的模型的指标,如损失函数、精确度等。注意,validation_split的划分在shuffle之前,因此如果你的数据本身是有序的,需要先手工打乱再指定validation_split,否则可能会出现验证集样本不均匀。

validation_data形式为(X,y)的tuple,是指定的验证集。此参数将覆盖validation_spilt。
shuffle布尔值或字符串,一般为布尔值,表示是否在训练过程中随机打乱输入样本的顺序。若为字符串“batch”,则是用来处理HDF5数据的特殊情况,它将在batch内部将数据打乱
class_weight字典,将不同的类别映射为不同的权值,该参数用来在训练过程中调整损失函数(只能用于训练)
sample_weight权值的numpy
array,用于在训练时调整损失函数(仅用于训练)。可以传递一个1D的与样本等长的向量用于对样本进行1对1的加权,或者在面对时序数据时,传递一个的形式为(samples,sequence_length)的矩阵来为每个时间步上的样本赋不同的权。这种情况下请确定在编译模型时添加了sample_weight_mode=’temporal’。
initial_epoch

initial_epoch: 从该参数指定的epoch开始训练,在继续之前的训练时有用。

 fit函数返回一个History的对象,其History.history属性记录了损失函数和其他指标的数值随epoch变化的情况,如果有验证集的话,也包含了验证集的这些指标变化情况。

3、model.predict 函数

predict(
    x,
    batch_size=None,
    verbose='auto',
    steps=None,
    callbacks=None,
    max_queue_size=10,
    workers=1,
    use_multiprocessing=False
)
xx:样本自变量数据X。支持多种类型可以是:
batch_size也是默认32. 当X是Dataset时,不需要指定
verbose提示信息模式。0 or 1. 0代表沉默模式,1代表提示模式(可以输出一些过程信息到控制台)。
steps这个参数规定了预测的步数,决定model预测batch_size*steps数据。一般指定为None,None时忽略。X是 Dataset时, predict() 将对X的所有数据进行预测。
callbacks预测过程中的回调函数设置

参考

model.fit() fit函数

TensorFlow 2.0 model的predict()方法

Model

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值