上采样:
有两类样本(A,B),A>B数量,若n*B=A(约等于),则B样本数据变为:n*B,A样本数据为:A
def upperSample(df)
df.index=range(len(df))
df_A=df[df['class']=='A']
df_B=df[df['class']=='B']
len_A=len(df_A)
len_B=len(df_B)
index_A=df_A.index
index_B=df_B.index
if len_A==len_B:
return shuffleDF(df)#shuffleDF()为自定义的重排函数,使df中的样本分布打乱
elif len_A>len_B:
x=len_A//len_B
df_B=df.iloc[list(index_B)*x]
df=pd.concat([df_A,df_B],axis=0)
df.index=range(len(df))
return shuffleDF(df)
else:
...(即len_B>len_A,方法同上)
def shuffleDF(df):
shuffle_index=np.random.permutation(len(df))
df=df.iloc[shffle_index]
df.index=range(len(df))
return df
下采样:
有两类样本(A,B),A>B数量, A,B中皆抽取len(B)数量样本用做训练
def lowerSample(df):
df.index=range(len(df))
df_A=df[df['class']=='A']
df_B=df[df['class']=='B']
len_A=len(df_A)
len_B=len(df_B)
if len_A==len_B:
return shuffleDF(df)
elif len_A>len_B:
df_A=df_A.sample(len_B)
df=pd.concat([df_A,df_B],axis=0)
df.index=range(len(df))
return shuffleDF(df)
else:
...(len_A<len_B,同上)
生成器自定义参数:
from keras.preprocessing.image import ImageDataGenerator
from skimage import io,transform,exposure,util
def Augmentdata(img):
datagen=ImageDataGenerator(...)
#随机增强图片img
img=datagen.random_transform(img)
#给img添加高斯噪声
img=utils.random_noise(img,mode='gaussian')
#调整图像对比度
theta=np.random.uniform(0.1,1)
img=exposure.adjust_gamma(img,gamma=theta)
return img
如上,当然以上增强参数,高斯,gamma等,可随机添加
threshold=20
if np.random.randint(0,50,1)<threshold:
#添加高斯,gamma
对于一批图片,如何添加增强参数呢?
可由以上代码改写:
如train_generator是数据增强后得到的生成器,next(train_generator)得到每批的值,(data_list和label_list),那么每个data就是一个img,我们获得每个img,就可以对其添加增强参数了