AlexNet实现花卉识别

本文介绍如何使用AlexNet神经网络模型实现花卉的识别,包括数据预处理、网络结构调整及训练技巧,最终达到78%以上的识别准确率。

AlexNet实现花卉识别

本人水平有限,如有错误,欢迎指出!

1. AlexNet

1.1 简介

​ AlexNet是由UToronto的Alex Krizhevsky、Hinton等人在2012年提出的8层神经网络模型,并获得了ILSVRC12挑战赛ImageNet数据集分类任务的冠军,并推动了神经网络朝更深层的网络模型发展。

1.2 网络结构

在这里插入图片描述

​ AlexNet整体上包含8层,前5层是卷积层,后3层是全连接层。但由于当时计算机硬件性能有限,所以用了两块GPU来跑,而现在的计算机水平可以在单CPU或单GPU上跑(但实践表明,1050Ti的显卡还是跑不动,所以之后就用CPU跑了)。

以上是最初的AlexNet网络模型,但是实战部分采用的数据集图片格式是171 * 171 * 3,并实现5分类,所以需要对网络结构进行调整

(数据集可从https://github.com/NickHan-cs/Deep_Learning_Datasets上下载)

本题采用的网络结构:

图片输入:171 * 171 * 3

卷积层1:使用48个9 * 9 * 3的过滤器,步长为3,padding为valid,输出的图像为55 * 55 * 48,激活函数是relu

最大池化层1:使用3 * 3的过滤器,步长为2,输出图像为27 * 27 * 48

BatchNormalization层1

卷积层2:使用128个5 * 5 * 48的过滤器,步长为1,padding为same,输出的图像为27 * 27 * 128,激活函数是relu

最大池化层2:使用3 * 3的过滤器,步长为2,输出的图像为13 * 13 * 128

卷积层3:使用192个3 * 3 * 128的过滤器,步长为1,padding为same,输出的图像为13 * 13 * 192,激活函数是relu

卷积层4:使用192个3 * 3 * 192的过滤器,步长为1,padding为same,输出的图像为13 * 13 * 192,激活函数是relu

卷积层5:使用128个3 * 3 * 192的过滤器,步长为1,padding为same,输出的图像为13 * 13 * 128,激活函数是relu

最大池化层3:使用3 * 3的过滤器,步长为2,输出的图像为6 * 6 * 128

Flatten层:将图像从3维展平为1维

全连接层:2048个神经元,激活函数是relu

Dropout层:比例为0.5

全连接层:256个神经元,激活函数是relu

Dropout层:比例为0.5

全连接层:5个神经元,激活函数是softmax

2. Tensorflow2实现AlexNet

2.1 读取数据

​ 下载数据集并保存至本地后,通过函数read_img读取数据集。由于不同图片的尺寸不同,统一尺寸为171 * 171 * 3,并将像素缩小到0~1,便于训练。

def read_img(path):
    imgs = []
    labels = []
    cate = [path+x for x in os.listdir(path) if os.path.isdir(path+x)]
    for index, i in enumerate(cate):
        for j in os.listdir(i):
            im = cv2.imread(i + '/' + j)
            img1 = cv2.resize(im, (171, 171)) / 255
            imgs.append(img1)
            labels.append(index)
    return np.asarray(imgs, np.float32), np.asarray(labels, np.int32)


path = r'D:/TensorFlow_datasets/flower_photos/'
data, label = read_img(path)

2.2 划分训练集和测试集

​ 打乱读取的数据集的顺序,取80%作为训练集,20%作为测试集

num_example = data.shape[0]
arr = np.arange(num_example)
np.random.shuffle(arr)
data = data[arr]
label = label[arr]
ratio = 0.8
s = np.int(num_example * ratio)
train_data = data[:s]
train_label = label[:s]
test_data = data[s:
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值