Python - способ обучения модели softmax keras? - PullRequest
0 голосов
/ 28 января 2019

Я использую keras для личного проекта, очень близкого к реализации word2vec с использованием keras.Я получил все готово, включая модель, но всякий раз, когда я пытаюсь на самом деле тренировать модель в пакетном режиме (в моем случае, пары из одного горячего кодирования вложений элементов), даже если я использую _yield вместо _return, он все равно выдает ошибку "ResourceExhaustedError: OOMпри распределении тензора ... ".

Я дошел до того, что даже пробую тренироваться на каждой паре отдельно (aka batch size = 1), но все равно не могу заставить его работать.Буду признателен за любую помощь.

Еще немного информации о модели, которую я пытаюсь тренировать: 1) Нет предметов = 3115 2) Поезд состоит из пары предметов согласно победе размер указан в item_list

Вот код:

def create_all_data(all_data, items_size, window_size, shuffle):
all_couples = []
for item_list in all_data:
    couples = create_data(item_list, window_size, shuffle)
    all_couples.extend(couples)

    if all_couples:
        X, Y = zip(*all_couples)
        X = np_utils.to_categorical(X, items_size+1)
        Y = np_utils.to_categorical(Y, items_size+1)

        yield X,Y


model = Sequential()
model.add(Dense(units = num_hidden_units, input_shape = (items_size+1,)))
model.add(Dense(units = items_size+1, activation= 'softmax'))
model.compile(loss='categorical_crossentropy', optimizer = 'rmsprop')

num_epochs = 20
win_size = 5

train_loss = []
for epoch in range(num_epochs):
    for x,y in create_all_data(trainset, items_size, win_size, True):
        loss = model.train_on_batch(x, y)
        train_loss.append(loss)
    print(epoch, loss)

И ошибка, которую я получаю:

ResourceExhaustedError: OOM при выделении тензора с формой[704,3116] и введите float on / job: localhost / replica: 0 / task: 0 / device: CPU: 0 процессором-распределителем [[{{node loss_2 / dens_6_loss / clip_by_value / Minimum}} = минимум [T = DT_FLOAT, _class = ["loc: @train ... ad / Reshape"], _device = "/ job: localhost / реплика: 0 / task: 0 / device: CPU: 0"] (loss_2 / density_6_loss / truediv, loss_2 /dens_6_loss / sub)]] Подсказка: если вы хотите увидеть список распределенных тензоров при появлении OOM, добавьте report_tensor_allocations_upon_oom в RunOptions для информации о текущем распределении.

1 Ответ

0 голосов
/ 30 января 2019

У вас есть два бесконечных генератора, и вы пытаетесь zip() их, а затем Yeild их одновременно, что недопустимо, допустимо, возможно, это неправильный термин, если вы используете zip, вы пытаетесь получить все данныесразу, что почти гарантирует вам нехватку памяти, проверьте эту ссылку для получения дополнительной информации https://pybit.es/generators.html

Для этого вам лучше использовать функцию yield.

Необработанная реализация этогоis

def zipper(Xgen, Ygen):
    while True:
        yield (Xgen.next(), Ygen.next())

Это даст X и Y один за другим, а не все сразу, что должно держать память, используемую в проверке.

Редактировать Теоретически код нижедолжно сработать, если это не так, я создам чат, и мы разберемся с этим.


def create_all_data(all_data, items_size, window_size, shuffle):
all_couples = []
for item_list in all_data:
    couples = create_data(item_list, window_size, shuffle)
    all_couples.extend(couples)

    if all_couples:
        X, Y = zip(*all_couples)
        X = np_utils.to_categorical(X, items_size+1)
        Y = np_utils.to_categorical(Y, items_size+1)

        yield (X.next(),Y.next())

Причина, по которой это возможно, заключается в том, что для приведенного выше кода я предполагаю, что all_data создает бесконечное числопоток, и, таким образом, пытался передать его разбить на график через генератор по одному.

...