似乎我可以通过使num_samples更大并保持nb_epoch = 1来获得完全相同的结果。我认为多个时代的目的是多次迭代相同的数据,但Keras不会在每个时代结束时重新实现生成器。它只是继续前进。例如,训练这个自动编码器:
import numpy as np
from keras.layers import (Convolution2D, MaxPooling2D,
UpSampling2D, Activation)
from keras.models import Sequential
rand_imgs = [np.random.rand(1, 100, 100, 3) for _ in range(1000)]
def keras_generator():
i = 0
while True:
print(i)
rand_img = rand_imgs[i]
i += 1
yield (rand_img, rand_img)
layers = ([
Convolution2D(20, 5, 5, border_mode='same',
input_shape=(100, 100, 3), activation='relu'),
MaxPooling2D((2, 2), border_mode='same'),
Convolution2D(3, 5, 5, border_mode='same', activation='relu'),
UpSampling2D((2, 2)),
Convolution2D(3, 5, 5, border_mode='same', activation='relu')])
autoencoder = Sequential()
for layer in layers:
autoencoder.add(layer)
gen = keras_generator()
autoencoder.compile(optimizer='adadelta', loss='binary_crossentropy')
history = autoencoder.fit_generator(gen, samples_per_epoch=100, nb_epoch=2)
我似乎得到与(samples_per_epoch = 100,nb_epoch = 2)相同的结果(samples_per_epoch = 200,nb_epoch = 1)。我是否按预期使用fit_generator?
答案 0 :(得分:4)
是的 - 你使用keras.fit_generator
时这是正确的,这两种方法是等价的。但是 - 保持epochs
是合理的有多种原因:
epoch
包含您希望记录一些有关培训的重要统计信息的数据量(例如,在纪元结束时的时间或损失)。 batch_size
这样的值,epoch将包含遍历数据集中的每个示例。nb_epoch
生成器时保持数据结构 - 在这种情况下,例如一组图片已加载到您的flow
,并且您希望使用Python
来应用不同类型的数据转换,设置Keras.ImageDataGenerator
和batch_size
的方式包括数据集中的每个示例都可以帮助您跟踪培训过程的进度。