Python keras培训期间使用fit_生成器时出现问题
我正在处理非常大的文本数据集。我考虑使用Python keras培训期间使用fit_生成器时出现问题,python,keras,neural-network,Python,Keras,Neural Network,我正在处理非常大的文本数据集。我考虑使用model.fit\u generator方法而不是简单的model.fit,因此我尝试使用此生成器: class BatchGenerator(tf.keras.utils.Sequence): def __init__(self, x_set, y_set, batch_size): self.x, self.y = x_set, y_set self.batch_size = batch_size
model.fit\u generator
方法而不是简单的model.fit
,因此我尝试使用此生成器:
class BatchGenerator(tf.keras.utils.Sequence):
def __init__(self, x_set, y_set, batch_size):
self.x, self.y = x_set, y_set
self.batch_size = batch_size
def __len__(self):
return int(np.ceil(len(self.x) / float(self.batch_size)))
def __getitem__(self, idx):
batch_x = self.x[idx * self.batch_size:(idx + 1) * self.batch_size]
batch_y = self.y[idx * self.batch_size:(idx + 1) * self.batch_size]
return batch_x, to_categorical(batch_y,num_labels)
def列车发电机(输入、输出):
对于i,o in-zip(inp,out):
交出i,o
当我在培训期间尝试使用它时,请使用:
\inp\u列、out\u列是填充到50个令牌的序列列表
型号:安装发电机(发电机=列车发电机(输入列车、输出列车),
每个历元的步数=批量大小*100,
纪元=20,
使用(多处理=真)
我得到:
ValueError: Error when checking input: expected embedding_input to have shape (50,) but got array with shape (1,)
现在,我尝试使用simplemodel.fit
方法,效果很好。所以,我认为我的问题出在发电机上,但是,因为我对使用发电机是新手,我不知道如何解决它。完整的模型摘要如下:
Layer (type) Output Shape
===========================================
Embedding (Embedding) (None, 50, 400)
___________________________________________
Bi_LSTM_1 (Bidirectional) (None, 50, 1024)
___________________________________________
Bi_LSTM_2 (Bidirectional) (None, 50, 1024)
___________________________________________
Output (Dense) (None, 50, 153)
===========================================
#编辑1
第一句话不知怎的打动了我。我意识到我误解了发电机的工作原理。我的生成器的输出是形状为50的列表,而不是形状为50的N个列表。因此,我深入研究了keras文档并找到了。因此,我改变了我的工作方式,这是一门作为发电机工作的课程:
class BatchGenerator(tf.keras.utils.Sequence):
def __init__(self, x_set, y_set, batch_size):
self.x, self.y = x_set, y_set
self.batch_size = batch_size
def __len__(self):
return int(np.ceil(len(self.x) / float(self.batch_size)))
def __getitem__(self, idx):
batch_x = self.x[idx * self.batch_size:(idx + 1) * self.batch_size]
batch_y = self.y[idx * self.batch_size:(idx + 1) * self.batch_size]
return batch_x, to_categorical(batch_y,num_labels)
其中to_category
是函数:
def to_categorical(sequences, categories):
cat_sequences = []
for s in sequences:
cats = []
for item in s:
cats.append(np.zeros(categories))
cats[-1][item] = 1.0
cat_sequences.append(cats)
return np.array(cat_sequences)
所以,我现在注意到的是我的网络性能得到了很好的提升,每个时代都持续了一半。发生这种情况是因为我有更多的可用RAM,因为现在我没有将所有数据集加载到内存中?Trye在输入列上交互并查看形状。我认为这是维度代表中的一个问题。但只有当我看到数据我才能帮上忙。谢谢@JúlioCesarPereiraRocha我无法解释为什么,但你的评论不知怎的触动了我!我编辑了这篇文章。@mao95在BatchGenerator类中,在def__len__(self)方法中,float(self.未完成。@CanbeyBilgili抱歉,没有注意到,我编辑了代码,谢谢!