Python-一种训练softmax keras模型的方法?

时间:2019-01-28 10:37:43

标签: tensorflow keras word2vec softmax

我将keras用于个人项目,与使用keras实现word2vec非常接近。我已经准备好了包括模型在内的所有内容,但是每当我尝试批量实际训练模型(在我的情况下,是几个热编码项的嵌入)时,即使我使用_yield而不是_return,它仍然会产生错误 “ ResourceExhaustedError:分配张量时出现OOM ...”。

我到了一个地步,我什至尝试对每对夫妇分别进行训练(即批量大小= 1),但仍然无法正常工作。任何帮助将不胜感激。

有关我要训练的模型的更多信息: 1)项目数= 3115 2)训练集由item_list

中给出的 win size 几对项目组成

以下是一些代码:

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:分配带有形状[704,3116]的张量并在/ job:localhost / replica:0 / task:0 / device:CPU:0上通过分配器cpu键入float      [[{{node loss_2 / dense_6_loss / clip_by_value / Minimum}} =最小值[T = DT_FLOAT,_class = [“ loc:@train ... ad / Reshape”],_ device =“ / job:localhost /副本:0 /任务:0 /设备:CPU:0“](损失_2 / dense_6_loss / truediv,损失_2 / dense_6_loss / sub)]] 提示:如果要在发生OOM时查看分配的张量的列表,请将report_tensor_allocations_upon_oom添加到RunOptions中以获取当前分配信息。

1 个答案:

答案 0 :(得分:0)

您有两个无限生成器,并且您尝试先zip()然后立即Yeild它们,这是不允许的,允许的使用期限不是正确的术语,如果您使用zip,则尝试一次产生所有数据,几乎可以保证您的内存不足,请查看此链接以获取更多https://pybit.es/generators.html

您宁愿为此使用yield函数。

那是一个粗略的实现

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

这将一次产生X和Y而不是一次产生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正在创建无限流,因此试图一次通过一个生成器将其拆分成图。