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

强颜欢笑 提交于 2020-04-16 15:49:21

【推荐阅读】微服务还能火多久?>>>

项目简介

本项目基于paddle 动态图实现了图像分类模型DenseNet ,建议使用GPU来运行本项目,静态图版本请查看:基于PaddlePaddle的图像分类-DenseNet,具体介绍如下:

DenseNet

相比ResNet,DenseNet提出了一个更激进的密集连接机制:即互相连接所有的层,具体来说就是每个层都会接受其前面所有层作为其额外的输入。图1为DenseNet的密集连接机制。可以看到,在DenseNet中,每个层都会与前面所有层在channel维度上连接(concat)在一起(这里各个层的特征图大小是相同的,后面会有说明),并作为下一层的输入。对于一个L层的网络,DenseNet共包含L(L+1)/2个连接,相比ResNet,这是一种密集连接。而且DenseNet是直接concat来自不同层的特征图,这可以实现特征重用,提升效率,这一特点是DenseNet与ResNet最主要的区别,具体结构如图所示。


图1. DenseNet连接机制

结构对比(CNN, ResNet, DenseNet):

DenseNet结构图

DenseNet核心思想在于建立了不同层之间的连接关系,充分利用了feature,进一步减轻了梯度消失问题,加深网络不是问题,而且训练效果非常好。

In[1]
# 解压花朵数据集   
!cd data/data2815 && unzip -qo flower_photos.zip
In[2]
# 预处理数据,将其转化为标准格式。同时将数据拆分成两份,以便训练和计算预估准确率 
import codecs   
import os   
import random   
import shutil   
from PIL import Image   
   
train_ratio = 4.0/ 5   
   
