【飞桨】【图像分类】【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的原始代码一样,有时候数据的路径不一定对得上,所以需要自己手动的先把代码中涉及到文件路径的地方改一下。
数据集路径的查看可以直接在notebook左侧的文件中找,点击两个方框可以复制路径
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())
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。