Python - способ обучения модели softmax keras?

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

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

Дополнительная информация о модели, которую я пытаюсь обучить: 1) No of items = 3115 2) Trainset состоит из пар элементов в соответствии с выигрышем размером, указанным в 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 by allocator cpu [[{{node loss_2 / density_6_loss / clip_by_value / Minimum }} = Минимум [T = DT_FLOAT, _class = ["loc: @train ... ad / Reshape"], _device = "/ job: localhost / replica: 0 / task: 0 / device: CPU: 0"] ( loss_2 / density_6_loss / truediv, loss_2 / density_6_loss / sub)]] Подсказка: если вы хотите видеть список выделенных тензоров, когда происходит OOM, добавьте report_tensor_allocations_upon_oom в RunOptions для получения информации о текущем распределении.


person melowgs    schedule 28.01.2019    source источник
comment
Можете поделиться небольшим количеством кода?   -  person anand_v.singh    schedule 28.01.2019
comment
@ anand_v.singh Спасибо. Я отредактировал вопрос с помощью некоторого кода и точной ошибки, которую я получаю.   -  person melowgs    schedule 28.01.2019
comment
Попробуйте запустить это в записной книжке Google Collab. Если проблема не исчезнет, ​​просто загрузите одно изображение и посмотрите график на тензорной доске и покажите результаты, если все еще не удается, поделитесь определением переменной набора поездов.   -  person anand_v.singh    schedule 28.01.2019
comment
@ anand_v.singh Я пробовал это также в Google Colab и получил точно такое же предупреждение. И еще одно, что я использовал почти весь свой лимит памяти графического процессора. Кажется, я не могу найти проблему: / .. Мой набор состоит из пар элементов, полученных из списков элементов каждого пользователя. Так же, как word2vec с предложениями. Мои предложения - это список элементов пользователей, а мои слова - это сами элементы. Составьте списки из ~ 4K элементов, каждый из которых состоит из 10-200 элементов.   -  person melowgs    schedule 29.01.2019


Ответы (1)


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

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

Грубая реализация этого

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 создает бесконечный поток и, таким образом, пытался передать его в граф через генератор по одному за раз.

person anand_v.singh    schedule 30.01.2019
comment
Еще раз спасибо за попытку помочь, но я был бы рад получить дополнительную информацию о том, как на самом деле использовать функцию zipper в коде. Могу ли я вызвать ее вместо функции zip? или до или после, чтобы иметь возможность каждый раз генерировать только одну пару для ввода в модель? - person melowgs; 30.01.2019
comment
По-видимому, .next не работает с массивами numpy, поэтому это не очень помогло. В конце я решил изменить потерю с категориальной перекрестной энтропии на разреженной категориальной cross энтропия, похоже, теперь работает лучше. Кстати, оказывается, я все еще не могу пользоваться чатом сайта из-за моей репутации: / - person melowgs; 31.01.2019