all_file_dir = 'data/data2815'   
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()
['daisy', 'dandelion', 'roses', 'sunflowers', 'tulips']
In[7]
#模型训练
!python train.py
W0309 14:06:23.309630   331 device_context.cc:237] Please NOTE: device: 0, CUDA Capability: 70, Driver API Version: 9.2, Runtime API Version: 9.0
W0309 14:06:23.314054   331 device_context.cc:245] device: 0, cuDNN Version: 7.3.
2020-03-09 14:06:26,455-INFO: Loss at epoch 0 step 0: [1.6306293], acc: [0.40625]
2020-03-09 14:06:26,455 - train.py[line:164] - INFO: Loss at epoch 0 step 0: [1.6306293], acc: [0.40625]
2020-03-09 14:07:00,967-INFO: Loss at epoch 0 step 40: [1.4798427], acc: [0.265625]
2020-03-09 14:07:00,967 - train.py[line:164] - INFO: Loss at epoch 0 step 40: [1.4798427], acc: [0.265625]
2020-03-09 14:07:25,247-INFO: model saved at epoch 0, best accuracy is 0.4166666666666667
2020-03-09 14:07:25,247 - train.py[line:173] - INFO: model saved at epoch 0, best accuracy is 0.4166666666666667
2020-03-09 14:07:26,168-INFO: Loss at epoch 1 step 0: [1.2032264], acc: [0.46875]
2020-03-09 14:07:26,168 - train.py[line:164] - INFO: Loss at epoch 1 step 0: [1.2032264], acc: [0.46875]
2020-03-09 14:08:01,188-INFO: Loss at epoch 1 step 40: [1.1422644], acc: [0.578125]
2020-03-09 14:08:01,188 - train.py[line:164] - INFO: Loss at epoch 1 step 40: [1.1422644], acc: [0.578125]
2020-03-09 14:08:26,341-INFO: model saved at epoch 1, best accuracy is 0.45694444444444443
2020-03-09 14:08:26,341 - train.py[line:173] - INFO: model saved at epoch 1, best accuracy is 0.45694444444444443
2020-03-09 14:08:27,338-INFO: Loss at epoch 2 step 0: [1.2546736], acc: [0.5625]
2020-03-09 14:08:27,338 - train.py[line:164] - INFO: Loss at epoch 2 step 0: [1.2546736], acc: [0.5625]
2020-03-09 14:09:02,312-INFO: Loss at epoch 2 step 40: [1.2519169], acc: [0.640625]
2020-03-09 14:09:02,312 - train.py[line:164] - INFO: Loss at epoch 2 step 40: [1.2519169], acc: [0.640625]
2020-03-09 14:09:26,235-INFO: model saved at epoch 2, best accuracy is 0.5520833333333334
2020-03-09 14:09:26,235 - train.py[line:173] - INFO: model saved at epoch 2, best accuracy is 0.5520833333333334
2020-03-09 14:09:27,184-INFO: Loss at epoch 3 step 0: [1.1887345], acc: [0.625]
2020-03-09 14:09:27,184 - train.py[line:164] - INFO: Loss at epoch 3 step 0: [1.1887345], acc: [0.625]
2020-03-09 14:10:01,888-INFO: Loss at epoch 3 step 40: [0.963113], acc: [0.609375]
2020-03-09 14:10:01,888 - train.py[line:164] - INFO: Loss at epoch 3 step 40: [0.963113], acc: [0.609375]
2020-03-09 14:10:25,868-INFO: Loss at epoch 4 step 0: [1.1661512], acc: [0.609375]
2020-03-09 14:10:25,868 - train.py[line:164] - INFO: Loss at epoch 4 step 0: [1.1661512], acc: [0.609375]
2020-03-09 14:11:00,529-INFO: Loss at epoch 4 step 40: [0.9893415], acc: [0.59375]
2020-03-09 14:11:00,529 - train.py[line:164] - INFO: Loss at epoch 4 step 40: [0.9893415], acc: [0.59375]
2020-03-09 14:11:24,229-INFO: model saved at epoch 4, best accuracy is 0.5930555555555556
2020-03-09 14:11:24,229 - train.py[line:173] - INFO: model saved at epoch 4, best accuracy is 0.5930555555555556
2020-03-09 14:11:25,270-INFO: Loss at epoch 5 step 0: [1.1620805], acc: [0.484375]
2020-03-09 14:11:25,270 - train.py[line:164] - INFO: Loss at epoch 5 step 0: [1.1620805], acc: [0.484375]
2020-03-09 14:12:00,006-INFO: Loss at epoch 5 step 40: [0.9655475], acc: [0.578125]
2020-03-09 14:12:00,006 - train.py[line:164] - INFO: Loss at epoch 5 step 40: [0.9655475], acc: [0.578125]
2020-03-09 14:12:24,136-INFO: Loss at epoch 6 step 0: [0.87590384], acc: [0.640625]
2020-03-09 14:12:24,136 - train.py[line:164] - INFO: Loss at epoch 6 step 0: [0.87590384], acc: [0.640625]
2020-03-09 14:12:59,071-INFO: Loss at epoch 6 step 40: [1.0555159], acc: [0.5625]
2020-03-09 14:12:59,071 - train.py[line:164] - INFO: Loss at epoch 6 step 40: [1.0555159], acc: [0.5625]
2020-03-09 14:13:22,416-INFO: Loss at epoch 7 step 0: [0.79678166], acc: [0.703125]
2020-03-09 14:13:22,416 - train.py[line:164] - INFO: Loss at epoch 7 step 0: [0.79678166], acc: [0.703125]
2020-03-09 14:13:56,924-INFO: Loss at epoch 7 step 40: [1.0299878], acc: [0.59375]
2020-03-09 14:13:56,924 - train.py[line:164] - INFO: Loss at epoch 7 step 40: [1.0299878], acc: [0.59375]
2020-03-09 14:14:21,666-INFO: Loss at epoch 8 step 0: [0.99066764], acc: [0.625]
2020-03-09 14:14:21,666 - train.py[line:164] - INFO: Loss at epoch 8 step 0: [0.99066764], acc: [0.625]
2020-03-09 14:14:55,127-INFO: Loss at epoch 8 step 40: [0.8330009], acc: [0.703125]
2020-03-09 14:14:55,127 - train.py[line:164] - INFO: Loss at epoch 8 step 40: [0.8330009], acc: [0.703125]
2020-03-09 14:15:18,747-INFO: model saved at epoch 8, best accuracy is 0.6583333333333333
2020-03-09 14:15:18,747 - train.py[line:173] - INFO: model saved at epoch 8, best accuracy is 0.6583333333333333
2020-03-09 14:15:19,664-INFO: Loss at epoch 9 step 0: [0.8782065], acc: [0.640625]
2020-03-09 14:15:19,664 - train.py[line:164] - INFO: Loss at epoch 9 step 0: [0.8782065], acc: [0.640625]
2020-03-09 14:15:54,402-INFO: Loss at epoch 9 step 40: [1.199759], acc: [0.46875]
2020-03-09 14:15:54,402 - train.py[line:164] - INFO: Loss at epoch 9 step 40: [1.199759], acc: [0.46875]
2020-03-09 14:16:17,738-INFO: Final loss: [0.7580707]
2020-03-09 14:16:17,738 - train.py[line:174] - INFO: Final loss: [0.7580707]
In[10]
#模型评估
!python eval.py
W0309 14:17:15.764678   520 device_context.cc:237] Please NOTE: device: 0, CUDA Capability: 70, Driver API Version: 9.2, Runtime API Version: 9.0
W0309 14:17:15.769109   520 device_context.cc:245] device: 0, cuDNN Version: 7.3.
0.63352275
In[11]
#预测
!python infer.py
W0309 14:17:26.886791   580 device_context.cc:237] Please NOTE: device: 0, CUDA Capability: 70, Driver API Version: 9.2, Runtime API Version: 9.0
W0309 14:17:26.890343   580 device_context.cc:245] device: 0, cuDNN Version: 7.3.
checkpoint loaded
image data/data2815/sunflowers/3840761441_7c648abf4d_n.jpg Infer result is: sunflowers

点击链接,使用AI Studio一键上手实践项目吧:https://aistudio.baidu.com/aistudio/projectdetail/205030 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!