使用 Keras 深度学习库通过 CNN 进行对象分类

Keras 是一个用于深度学习的 Python 库,它封装了强大的数值库 Theano 和 TensorFlow。

传统神经网络在解决一个困难问题时会遇到瓶颈,这个问题被称为对象识别。它指的是模型能够识别图像中的对象。

在这篇文章中,你将学习如何在 Keras 中开发和评估用于对象识别的深度学习模型。完成本教程后,你将了解:

  • 关于 CIFAR-10 对象分类数据集以及如何在 Keras 中加载和使用它
  • 如何创建用于对象识别的简单卷积神经网络
  • 如何通过创建更深层的卷积神经网络来提升性能

通过我的新书《使用 Python 进行深度学习启动你的项目,其中包括分步教程和所有示例的 Python 源代码文件。

让我们开始吧。

  • 2016 年 7 月:首次发布
  • 2016 年 10 月更新:针对 Keras 1.1.0 和 TensorFlow 0.10.0 进行了更新。
  • 2017 年 3 月更新:针对 Keras 2.0.2、TensorFlow 1.0.1 和 Theano 0.9.0 进行了更新。
  • 2019 年 9 月更新:针对 Keras 2.2.5 API 进行了更新。
  • 2022 年 7 月更新:更新至 TensorFlow 2.x API

有关为 CIFAR-10 开发 CNN 的扩展教程,请参阅以下帖子:

CIFAR-10 问题描述

自动分类对象照片的问题非常困难,因为对象的排列、位置、光照等因素几乎是无限的。这是一个棘手的问题。

这是计算机视觉领域的一个热门研究问题,最近也成为深度学习能力的重要展示。为此问题开发的标准计算机视觉和深度学习数据集是由加拿大高级研究所(CIFAR)开发的。

CIFAR-10 数据集包含 60,000 张照片,分为 10 个类别(因此得名 CIFAR-10)。类别包括飞机、汽车、鸟、猫等常见物体。数据集以标准方式划分,其中 50,000 张图像用于模型训练,其余 10,000 张用于评估其性能。

照片为彩色,包含红、绿、蓝分量,但尺寸较小,为 32 x 32 像素的正方形。

使用非常大的卷积神经网络可以获得最先进的结果。你可以在Rodrigo Benenson 的网页上了解 CIFAR-10 的最先进结果。模型性能以分类准确率报告,高于 90% 的性能非常好,人类在此问题上的性能为 94%,撰写本文时最先进的结果为 96%。

有一个使用 CIFAR-10 数据集的 Kaggle 竞赛。这是一个加入讨论开发新模型并获取模型和脚本作为起点的绝佳场所。

Python 深度学习需要帮助吗?

参加我的免费为期两周的电子邮件课程,发现 MLP、CNN 和 LSTM(附代码)。

立即点击注册,还将免费获得本课程的 PDF 电子书版本。

在 Keras 中加载 CIFAR-10 数据集

CIFAR-10 数据集可以很容易地在 Keras 中加载。

Keras 具有通过 `cifar10.load_data()` 函数自动下载 CIFAR-10 等标准数据集并将其存储在 `~/.keras/datasets` 目录中的功能。此数据集大小为 163 兆字节,因此可能需要几分钟才能下载。

下载后,后续调用该函数将加载数据集以供使用。

数据集以腌制训练集和测试集的形式存储,可在 Keras 中使用。每个图像都表示为一个三维矩阵,具有红、绿、蓝、宽度和高度的维度。我们可以直接使用 matplotlib 绘制图像。

运行代码会创建一个 3x3 的照片图。图像已经从 32x32 的小尺寸放大,但你仍然可以清楚地看到卡车、马和汽车。你还可以看到一些图像被强制转换为方形长宽比后出现的一些失真。

Small Sample of CIFAR-10 Images

CIFAR-10 图像小样本

用于 CIFAR-10 的简单卷积神经网络

CIFAR-10 问题最好使用卷积神经网络 (CNN) 解决。

你可以通过定义此示例中需要的所有类和函数来快速开始。

接下来,你可以加载 CIFAR-10 数据集。

红色、绿色和蓝色通道的像素值范围从 0 到 255。

使用归一化数据是一种好习惯。因为输入值易于理解,所以你可以通过将每个值除以最大观测值(即 255)来轻松归一化到 0 到 1 的范围。

请注意,数据以整数形式加载,因此你必须将其转换为浮点值才能执行除法。

输出变量定义为一个整数向量,范围从 0 到 1,表示每个类别。

你可以使用独热编码将它们转换为二进制矩阵,以最好地模拟分类问题。此问题有十个类别,因此你可以预期二进制矩阵的宽度为 10。

让我们从定义一个简单的 CNN 结构作为基线开始,并评估它在这个问题上的表现。

你将使用一个包含两个卷积层,然后是最大池化层和网络平坦化到全连接层的结构来做出预测。

基线网络结构可以总结如下:

  1. 卷积输入层,32 个特征图,大小为 3x3,使用整流器激活函数,权重约束最大范数设置为 3
  2. Dropout 设置为 20%
  3. 卷积层,32 个特征图,大小为 3x3,使用整流器激活函数,权重约束最大范数设置为 3
  4. 最大池化层,大小为 2x2
  5. 展平层
  6. 全连接层,512 个单元,使用整流器激活函数
  7. Dropout 设置为 50%
  8. 全连接输出层,10 个单元,使用 softmax 激活函数

使用对数损失函数,并使用随机梯度下降优化算法,配置为具有大学习率 0.01 的大动量和权重衰减。

你可以使用 25 个 epoch 和 32 的批次大小来拟合这个模型。

选择少量 epoch 是为了让本教程更容易理解。通常,对于这个问题,epoch 的数量会大一个或两个数量级。

模型拟合后,你将在测试数据集上评估它,并打印出分类准确率。

将所有这些结合起来,完整的示例如下所示。

运行此示例将提供以下结果。首先,总结了网络结构,这证实了设计已正确实现。

每个 epoch 后,训练和测试数据集上的分类准确率和损失都会被打印出来。

注意:由于算法或评估过程的随机性,或者数值精度的差异,你的结果可能会有所不同。考虑多次运行示例并比较平均结果。

该模型在测试集上进行评估,准确率达到 70.5%,这并不出色。

你可以通过创建一个更深层的网络来显著提高准确率。这就是你将在下一节中探讨的内容。

用于 CIFAR-10 的大型卷积神经网络

你已经看到,一个简单的 CNN 在这个复杂问题上表现不佳。在本节中,你将探讨如何扩大模型的规模和复杂性。

让我们设计一个简单 CNN 的深度版本。你可以引入额外的卷积层,并增加更多的特征图。你将使用相同的卷积、Dropout、卷积和最大池化层模式。

该模式将重复三次,分别使用 32、64 和 128 个特征图。其效果是随着最大池化层的存在,特征图的数量增加而尺寸越来越小。最后,在网络的输出端将使用一个额外且更大的全连接层,以尝试更好地将大量特征图转换为类别值。

新网络架构的总结如下:

  • 卷积输入层,32 个特征图,大小为 3x3,使用整流器激活函数
  • Dropout 层,20%
  • 卷积层,32 个特征图,大小为 3x3,使用整流器激活函数
  • 最大池化层,大小为 2x2
  • 卷积层,64 个特征图,大小为 3x3,使用整流器激活函数
  • Dropout 层,20%。
  • 卷积层,64 个特征图,大小为 3x3,使用整流器激活函数
  • 最大池化层,大小为 2x2
  • 卷积层,128 个特征图,大小为 3x3,使用整流器激活函数
  • Dropout 层,20%
  • 卷积层,128 个特征图,大小为 3x3,使用整流器激活函数
  • 最大池化层,大小为 2x2
  • 展平层
  • Dropout 层,20%
  • 全连接层,1024 个单元,使用整流器激活函数
  • Dropout 层,20%
  • 全连接层,512 个单元,使用整流器激活函数
  • Dropout 层,20%
  • 全连接输出层,10 个单元,使用 softmax 激活函数

你可以非常容易地在 Keras 中定义此网络拓扑,如下所示:

你可以使用与上述相同的程序和相同的 epoch 数量来拟合和评估此模型,但批次大小通过一些小的实验调整为 64。

将所有这些结合起来,完整的示例如下所示。

运行此示例将打印每个 epoch 在训练和测试数据集上的分类准确率和损失。

注意:由于算法或评估过程的随机性,或者数值精度的差异,你的结果可能会有所不同。考虑多次运行示例并比较平均结果。

最终模型的分类准确率估计值为 79.5%,比我们简单的模型高出 9 个百分点。

改进模型性能的扩展

你在这个非常困难的问题上取得了不错的成绩,但距离取得世界级的成果还有很长的路要走。

