程敬,女,西安工程大学电子信息学院,2022级研究生
研究方向:电子信息
电子邮件:[email protected]
陈梦丹,女,西安工程大学电子信息学院,2022级硕士研究生,张宏伟人工智能课题组
研究方向:机器视觉与人工智能
电子邮件:[email protected]
LeNet于1998年提出的,是最早的神经网络之一,用于解决手写识别的问题。
传承了LeNet ,AlexNet是于2012年提出的一个深度学习卷积神经网络模型。它在ImageNet图像识别挑战赛中取得了巨大的成功,引领了深度学习在计算机视觉领域的应用潮流。
AlexNet采用了一种前所未有的深度架构,具有8个卷积层和3个全连接层。它的架构相对较深,参数也相对Lenet较大。
(1) 架构:是更大更深的LeNet:10倍的参数个数,260倍的计算复杂度。
(2) Relu:相对于传统的sigmoid函数,ReLU能够更好地解决梯度消失的问题,并且计算速度更快。
(3) MaxPooling:使输出的值更大,梯度更大,训练会相对容易。
(4) 丢弃法:引入了Dropout层,用于减少过拟合。Dropout随机地将一部分神经元的输出置零,可以有效地提高模型的泛化能力。
(5) 数据增强:为了增加训练数据的多样性,AlexNet在训练过程中进行了数据增强操作,如随机裁剪、水平翻转和改变亮度等。
这里给出用Keras框架编写好的完整程序的百度网盘链接:
链接:https://pan.baidu.com/s/1n6HIY3Ius70c_cMa5YNWhA
提取码:lret
这个数据集是Kaggle大数据竞赛的一道赛题,利用给定的数据集,用算法实现猫和狗的识别。 其中包含了猫和狗的图片数量都是12500张且按顺序排序。
(1)、resize(227*227),代码如下:
import cv2
import os
# 数据预处理,把图片数据集的所有图片修剪成固定大小形状
def image_tailor(input_dir, out_dir):
for root, dirs, files in os.walk(input_dir):
for file in files:
# file为root目录中的文件
filepath = os.path.join(root, file) # 连接两个或更多的路径名组件,filepath路径为/root/file
try:
image = cv2.imread(filepath) # 根据输入路径读取照片
dim = (227, 227) # 裁剪的尺寸
resized = cv2.resize(image, dim) # 按比例将原图缩放成227*227
path = os.path.join(out_dir, file) # 保存的路径和相应的文件名
cv2.imwrite(path, resized) # 进行保存
except:
print(filepath)
os.remove(filepath)
cv2.waitKey()
input_patch = 'F:\\data\\kaggle\\test1' # 数据集的地址
out_patch = 'F:\\data\\fixdata\\tailor' # 图片裁剪后保存的地址
image_tailor(input_patch, out_patch)
print('reshape finished')
(2)、重命名:把图片命名为后续代码加载需要的格式,代码如下:
def rename(dir_path):
global j
dir_files=os.listdir(dir_path) #得到该文件夹下所有的文件
for file in dir_files: #这里的file已经是图片的名字了
num = str(j).zfill(5)
j = j + 1
filename = "dog." + num # 修改文件名的格式
file_path=os.path.join(dir_path,file) #路径拼接成绝对路径
new_name=os.path.join(dir_path,filename+".jpg")
os.rename(file_path, new_name)
if __name__ == '__main__':
dir_path = 'E:\\Desktop\\PetImages\\cat_dog_resized\\Dog'
global j
j = 0
rename(dir_path)
(3)、划分数据集:训练集:验证集:测试集=70% : 15% : 15%,结果如下:
在进行训练之前,首先将数据集的内容保存到一个TXT文件中,便于读取,代码如下:
import os
photos = os.listdir("./data/image/train/")
with open("data/dataset.txt","w") as f:
for photo in photos:
name = photo.split(".")[0]
if name=="cat":
f.write(photo + ";0\n")
elif name=="dog":
f.write(photo + ";1\n")
f.close()
在这段代码中,我们给不同的类别打上了标签方便训练,如果是猫,便签为0;如果是狗,标签为1。在运行代码之后,我们就可以看到生成的txt文件如下图所示。
训练50轮的结果:在验证集上达到86%的准确度。
这个平台很完善,操作简单,界面友好。在训练猫狗数据集分类任务时,只需要将处理后的数据传入平台,平台会自动分配训练集、验证集和测试集。接着选择所需要的网络,设置训练轮数和学习率灯参数,就可以直接开始训练,训练完成后经过测试会得到准确度等数据,如下图,我们可以看到使用Alexnet训练的模型准确率为93.69%。
并且该系统还会生成模型对于不同类别检测的准确度及其他的一些参考指标。
还有一些预测错误的图片展示,以方便我们了解到哪些图片是容易识别错误的。
使用Resnet-50进行猫狗数据集分类,可以看到检测的准确率是97.91%,每个图像的平均推理时间是6.86ms。
使用Mobilenet进行猫狗数据集分类,可以看到检测的准确率是97.25%,每个图像的平均推理时间是1.78ms。
(1)、AlexNet(2012)采用了ReLU激活函数和Dropout正则化技术,它深度学习图像分类任务中的突破性成果引领了后续模型的发展。
(2)、ResNet(2015)通过引入残差连接(residual connection)来构建深层网络,解决了深度神经网络训练中的梯度消失问题。
(3)、MobileNet(2017)使用了深度可分离卷积(depthwise separable convolution)来减少模型参数量和计算量,是比较轻量化的模型,适合于实时应用和资源受限的环境。
问题1:ImportError: cannot import name ‘Adam’ from ‘keras.optimizers’.
问题分析:keras 库更新后无法按照原方式导入包,Adam 导入已更改。
解决办法:使用下面两行的代码代替掉第一行的代码。
问题2:AttributeError: module ‘keras.backend’ has no attribute ‘set_image_dim_ordering’.
问题分析:还是keras版本的原因,新版本中image_dim_drdering更改为了image_data_format.
解决办法:使用最后一行的代码代替掉第二行的代码。
[1] Alexnet代码参考:http://t.csdn.cn/o0Bmo
[2] 数据集处理:https://blog.csdn.net/choose_lzn/article/details/89391102