我正在训练CNN。我正在训练模型的数据集是1.)小(选择相关行后约1.5k)和2.)班级失衡严重。
具体来说,有5,004种可能的输出类别(给定数据集的大小,很多类别)。其中一些类别可以很好地表示(每个> 50个样本);但是,有些图像很少(<10)。
基于这个原因,我采用以下方法来训练模型。我正在使用Keras +张量流。
但是,在第3步中,创建超采样数据集时,我遇到了重要的RHAM问题。我在下面创建了代码片段,以模拟如何解决该问题。实际上,代码末尾的for循环正在为数据帧的每一行加载唯一的图像,将其转换为图像,然后将其存储在数组中。通过重新采样,DF将获得约75k图像并最大化内存。
有人对如何提高程序的存储效率有任何想法吗?
import pandas as pd
from tqdm import tqdm
from tensorflow.keras.preprocessing import image
## Fake arrays for stack overflow
a_arr = np.zeros((128,128,1))
b_arr = np.zeros((128,128,1))
c_arr = np.zeros((128,128,1))
## Fake DF for stack overflow
d = {'Image': [1,2,2,2,3,4,4,4],'ID':['A','A','A','A','A','B','B','C']}
df = pd.DataFrame(data = d)
print(df.shape)
res = None
sample_to = 5
for grp in tqdm(df.groupby('ID')):
n = grp[1].shape[0]
additional_rows = grp[1].sample(0 if sample_to < n else sample_to - n, replace=True)
rows = pd.concat((grp[1], additional_rows))
if res is None: res = rows
else: res = pd.concat((res, rows))
res = res.reset_index(drop = True)
print(res.shape)
x_train = np.zeros((res.shape[0],128,128,1))
for index, row in tqdm(res.iterrows()):
if row['ID'] == 'A':
im = a_arr
elif row['ID'] == 'B':
im = b_arr
elif row['ID'] == 'c':
im = c_arr
x_train[index,:,:,:] = im
x_train.shape