У меня большой набор данных, изначально его размер равен (453732,839)
. В этом наборе данных у меня есть подгруппы, которые связаны друг с другом, и эти подгруппы имеют переменное измерение. Поскольку я должен обучать LSTM, каждая подгруппа должна быть одинакового размера, поэтому я применяю отступы к каждой подгруппе, чтобы они все были одинаковой длины. После дополнения набор данных становится примерно 2000000
строками.
Так что я выполняю функцию model.fit()
в al oop, где model.fit()
выполняется по одному для каждой части набора данных. Внутри l oop я добавляю в сеть часть набора данных, чтобы перейти к model.fit()
, но во второй части, до того, как model.fit()
заполнится, RAM не заполнится, и я не смогу продолжить обучение.
Это код, в котором я pad
и fit
модель:
training_set_portion_size = int(training_dataset.shape[0] / 6)
start_portion_index = 0
for epoch in range(0, 50):
for part in range(0, 4):
end_portion_index = start_portion_index + training_set_portion_size
training_set_portion = training_dataset[start_portion_index:end_portion_index]
training_set_portion_labels = training_set_portion[:, training_set_portion.shape[1]-1]
portion_groups = get_groups_id_count(training_set_portion[:,0])
# Scale dataset portion
training_set_portion = scaler.transform(training_set_portion[:,0:training_set_portion.shape[1]-1])
training_set_portion = np.concatenate((training_set_portion, training_set_portion_labels[:, np.newaxis]), axis=1)
# Pad dataset portion
training_set_portion = pad_groups(training_set_portion, portion_groups)
training_set_portion_labels = training_set_portion[:, training_set_portion.shape[1]-1]
# Exluding group and label from training_set_portion
training_set_portion = training_set_portion[:, 1:training_set_portion.shape[1] - 1]
# Reshape data for LSTM
training_set_portion = training_set_portion.reshape(int(training_set_portion.shape[0]/timesteps), timesteps, features)
training_set_portion_labels = training_set_portion_labels.reshape(int(training_set_portion_labels.shape[0]/timesteps), timesteps)
model.fit(training_set_portion, training_set_portion_labels, validation_split=0.2, shuffle=False, epochs=1,
batch_size=1, workers=0, max_queue_size=1, verbose=1)
* ** ОБНОВЛЕНИЕ ***
I ' m, используя pandas
сейчас, с chunksize
, но кажется, что тензоры объединяются в итераторе l oop.
pandas
:
training_dataset_iterator = pd.read_csv('/content/drive/My Drive/Tesi_magistrale/en-train.H',
chunksize=80000, sep=",", header=None, dtype=np.float64)
Новый код:
for epoch in range(0, 50):
for chunk in training_dataset_iterator:
training_set_portion = chunk.values
training_set_portion_labels = training_set_portion[:, training_set_portion.shape[1]-1]
portion_groups = get_groups_id_count(training_set_portion[:,0])
# Scale dataset portion
training_set_portion = scaler.transform(training_set_portion[:,0:training_set_portion.shape[1]-1])
training_set_portion = np.concatenate((training_set_portion, training_set_portion_labels[:, np.newaxis]), axis=1)
# Pad dataset portion
print('Padding portion...\n')
training_set_portion = pad_groups(training_set_portion, portion_groups)
training_set_portion_labels = training_set_portion[:, training_set_portion.shape[1]-1]
# Exluding group and label from training_set_portion
training_set_portion = training_set_portion[:, 1:training_set_portion.shape[1] - 1]
# Reshape data for LSTM
training_set_portion = training_set_portion.reshape(int(training_set_portion.shape[0]/timesteps), timesteps, features)
training_set_portion_labels = training_set_portion_labels.reshape(int(training_set_portion_labels.shape[0]/timesteps), timesteps)
print('Training set portion shape: ', training_set_portion.shape)
model.fit(training_set_portion, training_set_portion_labels, validation_split=0.2, shuffle=False, epochs=1,
batch_size=1, workers=0, max_queue_size=1, verbose=1)
Первое print('Training set portion shape: ', training_set_portion.shape)
дало мне (21327, 20, 837)
, а второе (43194, 20, 837)
. Я не понимаю, почему.
ОБНОВЛЕНИЕ 2
Я заметил, что training_set_portion = pad_groups(training_set_portion, portion_groups)
, в некотором роде, дублирует данные.
Код группы пэдов :
def pad_groups(dataset, groups):
max_subtree_length= 20
start = 0
rows, cols = dataset.shape
padded_dataset = []
index = 1
for group in groups:
pad = [group[0]] + [0] * (cols - 1)
stop = start + group[1]
subtree = dataset[start:stop].tolist()
padded_dataset.extend(subtree)
subtree_to_pad = max_subtree_length - group[1]
pads = [pad] * subtree_to_pad
padded_dataset.extend(pads)
start = stop
index+=1
padded_dataset = np.array(padded_dataset)
return padded_dataset
Как я могу это сделать? Заранее спасибо.