我将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中以获取当前分配信息。
答案 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正在创建无限流,因此试图一次通过一个生成器将其拆分成图。