Я пытаюсь что-то, я не уверен, что это должно работать таким образом. А именно, я пробую скрипт здесь: [https://github.com/lazyprogrammer/machine_learning_examples/blob/master/nlp_class3/attention.py], чтобы обучить некоторую модель перевода. Хотя все это работает хорошо, я застрял, когда получил больше данных (большие наборы) для обучения. Моя идея состоит в том, чтобы использовать fit_generator
вместо fit
, чтобы иметь возможность пакетирования входов, потому что не может поместиться в данные в памяти.
Вместо использования r = model.fit(...
(из строки 354) я попытался:
def generator(y, X, batch_size=100):
number_of_batches = 10 #samples_per_epoch/batch_size
counter = 0
csize = np.shape(y[0])[0]
shuffle_index = np.arange(csize)
print(csize, shuffle_index[0:6], shuffle_index[-6:-1])
np.random.shuffle(shuffle_index)
X = X[shuffle_index, :, :] #X.shape
y = [y[0][shuffle_index], y[1][shuffle_index], y[2][shuffle_index], y[3][shuffle_index]]
while 1:
index_batch = shuffle_index[batch_size*counter:batch_size*(counter+1)]
X_batch = X[index_batch, :, :] #X_batch.shape
y_batch = [y[0][index_batch], y[1][index_batch], y[2][index_batch], y[3][index_batch]]
counter += 1
print(counter, y[0][index_batch].shape, y[1][index_batch].shape, y[2][index_batch].shape, y[3][index_batch].shape, X_batch.shape)
yield(y_batch, X_batch)
if (counter < number_of_batches):
np.random.shuffle(shuffle_index)
counter=0
r = model.fit_generator(generator([encoder_inputs, decoder_inputs, z, z], decoder_targets_one_hot, 200),
epochs=EPOCHS, validation_freq=0.2, steps_per_epoch=10, shuffle=False)
Но что-то идет не так; Я получаю ошибки. Это окончательная распечатка:
Заполнение предварительно обученных вложений ... C: \ Users \ cp \ Anaconda3 \ lib \ site-packages \ tenorsflow_core \ python \ framework \ indexed_slices.py: 433: UserWarning: Преобразование разреженных IndexedSlices в плотный тензор неизвестной формы. Это может занять большой объем памяти.
"Преобразование разреженных индексированных фрагментов в плотный тензор неизвестной формы." Эпоха 1/50 C: \ Users \ cp \ Anaconda3 \ lib \ site-packages \ keras \ utils \ data_utils.py:718: UserWarning: вход не может быть получен. Это может быть связано с тем, что работник умер. У нас нет никакой информации о потерянном образце.
UserWarning) 1 (200, 255) (200, 231) (200, 256) (200, 256) (200, 231 , 1880) 1 (200, 255) (200, 231) (200, 256) (200, 256) (200, 231, 1880) 1 (200, 255) (200, 231) (200, 256) (200, 256) (200, 231, 1880) 1 (200, 255) (200, 231) (200, 256) (200, 256) (200, 231, 1880) 1 (200, 255) (200, 231) (200 , 256) (200, 256) (200, 231, 1880) 1 (200, 255) (200, 231) (200, 256) (200, 256) (200, 231, 1880) 1 (200, 255) ( 200, 231) (200, 256) (200, 256) (200, 231, 1880) 1 (200, 255) (200, 231) (200, 256) (200, 256) (200, 231, 1880) 1 (200, 255) (200, 231) (200, 256) (200, 256) (200, 231, 1880)
и тогда ядро умрет, или я должен остановить его. Это не помогает мне как задумано, не ограничивает использование памяти. Даже попробуйте np.memmap
для большой 3d матрицы, но это еще хуже.
Я явно нарушаю некоторые правила, которые я не знаю - это моя оценка на данный момент, поэтому я могу отследить sh мою идею. А может я рядом? Пожалуйста, дайте мне подсказку.