目录
简介
一、【Alexnet网络原理】
1.输入层(Input layer)
2.卷积层(C1)
3.卷积层(C2、C3、C4、C5)
4.全连接层(FC6、FC7)
5.输出层(output layer)
二、【百度平台配置步骤】
三、【数据集运行结果】
四、【实际数据运行结果】
五、【更多细节】
六、【总结与体会】
参考链接
通过手写数字识别任务,了解深度学习中常用的卷积神经网络模型AlexNet的原理和结构,并掌握使用百度AI Studio平台进行模型训练和推理的基本步骤。同时,通过对比实际数据运行结果和理论预期结果,深入理解深度学习模型的优化和调参方法。
1. 了解AlexNet的网络结构和原理,包括卷积层、池化层、全连接层等组成部分;
2. 在百度AI Studio平台上配置环境、上传数据集、定义模型、进行训练和推理;
3. 运行测试数据集并查看实际结果,分析模型性能和效果;
4. 总结遇到的问题和心得体会,深入思考深度学习模型的优化和调参方法。
获得对深度学习中常用卷积神经网络模型AlexNet的深入理解,并掌握在百度AI Studio平台上进行模型训练和推理的基本技能。
PaddlePaddle 2.4.0
环境: Python 3.0
CPU 2 Cores
RAM 8GB
Disk 100GB
AlexNet跟LeNet-5类似也是一个用于图像识别的卷积神经网络,但其网络结构更加复杂,参数更多。
AlexNet的作者是多伦多大学的Alex Krizhevsky等人。Alex Krizhevsky是Hinton的学生。网上流行说 Hinton、LeCun和Bengio是神经网络领域三巨头,LeCun是LeNet5的作者(Yann LeCun)。
AlexNet整体的网络结构包括:
1个输入层(input layer)
5个卷积层(C1、C2、C3、C4、C5)
2个全连接层(FC6、FC7)
1个输出层(output layer)。
AlexNet的输入图像尺寸是224x224x3。但是实际图像尺寸为227x227x3。据说224x224可能是写paper时候的手误或是后来对网络又做了调整。
该层的处理流程是:卷积-->ReLU-->局部响应归一化(LRN)-->池化
对于卷积来说:
输入是227x227x3,使用96个11x11x3的卷积核进行卷积,padding=0,stride=4,根据公式:(input_size + 2 * padding - kernel_size) / stride + 1=(227+2*0-11)/4+1=55,得到输出是55x55x96。
对ReLU激活函数来说:
对于局部响应归一化来说:
局部响应归一化层简称LRN,是在深度学习中提高准确度的技术方法。一般是在激活、池化后进行。LRN对局部神经元的活动创建竞争机制,使得其中响应比较大的值变得相对更大,并抑制其他反馈较小的神经元,增强了模型的泛化能力。
其公式为:
对于池化来说:
使用3x3,stride=2的池化单元进行最大池化操作(max pooling)。这里使用的是重叠池化,即stride小于池化单元的边长。根据公式:(55+2*0-3)/2+1=27,每组得到的输出为27x27x48。
这些个层的处理都同C1方法一样,处理流程是:卷积-->ReLU-->局部响应归一化(LRN)-->池化。
该层的流程为:(卷积)全连接 -->ReLU -->Dropout (卷积)
全连接:输入为6×6×256,使用4096个6×6×256的卷积核进行卷积,由于卷积核尺寸与输入的尺寸完全相同,即卷积核中的每个系数只与输入尺寸的一个像素值相乘一一对应,根据公式:(input_size + 2 * padding - kernel_size) / stride + 1=(6+2*0-6)/1+1=1,得到输出是1x1x4096。既有4096个神经元,该层被称为全连接层。
ReLU:这4096个神经元的运算结果通过ReLU激活函数中。
Dropout:随机的断开全连接层某些神经元的连接,通过不激活某些神经元的方式防止过拟合。4096个神经元也被均分到两块GPU上进行运算。
该层的流程为:(卷积)全连接 -->Softmax
全连接:输入为4096个神经元,输出是1000个神经元。这1000个神经元即对应1000个检测类别。
Softmax:这1000个神经元的运算结果通过Softmax函数中,输出1000个类别对应的预测概率值。
【百度飞桨】https://aistudio.baidu.com/projectoverview/public
点击创建自己的项目
之后给这个项目取个好听的名字,然后添加数据集,搜索官方的MINIST数据集,选择Notebook经典版就好啦。
打开后,就是这样的界面:
点击左上角的启动环境,选择基础版的环境就行。
接下来就需要训练模型,通过以下的代码,在百度飞桨云平台,我们可以云处理数据集MINIST,训练网络,之后将模型的参数保存在指定目录下。
点击左上角的三角符号运行。
训练代码:
import paddle
from paddle.vision.transforms import Normalize
transform = Normalize(mean=[127.5], std=[127.5], data_format='CHW')
# 下载数据集并初始化 DataSet
train_dataset = paddle.vision.datasets.MNIST(mode='train',transform=transform)
test_dataset = paddle.vision.datasets.MNIST(mode='test',transform=transform)
# 打印数据集里图片数量
#print('{} images in train_dataset, {} images intest_dataset'.format(len(train_dataset), len(test_dataset)))
# 模型组网并初始化网络
lenet = paddle.vision.models.LeNet(num_classes=10)
# 可视化模型组网结构和参数
paddle.summary(lenet,(1, 1, 28, 28))
# 封装模型,便于进行后续的训练、评估和推理
model = paddle.Model(lenet)
# 模型训练的配置准备,准备损失函数,优化器和评价指标
model.prepare(paddle.optimizer.Adam(parameters=model.parameters()),
paddle.nn.CrossEntropyLoss(),
paddle.metric.Accuracy())
# 开始训练
model.fit(train_dataset, epochs=5, batch_size=64, verbose=1)
# 保存模型,文件夹会自动创建
model.save('./output/mnist')
点击运行后,界面下方输出实时训练信息(大约需要两分钟),训练结束后,可以看到训练后模型参数保存在目录下:output
然后新建Code片段,输入测试手写数字功能代码,然后将你手写的数字图片上传到百度飞桨平台,新建文件夹my_data【如果不想叫这个需要改写第24行代码的路径】,之后上传你的图片,点击运行。
测试代码:
import paddle
from paddle.vision.transforms import Normalize
import numpy as np
import cv2
transform = Normalize(mean=[127.5], std=[127.5], data_format='CHW')
test_dataset = paddle.vision.datasets.MNIST(mode='test',
transform=transform)
# 模型组网并初始化网络
lenet = paddle.vision.models.LeNet(num_classes=10)
# 封装模型,便于进行后续的训练、评估和推理
model = paddle.Model(lenet)
# 加载模型
model.load('output/mnist')
# 从测试集中取出一张图片
img, label = test_dataset[0]
# 将图片shape从1*28*28变为1*1*28*28,增加一个batch维度,以匹配模型输入格式要求
img_batch = np.expand_dims(img.astype('float32'), axis=0)
# 输入图像处理
# img_6 = cv2.imread("my_data/6.png")
# img_6 = cv2.cvtColor(img_6, cv2.COLOR_RGB2GRAY)
# img_6 = cv2.resize(img_6,(28,28))
# img_6 = np.expand_dims(img_6, 0)
# img_batch = np.expand_dims(img_6, 0)
img_6 = cv2.imread("my_data/5.png",cv2.IMREAD_GRAYSCALE)
img_6 = cv2.resize(img_6, (28, 28))
img_6 = 255- img_6;
# # 可视化图片
from matplotlib import pyplot as plt
# img_6=cv2.cvtColor(img_6,cv2.COLOR_BGR2RGB) # 将颜色通道从BGR改变成RGB
# plt.imshow(img_6)
img_6_np = np.reshape(img_6, (1,28, 28)) # reshape图片数据为模型能识别的格式
print(img_6_np.shape)
plt.imshow(img_6_np[0],cmap='gray')
img_batch = np.expand_dims(img_6_np.astype('float32'), axis=0)
print(img_batch.shape)
# 执行推理并打印结果,此处predict_batch返回的是一个list,取出其中数据获得预测结果
out = model.predict_batch(img_batch)[0]
pred_label = out.argmax()
print('pred label: {}'.format(pred_label))
这里我上传了一张图片名叫5.png的手写数字5图片,通过模型预测,输出预测结果为5,预测结果正确。
5.png
我比较感兴趣的是百度飞桨提供了一个终端:
对于Linux操作系统选手是一个很好的锻炼学习机会,可参考我的学习记录啦:【Ros记录】自用 / Ubuntu / Linux (更新ing)-CSDN博客
成功实现了手写数字识别任务,并通过使用AlexNet模型在百度AI Studio平台上进行了训练和推理。
首通过学习AlexNet的网络结构和原理,对卷积神经网络的工作方式有了更深入的理解。了解到卷积层、池化层和全连接层等组成部分在图像识别任务中的重要作用,能够有效提取图像特征并进行分类。
在配置百度AI Studio平台环境、上传数据集、定义模型等步骤中,遇到了一些问题。例如,环境配置时需要注意选择合适的GPU资源,以加速模型训练过程。此外,数据集的准备和上传也需要仔细检查,确保数据的完整性和正确性。
在模型训练和推理过程中,我发现了优化和调参的重要性。通过调整学习率、批量大小和训练轮数等超参数,可以显著影响模型的性能和收敛速度。同时,还学到了使用验证集进行模型选择和调参的方法,以避免过拟合和欠拟合问题。
总的来说,对深度学习中常用的卷积神经网络模型有了更深入的理解,并掌握了在百度AI Studio平台上进行模型训练和推理的基本技能。通过遇到问题、调试和优化的过程,不仅加深了对模型原理的理解,还提高了解决问题和调参的能力。这对今后在深度学习领域的学习和应用都具有重要意义。
【关于Alexnet】https://zhuanlan.zhihu.com/p/467017218
【百度飞桨】https://aistudio.baidu.com/projectoverview/public
【Linux命令】https://blog.csdn.net/Akaxi1/article/details/133816856?spm=1001.2014.3001.5501
2023.10.26
仙桃数据谷