以下是一些你可以尝试的想法,以扩展模型并提高模型性能。

  • 训练更多周期。每个模型都只训练了非常少的周期,25个。通常,大型卷积神经网络会训练数百甚至数千个周期。你应该期望通过显著增加训练周期数来提高性能。
  • 图像数据增强。图像中的物体位置各不相同。通过使用一些数据增强,很可能可以进一步提高模型性能。标准化、随机位移或水平图像翻转等方法可能会有所帮助。
  • 更深的网络拓扑。所呈现的较大网络已经很深,但可以为该问题设计更大的网络。这可能涉及在输入层附近使用更多的特征图,并可能减少池化操作的激进程度。此外,可以采用并评估已证明有用的标准卷积网络拓扑。

总结

在这篇文章中,你学习了如何在 Keras 中创建深度学习模型,用于照片中的物体识别。

通过本教程,你学到了:

  • 关于 CIFAR-10 数据集以及如何在 Keras 中加载它,并绘制数据集中的临时示例。
  • 如何在问题上训练和评估一个简单的卷积神经网络。
  • 如何将简单的卷积神经网络扩展为深度卷积神经网络,以提高解决这个难题的性能。
  • 如何使用数据增强在困难的物体识别问题上获得进一步的提升。

你对物体识别或这篇文章有任何疑问吗?请在评论中提出你的问题,我将尽力回答。

