Keras 需要很长时间才能进入下一个纪元
Keras takes long time to go to next epoch
在训练 CNN 时,每个 epoch 完成后进入下一个 epoch 需要更多时间,而每个 epoch 可以在 60s-80s 内完成,移动到下一个 epoch 大约需要 5 分钟。我已经提供了我的代码,有什么我遗漏的吗?
#importing the libraries
from keras.models import Sequential
from keras.layers import Conv2D
from keras.layers import MaxPooling2D
from keras.layers import Flatten
from keras.layers import Dense
#inintializing the ANN
classifier = Sequential()
# Convolutional layer
classifier.add(Conv2D(64,(3,3),input_shape =(128, 128, 3), activation = 'relu'))
#pooling layer
classifier.add(MaxPooling2D(pool_size = (2,2)))
#second convolutional layer
classifier.add(Conv2D(128,(3,3), activation = 'relu'))
classifier.add(MaxPooling2D(pool_size = (2,2)))
# flatten
classifier.add(Flatten())
#full connection
classifier.add(Dense(output_dim = 128, activation = 'relu'))
classifier.add(Dense(output_dim = 1, activation = 'sigmoid'))
#compiling the cnn
classifier.compile(optimizer = 'adam', loss = 'binary_crossentropy', metrics = ['accuracy'])
# we create two instances with the same arguments
from keras.preprocessing.image import ImageDataGenerator
train_datagen = ImageDataGenerator(rescale = 1./255,
shear_range = 0.2,
zoom_range = 0.2,
horizontal_flip = True)
test_datagen = ImageDataGenerator(rescale = 1./255)
training_set = train_datagen.flow_from_directory('dataset/training_set',
target_size = (128, 128),
batch_size = 32,
class_mode = 'binary')
test_set = test_datagen.flow_from_directory('dataset/test_set',
target_size = (128, 128),
batch_size = 32,
class_mode = 'binary')
classifier.fit_generator(training_set,
samples_per_epoch = 8000,
nb_epoch = 25,
validation_data = test_set,
nb_val_samples = 2000)
如果您使用 ImageDataGenerator,则无需设置 samples_per_epoch
和 nb_val_samples
,因为这是一个序列并且内部包含其长度(当然,如果您使用最新的 Keras 版本)。问题是nb_val_steps
用于参数validation_steps
,我认为你只是将这个值设置得比正确的值高很多。
如果需要,您应该将 steps_per_epoch
和 validation_steps
设置为正确的值,如果您将 validation_steps
设置为大于 len(val_data) / batch_size
的值,您实际上是在告诉keras 使用比必要更多的数据进行验证,从而减慢验证步骤。
在训练 CNN 时,每个 epoch 完成后进入下一个 epoch 需要更多时间,而每个 epoch 可以在 60s-80s 内完成,移动到下一个 epoch 大约需要 5 分钟。我已经提供了我的代码,有什么我遗漏的吗?
#importing the libraries
from keras.models import Sequential
from keras.layers import Conv2D
from keras.layers import MaxPooling2D
from keras.layers import Flatten
from keras.layers import Dense
#inintializing the ANN
classifier = Sequential()
# Convolutional layer
classifier.add(Conv2D(64,(3,3),input_shape =(128, 128, 3), activation = 'relu'))
#pooling layer
classifier.add(MaxPooling2D(pool_size = (2,2)))
#second convolutional layer
classifier.add(Conv2D(128,(3,3), activation = 'relu'))
classifier.add(MaxPooling2D(pool_size = (2,2)))
# flatten
classifier.add(Flatten())
#full connection
classifier.add(Dense(output_dim = 128, activation = 'relu'))
classifier.add(Dense(output_dim = 1, activation = 'sigmoid'))
#compiling the cnn
classifier.compile(optimizer = 'adam', loss = 'binary_crossentropy', metrics = ['accuracy'])
# we create two instances with the same arguments
from keras.preprocessing.image import ImageDataGenerator
train_datagen = ImageDataGenerator(rescale = 1./255,
shear_range = 0.2,
zoom_range = 0.2,
horizontal_flip = True)
test_datagen = ImageDataGenerator(rescale = 1./255)
training_set = train_datagen.flow_from_directory('dataset/training_set',
target_size = (128, 128),
batch_size = 32,
class_mode = 'binary')
test_set = test_datagen.flow_from_directory('dataset/test_set',
target_size = (128, 128),
batch_size = 32,
class_mode = 'binary')
classifier.fit_generator(training_set,
samples_per_epoch = 8000,
nb_epoch = 25,
validation_data = test_set,
nb_val_samples = 2000)
如果您使用 ImageDataGenerator,则无需设置 samples_per_epoch
和 nb_val_samples
,因为这是一个序列并且内部包含其长度(当然,如果您使用最新的 Keras 版本)。问题是nb_val_steps
用于参数validation_steps
,我认为你只是将这个值设置得比正确的值高很多。
如果需要,您应该将 steps_per_epoch
和 validation_steps
设置为正确的值,如果您将 validation_steps
设置为大于 len(val_data) / batch_size
的值,您实际上是在告诉keras 使用比必要更多的数据进行验证,从而减慢验证步骤。