Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python keras培训期间使用fit_生成器时出现问题_Python_Keras_Neural Network - Fatal编程技术网

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,)
现在,我尝试使用simple
model.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抱歉,没有注意到,我编辑了代码,谢谢!