188 条评论:使用 Keras 深度学习库通过 CNN 进行物体分类

  1. Aakash Nain 2016年7月24日晚上9:53 #

    你好 Jason,
    maxnorm 在深度学习中有什么用?

  2. Aqsa 2016年7月31日下午4:46 #

    嗨 Jason
    我正在实时检测路标。我的图像大小是 800*1360。路标的大小从 16*16 到 256*256 不等。我如何才能利用卷积神经网络来实现这个目标,以获得良好的实时检测精度?

    • Jason Brownlee 2016年8月1日上午6:28 #

      Aqsa,请考虑你如何构建这个问题。两个选项是:

      1) 你可以将所有图像重新缩放到相同大小。
      2) 你可以对所有图像进行零填充。

      至于这个问题的网络细节,你需要设计和测试不同的结构。也许你可以利用现有的表现良好的结构,如 VGG 或 Inception。

  3. Jack 2016年9月1日下午12:54 #

    PCD 格式或 OFF 格式的 3D 数据集应该是什么输入维度?
    顺便说一下,我觉得你的教程非常有用。:-)

    • Jason Brownlee 2016年9月2日上午8:04 #

      抱歉,Jack,我不知道这些格式是什么。

      • Jack 2016年9月2日下午2:48 #

        点云数据 (PCD) 包含物体的 x、y 和 z 坐标……我想构建一个用于 3D 物体分类的神经网络……我面临的问题是我不知道网络的输入应该是什么……对于对图像进行分类的神经网络,你传递像素值 (0-255),但 PCD 文件只有坐标……将坐标作为输入是否明智?
        我可以提取物体的一些特征(从 pcd 文件中)……我可以将这些特征作为输入吗?
        我是这个领域的新手,所以我在理解事物方面有困难……

        • Jason Brownlee 2016年9月3日上午6:55 #

          我想知道你是否可以将坐标重新缩放到 0-1 的范围。然后直接提供它们。

          从那里,你将有一个基线,并且可以开始探索坐标的其他变换,例如投影到 2D。

        • Sanketh 2018年2月18日上午4:41 #

          你找到解决办法了吗?我现在也面临类似的情况。你能告诉我你是怎么解决这个问题的吗?

  4. shudhan 2016年9月2日下午4:49 #

    请问如何从图像中提取特征?

    • Jason Brownlee 2016年9月3日上午6:58 #

      在使用深度学习方法时,我们不再需要提取特征,因为我们正在执行自动特征学习。这是这种方法的一个巨大优势。

  5. Walid Ahmed 2016年9月10日上午4:52 #

    非常感谢。

    我有一个问题

    在 Keras 中,如何提取图像中检测到的物体(或多个物体)的确切位置,其中图像包含背景?
    我假设它使用滑动窗口进行物体检测

    • Jason Brownlee 2016年9月10日上午7:12 #

      好问题,Walid。

      这在图像中被称为物体识别。我目前还没有一个例子,但我将来会准备一个。

  6. Vinay 2016年9月12日上午5:04 #

    嗨……你能给出一些关于原始糖尿病或航空旅客数据集的例子吗?我的问题是如何将 CNN 应用于直接数值特征。你可以给出一个简单的例子

  7. Walid Ahmed 2016年9月14日上午3:22 #

    谢谢 Jason,我期待你的例子。

  8. NotMikeJones 2016年9月29日上午11:31 #

    在 Keras 中,你是在哪里指定第一个卷积层的输入维度的?我想尝试用时间序列进行事件检测的卷积神经网络,但 Keras 的一维卷积工作有问题。假设我的每个样本都是一个由 1 x 100 向量表示的时间序列,并且在向量中,我期望三种类型的事件在这些时间帧中的某个地方发生(不清楚事件的长度是多少,但假设大约有 10 个时间点)。我是否会使用三个特征图,然后使用一个“窗口”(例如 10 个时间点),它映射到卷积层中的单个神经元?那么我将有一个 3 x 10 的卷积层吗?

    谢谢!

    • Jason Brownlee 2016年9月30日上午7:47 #

      LSTM 是处理序列的网络,而不是 CNN。

      CNN 擅长处理空间结构,例如图像或文本中的结构。

      关于使用 LSTM 处理时间序列的本教程可能正是你所寻找的
      https://machinelearning.org.cn/time-series-prediction-lstm-recurrent-neural-networks-python-keras/

      • NotMikeJones 2016年10月1日上午12:12 #

        谢谢!我其实说错了——我不想预测未来时间点的值,而是想识别当前一组时间点是否符合某种模式,从而指示某个事件。

        例如,假设我们有健身追踪器数据,其中包含各种类型的传感器(心率、计步器、加速度计),并且我们知道一个人进行三种类型的活动:瑜伽、跑步、烹饪。我想训练一个模型来根据传感器数据识别这些活动,然后能够拉取实时数据并分类他们当前正在做什么。

        我当时认为使用带窗口方法的 CNN 会是最好的选择,但我可能完全错了。

        • Jason Brownlee 2016年10月1日上午8:02 #

          这听起来确实是一个异常检测或变化检测问题,你可能会受益于这种问题表述方式。

  9. Rafi 2016年10月18日下午6:34 #

    嗨,Jason,

    我正在运行本页中完全相同的代码,它在测试数据上产生了 71.82% 的准确率。

    唯一的区别是我使用了 70-30% 分割的验证数据集。我只得到了不到 11% 的验证和测试准确率。我的错误可能是什么?你遇到过这种情况吗?
    结果?请帮忙。

    谢谢
    拉菲

    35000/35000 [==============================] – 94s – 损失:2.2974 – 准确率:0.1158 – val_损失:2.3033 – val_准确率:0.0991
    纪元 24/25
    35000/35000 [==============================] – 94s – 损失:2.2961 – 准确率:0.1170 – val_损失:2.3035 – val_准确率:0.1022
    纪元 25/25
    35000/35000 [==============================] – 93s – 损失:2.2954 – 准确率:0.1213 – val_损失:2.3036 – val_准确率:0.0987

  10. Walid Ahmed 2016年11月2日上午2:30 #

    亲爱的Jason

    如果您能在 Keras 中说明:我如何提取图像中检测到的物体(或多个物体)的确切位置,其中图像包含背景?

    • Jason Brownlee 2016年11月2日上午9:08 #

      好问题,Walid,

      抱歉,我还没有 Keras 对象定位的示例。不过,它已列入待办事项清单。

  11. Augusto Aguirre 2016年11月2日下午2:28 #

    你好!解释得非常好!
    我正在使用你的模型对包含 0 或 1 的图像进行分类。
    为了解决这个问题,我最初可以使用最后一个隐藏层的变体进行部署

    model.add (Dense (1, activation = ‘sigmoid’))

    它会给我返回一个介于 0 或 1 之间的结果。

    当我想要调整模型时,它会给我以下错误
    “检查输入模型时出错:convolution2d_input_20 期望有 4 个维度,但得到的数组形状为 (8000, 3072)”
    我的数据集是 32x32 的 RGB 图像。因此,包含 3072 列,但其中一列为 0 或 1。
    此致!

    • Jason Brownlee 2016年11月3日上午7:50 #

      嗨 Augusto,很抱歉听到你的数据出现错误。

      原因尚不清楚,抱歉。也许你可以尝试并找出根本原因。尝试将你的示例简化到所需的最小程度,看看是否有助于找出问题。

  12. Walid Ahmed 2016年11月11日上午12:49 #

    为什么我需要在卷积层之前应用 dropout 层?

    对我来说,只有当它应用于输入层或全连接层中的任何其他层时才有意义。
    请求。

    • Jason Brownlee 2016年11月11日上午10:03 #

      嗨,Walid,

      这都是为了给网络施加压力,迫使它进行泛化。它可能是一个好的施压点来强制这种类型的学习,也可能不是。在你的问题上试试看。

  13. William Amador 2016年11月11日上午3:51 #

    嗨,Jason,我有一个问题,如果我的初始层不处理单个图像,而是处理 30 张图像序列,训练过程是怎样的?对于一个特定情况,一个人的运动序列;你有没有针对这种情况的 CNN 训练示例?

    谢谢你

    • Jason Brownlee 2016年11月11日上午10:05 #

      你好 William,好问题。抱歉,我目前还没有处理图像序列的实例。

  14. Walid Ahmed 2016年11月15日上午2:47 #

    嗨 Jason

    当我移除任何卷积层之前的 dropout 层时,我的结果有所改善。
    特别是当数据集大小很大时。

  15. Walid Ahmed 2016年11月16日上午6:06 #

    你好,Jason。
    另一个问题,我知道 Keras 有不同的优化器,在你的代码中你使用了 sgd,其他人可能使用像 adam 这样的优化器。
    https://keras.org.cn/optimizers/
    关于优化器类型有什么建议或推荐吗?

    • Jason Brownlee 2016年11月16日上午9:34 #

      嗨,Walid,

      我发现优化器通常对结果的影响很小——它们对结果的影响小于网络拓扑结构。

      SGD 广为人知,是一个很好的起点。ADAM 速度快,效果好,我实践中也经常使用。除此之外,我没有太多其他看法。

  16. Bharath Paturi 2016年11月16日下午5:54 #

    嗨,Jason,

    我有非常大的图像需要分析。每张图像的大小可能在 500 MB 到 1 GB 左右。
    我想对图像进行分割。我们可以使用卷积神经网络进行无监督学习吗?

    • Jason Brownlee 2016年11月17日上午9:52 #

      哎呀,Bharath,那些图像太大了。

      这可能,但你的内存会很快耗尽!

      抱歉,我没有好的建议。我还没有研究过这个问题。

  17. Michael 2016年11月17日上午8:40 #

    你好,

    我看到了你添加层的代码行中有一个错字。它应该写成

    model.add(Convolution2D(32, 3, 3, input_shape=(32, 32, 3), border_mode=’same’, activation=’relu’,

    • Jason Brownlee 2016年11月17日上午9:58 #

      你确定吗,Michael?我觉得一切都很好,而且示例在 Theano 和 TensorFlow 后端都能运行。

      也许我错过了什么?

      • Sean 2017年7月4日上午8:35 #

        我认为 Michael 说得对。它给我抛出了 input_shape=(3,32,32) 的错误。input_shape=(32,32,3) 应该是正确的。

    • Maxim 2016年12月19日上午1:44 #

      Michael,为了解决你的问题,请将此行:K.set_image_dim_ordering(‘th’)

      放在以下代码的上方:

      (X_train, y_train), (X_test, y_test)= cifar10.load_data()

  18. Shristi Baral 2016年11月21日下午10:15 #

    我该如何处理这个错误?在“在 Keras 中加载 CIFAR-10 数据集”下运行脚本时遇到了这个错误。我尝试修改 cifar10.py 的脚本来找出错误是什么。但我没能做到。
    —————————————————————————
    UnicodeDecodeError Traceback(最近一次调用在最后)
    in ()
    4 from scipy.misc import toimage
    5 # 加载数据
    —-> 6 (X_train, y_train), (X_test, y_test) = cifar10.load_data()
    7 # 创建一个 3×3 图像网格
    8 for i in range(0, 9)

    /home/kdc/anaconda3/lib/python3.5/site-packages/keras/datasets/cifar10.py in load_data()
    18 for i in range(1, 6)
    19 fpath = os.path.join(path, ‘data_batch_’ + str(i))
    —> 20 data, labels = load_batch(fpath)
    21 X_train[(i-1)*10000:i*10000, :, :, :] = data
    22 y_train[(i-1)*10000:i*10000] = labels

    /home/kdc/anaconda3/lib/python3.5/site-packages/keras/datasets/cifar.py in load_batch(fpath, label_key)
    10 d = cPickle.load(f)
    11 else
    —> 12 d = cPickle.load(f, encoding=”bytes”)
    13 # 解码 utf8
    14 for k, v in d.items()

    UnicodeDecodeError: 'ascii' 编解码器无法解码位置 3031 的字节 0x80:序号不在范围 (128) 内

    • Jason Brownlee 2016年11月22日上午7:05 #

      我以前从未见过这个错误,也许可以发布到 stack overflow 或 Keras 列表?

  19. Aquib Javed Khan 2016年11月22日下午8:35 #

    你好,感谢这篇很棒的教程,你的代码和解释对我理解分类任务帮助很大。

    我实际上想输入新图像并获取与其匹配的标签,我该怎么做,就像我这样做一样

    import keras
    from keras.models import load_model
    来自 keras.models import Sequential
    import cv2
    import numpy as np
    from keras.preprocessing.image import ImageDataGenerator, array_to_img, img_to_array, load_img
    model = Sequential()

    model =load_model(‘firstmodel.h5′)
    model.compile(loss=’binary_crossentropy’,
    optimizer='rmsprop',
    metrics=['accuracy'])

    img = cv2.imread(‘cat.jpg’,0)
    img = cv2.resize(img,(150,150))

    classes = model.predict_classes(img, batch_size=32)
    print classes

    我收到错误
    异常:检查时出错:预期的 convolution2d_input_1 应该有 4 个维度,但得到的数组形状为 (150, 150)

    如何修复?

    • Jason Brownlee 2016年11月23日上午8:58 #

      我的建议是确保你加载的数据与预期的输入维度完全匹配。你可能需要调整新数据的大小或进行填充以使其匹配。

  20. s 2016年12月1日下午1:23 #

    这不是物体检测,这是分类

  21. Walid 2016年12月2日上午4:40 #

    亲爱的Jason

    我非常期待 Keras 物体定位的示例,希望你尽快提供一个

    • Jason Brownlee 2016年12月2日上午8:18 #

      Walid,我希望在新的一年里尽快准备一个。

  22. Ahmed Desoky 2016年12月7日上午4:55 #

    你好 Jason,

    你的教程非常有帮助,也很棒。

    我正在使用 Keras 在 kitti 数据集上进行分类问题。我发现 kitti 尚未在 https://keras.org.cn/datasets/ 中得到支持。

    有什么建议或入门点可以解决我的问题吗?

    谢谢你的帮助

  23. Thanawin 2016年12月7日下午1:31 #

    嗨,Jason

    我看了很多教程,但这个是最好的。
    我很好奇“scores = model.evaluate(X_test, y_test, verbose=0)”是否会取“model.fit()”的最后一个模型。如果您能建议我如何使用“model.fit()”中的最佳模型来评估我的测试数据,我将不胜感激。

  24. TSchecker 2016年12月14日下午7:35 #

    嗨,Jason,

    万一遇到错误

    “AttributeError: 'module' object has no attribute 'control_flow_ops'”

    在此找到
    https://github.com/fchollet/keras/issues/3857

    import tensorflow as tf
    tf.python.control_flow_ops = tf

  25. yask 2016年12月15日上午3:04 #

    嗨 Jason
    我真的很喜欢你的文章
    我想从照片中提取冰、水等物体。
    这个库对此有用吗?我如何定义训练区域?我需要提供冰、水等样本图像作为分类器的训练区域吗?哪种分类器最适合这里?人工神经网络怎么样?

  26. pranoy 2016年12月19日下午7:58 #

    哪个函数用于预测……

    如果我给一张马的图像,我想预测输出。我应该使用哪个函数?

    • Jason Brownlee 2016年12月20日上午7:30 #

      你可以使用 model.predict() 对新数据进行预测。

      新数据的形状必须与用于训练网络的数据的形状相同。

      • Philip L. 2019年12月3日上午8:30 #

        你好,我完全是这方面的新手,但多亏了你的精彩教程,我正在学习。但我仍然不明白如何使用 model.predict(),尤其是在这个例子中。你有没有这个项目的 model.predict() 示例??我真的还没有任何想法如何编写代码来加载我自己的数据集进行预测,将其重新缩放到 32x32 维度(这是数据的大小吗??不太确定),然后将该图像用作 X_test。我还有很多不知道的……
        任何回复对我来说都意义重大……谢谢

        • Jason Brownlee 2019年12月3日下午1:32 #

          谢谢!

          你可以通过调用 model.predict() 来预测单个图像,它将接收一个形状为 [样本、行、列、通道] 的数组,其中你可能有一个样本、32x32 的行和列以及 3 个通道。

          这有帮助吗?

  27. Milos 2016年12月29日下午10:34 #

    嗨,Jason,

    很棒的文章。我有一个问题。在 Dense 部分,你指定了 512 个神经元。你能告诉我你是如何确定神经元数量的吗?

    谢谢

    • Jason Brownlee 2016年12月30日上午5:50 #

      你好 Milos,我使用的是试错法。选择层的数量和大小是一门艺术——需要测试大量的配置。

      • Milos 2016年12月30日下午7:07 #

        谢谢你的回答。我本来也是这么想的,但我还是得问一下:).
        我在你的网站上找到了很棒且非常实用的文章:).

  28. Deepak 2017年1月30日下午3:56 #

    当我使用 model.predict 时,出现了以下错误。请帮帮我

    TypeError Traceback (most recent call last)
    in ()
    ----> 1 model.predict(tmp)

    /usr/local/lib/python2.7/dist-packages/keras/models.pyc in predict(self, x, batch_size, verbose)
    722 if self.model is None
    723 self.build()
    --> 724 return self.model.predict(x, batch_size=batch_size, verbose=verbose)
    725
    726 def predict_on_batch(self, x)

    /usr/local/lib/python2.7/dist-packages/keras/engine/training.pyc in predict(self, x, batch_size, verbose)
    1266 f = self.predict_function
    1267 return self._predict_loop(f, ins,
    --> 1268 batch_size=batch_size, verbose=verbose)
    1269
    1270 def train_on_batch(self, x, y,

    /usr/local/lib/python2.7/dist-packages/keras/engine/training.pyc in _predict_loop(self, f, ins, batch_size, verbose)
    944 ins_batch = slice_X(ins, batch_ids)
    945
    --> 946 batch_outs = f(ins_batch)
    947 if not isinstance(batch_outs, list)
    948 batch_outs = [batch_outs]

    /usr/local/lib/python2.7/dist-packages/keras/backend/theano_backend.pyc in __call__(self, inputs)
    957 def __call__(self, inputs)
    958 assert isinstance(inputs, (list, tuple))
    --> 959 return self.function(*inputs)
    960
    961

    /usr/local/lib/python2.7/dist-packages/Theano-0.9.0.dev5-py2.7.egg/theano/compile/function_module.pyc in __call__(self, *args, **kwargs)
    786 s.storage[0] = s.type.filter(
    787 arg, strict=s.strict,
    --> 788 allow_downcast=s.allow_downcast)
    789
    790 except Exception as e

    /usr/local/lib/python2.7/dist-packages/Theano-0.9.0.dev5-py2.7.egg/theano/tensor/type.pyc in filter(self, data, strict, allow_downcast)
    115 if allow_downcast
    116 # Convert to self.dtype, regardless of the type of data
    --> 117 data = theano._asarray(data, dtype=self.dtype)
    118 # TODO: consider to pad shape with ones to make it consistent
    119 # with self.broadcastable… like vector->row type thing

    /usr/local/lib/python2.7/dist-packages/Theano-0.9.0.dev5-py2.7.egg/theano/misc/safe_asarray.pyc in _asarray(a, dtype, order)
    32 dtype = theano.config.floatX
    33 dtype = numpy.dtype(dtype) # Convert into dtype object.
    ----> 34 rval = numpy.asarray(a, dtype=dtype, order=order)
    35 # Note that dtype comparison must be done by comparing their `num`
    36 # attribute. One cannot assume that two identical data types are pointers

    /home/yashwanth/.local/lib/python2.7/site-packages/numpy/core/numeric.pyc in asarray(a, dtype, order)
    529
    530 “””
    --> 531 return array(a, dtype, copy=False, order=order)
    532
    533

    TypeError: Bad input argument to theano function with name “/usr/local/lib/python2.7/dist-packages/keras/backend/theano_backend.py:955” at index 0 (0-based).
    Backtrace when that variable is created

    File “/usr/local/lib/python2.7/dist-packages/IPython/core/interactiveshell.py”, line 2821, in run_ast_nodes
    if self.run_code(code, result)
    File “/usr/local/lib/python2.7/dist-packages/IPython/core/interactiveshell.py”, line 2881, in run_code
    exec(code_obj, self.user_global_ns, self.user_ns)
    文件“”,第2行,在
    model.add(Convolution1D(64, 2, input_shape=[1,4], border_mode=’same’, activation=’relu’, W_constraint=maxnorm(3)))
    File “/usr/local/lib/python2.7/dist-packages/keras/models.py”, line 299, in add
    layer.create_input_layer(batch_input_shape, input_dtype)
    File “/usr/local/lib/python2.7/dist-packages/keras/engine/topology.py”, line 397, in create_input_layer
    dtype=input_dtype, name=name)
    File “/usr/local/lib/python2.7/dist-packages/keras/engine/topology.py”, line 1198, in Input
    input_tensor=tensor)
    File “/usr/local/lib/python2.7/dist-packages/keras/engine/topology.py”, line 1116, in __init__
    name=self.name)
    File “/usr/local/lib/python2.7/dist-packages/keras/backend/theano_backend.py”, line 110, in placeholder
    x = T.TensorType(dtype, broadcast)(name)
    float() argument must be a string or a number

    • Jason Brownlee 2017年2月1日上午10:21 #

      我很抱歉听到这个消息。

      原因对我来说不明显,堆栈跟踪很难阅读。

      也许你可以尝试发布到 stackoverflow 或 Keras Google 群组?

  29. Rajesh 2017年2月6日上午4:08 #

    嗨,Jason,

    关于以下错误有什么想法吗?一切在 model.summary 之前都看起来很好。但是当我尝试拟合模型时,我看到了以下错误。

    ValueError 回溯 (最近一次调用)
    in ()
    1 # 拟合模型
    ----> 2 model.fit(X_train, y_train, validation_data=(X_test, y_test), nb_epoch=epochs, batch_size=32)
    3 # 最终评估模型
    4 scores = model.evaluate(X_test, y_test, verbose=0)
    5 print(“准确率: %.2f%%” % (scores[1]*100))

    /home/rajesh/anaconda2/lib/python2.7/site-packages/keras/models.pyc in fit(self, x, y, batch_size, nb_epoch, verbose, callbacks, validation_split, validation_data, shuffle, class_weight, sample_weight, initial_epoch, **kwargs)
    670 class_weight=class_weight,
    671 sample_weight=sample_weight,
    --> 672 initial_epoch=initial_epoch)
    673
    674 def evaluate(self, x, y, batch_size=32, verbose=1,

    /home/rajesh/anaconda2/lib/python2.7/site-packages/keras/engine/training.pyc in fit(self, x, y, batch_size, nb_epoch, verbose, callbacks, validation_split, validation_data, shuffle, class_weight, sample_weight, initial_epoch)
    1115 class_weight=class_weight,
    1116 check_batch_axis=False,
    --> 1117 batch_size=batch_size)
    1118 # 准备验证数据
    1119 if validation_data

    /home/rajesh/anaconda2/lib/python2.7/site-packages/keras/engine/training.pyc in _standardize_user_data(self, x, y, sample_weight, class_weight, check_batch_axis, batch_size)
    1028 self.internal_input_shapes,
    1029 check_batch_axis=False,
    --> 1030 exception_prefix=’model input’)
    1031 y = standardize_input_data(y, self.output_names,
    1032 output_shapes,

    /home/rajesh/anaconda2/lib/python2.7/site-packages/keras/engine/training.pyc in standardize_input_data(data, names, shapes, check_batch_axis, exception_prefix)
    122 ‘ to have shape ‘ + str(shapes[i]) +
    123 ‘ but got array with shape ‘ +
    --> 124 str(array.shape))
    125 return arrays
    126

    ValueError: Error when checking model input: expected convolution2d_input_6 to have shape (None, 3, 32, 32) but got array with shape (50000, 32, 32, 3)

    • Rajesh 2017年2月6日上午4:22 #

      我明白了问题所在。我是在 input_shape 步骤中犯了错误。

      这是一个非常好的教程。写得很好。谢谢

      • Rajesh 2017年2月6日上午8:59 #

        抱歉打扰...但我仍然看到错误 🙁

        • Jason Brownlee 2017年2月6日上午9:45 #

          你好 Rajesh,你可能需要确认你没有遗漏任何代码行。

          另外,确认你的 Keras、TensorFlow/Theano 和 Python 版本。

  30. Sam 2017年2月6日下午9:11 #

    你好,
    感谢您的示例。我尝试运行您的代码。但是我们的网络服务器被阻止了,代码无法从以下网址获取数据。

    http://www.cs.toronto.edu/~kriz/cifar-10-python.tar.gz

    您能告诉我除了使用下载包装器方法之外,还有没有其他方法可以制作训练数据集?

    • Sam 2017年2月6日下午9:37 #

      哦,我通过谷歌搜索找到了解决方案。无论如何,谢谢。

  31. John 2017年2月7日下午2:10 #

    你好,

    我如何在视频中识别自行车。如果你能给个例子就太好了。

    • Jason Brownlee 2017年2月8日上午9:32 #

      好问题,约翰,这是我未来想探讨的一个领域。

  32. Ikhsan 2017年3月17日下午2:22 #

    嗨,Jason,

    感谢本教程。我有一个关于 random.seed(seed) 的问题。我们为什么要首先设置种子,以及随机数生成器在代码的其余部分中是如何使用的?

    谢谢。

  33. Ali 2017年4月21日下午5:43 #

    嗨,jason

    感谢这篇很棒的教程,我正在尝试运行代码,但遇到了以下错误,有什么建议可以解决吗?

    我使用的是带有 theano 2.7 后端的 keras

    model = Sequential()
    model.add(Conv2D(32, (3, 3), input_shape=(3, 32, 32), padding=’same’, activation=’relu’, kernel_constraint=maxnorm(3)))
    model.add(Dropout(0.2))
    model.add(Conv2D(32, (3, 3), activation=’relu’, padding=’same’, kernel_constraint=maxnorm(3)))
    model.add(MaxPooling2D(pool_size=(2, 2)))
    model.add(Flatten())
    model.add(Dense(512, activation=’relu’, kernel_constraint=maxnorm(3)))
    model.add(Dropout(0.5))
    model.add(Dense(num_classes, activation='softmax'))
    # 编译模型
    epochs = 25
    lrate = 0.01
    decay = lrate/epochs
    sgd = SGD(lr=lrate, momentum=0.9, decay=decay, nesterov=False)
    model.compile(loss='categorical_crossentropy', optimizer=sgd, metrics=['accuracy'])
    打印(model.summary())

    回溯(最近一次调用)

    文件“”,第2行,在
    model.add(Conv2D(32, (3, 3), input_shape=(3, 32, 32), padding=’same’, activation=’relu’, kernel_constraint=maxnorm(3)))

    TypeError: __init__() takes at least 4 arguments (4 given)

    • Jason Brownlee 2017年4月22日上午9:24 #

      我不确定 Ali,我以前没见过这个错误。

      也许你可以确认你是否完全复制了代码?

      考虑删除参数以帮助缩小故障原因的范围。

  34. AIZEN 2017年5月1日上午12:12 #

    您好,我已经在静态图像中成功检测到物体。我应该怎么做才能在视频输入中检测物体?我打算使用相同的 Keras CNN。

    • Jason Brownlee 2017年5月1日上午5:57 #

      你可以用一个CNN将视频的每一帧作为图像处理,并使用LSTM处理来自CNN的数据序列。

  35. Supriya 2017年5月2日上午2:24 #

    你好,在这个例子中我们创建了CNN模型,但如何测试它呢?

    • Jason Brownlee 2017年5月2日上午6:02 #

      你可以使用训练/测试分割或 k 折交叉验证。

  36. Chao 2017年5月18日下午3:55 #

    “kernel_constraint=maxnorm(3)” 是什么意思?

    非常感谢!

  37. Mohamed Mnete 2017年6月1日下午5:22 #

    你好,假设我有一张图像,我想让你刚刚制作的模型预测图像上的内容。我把它保存在与 Python 文件相同的目录中。我如何加载它以放入预测函数中,以及如何编写预测函数。我还想尝试在你的模型上使用我自己的图像。我还卡在将图像转换为 numpy 数组的技术上。我还希望输出是 -1 或 1。我该如何编写代码。请帮忙……

  38. Natthaphon 2017年6月8日下午1:25 #

    那我可以在每张图片中插入注释吗?

  39. Daniel 2017年6月18日上午5:33 #

    你好,

    我正在尝试做一个图像分类器,它确定某物是否应该被赋予特定的标签。我的问题是分类器在每个 epoch 后准确率保持不变,并且基本上将所有图像分配到相同的类别。这毫无意义,因为图像类别相当独特(#gym 和 #foraging)。我基本上复制了你使用的小型 CNN

    model = Sequential()
    model.add(Convolution2D(32, 3, 3, input_shape=(3, 100, 100), activation=’relu’))
    model.add(Dropout(0.2))
    model.add(Convolution2D(32, 3, 3, activation=’relu’))
    model.add(MaxPooling2D(pool_size=(2, 2)))
    model.add(Flatten())
    model.add(Dense(512, activation=’relu’))
    model.add(Dropout(0.5))
    model.add(Dense(1, activation=’softmax’))

    epochs = 10
    lrate = 0.001
    decay = lrate/epochs
    sgd = SGD(lr=lrate, momentum=0.9, decay=decay, nesterov=False)
    print(‘compiling model’)
    model.compile(loss=’binary_crossentropy’, optimizer=sgd, metrics=[‘accuracy’])

    print(“fitting model”)
    model.fit(X_training, Y_training, nb_epoch=epochs, batch_size=100)

    但我每次都得到这些结果

    拟合模型
    在908个样本上训练,在908个样本上验证
    第 1/10 纪元
    908/908 [==============================] - 104s - loss: 7.9712 - acc: 0.5000
    第 2/10 纪元
    908/908 [==============================] - 104s - loss: 7.9712 - acc: 0.5000
    第 3/10 纪元
    908/908 [==============================] - 104s - loss: 7.9712 - acc: 0.5000
    第 4/10 纪元
    908/908 [==============================] - 104s - loss: 7.9712 - acc: 0.5000
    第 5/10 纪元
    908/908 [==============================] - 104s - loss: 7.9712 - acc: 0.5000
    第 6/10 纪元
    908/908 [==============================] - 104s - loss: 7.9712 - acc: 0.5000
    第 7/10 纪元
    908/908 [==============================] - 104s - loss: 7.9712 - acc: 0.5000
    第 8/10 纪元
    908/908 [==============================] - 104s - loss: 7.9712 - acc: 0.5000
    第 9/10 纪元
    908/908 [==============================] - 104s - loss: 7.9712 - acc: 0.5000
    第 10/10 纪元
    908/908 [==============================] - 104s - loss: 7.9712 - acc: 0.5000

    我做错了什么?

  40. Darlington Akogo 2017年6月28日上午10:42 #

    您好 Jason,感谢您的精彩教程!我需要一些帮助,我正在基于您的教程做一个医学图像识别(诊断)项目。在这里,您通过 Keras 的 load_data() 函数导入了 Cifar10 数据集,但是由于我是从其他来源下载数据集,所以这不可能。所以我通过研究发现了 Keras 的 flow_from_directory() 函数用于图像数据处理,这很棒,我只需将图像分成文件夹,它就会将它们视为类别。然而,医学图像是“DICOM”图像格式,而 Keras 图像函数似乎不支持它,所以通过进一步研究,我发现了 pydicom 模块,用于在 python 中处理 DICOM 图像,但是现在我无法使用 flow_from_directory(),您能否提供一些帮助,说明如何使用 DICOM 图像训练我的 ConvNet 模型并能够使用它来分类(使用 predict() 函数)任何新的 DICOM 图像?

    提前谢谢。

    • Jason Brownlee 2017年6月29日上午6:28 #

      我不了解那种格式。

      也许你可以转换这些图片?
      也许你可以自己编写一个与 DICOM 兼容的目录流函数?

    • shila mosammami 2017年12月10日上午9:21 #

      亲爱的朋友,
      试试这个

  41. Bruce Wind 2017年6月29日上午11:30 #

    你好,Jason,感谢分享。我测试了你提供的代码,但是我的机器不支持 CUDA,所以运行得很慢(每个 epoch 半小时)。既然你有一台如此强大的电脑,你能展示一下几百或几千个 epoch 之后的结果吗?谢谢。

  42. Nunu 2017年7月23日下午10:00 #

    亲爱的 Jason,
    这真是一个非常好的教程 :)。如果你绘制 acc 与 acc_val 的图表,acc 的图表与 acc_val 的图表之间会有一个间隙,这是否意味着过拟合?!而且,我(如果我错了请纠正我)准确率图表在一定数量的 epoch 后应该变成渐近线(即准确率将不再增加)!!
    提前感谢
    努拉

    • Jason Brownlee 2017年7月24日上午6:54 #

      如果 acc 小于 val_acc,则可能意味着模型欠拟合,并且可能需要更大的模型或更长时间的拟合模型才能在验证集上表现更好。

      • Nunu 2017年7月24日下午6:55 #

        是的,这是真的,但如果 acc_val 大于 acc,那么也存在过拟合,我注意到你的上述两个结果中都有这种情况!过拟合的原因可能是什么?我们如何摆脱它。

        致敬
        努努

        • Jason Brownlee 2017年7月25日上午9:40 #

          也许减少训练,也许训练一个更小的模型,也许添加一些正则化,比如 dropout。

          希望这些能作为一个开始有所帮助。

  43. Nunu 2017年7月25日下午7:40 #

    是的,我添加了 dropout 并添加了一个完全连接层,我想它奏效了。

    非常感谢 Jason 🙂
    此致,
    努努

  44. Luna 2017年8月27日下午6:46 #

    嗨,Jason,

    通常,用于图像分类的 CNN 会生成一个包含可能类别概率的向量。此库中是否有函数可以提取该向量?谢谢!

    • Jason Brownlee 2017年8月28日上午6:49 #

      您可以在输出层使用 softmax 激活函数来获取多个类别的概率,或者使用 sigmoid 激活函数来获取二分类的概率。

  45. Walid Ahmed 2017年9月2日上午4:55 #

    你好,
    有没有一种方法可以以矢量化的方式应用 keras.predict 函数,使其能够同时处理多个输入(图像)?

    谢谢

    • Jason Brownlee 2017年9月2日上午6:17 #

      是的,我相信 predict() 可以接受样本列表 (X) 并返回预测列表 (yhat)。

  46. zoda 2017年9月5日上午3:32 #

    你好,

    如果我有一张包含 6 个物体的图像,我该怎么做才能检测并测量图像中物体的大小。如果您能给我一些提示,那将非常有帮助。
    谢谢。

    • Jason Brownlee 2017年9月7日下午12:37 #

      您可以使用对象定位。

      抱歉,我没有例子。

  47. Sunil A Patel 2017年9月24日下午4:10 #

    先生,

    我想在图像中检测手。我的问题是手在图像中很小,并且图像大小各不相同(我的图像大小是 1920*1080)。一张图像包含手、杯子、脸、桌子等……

    我的问题是
    1. 我们是否应该训练 CNN 来识别各种手形和固定大小,例如 50X50 或其他?
    2. 如何找到手的位置。

    • Jason Brownlee 2017年9月25日上午5:37 #

      抱歉,我没有对象本地化的例子。我希望将来能开发出这些例子。

  48. vinay 2017年10月17日上午12:00 #

    如何在支持 GPU 的机器上运行此代码?

  49. Miles 2017年10月18日上午1:28 #

    嗨,Jason,

    在第一个示例网络中,您在所有隐藏层(卷积层和全连接层)中都使用了最大范数核约束。我理解这样做的优点,特别是在与 dropout 结合使用时。我想知道您在模型的第二次迭代中是否因为某种原因去除了卷积层的核约束?如果是,您介意解释这样做的动机吗?谢谢!

    • Jason Brownlee 2017年10月18日上午5:39 #

      那是几年前的事了,我不记得了。也许模型在没有约束的情况下获得了更好的结果?

  50. Tin Tran 2017年10月18日下午6:44 #

    嗨,Jason,

    当我们完成模型训练后,如何将该模型用于新图片?

  51. Gabriele Minniti 2017年10月28日下午8:10 #

    嗨,Jason!我叫 Gabriele,是一名年轻的数据科学家!我目前正在使用 CNN,有几个问题想问你。

    1. 我看到你使用的是 32 x 32 的图像,我的问题是对于 1070 - 720 的高分辨率图像,最佳形状是什么?图像必须是正方形的吗?

    2. epoch 数量的增加对“准确率指标”的提升有多显著?也许 100 个 epoch?1000 个?它们能返回一个高性能模型吗?

    非常感谢!
    PS. 抱歉我的“不完美的英语”,希望你理解我的问题!
    GM

  52. 库马尔 2017年11月7日下午6:44 #

    亲爱的 Jason,

    我正在尝试识别图像中的多个对象,并统计每张图像中每个类别的对象数量。您能帮我解决这个问题吗?

    • 贾森·布朗利 2017年11月8日上午9:21 #

      这听起来是个很棒的问题,但我没有这方面的问题资料,抱歉。

  53. 阿伦 2017年11月15日凌晨12:10 #

    回溯(最近一次调用)

    File “”, line 1, in
    b=model.fit(X, Y,validation_split=0.33, epochs=150, batch_size=10,verbose=0)

    文件“/Users/arun/anaconda/lib/python3.6/site-packages/keras/models.py”,第893行,位于fit中
    initial_epoch=initial_epoch)

    文件“/Users/arun/anaconda/lib/python3.6/site-packages/keras/engine/training.py”,第1555行,位于fit中
    batch_size=batch_size)

    文件“/Users/arun/anaconda/lib/python3.6/site-packages/keras/engine/training.py”,第1409行,位于_standardize_user_data中
    exception_prefix=’input’)

    文件“/Users/arun/anaconda/lib/python3.6/site-packages/keras/engine/training.py”,第126行,位于_standardize_input_data中
    array = data[i]

    UnboundLocalError: 局部变量'arrays'在赋值前被引用

    我在尝试拟合模型时收到此错误。看起来这是Keras中的一个错误。

  54. Himmat Ram Bairwa 2017年11月16日下午6:37 #

    你好
    我输入了自己的.jpg图片,然后想预测类别,但我得到了错误的结果。

    img = cv2.imread(‘C:/Users/8himmat/Desktop/ML/data/train/cats/dog2.jpg’)
    img = cv2.resize(img,(32,32))
    img = numpy.array(img)
    img = numpy.reshape(img,[1,3,32,32])
    preds = model.predict_classes(img)

    • 贾森·布朗利 2017年11月17日上午9:23 #

      也许模型对您的示例来说不够好?

      尝试更多示例,尝试使用更多类似您尝试的示例来训练模型,尝试在训练期间进行数据增强等等。

  55. 希拉·M 2017年12月10日上午9:38 #

    亲爱的 Jason,
    首先,非常感谢您提供的教程。
    我正在尝试使用ConvNN进行肝脏分割,我的数据集是Sliver07,其中包含元图像。有两个文件夹,一个名为“scan”,包含CT扫描的原始元图像,总共20张;另一个名为“segment”,包含20张已分割肝脏的元图像。每个实例都有两种格式:.mhd和.raw,它们可以通过itksnap轻松查看。我可以加载数据并获取numpy数组,但是我从原始图像和分割图像输出中获得的numpy数组如下:
    [[[-1007 -997 -1007 …, -973 -969 -1007]
    [-1002 -1000 -1007 …, -979 -999 -1015]
    [-1000 -993 -1003 …, -999 -1009 -1007]
    ……,
    [ -894 -877 -883 …, -893 -895 -906]
    [ -872 -878 -894 …, -896 -892 -894]
    [ -873 -882 -893 …, -898 -909 -896]]

    [[-1005 -999 -1006 …, -972 -964 -1008]
    [-1008 -995 -1004 …, -966 -995 -1022]
    [-1004 -991 -1001 …, -990 -1015 -1008]
    ……,
    [ -905 -882 -897 …, -889 -878 -895]
    [ -879 -884 -910 …, -885 -880 -891]
    [ -874 -893 -907 …, -882 -887 -897]]

    [[-1001 -1010 -1009 …, -991 -967 -1000]
    [-1000 -1004 -1006 …, -977 -989 -1019]
    [ -993 -993 -1001 …, -988 -1013 -1001]
    ……,
    [ -902 -918 -911 …, -899 -888 -892]
    [ -905 -909 -911 …, -899 -887 -888]
    [ -909 -911 -908 …, -900 -901 -896]]

    ……,
    [[-1001 -1002 -1002 …, -1007 -998 -1004]
    [-1004 -1004 -1005 …, -1003 -1009 -1000]
    [ -996 -1002 -1005 …, -996 -1000 -988]
    ……,
    [ -888 -896 -897 …, -883 -888 -898]
    [ -879 -875 -866 …, -886 -881 -894]
    [ -878 -866 -867 …, -895 -891 -896]]

    [[ -986 -990 -997 …, -1010 -1004 -1008]
    [ -999 -994 -995 …, -1003 -1007 -1002]
    [-1006 -1011 -1006 …, -1000 -996 -980]
    ……,
    [ -887 -894 -900 …, -888 -893 -903]
    [ -882 -885 -879 …, -891 -883 -892]
    [ -880 -876 -876 …, -896 -884 -882]]

    [[-1000 -1004 -1003 …, -1002 -1003 -997]
    [-1007 -1002 -1004 …, -1002 -997 -998]
    [-1013 -1011 -997 …, -998 -995 -993]
    ……,
    [ -887 -894 -891 …, -886 -891 -900]
    [ -892 -892 -885 …, -892 -885 -893]
    [ -895 -893 -885 …, -902 -893 -889]]]
    分割后的numpy数组
    [[[0 0 0 …, 0 0 0]
    [0 0 0 …, 0 0 0]
    [0 0 0 …, 0 0 0]
    ……,
    [0 0 0 …, 0 0 0]
    [0 0 0 …, 0 0 0]
    [0 0 0 …, 0 0 0]]

    [[0 0 0 …, 0 0 0]
    [0 0 0 …, 0 0 0]
    [0 0 0 …, 0 0 0]
    ……,
    [0 0 0 …, 0 0 0]
    [0 0 0 …, 0 0 0]
    [0 0 0 …, 0 0 0]]

    [[0 0 0 …, 0 0 0]
    [0 0 0 …, 0 0 0]
    [0 0 0 …, 0 0 0]
    ……,
    [0 0 0 …, 0 0 0]
    [0 0 0 …, 0 0 0]
    [0 0 0 …, 0 0 0]]

    ……,
    [[0 0 0 …, 0 0 0]
    [0 0 0 …, 0 0 0]
    [0 0 0 …, 0 0 0]
    ……,
    [0 0 0 …, 0 0 0]
    [0 0 0 …, 0 0 0]
    [0 0 0 …, 0 0 0]]

    [[0 0 0 …, 0 0 0]
    [0 0 0 …, 0 0 0]
    [0 0 0 …, 0 0 0]
    ……,
    [0 0 0 …, 0 0 0]
    [0 0 0 …, 0 0 0]
    [0 0 0 …, 0 0 0]]

    [[0 0 0 …, 0 0 0]
    [0 0 0 …, 0 0 0]
    [0 0 0 …, 0 0 0]
    ……,
    [0 0 0 …, 0 0 0]
    [0 0 0 …, 0 0 0]
    [0 0 0 …, 0 0 0]]]
    1) 我不知道如何为此构建模型。
    2) 这些数字对我来说似乎很奇怪,为什么原始图像都是负数,而分割图像都是零?
    3) 我本以为每个文件夹都有20个数组,但这些结果让我无法理解。
    此致

  56. 法布里齐奥 2018年1月18日下午11:29 #

    嗨,Jason,
    我目前正在从事实时物体检测的工作。我需要牢记一些限制:这个程序应该在普通台式电脑上运行,主要思路是它应该能够以视频作为输入来检测物体。因此,在计算成本方面不应该很高。
    CNN是解决这个问题的良好方法吗?我在谷歌上看到OpenCV上有一个预训练的DNN(我应该尽可能多地使用OpenCV),但它在Caffe下运行,我对Caffe一无所知。
    这就是我在这里的原因,我认为CNN将是一个不错的方法。你觉得呢?你有什么额外的建议/提示吗?

  57. 阿里 2018年2月3日上午6:37 #

    你好,我没看到任何图像识别!

  58. 普拉蒂普 2018年3月11日凌晨12:35 #

    你好,先生,

    您能告诉我错误是什么吗?我只是复制了上面的代码,但它显示了一些错误。

    ValueError: 检查输入时出错:预期conv2d_26_input的形状为(3, 32, 32),但得到的数组形状为(32, 32, 3)

    我尝试更改输入形状,但错误仍然存在。

    • 贾森·布朗利 2018年3月11日上午6:29 #

      看起来模型期望数据是一种大小,而数据是另一种大小。您可以更改模型或更改数据。

  59. 萨滕德拉·拉梅什·瓦尔玛 2018年3月26日上午7:56 #

    CIFAR数据集下载时间太长(预计4小时以上)。有没有办法我们可以直接从他们的网站使用zip文件加载数据?

    • 萨滕德拉·拉梅什·瓦尔玛 2018年3月26日上午8:29 #

      没关系。我找到了解决方案。
      从CIFAR数据集网站下载zip文件。
      将zip文件放置在keras–>datasets文件夹中。
      zip文件包含batches文件夹。
      现在在Windows上使用7zip,首先将文件压缩为tar,然后使用右键菜单中的“添加到档案”选项将其压缩为zip。
      然后再次运行代码。
      节省大量时间,无需更改代码。

    • 贾森·布朗利 2018年3月26日上午10:04 #

      抱歉,我暂时不确定。

  60. 梅纳克希·乔杜里 2018年4月7日下午4:15 #

    您能否分享一下在Python/R/Matlab中融合多个卷积神经网络的代码?

  61. 萨蒂亚吉特·帕特奈克 2018年4月9日下午3:15 #

    需要指导如何进行裂纹检测,我有一些机器的图像,其中一些图像有裂纹,需要识别有裂纹的图像,这个问题如何解决?

    尝试了使用Canny边缘检测,但找到边缘后,有点卡住不知道如何进行,如果有其他方法可以实现,请回复,我会尝试解决它..

    • 贾森·布朗利 2018年4月10日上午6:13 #

      听起来是个很棒的问题。也许你可以使用迁移学习和预训练模型(如VGG)来开始模型开发?

  62. 拉杰 2018年4月12日下午11:14 #

    亲爱的 Jason,

    我有一些散点图(matplotlib)图像和包含刻度线、刻度值和点的边界框坐标的idl文件,现在我想进行对象检测任务,您能给我推荐一些预训练模型,我可以用它们来检测刻度线、刻度值和点吗?

    • 贾森·布朗利 2018年4月13日上午6:41 #

      这听起来是个很棒的项目,使用预训练模型是加快进展的好方法。

      或许从这些开始
      https://keras.org.cn/applications/

      • 拉杰 2018年4月15日凌晨2:03 #

        亲爱的 Jason,
        感谢您的回复。实际上我还有一个问题,在对象检测任务中,如果我在模型训练时给出图像和(Xmin,Ymin,Xmax,Ymax)即边界框,那么在模型测试时我只给出图像吗?

  63. 拉杰 2018年4月15日上午8:26 #

    我的意思是,如果我有训练和测试图像,并且我有训练和测试图像的边界框,并且我将图像和边界框作为带标签的数据提供给我的模型进行训练,那么在测试模型时,我只提供测试图像,还是提供带边界框(带标签数据)的图像?

  64. 卡尔提克 2018年5月10日下午4:23 #

    你好,我想在一张6000x4000像素的图像中检测一个30x40像素大小的物体。这种方法正确吗?

  65. 叶卡捷琳娜 2018年5月17日上午10:49 #

    大家好,我在导入cifar10数据集时遇到了问题

    (x_train, y_train), (x_test, y_test) = cifar10.load_data()

    AttributeError Traceback (最近一次调用)
    in ()
    3
    4 # 加载预混的训练和测试数据
    —-> 5 (x_train, y_train), (x_test, y_test) = cifar10.load_data()

    ~/anaconda3/lib/python3.6/site-packages/keras/datasets/cifar10.py 在load_data()中
    18 for i in range(1, 6)
    19 fpath = os.path.join(path, ‘data_batch_’ + str(i))
    —> 20 data, labels = load_batch(fpath)
    21 X_train[(i-1)*10000:i*10000, :, :, :] = data
    22 y_train[(i-1)*10000:i*10000] = labels

    ~/anaconda3/lib/python3.6/site-packages/keras/datasets/cifar.py 在load_batch(fpath, label_key)中
    14 for k, v in d.items()
    15 del(d[k])
    —-> 16 d[k.decode(“utf8”)] = v
    17 f.close()
    18 data = d[“data”]

    AttributeError: 'str'对象没有'decode'属性

    有人遇到过这个问题吗?有什么解决方案?

    • 叶卡捷琳娜 2018年5月17日下午1:06 #

      通过重新安装Keras解决

    • 贾森·布朗利 2018年5月17日下午3:11 #

      听到这个消息我很难过。也许可以尝试将您的代码和错误发布到stackoverflow上?

  66. 朱莉娅 2018年6月7日凌晨1:48 #

    嗨,感谢您的教程,非常有帮助!我使用了与您的深度CNN相同的架构,但它完成一个epoch需要10多分钟,而您的看起来只需要30秒左右。据我所知,我的代码与您的相同,我的电脑以前从未这么慢过。有什么可能导致这种情况的原因吗?

  67. 阿宁迪亚 2018年7月19日下午10:36 #

    嗨,Jason,

    很棒的教程,对我的项目很有帮助。:)
    如果您能发布任何关于实时物体检测和定位的文章,例如YOLO或SSD,将非常有帮助。如果您已经有相关文章,能否在此分享链接。谢谢:)

  68. 英德 2018年8月5日下午4:53 #

    贾森,如果我们的测试图像有其他不属于这个数据集的对象,或者只是没有类别对象的普通图像,该怎么办?
    这仍然会分类并匹配我们类别集中的某些东西,我们如何处理这个问题。
    我找到的一个解决方案是创建一个只包含负面图像(与现有类别无关)的类别,但在世界上有太多不同的负面图像,很难收集。请解释我们如何能让它更完美。

  69. 维什瓦斯 2018年8月7日下午9:02 #

    嗨,Jason,

    我们如何决定图像的卷积层数量,是试错法还是有规则可循?

  70. 苏普拉萨德·卡马特 2018年8月9日下午4:26 #

    非常感谢,贾森,感谢您的所有文章。它让我有信心使用keras编写简单的深度学习模型。这篇文章真的帮助我创建了我的第一个CNN模型,这是我几天来一直困扰的事情。我只有几个问题。

    1) 您是如何推导出每个隐藏层的神经元数量的?我知道我们可以使用scikit-learn中的GridSearchCV进行超参数调优,如您在另一篇博客文章中详述的那样。我能够调优输入层的神经元,但当我尝试调优后续层时出现错误。

    2) 我如何检查我的模型是过拟合还是欠拟合?我知道您使用Dropout来帮助减少过拟合。但是有没有办法确定我的模型是过拟合还是欠拟合?

    3) 您为什么在两个Conv2D层之后只添加一个MaxPooling2D层?我一直认为在每个卷积层之后都必须进行最大池化。您能对此进行更详细的解释吗?

    4) 我正在使用tensorflow-gpu作为我的后端。为了让我的GPU承担处理负载,我必须增加batch_size。我只是好奇想知道batch_size在处理速度显著提高的同时如何影响准确性。

  71. 苏普拉萨德·卡马特 2018年8月11日下午1:35 #

    谢谢您,先生。我也会仔细阅读这些链接。

    我有一个小小的建议。您使用的示例没有太多步骤来准备训练和测试数据集。如果有人想用自己的图像文件而不是标准的CIFAR-10来创建CNN模型呢?这就是我遇到很多问题的地方,这不像其他有监督的机器学习代码那样简单。我经过多次尝试和错误才最终弄明白。如果您能提供一个使用自有数据构建模型的示例(如果您还没有写过关于这个的帖子),那将对像我这样的初学者非常有帮助。这只是我的个人意见,因为只有我知道编写一个端到端程序有多么困难。我假设会有更多像我一样对深度学习新手的人。

    再次感谢您的所有博客文章。

  72. 迪潘舒·阿加瓦尔 2018年8月13日下午3:05 #

    嗨,Jason,

    我正在做一个类似的项目,需要确定扫描图像中是否存在手写签名。

    您能建议一些解决这个问题的方法吗,以获得签名是否存在的是或否作为输出。

    谢谢

    • 贾森·布朗利 2018年8月14日上午6:14 #

      您也许可以使用经典计算机视觉技术来解决这个问题,也许您不需要学习模型?

      例如,如果文档上的空白处不为空,则表示有签名。

  73. 迪拉吉 2018年8月27日下午7:47 #

    嗨,Jason,

    您的文章对我理解卷积神经网络的实现帮助很大。
    谢谢你。

    我想知道我是否可以使用相同的概念通过CNN来区分不同类型的硬币?

  74. 亚什·梅赫塔 2018年10月19日下午8:44 #

    嗨,Jason,

    我正在使用Keras库通过CNN检测路面漏水。如何决定要应用的卷积层数以及conv2d函数中的值。我从哪里可以了解这些事物的基本知识。漏水数据集不可用,所以我自己下载图像创建数据集,那么我需要多少数据才能获得更好的结果。我可以用400张图像训练模型吗,因为我找不到更多的图像

    • 贾森·布朗利 2018年10月20日上午5:55 #

      我建议测试一系列不同的模型配置,以发现最适合您特定问题的方法。

  75. 阿琼 2018年11月10日下午1:54 #

    嗨,贾森……这是关于CNN的一篇很棒的帖子,感谢这篇精彩的文章。
    如果您能告诉我如何实现此目标定位,我将不胜感激……提前致谢????

  76. prisilla 2019年1月8日晚上11:16 #

    嗨,Jason,

    我正在尝试评估总准确率

    我的代码片段如下
    training_set = train_datagen.flow_from_directory('dataset/training_set',
    target_size = (64, 64),
    batch_size = batch_size,
    class_mode = 'binary')
    test_set = test_datagen.flow_from_directory('dataset/test_set',
    target_size = (64, 64),
    batch_size = batch_size,
    class_mode = 'binary')
    H = classifier.fit_generator(training_set,
    steps_per_epoch = 2000,
    epochs = 2,
    validation_data = None)

    # 进行预测
    import numpy as np
    from keras.preprocessing import image
    test_image = image.load_img(r'dataset\dog.4028.jpg', target_size = (64,64))
    test_image = image.img_to_array(test_image)
    test_image = np.expand_dims(test_image, axis = 0)
    acc = classifier.evaluate(training_set,test_image, verbose = 0)
    print('测试准确率:', acc)

    两条语句

    scores = model.evaluate(X_test, y_test, verbose=0)
    print("准确率: %.2f%%" % (scores[1]*100))

    被以下两条语句替换

    acc = classifier.evaluate(training_set,test_image, verbose = 0)
    print('测试准确率:', acc)

    但我没有得到准确率,它正在报错。语法有什么问题

    • Jason Brownlee 2019年1月9日上午8:46 #

      也许尝试将您的代码和错误发布到stackoverflow?

  77. ajith 2019年2月6日下午3:11 #

    嗨,刚开始深度学习
    猫和狗
    但我的准确率停留在50%
    我尝试了dropout、正则化和数据免疫

  78. Amit 2019年2月8日上午3:19 #

    嗨,Jason,
    我是机器学习新手,想了解三通道的第一层权重维度计算。修改了第一层,如下所示
    —————–
    model.add(Conv2D(8, (5, 5), input_shape=(32, 32, 3), padding='same', activation='relu', kernel_constraint=maxnorm(3)))
    —————–
    并显示了下面的权重矩阵维度。
    —————–
    len(model.layers[0].get_weights()[0]),
    len(model.layers[0].get_weights()[0][0]),
    len(model.layers[0].get_weights()[0][0][0]),
    len(model.layers[0].get_weights()[0][0][0][0])
    —————–

    结果是
    —————
    (5, 5, 3, 8)
    —————

    到目前为止理论上学到的,5*5的滤波器将与32*32进行卷积,步长为1*1,填充方式相同,每个通道将得到28*28的结果。

    所有三个通道的此类结果矩阵(28*28)将进行加法,结果矩阵仍将是28*28。

    最后,对于所有核(8),总权重维度将是8*28*28

    但它是如何计算为(5, 5, 3, 8)的?

    此致

    • Jason Brownlee 2019年2月8日上午7:56 #

      滤波器就是权重,例如8个5x5的3通道滤波器。

  79. Vatsal 2019年3月8日晚上9:39 #

    嗨,Json,
    你能告诉我或给我一个关于如何保存模型并用它来预测一些新图像的链接吗?

  80. Sakthi Dasan Sekar 2019年5月14日晚上8:40 #

    这是一个图像分类问题,而不是目标识别/检测问题。

    • Jason Brownlee 2019年5月15日上午8:12 #

      这是对物体照片的分类。

      确实,它不是目标识别。

  81. Mbunga Blaise 2019年7月8日晚上7:50 #

    嗨,Jason,很高兴阅读您所有关于机器学习和深度学习的教程。感谢您所有的教程以及您给我们的回复。我使用Keras函数式API创建了两个CNN块,以提取Smiles(药物序列)和蛋白质序列的最佳表示,然后我将两个块的输出连接起来,进行dropout并将其传递给全连接层。当我打印模型摘要时,它运行良好,但是当我尝试拟合模型时,屏幕显示以下错误消息

    ValueError: Error when checking input: expected input_8 to have shape (103, 64) but got array with shape (31824, 72)
    以下是我的简短代码

    关于错误消息,你能告诉我哪里出了问题吗

  82. Peter 2019年8月30日上午2:16 #

    你好,Jason
    我想知道加载所有图像在某个时候是否会导致内存崩溃。
    那么……Keras有什么方法可以直接从文件夹读取图像,而不是一次性全部加载到内存中吗?
    此致

  83. tiennguyen 2021年2月23日下午12:14 #

    感谢您的分享,Jason Brownlee。
    我有一个问题:为什么本教程中我们不使用Reshape()函数来处理数据,就像示例https://machinelearning.org.cn/handwritten-digit-recognition-using-convolutional-neural-networks-python-keras/一样。更详细地说
    # 将28*28图像展平为每个图像的784向量
    num_pixels = X_train.shape[1] * X_train.shape[2]
    X_train = X_train.reshape((X_train.shape[0], num_pixels)).astype('float32')
    X_test = X_test.reshape((X_test.shape[0], num_pixels)).astype('float32')

    • Jason Brownlee 2021年2月23日下午1:25 #

      因为输入数据已经有颜色通道,可以直接建模。

  84. tiennguyen 2021年2月23日下午12:17 #

    抱歉,我发错了细节。我想要向您展示的正确细节

    # 加载数据
    (X_train, y_train), (X_test, y_test) = mnist.load_data()
    # 重塑为 [样本][宽度][高度][通道]
    X_train = X_train.reshape(X_train.shape[0], 28, 28, 1).astype('float32')
    X_test = X_test.reshape(X_test.shape[0], 28, 28, 1).astype('float32')

  85. Arpit Gupta 2021年12月5日晚上8:52 #

    嗨,在这个例子中您提到了数据增强,但没有使用这个博客。如果我们在这个例子中使用增强,它会提高性能吗?

    • Adrian Tam
      Adrian Tam 2021年12月8日上午7:36 #

      有可能,特别是如果你的增强可以减少网络的噪声,让它学得更好。

发表回复

Machine Learning Mastery 是 Guiding Tech Media 的一部分,Guiding Tech Media 是一家领先的数字媒体出版商,专注于帮助人们了解技术。访问我们的公司网站以了解更多关于我们的使命和团队的信息。