为卷积神经网络加载图像

时间:2018-12-21 00:49:56

标签: python performance tensorflow keras conv-neural-network

我正在训练CNN。我正在训练模型的数据集是1.)小(选择相关行后约1.5k)和2.)班级失衡严重。

具体来说,有5,004种可能的输出类别(给定数据集的大小,很多类别)。其中一些类别可以很好地表示(每个> 50个样本);但是,有些图像很少(<10)。

基于这个原因,我采用以下方法来训练模型。我正在使用Keras +张量流。

  1. 在较小的图像(224 x 224)上训练CNN
  2. 在更大的图像上训练CNN(448 x 448)
  3. 在超采样数据集上训练CNN,以获取有关 代表性较低的图片

但是,在第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

0 个答案:

没有答案