Day4 《青春有你2》分类任务坑总

前言

第三天的作业是对第二天爬取的《青春》选手信息进行数据分析,基本上用的是matplotlib绘图,所以就不分享了,再加上有点小细节没做好也没有满分。day4 的任务是建立自己的数据集,对任务进行分类。

图像分类是计算机视觉的重要领域,它的目标是将图像分类到预定义的标签。这次作业是在百度飞桨(AI Studio)的在线平台上操作(paddle 是类似 tensorflow 的 深度学习框架)

优点: 金主爸爸有免费的算力提供,这点对大学生还是很良好(GPU :Tesla V100 16G ,Mem:16GB;CPU:8 Cores, RAM:32GB Dosk 100GB)
页面
以上在线平台的页面,终端是linux环境终端,具体见官网新手指南

实践

  • 基础配置
#CPU环境启动请务必执行该指令
%set_env CPU_NUM=2
#安装paddlehub(paddlehub封装了很多模型库,可以直接调用)
!pip install paddlehub==1.6.0 -i https://pypi.tuna.tsinghua.edu.cn/simple
import paddlehub as hub
  • step1: 基础工作

加载数据文件 和 导入python包。另外我已经在平台上上传了该数据集 青春有你2 大家可以自行下载或者在项目数据集选择里面 搜索导入即可。

如果选择上传 ,新建一个cell ,修改下以下的代码。在线AI Studio 是在linux环境。(需要注意的是:linux没有自带的解压rar包,如果上传rar包,需要安装,不然会报错。所以建议是上传 .zip格式包 )
!unzip -o XXX.zip -d [目的目录]

#解压压缩包到 目的路径
#zip 包i  (解包也可在终端中操作)
!unzip -o wangchengxuan.zip -d ./dataset/i/
  • step2: 加载预训练模型

PaddleHub中选择合适的预训练模型来Finetune(微调),在注释后面我选用了几种模型可供参考。先要install 下载模型 之后 才不会报错,下载好后可以将 install 注释掉。

!hub install name="mobilenet_v2_imagenet" #"resnet_v2_101_imagenet"#"mobilenet_v2_imagenet" #"resnet_v2_50_imagenet"
module = hub.Module(name="mobilenet_v2_imagenet")
  • step3: 数据准备

加载图片数据集,可以在上面的链接获取数据集。要将图片的名称和标签都写到train_list.txt,val_list.txt,test_txt(都在dataset 文件目录下)
自定义数据的具体说明,请查看适配自定义数据

import os
label={"虞书欣":0,"许佳琪":1,"赵小棠":2,"安崎":3,"王承渲":4}
def write_data(filename,dir_name):
    """filename txt 文件名称,dir_name是数据集的名称"""
    path=os.path.join(os.getcwd(),"dataset",dir_name)
    print(path)
    file_writer=open("dataset/"+filename,'w')#打开文件
    filelist=os.listdir(path)
    for i in filelist:
        filenames=os.listdir(os.path.join(path,i))
        for j in filenames:
            file_writer.writelines([os.path.join(path,i,j)," ",str(label[i])+'\n'])
    file_writer.close()

write_data("train_list.txt","i")

