在Keras中使用自定义数据生成器有什么好处?

时间:2019-09-03 13:16:20

标签: keras

我学习了三种将数据馈送到keras模型进行训练的方法。

第一种方式:

model1.fit(x_examples, y_examples, batch_size=10, epochs=2, shuffle=True)

第二种方法,使用一个函数:

def data_generator(batch_size=10):
    indices = np.arange(len(x_examples)); n = len(x_examples)
    i = 0
    while True:
        x_data, y_data = [], []
        for b in range(batch_size):
            if i==0: np.random.shuffle(indices)
            x_data.append(x_examples[i]); y_data.append(y_examples[i])
            i = (i+1) % n
        x_data = np.array(x_data); y_data = np.array(y_data)
        yield x_data, y_data

model2.fit_generator(generator=data_generator(), 
    steps_per_epoch=len(x_examples)//batch_size, epochs=2)

第三种方式,使用一个类:

class DataGenerator(keras.utils.Sequence):
    def __init__(self, batch_size=10, shuffle=True):
        super().__init__()
        self.batch_size = batch_size
        self.shuffle = shuffle
        self.on_epoch_end()
    def __len__(self):
        return int(np.floor(len(x_examples) / self.batch_size))
    def on_epoch_end(self):
        self.indexes = np.arange(len(x_examples))
        if self.shuffle == True:
            np.random.shuffle(self.indexes)
    def __getitem__(self, index):
        indexes = self.indexes[index * self.batch_size: (index + 1) * self.batch_size]
        X = x_examples[indexes]; y = y_examples[indexes]
        return X, y

model3.fit_generator(generator=DataGenerator(), epochs=2)

这三种方法是否等效?通过运行一个简单的测试,我固定了以下随机状态:

numpy.random.seed(0)
tensorflow.set_random_seed(0)

三个相同模型(model1model2model3)的损失是不同的。

0 个答案:

没有答案