深度学习-第P1周——实现mnist手写数字识别

一、前言

  • 本文为365天深度学习训练营 中的学习记录博客
  • 原作者:K同学啊

 

二、我的环境

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

三 、前期工作

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、归一化

  • 使不同量纲的特征处于同一数值量级,减少方差大的特征的影响,使模型更准确
  • 加快学习算法的准确性

代码用于在训练机器学习模型之前对图像数据进行像素值归一化。在这种情况下,图像数据被除以255.0。

在许多图像数据集中,像素值的范围通常是从0到255,其中0代表黑色,255代表白色。将像素值除以255.0进行归一化,可以将值缩放到0到1之间。这种归一化通常用于确保所有输入特征(在这种情况下是像素值)都在一个相似的范围内,这有助于模型在训练过程中更快地收敛。

train_images, test_images = train_images / 255.0, test_images / 255.0

print(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])
plt.show()

深度学习-第P1周——实现mnist手写数字识别_第1张图片

5、调整图片格式 

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

四、构建简单的CNN网络

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

#构建简单的CNN网络
# 创建并设置卷积神经网络
# 卷积层:通过卷积操作对输入图像进行降维和特征抽取
# 池化层:是一种非线性形式的下采样。主要用于特征降维,压缩数据和参数的数量,减小过拟合,同时提高模型的鲁棒性。
# 全连接层:在经过几个卷积和池化层之后,神经网络中的高级推理通过全连接层来完成。
model = models.Sequential([
    #设置二维卷积层1,设置32个3*3的卷积核,activation参数将激活函数设置为ReLU函数,input_shape参数将图层的输入形状设置为(28,28,1)
    #ReLU函数作为激活函数可以增强判定函数和整个神经网络的非线性特性,而本身并不会改变卷积层
    #相比较其他函数,ReLU函数更受欢迎,它可以将神经网络的训练速度提升数倍,而并不会对模型的泛化准确度造成显著影响。
    layers.Conv2D(32, (3, 3), activation = 'relu', input_shape= (28, 28, 1)),
    #池化层1,2*2采样
    layers.MaxPooling2D((2, 2)),
    #设置二维卷积层2
    layers.Conv2D(64, (3, 3), activation = 'relu'),
    #池化层2,2*2采样
    layers.MaxPooling2D((2, 2)),

    layers.Flatten(),#Flatten层,连接卷积层与全连接层
    layers.Dense(64, activation = 'relu'),#全连接层,特征进一步提取,64为输出空间的维数,activation参数将激活函数设置为热炉函数
    layers.Dense(10)#输出层,输出预期结果,10为输出空间的维数

])

model.summary()#打印网络结构

 

创建一个顺序对象,并将各个网络层按顺序添加到该对象中。

  • 第一层是一个二维卷积层(Conv2D),具有32个大小为3x3的卷积核。激活函数使用ReLU。
  • 输入层(input_shape)指定输入的形状为28x28的灰度图像(1表示通道数为1)。
  • 然后添加了一个最大池化层(MaxPooling2D),大小为2x2,用于降低特征图的空间维度。
  • 接下来是第二个二维卷积层(Conv2D),具有64个大小为3x3的卷积核,同样使用ReLU作为激活函数。
  • 再次添加一个最大池化层(MaxPooling2D)。

之后通过Flatten层将特征图展开为一个维向量,为全连接层做准备。

接下来是两个全连接层(Dense):

  • 第一个全连接层工具有64个神经元,使用ReLU作为激活函数。
  • 第二个全连接层有10个神经元,对应于输入不同的数量。该层没有指定激活次数,因为在多类别题中,一一般使用Softmax激活函数。

使用model.summary()函数打印模型的摘要信息,其中包含每一层的名称、输出形状和参数数量等。深度学习-第P1周——实现mnist手写数字识别_第2张图片

 深度学习-第P1周——实现mnist手写数字识别_第3张图片

五、编译并训练模型 

关于model.fit(x, y, batch_size, epochs, validation_data)函数

  • x: 输入数据,可以是Numpy数据组、Pandas DataFrame或Tensor对象。它包含训练样例的特征。
  • y: 目标数据,与输入数据相对应的目标变量。可以是Numpy数据组、Pandas Series或Tensor数据。它包含训练样例的标签。
  • batch_size: 整数值,指定每次批次的样本量。在模型更新之前,模型会根据这个值将培训训练数据分配给多个批次。默认值为32。
  • epochs: 整数值,表示训练的轮数。每个epoch表示使用训练数据中的所有样例完成一次前向传播和反向传播的过程。默认值为1。
  • validation_data: 可选参数,用于在训练过程中评估模型的试验数据。可以是包含输入数据和目标数据的元组(x_val, y_val)

model.fit()函数会根据指标的训练数据和参数对模型进行训练。它会自动执行前向传播、计算损失函数、反向传播以及参与数字更新的过程。训练过程中的损失函数和指标的变化会显示在输出中。

在训练过程中,可以通过设置回复函数(如EarlyStopping、ModelCheckpoint等)来监控训练过程并采集相应的操作。

训练完成后,模型的权力和参与数字会被更新,可以使用该模型进行预测或评估任务。

 

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()
train_images, test_images = train_images / 255.0, test_images / 255.0

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

#二、构建简单的CNN网络
# 创建并设置卷积神经网络
# 卷积层:通过卷积操作对输入图像进行降维和特征抽取
# 池化层:是一种非线性形式的下采样。主要用于特征降维,压缩数据和参数的数量,减小过拟合,同时提高模型的鲁棒性。
# 全连接层:在经过几个卷积和池化层之后,神经网络中的高级推理通过全连接层来完成。
model = models.Sequential([
    #设置二维卷积层1,设置32个3*3的卷积核,activation参数将激活函数设置为ReLU函数,input_shape参数将图层的输入形状设置为(28,28,1)
    #ReLU函数作为激活函数可以增强判定函数和整个神经网络的非线性特性,而本身并不会改变卷积层
    #相比较其他函数,ReLU函数更受欢迎,它可以将神经网络的训练速度提升数倍,而并不会对模型的泛化准确度造成显著影响。
    layers.Conv2D(32, (3, 3), activation = 'relu', input_shape= (28, 28, 1)),
    #池化层1,2*2采样
    layers.MaxPooling2D((2, 2)),
    #设置二维卷积层2
    layers.Conv2D(64, (3, 3), activation = 'relu'),
    #池化层2,2*2采样
    layers.MaxPooling2D((2, 2)),

    layers.Flatten(),#Flatten层,连接卷积层与全连接层
    layers.Dense(64, activation = 'relu'),#全连接层,特征进一步提取,64为输出空间的维数,activation参数将激活函数设置为热炉函数
    layers.Dense(10)#输出层,输出预期结果,10为输出空间的维数

])

model.summary()#打印网络结构

'''设置优化器、损失函数以及metrics
'''
model.compile(
	#设置优化器为Adam优化器
    optimizer = 'adam',
    #设置损失函数为交叉熵损失函数tf.keras.losses.SparseCategoricalCrossentropy(from_logits = True)
    #from_logits为True时,会将y_pred转化为概率,此时结果更加稳定
    loss = tf.keras.losses.SparseCategoricalCrossentropy(from_logits = True),
    #设置性能指标列表,将在模型训练时监控列表中的指标
    metrics = ['accuracy']
)
#输入训练数据集、验证数据集以及迭代次数epochs
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)
print(pre[1])

 

你可能感兴趣的:(深度学习,pytorch,人工智能)