首页 文章

's the purpose of nb_epoch in Keras'的fit_generator是什么?

提问于
浏览
3

看起来我可以通过使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)与(sample_per_epoch = 200,nb_epoch = 1)相同的结果 . 我是否按预期使用fit_generator?

1 回答

  • 3

    是的 - 你是对的,当使用 keras.fit_generator 时,这两种方法是等价的 . 但是 - 保持 epochs 是合理的有多种原因:

    • Logging: 在这种情况下 epoch 包含您想要记录一些关于培训的重要统计数据的数据量(例如,在纪元结束时的时间或损失) .

    • Keeping directory structure 当您使用生成器从硬盘加载数据时 - 在这种情况下 - 当您知道目录中有多少文件时 - 您可以将 batch_sizenb_epoch 调整为这样的值,即epoch将包含在每个示例中你的数据集 .

    • Keeping the structure of data when using flow generator - 在这种情况下,当您有例如加载到 Python 的一组图片,并且您希望使用 Keras.ImageDataGenerator 应用不同类型的数据转换,设置 batch_sizenb_epoch ,使得epoch包含遍历数据集中的每个示例可能有助于您跟踪您的进度训练过程 .

相关问题