用PaddlePaddle实现图像分类-AlexNet(动态图版)
2020-04-15 18:29
627 查看
项目简介
本项目使用paddle的动态图机制实现了经典的图像分类网络:AlexNet,并在公开的蔬菜数据集上进行了模型训练以及验证,建议使用GPU来运行本项目。静态图版本请查看:用PaddlePaddle实现图像分类-AlexNet
下载安装命令 ## CPU版本安装命令 pip install -f https://paddlepaddle.org.cn/pip/oschina/cpu paddlepaddle ## GPU版本安装命令 pip install -f https://paddlepaddle.org.cn/pip/oschina/gpu paddlepaddle-gpu
数据集介绍
解压蔬菜数据集,里面包括三个目录,分别是三个类别对应的数据,具体的数据预处理过程见后续介绍
网络结构介绍
AlexNet网络具体结构如下图所示:
原论文中是采取了两块GPU进行交互,所以在图中有两条支路。AlexNet架构有6000万参数和650000个神经元,包含5层卷积网络,其中一些含有max pooling,还有3层全连接层,最后一层的节点数1000个,采用softmax分类
参考链接:AlexNet学习
论文原文:ImageNet Classification with Deep ConvolutionalNeural Networks
# 解压蔬菜数据集 !cd data/data504 && unzip -q vegetables.zip
解压预训练参数,去掉了最后分类的全连接层
预处理数据,将其转化为标准格式。同时将数据拆分成两份,以便训练和计算预估准确率
- label_list.txt 每一行一个类别,类别编号\t类别名字
- train.txt 每一行一个样本,图片路径\t类别编号
- trainImageSet/xxx.jpg 训练图片
- eval.txt 格式通 train.txt
- evalImageSet/xxx.jpg 验证图片
import codecs import os import random import shutil from PIL import Image train_ratio = 4.0 / 5 all_file_dir = 'data/data504/vegetables' class_list = [c for c in os.listdir(all_file_dir) if os.path.isdir(os.path.join(all_file_dir, c)) and not c.endswith('Set') and not c.startswith('.')] class_list.sort() print(class_list) train_image_dir = os.path.join(all_file_dir, "trainImageSet") if not os.path.exists(train_image_dir): os.makedirs(train_image_dir) eval_image_dir = os.path.join(all_file_dir, "evalImageSet") if not os.path.exists(eval_image_dir): os.makedirs(eval_image_dir) train_file = codecs.open(os.path.join(all_file_dir, "train.txt"), 'w') eval_file = codecs.open(os.path.join(all_file_dir, "eval.txt"), 'w') with codecs.open(os.path.join(all_file_dir, "label_list.txt"), "w") as label_list: label_id = 0 for class_dir in class_list: label_list.write("{0}\t{1}\n".format(label_id, class_dir)) image_path_pre = os.path.join(all_file_dir, class_dir) for file in os.listdir(image_path_pre): try: img = Image.open(os.path.join(image_path_pre, file)) if random.uniform(0, 1) <= train_ratio: shutil.copyfile(os.path.join(image_path_pre, file), os.path.join(train_image_dir, file)) train_file.write("{0}\t{1}\n".format(os.path.join(train_image_dir, file), label_id)) else: shutil.copyfile(os.path.join(image_path_pre, file), os.path.join(eval_image_dir, file)) eval_file.write("{0}\t{1}\n".format(os.path.join(eval_image_dir, file), label_id)) except Exception as e: pass # 存在一些文件打不开,此处需要稍作清洗 label_id += 1 train_file.close() eval_file.close()
['cuke', 'lettuce', 'lotus_root']In[5]
!python work/train.py
W0306 15:44:50.494469 222 device_context.cc:237] Please NOTE: device: 0, CUDA Capability: 70, Driver API Version: 10.1, Runtime API Version: 9.0 W0306 15:44:50.498114 222 device_context.cc:245] device: 0, cuDNN Version: 7.3. 2020-03-06 15:44:52,723 - train.py[line:76] - INFO: Loss at epoch 0 step 0: [1.2393346], acc: [0.328125] 2020-03-06 15:44:58,777 - train.py[line:76] - INFO: Loss at epoch 1 step 0: [1.1206189], acc: [0.46875] 2020-03-06 15:45:04,972 - train.py[line:76] - INFO: Loss at epoch 2 step 0: [1.2411859], acc: [0.390625] 2020-03-06 15:45:11,130 - train.py[line:76] - INFO: Loss at epoch 3 step 0: [0.78164065], acc: [0.671875] 2020-03-06 15:45:17,355 - train.py[line:76] - INFO: Loss at epoch 4 step 0: [0.5699992], acc: [0.734375] 2020-03-06 15:45:23,380 - train.py[line:76] - INFO: Loss at epoch 5 step 0: [0.42954433], acc: [0.859375] 2020-03-06 15:45:29,459 - train.py[line:76] - INFO: Loss at epoch 6 step 0: [0.25614244], acc: [0.890625] 2020-03-06 15:45:35,796 - train.py[line:76] - INFO: Loss at epoch 7 step 0: [0.75625485], acc: [0.765625] 2020-03-06 15:45:41,868 - train.py[line:76] - INFO: Loss at epoch 8 step 0: [0.45293224], acc: [0.78125] 2020-03-06 15:45:48,243 - train.py[line:76] - INFO: Loss at epoch 9 step 0: [0.34878293], acc: [0.859375] 2020-03-06 15:45:53,480 - train.py[line:78] - INFO: Final loss: [0.26190406]In[6]
!python work/eval.py
W0306 15:49:41.288347 282 device_context.cc:237] Please NOTE: device: 0, CUDA Capability: 70, Driver API Version: 10.1, Runtime API Version: 9.0 W0306 15:49:41.291836 282 device_context.cc:245] device: 0, cuDNN Version: 7.3. 0.9137931
点击链接,使用AI Studio一键上手实践项目吧:https://aistudio.baidu.com/aistudio/projectdetail/169433
下载安装命令 ## CPU版本安装命令 pip install -f https://paddlepaddle.org.cn/pip/oschina/cpu paddlepaddle ## GPU版本安装命令 pip install -f https://paddlepaddle.org.cn/pip/oschina/gpu paddlepaddle-gpu
>> 访问 PaddlePaddle 官网,了解更多相关内容。
相关文章推荐
- 用PaddlePaddle实现图像分类-ResNet(动态图版)
- 用PaddlePaddle实现图像分类-MobileNet-v2(动态图版)
- 百度AI攻略:Paddlehub实现图像分类
- 机器学习实验(十二):深度学习之图像分类模型AlexNet结构分析和tensorflow实现
- CNN与句子分类之动态池化方法DCNN--TensorFlow实现篇
- SVM+HOG对图像进行分类(MATLAB实现)
- TensorFlow学习--AlexNet实现&图像识别
- [数字图像处理]常见噪声的分类与Matlab实现
- 【VS开发】【图像处理】基于灰度世界、完美反射、动态阈值等图像自动白平衡算法的原理、实现及效果
- 从AlexNet到DenseNet,再到SENet,一文看懂图像分类领域的突破性进展
- 基于FPGA的OLED真彩色动态图像显示的实现
- 在同一treeview中拖放节点并实现动态图像跟随
- TensorFlow实战5:利用卷积神经网络对图像分类(初阶:MNIST手写数字)代码实现
- 【IOS实例小计】图像移动--可扩展为动态实现图标变化
- 【支持动态gif格式】基于java实现图像裁剪以及生成缩略图功能
- 如何通过动态生成Html灵活实现DataGrid分类统计的界面显示功能
- 基于灰度世界、完美反射、动态阈值等图像自动白平衡算法的原理、实现及效果
- 百度AI实现图像分类-python
- JAVA=====动态图像的控制实现
- 数字图像处理]常见噪声的分类与Matlab实现