效果图:
在这里插入图片描述
或者:(dataset 下是有test 文件目录,在生成新版本时忘记保存了,此时不要在路径添加 dataset/ 这个前缀,因为在下面的时候已经传入了图片的基目录 dataset 文件夹。 添加 的结果是训练时候报错说找不到文件
在这里插入图片描述


from paddlehub.dataset.base_cv_dataset import BaseCVDataset
   
class DemoDataset(BaseCVDataset):	
   def __init__(self):	
       # 数据集存放位置
       
       self.dataset_dir = "dataset" #这里定义数据集的根目录,通过读取txt里面的文件添加到路径里面。
       super(DemoDataset, self).__init__(
           base_path=self.dataset_dir,
           train_list_file="train_list.txt",
           validate_list_file="validate_list.txt",
           test_list_file="test_list.txt",
           label_list_file="label_list.txt",
           )
dataset = DemoDataset()
  • Step4、生成数据读取器

接着生成一个图像分类的reader,reader负责将dataset的数据进行预处理,接着以特定格式组织并输入给模型进行训练。
当我们生成一个图像分类的reader时,需要指定输入图片的大小

data_reader = hub.reader.ImageClassificationReader(
    image_width=module.get_expected_image_width(), #模型规定的图片输入大小
    image_height=module.get_expected_image_height(),
    images_mean=module.get_pretrained_images_mean(),
    images_std=module.get_pretrained_images_std(),
    dataset=dataset)
  • Step5、配置策略
    在进行Finetune前,我们可以设置一些运行时的配置,例如如下代码中的配置,表示:
    • use_cuda:设置为False表示使用CPU进行训练。如果您本机支持GPU,且安装的是GPU版本的PaddlePaddle,我们建议您将这个选项设置为True;

    • epoch:迭代轮数;

    • batch_size:每次训练的时候,给模型输入的每批数据大小为32(申请平台cpu资源最大利用率resnet50模型),模型训练时能够并行处理批数据,因此batch_size越大,训练的效率越高,但是同时带来了内存的负荷,过大的batch_size可能导致内存不足而无法训练,因此选择一个合适的batch_size是很重要的一步;出现内存溢出的问题,需要改小batch_size

    • log_interval:每隔10 step打印一次训练日志;

    • eval_interval:每隔50 step在验证集上进行一次性能评估;

    • checkpoint_dir:将训练的参数和数据保存到 cv_finetune_turtorial_demo目录中;

    • strategy:使用DefaultFinetuneStrategy策略进行finetune;

PaddleHub提供了许多优化策略,如AdamWeightDecayStrategyULMFiTStrategyDefaultFinetuneStrategy

config = hub.RunConfig(
    use_cuda=True,                              #是否使用GPU训练,默认为False; 
    num_epoch=50,                                #Fine-tune的轮数;
    checkpoint_dir="cv_mobilenet_4",#模型checkpoint保存路径, 若用户没有指定,程序会自动生成;
    batch_size=128,                              #训练的批大小,如果使用GPU,请根据实际情况调整batch_size;
    eval_interval=60,                           #模型评估的间隔,默认每100个step评估一次验证集;
    strategy=hub.finetune.strategy.AdamWeightDecayStrategy())  #Fine-tune优化策略;
  • Step6 组建Finetune Task

有了合适的预训练模型准备要迁移的数据集后,我们开始组建一个Task。

由于该数据设置是一个五分类的任务,而我们下载的分类module是在ImageNet数据集上训练的千分类模型,所以我们需要对模型进行简单的微调,把模型改造为一个二分类模型:

获取module的上下文环境,包括输入和输出的变量,以及Paddle Program;
从输出变量中找到特征图提取层feature_map;
在feature_map后面接入一个全连接层,生成Task;

input_dict, output_dict, program = module.context(trainable=True)
img = input_dict["image"]
feature_map = output_dict["feature_map"]
feed_list = [img.name]

task = hub.ImageClassifierTask(
    data_reader=data_reader,
    feed_list=feed_list,
    feature=feature_map, #获得全连接层前的输出
    num_classes=dataset.num_labels,
    config=config)
  • Step7、开始Finetune

我们选择finetune_and_eval接口来进行模型训练,这个接口在finetune的过程中,会周期性的进行模型效果的评估,以便我们了解整个训练过程的性能变化。(由于任务的评分标准是预测5张中对的个数,所以在val_list.txt 这里我设置了和 test_list.txt 一样)

  *  默认保存val预测最好的模型参数 

在这里插入图片描述

  • step 8 : 预测
    当Finetune完成后,我们使用模型来进行预测,先通过以下命令来获取测试的图片
import numpy as np
import matplotlib.pyplot as plt 
import matplotlib.image as mpimg
import os

with open("dataset/test_list.txt","r") as f:
    filepath = f.readlines()

data=[]
for i in filepath: #路径需要自己根据需要修改
    data.append(os.path.join(os.getcwd(),"dataset",i.split(" ")[0]))
# data = [filepath[0].split(" ")[0],filepath[1].split(" ")[0],filepath[2].split(" ")[0],filepath[3].split(" ")[0],filepath[4].split(" ")[0]]
print(data)
label_map = dataset.label_dict()
index = 0
run_states = task.predict(data=data)
results = [run_state.run_results for run_state in run_states]

for batch_result in results:
    print(batch_result)
    batch_result = np.argmax(batch_result, axis=2)[0]
    print(batch_result)
    for result in batch_result:
        index += 1
        result = label_map[result]
        print("input %i is %s, and the predict result is %s" %
              (index, data[index - 1], result))

结果是5张图片都预测对了(呜呜,为了这个结果像个机器人,实际上训练中我并没有用到数据集里的所有图片)
在这里插入图片描述

总结

虽然评价指标让我觉得就好像一个调参狗,但是基本实现流程还算是满清晰。对于第一次使用paddlehub 我还是有诸多不适,谁让爸爸有算力呢。
总结小坑:

  • 数据集 写入txt 的路径需要注意
  • 内存溢出 和 batch_size
  • 另外一个我觉得比较魔性的就是,就是你训练过程中出现错了,不能像jupyter 重新运行该cell,不然又会报错。训练中也有出现411 不是路径的错误,基本上重启环境(80%的万精油)就能解决。

可能我对paddle paddlehub 的熟悉程度也就这样,只能浅显说明。

原创文章 4 获赞 8 访问量 395

猜你喜欢

转载自blog.csdn.net/qq_41838627/article/details/105818891