Загрузка изображений для сверточной нейронной сети - PullRequest
0 голосов
/ 21 декабря 2018

Я нахожусь в процессе обучения CNN.Набор данных, на котором я тренирую модель: 1.) маленький (~ 15k после выбора соответствующих строк) и 2.) имеет значительный дисбаланс классов.

В частности, существует 5 004 возможных выходных класса (много классовучитывая размер набора данных).Некоторые из этих классов хорошо представлены (> 50 образцов каждый);однако у некоторых очень мало изображений (<10). </p>

По этой причине я использую следующий подход к обучению модели.Я использую Keras + tenorflow.

  1. Поезд CNN на небольших изображениях (224 x 224)
  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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...