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:

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





