【问题标题】:Criteria for nb_epoch, samples_per_epoch, and nb_val_samples in keras fit_generator?keras fit_generator 中 nb_epoch、samples_per_epoch 和 nb_val_samples 的标准?
【发布时间】:2017-03-11 10:40:17
【问题描述】:

我创建了一个简单的猫狗图像分类(卷积神经网络)。每个类有 7000 个训练数据和每个类 5500 个验证数据。

我的问题是我的系统没有完成所有纪元。如果有人能解释选择 nb_epoch、samples_per_epoch 和 nb_val_samples 值的比例或标准,以便从给定数量的训练和验证数据中获得最大收益,我将不胜感激。

以下是我的代码:

from keras.preprocessing.image import ImageDataGenerator
from keras.models import Sequential
from keras.layers import Convolution2D, MaxPooling2D
from keras.layers import Activation, Dropout, Flatten, Dense
from keras.callbacks import EarlyStopping
import numpy as np
from keras.preprocessing import image
from keras.utils.np_utils import probas_to_classes

model=Sequential()
model.add(Convolution2D(32, 5,5, input_shape=(28,28,3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2,2)))

model.add(Convolution2D(32,3,3))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2,2)))

model.add(Flatten())
model.add(Dense(128))
model.add(Activation('relu'))
model.add(Dropout(0.5))

model.add(Dense(2))
model.add(Activation('softmax'))

train_datagen=ImageDataGenerator(rescale=1./255,
shear_range=0.2,
zoom_range=0.2,
horizontal_flip=True)
test_datagen=ImageDataGenerator(rescale=1./255)

train_generator=train_datagen.flow_from_directory(
r'F:\data\train',
target_size=(28,28),
classes=['dog','cat'],
batch_size=10,
class_mode='categorical',
shuffle=True)

validation_generator=test_datagen.flow_from_directory(
r'F:\data\validation',
target_size=(28, 28),
classes=['dog','cat'],
batch_size=10,
class_mode='categorical',
shuffle=True)

model.compile(loss='categorical_crossentropy', optimizer='rmsprop', metrics=['accuracy'])
early_stopping=EarlyStopping(monitor='val_loss', patience=2)
model.fit_generator(train_generator,verbose=2, samples_per_epoch=650, nb_epoch=100, validation_data=validation_generator, callbacks=[early_stopping],nb_val_samples=550)

json_string=model.to_json()
open(r'F:\data\mnistcnn_arc.json','w').write(json_string)
model.save_weights(r'F:\data\mnistcnn_weights.h5')
score=model.evaluate_generator(validation_generator, 1000)

print('Test score:', score[0])
print('Test accuracy:', score[1])

img_path = 'F:/abc.jpg'
img = image.load_img(img_path, target_size=(28, 28))
x = image.img_to_array(img)
x = np.expand_dims(x, axis=0)

y_proba = model.predict(x)
y_classes = probas_to_classes(y_proba)
print(train_generator.class_indices)
print(y_classes)

【问题讨论】:

    标签: python tensorflow keras conv-neural-network


    【解决方案1】:

    samples_per_epoch 通常设置为:

    samples_per_epoch=train_generator.nb_samples
    

    通过这种方式,您可以确保在每个时期您看到的样本数量都与您的训练集的大小相等。这意味着您可以在每个 epoch 看到所有的训练样本。


    nb_epoch 完全取决于您。它决定了您对samples_per_epoch 定义的数字进行迭代的次数。

    举个例子,在您的代码中,您的模型现在正在“看到”(nb_epoch * samples_per_epoch) 图像,在本例中是 65000 张图像。


    nb_val_samples 确定在完成每个 epoch 后评估您的模型的验证样本数。这也取决于你。通常的事情是设置:

    nb_val_samples=validation_generator.nb_samples
    

    为了在完整的验证集上评估您的模型。


    batch_size 决定了同时将多少张图像输入到您的 gpu(或 cpu)。愚蠢的规则是设置你的gpu内存允许的最大batch_size。理想的 batch_size 是当今研究的活跃领域,但通常更大的 batch_size 会更好。

    【讨论】:

    • batch_size 是如何在这里发挥作用的?为它选择值的良好标准应该是什么?
    • 最后一件事,我的训练数据有 7k 乘以 2 个类,所以 train_generator.train_samples 将单独保存和执行,或者全部在 samples_per_epoch 中执行?
    • 我不完全理解你的问题。你能用另一种方式重新解释一下吗?
    • 你说,“在你的代码中,你的模型现在正在‘看到’(nb_epoch * samples_per_epoch) 图像,在这种情况下是 65000 个图像。”我的问题是每个班级65000个还是只有一个? (因为我有 2 个班级,每个班级有 7000 张图片)
    • 两个类的 65000。生成器每个时期只从 7000 只猫和 7000 只狗中挑选 650 张图像。在 (nb_epoch * samples_per_epoch) 中,如果您按照我的回答设置 samples_per_epoch=train_generator.nb_samples ,则您的数据集的 samples_per_epoch 将等于 14000
    猜你喜欢
    • 1970-01-01
    • 2018-03-01
    • 2017-09-13
    • 1970-01-01
    • 2019-10-26
    • 2017-12-30
    • 2019-04-25
    • 1970-01-01
    • 2017-09-13
    相关资源
    最近更新 更多