【飞桨】【图像分类】【PaddlePaddle】paddle 柠檬分类作业排坑

【飞桨】【图像分类】【PaddlePaddle】paddle 柠檬分类课程作业
paddle 图像分类课程地址:https://aistudio.baidu.com/aistudio/course/introduce/11939?directly=1&shared=1&qq-pf-to=pcqq.c2c

任务描述

如何根据据图像的视觉内容为图像赋予一个语义类别是图像分类的目标,也是图像检索、图像内容分析和目标识别等问题的基础。
本实践旨在通过一个美食分类的案列,让大家理解和掌握如何使用飞桨2.0搭建一个卷积神经网络。
特别提示:本实践所用数据集均来自互联网,请勿用于商务用途。

解压文件,使用train.csv训练,测试使用val.csv。最后以在val上的准确率作为最终分数。

路径问题

和大多数fork的原始代码一样,有时候数据的路径不一定对得上,所以需要自己手动的先把代码中涉及到文件路径的地方改一下。
【飞桨】【图像分类】【PaddlePaddle】paddle 柠檬分类作业排坑_第1张图片
数据集路径的查看可以直接在notebook左侧的文件中找,点击两个方框可以复制路径

运行到MobileNetV2报错

1个是需要将SGD中parameters参数作如下的修改,
2是如果还报错的话需要重新启动下Notebook

scheduler = paddle.optimizer.lr.CosineAnnealingDecay(learning_rate=0.5, T_max=10, verbose=True)
sgd = paddle.optimizer.SGD(learning_rate=scheduler, parameters=model.parameters())

预测结果写入CSV

import csv


f = open('sumit.csv','w',encoding='utf-8')
csv_writer = csv.writer(f)
csv_writer.writerow(["id","class_num"])
csv_writer.writerow([path.split('/')[-1],predit_class])
f.close()

涨分技巧

1 labelShuffling
训练数据常常出现类间不平衡的现象,通过增加少量样本被训练的次数来做一个平衡。

def labelShuffling(dataFrame, groupByName = 'class_num'):

    groupDataFrame = dataFrame.groupby(by=[groupByName])
    labels = groupDataFrame.size()
    print("length of label is ", len(labels))
    maxNum = max(labels)
    lst = pd.DataFrame()
    for i in range(len(labels)):
        print("Processing label  :", i)
        tmpGroupBy = groupDataFrame.get_group(i)
        createdShuffleLabels = np.random.permutation(np.array(range(maxNum))) % labels[i]
        print("Num of the label is : ", labels[i])
        lst=lst.append(tmpGroupBy.iloc[createdShuffleLabels], ignore_index=True)
        print("Done")
    # lst.to_csv('test1.csv', index=False)
    return lst

2图像增强
paddle使用Compose这个函数可以联合多个图像增强算法,简单的图像增强和预处理代码如下

data_transforms = T.Compose([
    T.Resize(size=(224, 224)),
    T.RandomHorizontalFlip(224),
    T.RandomVerticalFlip(224),
    T.Transpose(),    # HWC -> CHW
    T.Normalize(
        mean=[0, 0, 0],        # 归一化
        std=[255, 255, 255],
        to_rgb=True)    
])

3 label smooth
人们在定义分类标签的时候往往是非0即1的,但是也有可能出现人工标错的情况,以独热编码为例,假设标签【0 1 0 0】表示猫这个类别,【0 0 0 1 0】表示狗这个类别,那么如果把猫标成【0.05 0.85 0.05 0.05】 狗标记成0.05 0.05 0.85 0.05】 ,那么就是一个label smooth。

引入经典网络MobileNet

你可能感兴趣的:(深度学习,深度学习)