用PaddlePaddle实现图像分类-AlexNet(动态图版)

项目简介

本项目使用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网络具体结构如下图所示:
用PaddlePaddle实现图像分类-AlexNet(动态图版)
原论文中是采取了两块GPU进行交互,所以在图中有两条支路。AlexNet架构有6000万参数和650000个神经元,包含5层卷积网络,其中一些含有max pooling,还有3层全连接层,最后一层的节点数1000个,采用softmax分类
参考链接:AlexNet学习
论文原文:ImageNet Classification with Deep ConvolutionalNeural Networks

In[1]

# 解压蔬菜数据集
!cd data/data504 && unzip -q vegetables.zip

 

解压预训练参数,去掉了最后分类的全连接层

 

预处理数据,将其转化为标准格式。同时将数据拆分成两份,以便训练和计算预估准确率

  • label_list.txt 每一行一个类别,类别编号/t类别名字
  • train.txt 每一行一个样本,图片路径/t类别编号
  • trainImageSet/xxx.jpg 训练图片
  • eval.txt 格式通 train.txt
  • evalImageSet/xxx.jpg 验证图片

In[2]

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 官网,了解更多相关内容

{{o.name}}


{{m.name}}

原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/72693.html

(0)
上一篇 2021年8月11日 22:20
下一篇 2021年8月11日 22:20

相关推荐

发表回复

登录后才能评论