深度学习 神经网络python干货python专题

深度学习训练前的探索性数据分析工作

2021-03-17  本文已影响0人  LabVIEW_Python

刚刚拿到原始数据时,往往毫无头绪,这时需要对原始数据做探索性数据分析(Exploratory Data Analysis,简称EDA)工作,即通过作图、制表、方程拟合、计算特征量等手段探索数据的结构和规律。

对于图像分类任务来说,首先应该统计出每个类别的数量分布情况,常用直方图来实现。

若图像分类任务中,类别描述是一个csv文件,那么用pandas.DataFrame.hist()函数可以方便的获得每个类别数量的分布情况。Python范例如下:

import os 
import pandas as pd 
import numpy as np 
import matplotlib.pyplot as plt
from PIL import Image 

# 从csv文件中读取数据
FILE = r'lemon_dataset\train_images.csv'
train_images_df = pd.read_csv(FILE,sep=',')
hist = train_images_df['class_num'].hist()
plt.show()
类别数量直方图
上述代码所用的数据来自:https://aistudio.baidu.com/aistudio/datasetdetail/73999

接着可以用head(),describe()等方法快速查看数据集

print(train_images_df.head())
print(train_images_df.describe())

id class_num
0 train_0000.jpg 0
1 train_0001.jpg 0
2 train_0002.jpg 0
3 train_0003.jpg 0
4 train_0004.jpg 0
class_num
count 1102.000000
mean 1.235027
std 1.136516
min 0.000000
25% 0.000000
50% 1.000000
75% 2.000000
max 3.000000

图像分类问题,最常见的挑战是类别不均衡,例如:一个类别有几千张,另一个类别只有几十张,即存在数量级上的差异,这会导致模型在小样本数据类别上的分类能力不佳,甚至是被忽略。直观的感受就是,模型是被拥有大数据的类别训练出来的。从上图可以看出,0类别的数量是400,3类别的数量是210,不存在类别不均衡问题。
下图展示的是一个典型的类别不均衡:在4251个训练图片中,有超过2000个类别中只有一张图片。还有一些类中有2-5个图片。现在,这是一个严重的不平衡类问题。

类别不均衡
图像分类问题,次常见的挑战是训练数据量少,总所周知,收集数据是有成本的,而且成本不小,不仅是经济成本,还有时间成本 —— 即某些类别在一定时间内,只能收集到这么多。对于上述数据集,count = 1102, 即4个类别总计只有1102张图片,显然,遇到了训练数据量少的问题。一个常规的判断标准是:要从头训练出卷积神经网络,数据样本足够意味着:一个类别的图片数据>5000张。对于训练数据量少的问题,解决方式是:图像增强。

分析完样本数量分布后,下一步就是查看图像数据特征,即图像数据最大值,最小值,均值和标准差,范例代码如下所示:

IMAGE_FILE = r'lemon_dataset\train_images\train_0000.jpg'
img = Image.open(IMAGE_FILE)
plt.imshow(img)  # 查看图片
plt.show()
img = np.asarray(img)
print(img.shape) # 查看图像数据形状和数值特点
print(f"max:{np.max(img)}, min:{np.min(img)}, mean:{np.mean(img)}, std:{np.std(img)}")

(640, 640, 3)
max:255, min:0, mean:48.16987711588542, std:70.075780270147

拿到图像数据数值特点后,可以做数据的归一化操作,(《深度学习中的Normalization和Standardization处理1》)[https://www.jianshu.com/p/863cc00cc1b8]。归一化操作的好处是:

无归一化 vs 有归一化

训练前,对数据做归一化操作,已经变成深度学习数据预处理的默认操作了。基于Paddle的归一化代码实现,如下所示。

from paddle.vision.transforms import Normalize
normalize = Normalize(mean=[0,0,0],std=[255.,255.,255.],data_format='HWC')
img = normalize(img)
print(f"max:{np.max(img)}, min:{np.min(img)}, mean:{np.mean(img)}, std:{np.std(img)}")

max:1.0, min:0.0, mean:0.18890143930912018, std:0.27480703592300415

上一篇 下一篇

猜你喜欢

热点阅读