我学习了三种将数据馈送到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)
三个相同模型(model1
,model2
,model3
)的损失是不同的。