使用Keras进行图像分类,CNN训练非常缓慢

时间:2018-12-16 16:44:59

标签: python image-processing keras conv-neural-network

我尝试使用CNN进行二进制分类。使用与https://www.udemy.com/deeplearning/中所述完全相同的代码来完成。但是,当我在PC(CPU-8 GB RAM)上运行代码时,即使我将批处理大小设为32,训练也非常缓慢地在每个时期执行单个项目。但是,在讲师的计算机(即使他也使用CPU)。 训练集总共包含8000张图像,测试集包含2000张图像。我知道对于这么大的数据,处理肯定会很慢,但是我注意到它比平常要慢得多。

from keras.layers import Dense
from keras.layers import Convolution2D
from keras.layers import MaxPooling2D
from keras.layers import Flatten
from keras.models import Sequential
classifier=Sequential()

classifier.add(Convolution2D(32, (3, 3 ), input_shape=(64,64,3),activation='relu'))

classifier.add(MaxPooling2D(pool_size=(2 , 2)))

classifier.add(Flatten())

classifier.add(Dense(units=128, activation='relu'))
classifier.add(Dense(units=1, activation='sigmoid'))

classifier.compile(optimizer='adam' , loss='binary_crossentropy' ,metrics=['accuracy'])


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=(64, 64), #since 64,64,pixels
        batch_size=32,
        class_mode='binary')



test_set= test_datagen.flow_from_directory(
        'dataset/test_set',
        target_size=(64, 64),
        batch_size=32,
        class_mode='binary')

classifier.fit_generator(
        training_set,
        steps_per_epoch=8000,
        epochs=25,
        validation_data=test_set,
        validation_steps=2000)

基于目录的图像预处理流程按照Keras文档中的说明进行,以Tensorflow作为后端。

谢谢!

3 个答案:

答案 0 :(得分:2)

Dan绝对正确,认为在GPU上运行将挽救生命。但是,我注意到您的“ steps_per_epoch”值为8000,该值等于训练集中的图像数量。这通常应等于图像数量除以批处理大小。在您的情况下,steps_per_epoch应该等于8000/32 = 250。

快速查看示例:https://github.com/brandonschabell/AircraftClassification/blob/new-model-brandon/BrandonsModel.py

答案 1 :(得分:1)

将所有数据放入Google驱动器,并将其装入http://colab.research.google.com。 ...并在GPU上免费运行代码! 处理图像时,CPU并不是最佳选择...

答案 2 :(得分:0)

尽管毫无疑问,GPU将大大提高DNN的推理和训练速度,但通常会忽略通过正确的CPU优化实现的性能提升。 这个问题是关于 CPU缓慢训练 (可能与Keras一起使用)的可能原因。

安装(或编译)正确的TensorFlow二进制文件:

  • 在使用pip install tensorflow安装TF时,您将获得一个与尽可能多的计算机配置兼容的通用版本,因为pipeasy_install,{{1} }等)专注于Python,而忽略了非Python库依赖项,例如virtualenvHDF5MKL等。使用英特尔MKL-DNN安装优化的TF构建可能(reference)带来最高“ 70倍的训练性能和最高85倍的推理性能”。在这里阅读如何build your pip-wheel with MKL support

  • 如果您不想自己打扰从源代码编译TF,请使用LLVM安装TF二进制文件,该文件可以处理Python包以及Python包本身(例如{ {3}}进行condapip的一般讨论。另请参阅see here,以直接比较Eigen和MKL优化版本TF的CPU性能。安装MKL优化版本的示例:conda

  • 此外,从源代码构建TensorFlow以获得最佳性能。 MKL(-DNN)通常很快速,并且可以在不知道可访问的本机SIMD矢量扩展的情况下部署预构建的二进制文件,但是取决于使用AVX / AVX2 / AVX512扩展的CPU生态系统,它可能会(甚至)更快。 / p>

优化您的输入管道

  • 最后,请注意Keras。使用Keras作为DNN培训的输入管道也可能会成为一个巨大的瓶颈。 Keras依赖于Python的conda install tensorflow-mkl(以及可选的multithreading)库,它们可能缺乏性能(当执行大量I / O或即时进行扩充时)和可伸缩性(当在多个CPU上运行时) )与this article相比。考虑离线执行增强,或使用其他输入管道(例如TF本机GIL-free implementations或第三方的管道,例如tf.data

最后,如果您刚开始使用TensorFlow,请不要费心将最后的FLOP挤出系统。一开始并不那么重要。