Как использовать fit_generator для обучения модели seq2seq с помощью механизма внимания (keras / tf)? - PullRequest
0 голосов
/ 11 марта 2020

Я пытаюсь что-то, я не уверен, что это должно работать таким образом. А именно, я пробую скрипт здесь: [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 мою идею. А может я рядом? Пожалуйста, дайте мне подсказку.

...