【问题标题】:Image classification using Keras,CNN training very SLOWLY使用 Keras 进行图像分类,CNN 训练非常缓慢
【发布时间】:2019-05-17 04:14:51
【问题描述】:

我尝试使用 CNN 进行二元分类。使用与https://www.udemy.com/deeplearning/ 中解释的完全相同的代码完成。但是当我在我的 PC(CPU-8 GB RAM)上运行代码时,训练在每个 epoch 中执行非常缓慢,即使我将批量大小设置为 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 作为后端。

谢谢!

【问题讨论】:

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


    【解决方案1】:

    尽管 GPU 无疑会为 DNN 的推理和训练提供显着的速度提升,但通过正确的 CPU 优化可能带来的性能提升通常在很大程度上被忽略了。 这个问题是关于CPU 训练缓慢(可能使用 Keras) 背后的合理原因。

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

    • 使用pip install tensorflow 安装 TF 时,您将获得与尽可能多的机器配置兼容的通用版本,因为pipeasy_installvirtualenv 等)专注于Python,忽略非 Python 库依赖项,例如 HDF5MKLLLVM 等。使用英特尔的 MKL-DNN 安装优化的 TF 构建可能会带来高达“70 倍以上的训练性能”推理性能提高 85 倍" (reference)。阅读此处了解如何build your pip-wheel with MKL support

    • 1234563对于pipconda 的一般性讨论)。另请参阅this article,以直接比较 Eigen 的 CPU 和 MKL 优化版本的 TF 上的性能。安装 MKL 优化版本的示例:conda install tensorflow-mkl
    • 此外,从源代码构建 TensorFlow 以获得最佳性能。 MKL(-DNN)(通常)速度很快,并且允许在不知道可访问的本机 SIMD 矢量扩展的情况下部署预构建的二进制文件,但取决于您的 CPU 生态系统,使用 AVX/AVX2/AVX512 扩展可能(甚至)更快。

    优化您的输入管道

    • 最后,请注意 Keras。使用 Keras 作为 DNN 训练的输入管道也可能成为一个重大瓶颈。 Keras 依赖于 Python 的 multithreading(以及可选的 multiprocessing)库,与 @ 987654325@。考虑离线执行增强,或使用替代输入管道(例如 TF 原生 tf.data,或第 3 方,如 Tensorpack

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

    【讨论】:

      【解决方案2】:

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

      查看这里的简单示例:https://github.com/brandonschabell/AircraftClassification/blob/new-model-brandon/BrandonsModel.py

      【讨论】:

        【解决方案3】:

        把你所有的数据放在你的谷歌驱动器里,然后挂载到http://colab.research.google.com。 ...并在 GPU 上免费运行您的代码! 处理图像时,CPU 不是最佳选择...

        【讨论】:

          猜你喜欢
          • 2018-09-17
          • 1970-01-01
          • 2017-07-18
          • 2016-06-20
          • 2020-12-27
          • 1970-01-01
          • 2021-01-20
          • 1970-01-01
          • 2017-07-07
          相关资源
          最近更新 更多