Я нахожусь в процессе обучения CNN.Набор данных, на котором я тренирую модель: 1.) маленький (~ 15k после выбора соответствующих строк) и 2.) имеет значительный дисбаланс классов.
В частности, существует 5 004 возможных выходных класса (много классовучитывая размер набора данных).Некоторые из этих классов хорошо представлены (> 50 образцов каждый);однако у некоторых очень мало изображений (<10). </p>
По этой причине я использую следующий подход к обучению модели.Я использую Keras + tenorflow.
- Поезд CNN на небольших изображениях (224 x 224)
- Поезд CNN на больших изображениях (448 x 448)
- Поезд 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