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 绘制图像。
1 2 3 4 5 6 7 8 9 10 11 |
# 绘制即时 CIFAR10 实例 from tensorflow.keras.datasets import cifar10 import matplotlib.pyplot as plt # 加载数据 (X_train, y_train), (X_test, y_test) = cifar10.load_data() # 创建一个 3x3 图像网格 for i in range(0, 9): plt.subplot(330 + 1 +i) plt.imshow(X_train[i]) # 显示绘图 plt.show() |
运行代码会创建一个 3x3 的照片图。图像已经从 32x32 的小尺寸放大,但你仍然可以清楚地看到卡车、马和汽车。你还可以看到一些图像被强制转换为方形长宽比后出现的一些失真。

CIFAR-10 图像小样本
用于 CIFAR-10 的简单卷积神经网络
CIFAR-10 问题最好使用卷积神经网络 (CNN) 解决。
你可以通过定义此示例中需要的所有类和函数来快速开始。
1 2 3 4 5 6 7 8 9 10 11 12 |
# 用于 CIFAR-10 的简单 CNN 模型 from tensorflow.keras.datasets import cifar10 from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Dense from tensorflow.keras.layers import Dropout from tensorflow.keras.layers import Flatten from tensorflow.keras.constraints import MaxNorm from tensorflow.keras.optimizers import SGD from tensorflow.keras.layers import Conv2D from tensorflow.keras.layers import MaxPooling2D from tensorflow.keras.utils import to_categorical ... |
接下来,你可以加载 CIFAR-10 数据集。
1 2 3 |
... # 加载数据 (X_train, y_train), (X_test, y_test) = cifar10.load_data() |
红色、绿色和蓝色通道的像素值范围从 0 到 255。
使用归一化数据是一种好习惯。因为输入值易于理解,所以你可以通过将每个值除以最大观测值(即 255)来轻松归一化到 0 到 1 的范围。
请注意,数据以整数形式加载,因此你必须将其转换为浮点值才能执行除法。
1 2 3 4 5 6 |
... # 将输入从 0-255 归一化到 0.0-1.0 X_train = X_train.astype('float32') X_test = X_test.astype('float32') X_train = X_train / 255.0 X_test = X_test / 255.0 |
输出变量定义为一个整数向量,范围从 0 到 1,表示每个类别。
你可以使用独热编码将它们转换为二进制矩阵,以最好地模拟分类问题。此问题有十个类别,因此你可以预期二进制矩阵的宽度为 10。
1 2 3 4 5 |
... # one hot 编码输出 y_train = to_categorical(y_train) y_test = to_categorical(y_test) num_classes = y_test.shape[1] |
让我们从定义一个简单的 CNN 结构作为基线开始,并评估它在这个问题上的表现。
你将使用一个包含两个卷积层,然后是最大池化层和网络平坦化到全连接层的结构来做出预测。
基线网络结构可以总结如下:
- 卷积输入层,32 个特征图,大小为 3x3,使用整流器激活函数,权重约束最大范数设置为 3
- Dropout 设置为 20%
- 卷积层,32 个特征图,大小为 3x3,使用整流器激活函数,权重约束最大范数设置为 3
- 最大池化层,大小为 2x2
- 展平层
- 全连接层,512 个单元,使用整流器激活函数
- Dropout 设置为 50%
- 全连接输出层,10 个单元,使用 softmax 激活函数
使用对数损失函数,并使用随机梯度下降优化算法,配置为具有大学习率 0.01 的大动量和权重衰减。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
... # 创建模型 model = Sequential() model.add(Conv2D(32, (3, 3), input_shape=(32, 32, 3), 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(learning_rate=lrate, momentum=0.9, decay=decay, nesterov=False) model.compile(loss='categorical_crossentropy', optimizer=sgd, metrics=['accuracy']) print(model.summary()) |
你可以使用 25 个 epoch 和 32 的批次大小来拟合这个模型。
选择少量 epoch 是为了让本教程更容易理解。通常,对于这个问题,epoch 的数量会大一个或两个数量级。
模型拟合后,你将在测试数据集上评估它,并打印出分类准确率。
1 2 3 4 5 6 |
... # 拟合模型 model.fit(X_train, y_train, validation_data=(X_test, y_test), epochs=epochs, batch_size=32) # 模型的最终评估 scores = model.evaluate(X_test, y_test, verbose=0) print("Accuracy: %.2f%%" % (scores[1]*100)) |
将所有这些结合起来,完整的示例如下所示。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
# 用于 CIFAR-10 数据集的简单 CNN 模型 from tensorflow.keras.datasets import cifar10 from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Dense from tensorflow.keras.layers import Dropout from tensorflow.keras.layers import Flatten from tensorflow.keras.constraints import MaxNorm from tensorflow.keras.optimizers import SGD from tensorflow.keras.layers import Conv2D from tensorflow.keras.layers import MaxPooling2D from tensorflow.keras.utils import to_categorical # 加载数据 (X_train, y_train), (X_test, y_test) = cifar10.load_data() # 将输入从 0-255 归一化到 0.0-1.0 X_train = X_train.astype('float32') X_test = X_test.astype('float32') X_train = X_train / 255.0 X_test = X_test / 255.0 # one hot 编码输出 y_train = to_categorical(y_train) y_test = to_categorical(y_test) num_classes = y_test.shape[1] # 创建模型 model = Sequential() model.add(Conv2D(32, (3, 3), input_shape=(32, 32, 3), 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()) 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(learning_rate=lrate, momentum=0.9, decay=decay, nesterov=False) model.compile(loss='categorical_crossentropy', optimizer=sgd, metrics=['accuracy']) model.summary() # 拟合模型 model.fit(X_train, y_train, validation_data=(X_test, y_test), epochs=epochs, batch_size=32) # 模型的最终评估 scores = model.evaluate(X_test, y_test, verbose=0) print("Accuracy: %.2f%%" % (scores[1]*100)) |
运行此示例将提供以下结果。首先,总结了网络结构,这证实了设计已正确实现。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
模型: "sequential" _________________________________________________________________ 层 (类型) 输出形状 参数 # ================================================================= conv2d (Conv2D) (None, 32, 32, 32) 896 dropout (Dropout) (None, 32, 32, 32) 0 conv2d_1 (Conv2D) (None, 32, 32, 32) 9248 max_pooling2d (MaxPooling2D (None, 16, 16, 32) 0 ) flatten (Flatten) (None, 8192) 0 dense (Dense) (None, 512) 4194816 dropout_1 (Dropout) (None, 512) 0 dense_1 (Dense) (None, 10) 5130 ================================================================= 总参数:4,210,090 可训练参数:4,210,090 不可训练参数: 0 _________________________________________________________________ |
每个 epoch 后,训练和测试数据集上的分类准确率和损失都会被打印出来。
注意:由于算法或评估过程的随机性,或者数值精度的差异,你的结果可能会有所不同。考虑多次运行示例并比较平均结果。
该模型在测试集上进行评估,准确率达到 70.5%,这并不出色。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
... 纪元 20/25 1563/1563 [==============================] - 34s 22ms/步 - 损失:0.3001 - 准确率:0.8944 - 验证损失:1.0160 - 验证准确率:0.6984 纪元 21/25 1563/1563 [==============================] - 35s 23ms/步 - 损失:0.2783 - 准确率:0.9021 - 验证损失:1.0339 - 验证准确率:0.6980 纪元 22/25 1563/1563 [==============================] - 35s 22ms/步 - 损失:0.2623 - 准确率:0.9084 - 验证损失:1.0271 - 验证准确率:0.7014 纪元 23/25 1563/1563 [==============================] - 33s 21ms/步 - 损失:0.2536 - 准确率:0.9104 - 验证损失:1.0441 - 验证准确率:0.7011 纪元 24/25 1563/1563 [==============================] - 34s 22ms/步 - 损失:0.2383 - 准确率:0.9180 - 验证损失:1.0576 - 验证准确率:0.7012 纪元 25/25 1563/1563 [==============================] - 37s 24ms/步 - 损失:0.2245 - 准确率:0.9219 - 验证损失:1.0544 - 验证准确率:0.7050 准确率:70.50% |
你可以通过创建一个更深层的网络来显著提高准确率。这就是你将在下一节中探讨的内容。
用于 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 中定义此网络拓扑,如下所示:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
... # 创建模型 model = Sequential() model.add(Conv2D(32, (3, 3), input_shape=(32, 32, 3), activation='relu', padding='same')) model.add(Dropout(0.2)) model.add(Conv2D(32, (3, 3), activation='relu', padding='same')) model.add(MaxPooling2D()) model.add(Conv2D(64, (3, 3), activation='relu', padding='same')) model.add(Dropout(0.2)) model.add(Conv2D(64, (3, 3), activation='relu', padding='same')) model.add(MaxPooling2D()) model.add(Conv2D(128, (3, 3), activation='relu', padding='same')) model.add(Dropout(0.2)) model.add(Conv2D(128, (3, 3), activation='relu', padding='same')) model.add(MaxPooling2D()) model.add(Flatten()) model.add(Dropout(0.2)) model.add(Dense(1024, activation='relu', kernel_constraint=MaxNorm(3))) model.add(Dropout(0.2)) model.add(Dense(512, activation='relu', kernel_constraint=MaxNorm(3))) model.add(Dropout(0.2)) model.add(Dense(num_classes, activation='softmax')) # 编译模型 epochs = 25 lrate = 0.01 decay = lrate/epochs sgd = SGD(learning_rate=lrate, momentum=0.9, decay=decay, nesterov=False) model.compile(loss='categorical_crossentropy', optimizer=sgd, metrics=['accuracy']) model.summary() ... |
你可以使用与上述相同的程序和相同的 epoch 数量来拟合和评估此模型,但批次大小通过一些小的实验调整为 64。
1 2 3 4 5 |
... model.fit(X_train, y_train, validation_data=(X_test, y_test), epochs=epochs, batch_size=64) # 模型的最终评估 scores = model.evaluate(X_test, y_test, verbose=0) print("Accuracy: %.2f%%" % (scores[1]*100)) |
将所有这些结合起来,完整的示例如下所示。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
# 用于 CIFAR-10 数据集的大型 CNN 模型 from tensorflow.keras.datasets import cifar10 from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Dense from tensorflow.keras.layers import Dropout from tensorflow.keras.layers import Flatten from tensorflow.keras.constraints import MaxNorm from tensorflow.keras.optimizers import SGD from tensorflow.keras.layers import Conv2D from tensorflow.keras.layers import MaxPooling2D from tensorflow.keras.utils import to_categorical # 加载数据 (X_train, y_train), (X_test, y_test) = cifar10.load_data() # 将输入从 0-255 归一化到 0.0-1.0 X_train = X_train.astype('float32') X_test = X_test.astype('float32') X_train = X_train / 255.0 X_test = X_test / 255.0 # one hot 编码输出 y_train = to_categorical(y_train) y_test = to_categorical(y_test) num_classes = y_test.shape[1] # 创建模型 model = Sequential() model.add(Conv2D(32, (3, 3), input_shape=(32, 32, 3), activation='relu', padding='same')) model.add(Dropout(0.2)) model.add(Conv2D(32, (3, 3), activation='relu', padding='same')) model.add(MaxPooling2D()) model.add(Conv2D(64, (3, 3), activation='relu', padding='same')) model.add(Dropout(0.2)) model.add(Conv2D(64, (3, 3), activation='relu', padding='same')) model.add(MaxPooling2D()) model.add(Conv2D(128, (3, 3), activation='relu', padding='same')) model.add(Dropout(0.2)) model.add(Conv2D(128, (3, 3), activation='relu', padding='same')) model.add(MaxPooling2D()) model.add(Flatten()) model.add(Dropout(0.2)) model.add(Dense(1024, activation='relu', kernel_constraint=MaxNorm(3))) model.add(Dropout(0.2)) model.add(Dense(512, activation='relu', kernel_constraint=MaxNorm(3))) model.add(Dropout(0.2)) model.add(Dense(num_classes, activation='softmax')) # 编译模型 epochs = 25 lrate = 0.01 decay = lrate/epochs sgd = SGD(learning_rate=lrate, momentum=0.9, decay=decay, nesterov=False) model.compile(loss='categorical_crossentropy', optimizer=sgd, metrics=['accuracy']) model.summary() # 拟合模型 model.fit(X_train, y_train, validation_data=(X_test, y_test), epochs=epochs, batch_size=64) # 模型的最终评估 scores = model.evaluate(X_test, y_test, verbose=0) print("Accuracy: %.2f%%" % (scores[1]*100)) |
运行此示例将打印每个 epoch 在训练和测试数据集上的分类准确率和损失。
注意:由于算法或评估过程的随机性,或者数值精度的差异,你的结果可能会有所不同。考虑多次运行示例并比较平均结果。
最终模型的分类准确率估计值为 79.5%,比我们简单的模型高出 9 个百分点。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
... 纪元 20/25 782/782 [==============================] - 50s 64ms/步 - 损失:0.4949 - 准确率:0.8237 - 验证损失:0.6161 - 验证准确率:0.7864 纪元 21/25 782/782 [==============================] - 51s 65ms/步 - 损失:0.4794 - 准确率:0.8308 - 验证损失:0.6184 - 验证准确率:0.7866 纪元 22/25 782/782 [==============================] - 50s 64ms/步 - 损失:0.4660 - 准确率:0.8347 - 验证损失:0.6158 - 验证准确率:0.7901 纪元 23/25 782/782 [==============================] - 50s 64ms/步 - 损失:0.4523 - 准确率:0.8395 - 验证损失:0.6112 - 验证准确率:0.7919 纪元 24/25 782/782 [==============================] - 50s 64ms/步 - 损失:0.4344 - 准确率:0.8454 - 验证损失:0.6080 - 验证准确率:0.7886 纪元 25/25 782/782 [==============================] - 50s 64ms/步 - 损失:0.4231 - 准确率:0.8487 - 验证损失:0.6076 - 验证准确率:0.7950 准确率:79.50% |
改进模型性能的扩展
你在这个非常困难的问题上取得了不错的成绩,但距离取得世界级的成果还有很长的路要走。
以下是一些你可以尝试的想法,以扩展模型并提高模型性能。
- 训练更多周期。每个模型都只训练了非常少的周期,25个。通常,大型卷积神经网络会训练数百甚至数千个周期。你应该期望通过显著增加训练周期数来提高性能。
- 图像数据增强。图像中的物体位置各不相同。通过使用一些数据增强,很可能可以进一步提高模型性能。标准化、随机位移或水平图像翻转等方法可能会有所帮助。
- 更深的网络拓扑。所呈现的较大网络已经很深,但可以为该问题设计更大的网络。这可能涉及在输入层附近使用更多的特征图,并可能减少池化操作的激进程度。此外,可以采用并评估已证明有用的标准卷积网络拓扑。
总结
在这篇文章中,你学习了如何在 Keras 中创建深度学习模型,用于照片中的物体识别。
通过本教程,你学到了:
- 关于 CIFAR-10 数据集以及如何在 Keras 中加载它,并绘制数据集中的临时示例。
- 如何在问题上训练和评估一个简单的卷积神经网络。
- 如何将简单的卷积神经网络扩展为深度卷积神经网络,以提高解决这个难题的性能。
- 如何使用数据增强在困难的物体识别问题上获得进一步的提升。
你对物体识别或这篇文章有任何疑问吗?请在评论中提出你的问题,我将尽力回答。
你好 Jason,
maxnorm 在深度学习中有什么用?
你好 Aakash,
maxnorm 是一种权重约束,被发现在使用 dropout 时很有用。在此了解更多关于 maxnorm 和 dropout 的信息
https://machinelearning.org.cn/dropout-regularization-deep-learning-models-keras/
你可以在这里了解更多关于 Keras 中的权重约束的信息
https://keras.org.cn/constraints/
嗨 Jason
我正在实时检测路标。我的图像大小是 800*1360。路标的大小从 16*16 到 256*256 不等。我如何才能利用卷积神经网络来实现这个目标,以获得良好的实时检测精度?
Aqsa,请考虑你如何构建这个问题。两个选项是:
1) 你可以将所有图像重新缩放到相同大小。
2) 你可以对所有图像进行零填充。
至于这个问题的网络细节,你需要设计和测试不同的结构。也许你可以利用现有的表现良好的结构,如 VGG 或 Inception。
PCD 格式或 OFF 格式的 3D 数据集应该是什么输入维度?
顺便说一下,我觉得你的教程非常有用。:-)
抱歉,Jack,我不知道这些格式是什么。
点云数据 (PCD) 包含物体的 x、y 和 z 坐标……我想构建一个用于 3D 物体分类的神经网络……我面临的问题是我不知道网络的输入应该是什么……对于对图像进行分类的神经网络,你传递像素值 (0-255),但 PCD 文件只有坐标……将坐标作为输入是否明智?
我可以提取物体的一些特征(从 pcd 文件中)……我可以将这些特征作为输入吗?
我是这个领域的新手,所以我在理解事物方面有困难……
我想知道你是否可以将坐标重新缩放到 0-1 的范围。然后直接提供它们。
从那里,你将有一个基线,并且可以开始探索坐标的其他变换,例如投影到 2D。
你找到解决办法了吗?我现在也面临类似的情况。你能告诉我你是怎么解决这个问题的吗?
请问如何从图像中提取特征?
在使用深度学习方法时,我们不再需要提取特征,因为我们正在执行自动特征学习。这是这种方法的一个巨大优势。
非常感谢。
我有一个问题
在 Keras 中,如何提取图像中检测到的物体(或多个物体)的确切位置,其中图像包含背景?
我假设它使用滑动窗口进行物体检测
好问题,Walid。
这在图像中被称为物体识别。我目前还没有一个例子,但我将来会准备一个。
嗨……你能给出一些关于原始糖尿病或航空旅客数据集的例子吗?我的问题是如何将 CNN 应用于直接数值特征。你可以给出一个简单的例子
抱歉,我没有这样的例子。
你可以在这里学习 Jason 开发的 Pima 糖尿病示例。 https://machinelearning.org.cn/tutorial-first-neural-network-python-keras/
在学习了这个例子之后,我已经在 iPython notebook 中实现了这个例子,你可以在这里看到。 https://github.com/thepunitsingh/keras_tutorials/blob/master/pima-indians-diabetes-categorization.ipynb
谢谢 Jason,我期待你的例子。
在 Keras 中,你是在哪里指定第一个卷积层的输入维度的?我想尝试用时间序列进行事件检测的卷积神经网络,但 Keras 的一维卷积工作有问题。假设我的每个样本都是一个由 1 x 100 向量表示的时间序列,并且在向量中,我期望三种类型的事件在这些时间帧中的某个地方发生(不清楚事件的长度是多少,但假设大约有 10 个时间点)。我是否会使用三个特征图,然后使用一个“窗口”(例如 10 个时间点),它映射到卷积层中的单个神经元?那么我将有一个 3 x 10 的卷积层吗?
谢谢!
LSTM 是处理序列的网络,而不是 CNN。
CNN 擅长处理空间结构,例如图像或文本中的结构。
关于使用 LSTM 处理时间序列的本教程可能正是你所寻找的
https://machinelearning.org.cn/time-series-prediction-lstm-recurrent-neural-networks-python-keras/
谢谢!我其实说错了——我不想预测未来时间点的值,而是想识别当前一组时间点是否符合某种模式,从而指示某个事件。
例如,假设我们有健身追踪器数据,其中包含各种类型的传感器(心率、计步器、加速度计),并且我们知道一个人进行三种类型的活动:瑜伽、跑步、烹饪。我想训练一个模型来根据传感器数据识别这些活动,然后能够拉取实时数据并分类他们当前正在做什么。
我当时认为使用带窗口方法的 CNN 会是最好的选择,但我可能完全错了。
这听起来确实是一个异常检测或变化检测问题,你可能会受益于这种问题表述方式。
嗨,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
亲爱的Jason
如果您能在 Keras 中说明:我如何提取图像中检测到的物体(或多个物体)的确切位置,其中图像包含背景?
好问题,Walid,
抱歉,我还没有 Keras 对象定位的示例。不过,它已列入待办事项清单。
你好!解释得非常好!
我正在使用你的模型对包含 0 或 1 的图像进行分类。
为了解决这个问题,我最初可以使用最后一个隐藏层的变体进行部署
model.add (Dense (1, activation = ‘sigmoid’))
它会给我返回一个介于 0 或 1 之间的结果。
当我想要调整模型时,它会给我以下错误
“检查输入模型时出错:convolution2d_input_20 期望有 4 个维度,但得到的数组形状为 (8000, 3072)”
我的数据集是 32x32 的 RGB 图像。因此,包含 3072 列,但其中一列为 0 或 1。
此致!
嗨 Augusto,很抱歉听到你的数据出现错误。
原因尚不清楚,抱歉。也许你可以尝试并找出根本原因。尝试将你的示例简化到所需的最小程度,看看是否有助于找出问题。
为什么我需要在卷积层之前应用 dropout 层?
对我来说,只有当它应用于输入层或全连接层中的任何其他层时才有意义。
请求。
嗨,Walid,
这都是为了给网络施加压力,迫使它进行泛化。它可能是一个好的施压点来强制这种类型的学习,也可能不是。在你的问题上试试看。
嗨,Jason,我有一个问题,如果我的初始层不处理单个图像,而是处理 30 张图像序列,训练过程是怎样的?对于一个特定情况,一个人的运动序列;你有没有针对这种情况的 CNN 训练示例?
谢谢你
你好 William,好问题。抱歉,我目前还没有处理图像序列的实例。
嗨 Jason
当我移除任何卷积层之前的 dropout 层时,我的结果有所改善。
特别是当数据集大小很大时。
谢谢你的反馈,Walid。干得好!
你好,Jason。
另一个问题,我知道 Keras 有不同的优化器,在你的代码中你使用了 sgd,其他人可能使用像 adam 这样的优化器。
https://keras.org.cn/optimizers/
关于优化器类型有什么建议或推荐吗?
嗨,Walid,
我发现优化器通常对结果的影响很小——它们对结果的影响小于网络拓扑结构。
SGD 广为人知,是一个很好的起点。ADAM 速度快,效果好,我实践中也经常使用。除此之外,我没有太多其他看法。
嗨,Jason,
我有非常大的图像需要分析。每张图像的大小可能在 500 MB 到 1 GB 左右。
我想对图像进行分割。我们可以使用卷积神经网络进行无监督学习吗?
哎呀,Bharath,那些图像太大了。
这可能,但你的内存会很快耗尽!
抱歉,我没有好的建议。我还没有研究过这个问题。
你好,
我看到了你添加层的代码行中有一个错字。它应该写成
model.add(Convolution2D(32, 3, 3, input_shape=(32, 32, 3), border_mode=’same’, activation=’relu’,
你确定吗,Michael?我觉得一切都很好,而且示例在 Theano 和 TensorFlow 后端都能运行。
也许我错过了什么?
我认为 Michael 说得对。它给我抛出了 input_shape=(3,32,32) 的错误。input_shape=(32,32,3) 应该是正确的。
Michael,为了解决你的问题,请将此行:K.set_image_dim_ordering(‘th’)
放在以下代码的上方:
(X_train, y_train), (X_test, y_test)= cifar10.load_data()
我该如何处理这个错误?在“在 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) 内
我以前从未见过这个错误,也许可以发布到 stack overflow 或 Keras 列表?
你好,感谢这篇很棒的教程,你的代码和解释对我理解分类任务帮助很大。
我实际上想输入新图像并获取与其匹配的标签,我该怎么做,就像我这样做一样
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
我非常期待 Keras 物体定位的示例,希望你尽快提供一个
Walid,我希望在新的一年里尽快准备一个。
你好 Jason,
你的教程非常有帮助,也很棒。
我正在使用 Keras 在 kitti 数据集上进行分类问题。我发现 kitti 尚未在 https://keras.org.cn/datasets/ 中得到支持。
有什么建议或入门点可以解决我的问题吗?
谢谢你的帮助
抱歉,我还没有看过那个数据集。
嗨,Jason
我看了很多教程,但这个是最好的。
我很好奇“scores = model.evaluate(X_test, y_test, verbose=0)”是否会取“model.fit()”的最后一个模型。如果您能建议我如何使用“model.fit()”中的最佳模型来评估我的测试数据,我将不胜感激。
嗨,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
感谢分享,TSchecker。
嗨 Jason
我真的很喜欢你的文章
我想从照片中提取冰、水等物体。
这个库对此有用吗?我如何定义训练区域?我需要提供冰、水等样本图像作为分类器的训练区域吗?哪种分类器最适合这里?人工神经网络怎么样?
哪个函数用于预测……
如果我给一张马的图像,我想预测输出。我应该使用哪个函数?
你可以使用 model.predict() 对新数据进行预测。
新数据的形状必须与用于训练网络的数据的形状相同。
你好,我完全是这方面的新手,但多亏了你的精彩教程,我正在学习。但我仍然不明白如何使用 model.predict(),尤其是在这个例子中。你有没有这个项目的 model.predict() 示例??我真的还没有任何想法如何编写代码来加载我自己的数据集进行预测,将其重新缩放到 32x32 维度(这是数据的大小吗??不太确定),然后将该图像用作 X_test。我还有很多不知道的……
任何回复对我来说都意义重大……谢谢
谢谢!
你可以通过调用 model.predict() 来预测单个图像,它将接收一个形状为 [样本、行、列、通道] 的数组,其中你可能有一个样本、32x32 的行和列以及 3 个通道。
这有帮助吗?
嗨,Jason,
很棒的文章。我有一个问题。在 Dense 部分,你指定了 512 个神经元。你能告诉我你是如何确定神经元数量的吗?
谢谢
你好 Milos,我使用的是试错法。选择层的数量和大小是一门艺术——需要测试大量的配置。
谢谢你的回答。我本来也是这么想的,但我还是得问一下:).
我在你的网站上找到了很棒且非常实用的文章:).
谢谢 Milos。
当我使用 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
我很抱歉听到这个消息。
原因对我来说不明显,堆栈跟踪很难阅读。
也许你可以尝试发布到 stackoverflow 或 Keras Google 群组?
嗨,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)
我明白了问题所在。我是在 input_shape 步骤中犯了错误。
这是一个非常好的教程。写得很好。谢谢
抱歉打扰...但我仍然看到错误 🙁
你好 Rajesh,你可能需要确认你没有遗漏任何代码行。
另外,确认你的 Keras、TensorFlow/Theano 和 Python 版本。
你好,
感谢您的示例。我尝试运行您的代码。但是我们的网络服务器被阻止了,代码无法从以下网址获取数据。
http://www.cs.toronto.edu/~kriz/cifar-10-python.tar.gz
您能告诉我除了使用下载包装器方法之外,还有没有其他方法可以制作训练数据集?
哦,我通过谷歌搜索找到了解决方案。无论如何,谢谢。
很高兴听到这个消息,山姆。
你好,
我如何在视频中识别自行车。如果你能给个例子就太好了。
好问题,约翰,这是我未来想探讨的一个领域。
嗨,Jason,
感谢本教程。我有一个关于 random.seed(seed) 的问题。我们为什么要首先设置种子,以及随机数生成器在代码的其余部分中是如何使用的?
谢谢。
你不需要给随机数生成器播种。我试图让代码 100% 可重现。
随机数用于给神经网络播种,并在训练期间用于打乱训练数据。
你可以在这里了解更多关于机器学习中随机数的信息
https://machinelearning.org.cn/randomness-in-machine-learning/
嗨,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)
我不确定 Ali,我以前没见过这个错误。
也许你可以确认你是否完全复制了代码?
考虑删除参数以帮助缩小故障原因的范围。
您好,我已经在静态图像中成功检测到物体。我应该怎么做才能在视频输入中检测物体?我打算使用相同的 Keras CNN。
你可以用一个CNN将视频的每一帧作为图像处理,并使用LSTM处理来自CNN的数据序列。
你好,在这个例子中我们创建了CNN模型,但如何测试它呢?
你可以使用训练/测试分割或 k 折交叉验证。
“kernel_constraint=maxnorm(3)” 是什么意思?
非常感谢!
好问题。这是一个权重约束。关于为什么要使用它们,请参阅这篇文章
https://machinelearning.org.cn/dropout-regularization-deep-learning-models-keras/
你好,假设我有一张图像,我想让你刚刚制作的模型预测图像上的内容。我把它保存在与 Python 文件相同的目录中。我如何加载它以放入预测函数中,以及如何编写预测函数。我还想尝试在你的模型上使用我自己的图像。我还卡在将图像转换为 numpy 数组的技术上。我还希望输出是 -1 或 1。我该如何编写代码。请帮忙……
这篇文章会给你一些帮助
https://machinelearning.org.cn/save-load-keras-deep-learning-models/
那我可以在每张图片中插入注释吗?
当然可以。
你好,
我正在尝试做一个图像分类器,它确定某物是否应该被赋予特定的标签。我的问题是分类器在每个 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
我做错了什么?
我在这里有一些你可以尝试的想法
https://machinelearning.org.cn/improve-deep-learning-performance/
您好 Jason,感谢您的精彩教程!我需要一些帮助,我正在基于您的教程做一个医学图像识别(诊断)项目。在这里,您通过 Keras 的 load_data() 函数导入了 Cifar10 数据集,但是由于我是从其他来源下载数据集,所以这不可能。所以我通过研究发现了 Keras 的 flow_from_directory() 函数用于图像数据处理,这很棒,我只需将图像分成文件夹,它就会将它们视为类别。然而,医学图像是“DICOM”图像格式,而 Keras 图像函数似乎不支持它,所以通过进一步研究,我发现了 pydicom 模块,用于在 python 中处理 DICOM 图像,但是现在我无法使用 flow_from_directory(),您能否提供一些帮助,说明如何使用 DICOM 图像训练我的 ConvNet 模型并能够使用它来分类(使用 predict() 函数)任何新的 DICOM 图像?
提前谢谢。
我不了解那种格式。
也许你可以转换这些图片?
也许你可以自己编写一个与 DICOM 兼容的目录流函数?
亲爱的朋友,
试试这个
你好,Jason,感谢分享。我测试了你提供的代码,但是我的机器不支持 CUDA,所以运行得很慢(每个 epoch 半小时)。既然你有一台如此强大的电脑,你能展示一下几百或几千个 epoch 之后的结果吗?谢谢。
我在 AWS 上运行了这个示例。我建议你也尝试一下。
https://machinelearning.org.cn/develop-evaluate-large-deep-learning-models-keras-amazon-web-services/
它真的很有帮助!
亲爱的 Jason,
这真是一个非常好的教程 :)。如果你绘制 acc 与 acc_val 的图表,acc 的图表与 acc_val 的图表之间会有一个间隙,这是否意味着过拟合?!而且,我(如果我错了请纠正我)准确率图表在一定数量的 epoch 后应该变成渐近线(即准确率将不再增加)!!
提前感谢
努拉
如果 acc 小于 val_acc,则可能意味着模型欠拟合,并且可能需要更大的模型或更长时间的拟合模型才能在验证集上表现更好。
是的,这是真的,但如果 acc_val 大于 acc,那么也存在过拟合,我注意到你的上述两个结果中都有这种情况!过拟合的原因可能是什么?我们如何摆脱它。
致敬
努努
也许减少训练,也许训练一个更小的模型,也许添加一些正则化,比如 dropout。
希望这些能作为一个开始有所帮助。
是的,我添加了 dropout 并添加了一个完全连接层,我想它奏效了。
非常感谢 Jason 🙂
此致,
努努
干得好!
嗨,Jason,
通常,用于图像分类的 CNN 会生成一个包含可能类别概率的向量。此库中是否有函数可以提取该向量?谢谢!
您可以在输出层使用 softmax 激活函数来获取多个类别的概率,或者使用 sigmoid 激活函数来获取二分类的概率。
你好,
有没有一种方法可以以矢量化的方式应用 keras.predict 函数,使其能够同时处理多个输入(图像)?
谢谢
是的,我相信 predict() 可以接受样本列表 (X) 并返回预测列表 (yhat)。
你好,
如果我有一张包含 6 个物体的图像,我该怎么做才能检测并测量图像中物体的大小。如果您能给我一些提示,那将非常有帮助。
谢谢。
您可以使用对象定位。
抱歉,我没有例子。
先生,
我想在图像中检测手。我的问题是手在图像中很小,并且图像大小各不相同(我的图像大小是 1920*1080)。一张图像包含手、杯子、脸、桌子等……
我的问题是
1. 我们是否应该训练 CNN 来识别各种手形和固定大小,例如 50X50 或其他?
2. 如何找到手的位置。
抱歉,我没有对象本地化的例子。我希望将来能开发出这些例子。
如何在支持 GPU 的机器上运行此代码?
您需要配置您的 TensorFlow 或 Theano 库以使用 GPU。对此我没有说明,抱歉。
一般来说,我建议使用预配置的系统,例如亚马逊,大约每小时 1 美元。
https://machinelearning.org.cn/develop-evaluate-large-deep-learning-models-keras-amazon-web-services/
嗨,Jason,
在第一个示例网络中,您在所有隐藏层(卷积层和全连接层)中都使用了最大范数核约束。我理解这样做的优点,特别是在与 dropout 结合使用时。我想知道您在模型的第二次迭代中是否因为某种原因去除了卷积层的核约束?如果是,您介意解释这样做的动机吗?谢谢!
那是几年前的事了,我不记得了。也许模型在没有约束的情况下获得了更好的结果?
嗨,Jason,
当我们完成模型训练后,如何将该模型用于新图片?
好问题,请看这篇文章,了解如何最终确定模型。
https://machinelearning.org.cn/train-final-machine-learning-model/
一旦您有了最终模型,您就可以调用它了。
yhat = model.predict(newX)
嗨,Jason!我叫 Gabriele,是一名年轻的数据科学家!我目前正在使用 CNN,有几个问题想问你。
1. 我看到你使用的是 32 x 32 的图像,我的问题是对于 1070 - 720 的高分辨率图像,最佳形状是什么?图像必须是正方形的吗?
2. epoch 数量的增加对“准确率指标”的提升有多显著?也许 100 个 epoch?1000 个?它们能返回一个高性能模型吗?
非常感谢!
PS. 抱歉我的“不完美的英语”,希望你理解我的问题!
GM
您可以尝试不同形状的图像或标准化为一种形状。较小的图像需要较小的模型,这反过来又训练得更快。
这篇文章将为您提供有关如何提高神经网络模型性能的想法
https://machinelearning.org.cn/improve-deep-learning-performance/
亲爱的 Jason,
我正在尝试识别图像中的多个对象,并统计每张图像中每个类别的对象数量。您能帮我解决这个问题吗?
这听起来是个很棒的问题,但我没有这方面的问题资料,抱歉。
嘿
回溯(最近一次调用)
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中的一个错误。
或许再次检查您是否安装了所有库的最新版本
https://machinelearning.org.cn/setup-python-environment-machine-learning-deep-learning-anaconda/
并确认您已复制示例中的所有代码。
你好
我输入了自己的.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)
也许模型对您的示例来说不够好?
尝试更多示例,尝试使用更多类似您尝试的示例来训练模型,尝试在训练期间进行数据增强等等。
亲爱的 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个数组,但这些结果让我无法理解。
此致
也许联系数据集所有者,询问更多信息?
嗨,Jason,
我目前正在从事实时物体检测的工作。我需要牢记一些限制:这个程序应该在普通台式电脑上运行,主要思路是它应该能够以视频作为输入来检测物体。因此,在计算成本方面不应该很高。
CNN是解决这个问题的良好方法吗?我在谷歌上看到OpenCV上有一个预训练的DNN(我应该尽可能多地使用OpenCV),但它在Caffe下运行,我对Caffe一无所知。
这就是我在这里的原因,我认为CNN将是一个不错的方法。你觉得呢?你有什么额外的建议/提示吗?
我认为运行CNN很简单,但训练非常慢。
你好,我没看到任何图像识别!
你好,先生,
您能告诉我错误是什么吗?我只是复制了上面的代码,但它显示了一些错误。
ValueError: 检查输入时出错:预期conv2d_26_input的形状为(3, 32, 32),但得到的数组形状为(32, 32, 3)
我尝试更改输入形状,但错误仍然存在。
看起来模型期望数据是一种大小,而数据是另一种大小。您可以更改模型或更改数据。
CIFAR数据集下载时间太长(预计4小时以上)。有没有办法我们可以直接从他们的网站使用zip文件加载数据?
没关系。我找到了解决方案。
从CIFAR数据集网站下载zip文件。
将zip文件放置在keras–>datasets文件夹中。
zip文件包含batches文件夹。
现在在Windows上使用7zip,首先将文件压缩为tar,然后使用右键菜单中的“添加到档案”选项将其压缩为zip。
然后再次运行代码。
节省大量时间,无需更改代码。
很高兴听到这个消息。
抱歉,我暂时不确定。
您能否分享一下在Python/R/Matlab中融合多个卷积神经网络的代码?
当然,请看这里
https://machinelearning.org.cn/develop-n-gram-multichannel-convolutional-neural-network-sentiment-analysis/
需要指导如何进行裂纹检测,我有一些机器的图像,其中一些图像有裂纹,需要识别有裂纹的图像,这个问题如何解决?
尝试了使用Canny边缘检测,但找到边缘后,有点卡住不知道如何进行,如果有其他方法可以实现,请回复,我会尝试解决它..
听起来是个很棒的问题。也许你可以使用迁移学习和预训练模型(如VGG)来开始模型开发?
亲爱的 Jason,
我有一些散点图(matplotlib)图像和包含刻度线、刻度值和点的边界框坐标的idl文件,现在我想进行对象检测任务,您能给我推荐一些预训练模型,我可以用它们来检测刻度线、刻度值和点吗?
这听起来是个很棒的项目,使用预训练模型是加快进展的好方法。
或许从这些开始
https://keras.org.cn/applications/
亲爱的 Jason,
感谢您的回复。实际上我还有一个问题,在对象检测任务中,如果我在模型训练时给出图像和(Xmin,Ymin,Xmax,Ymax)即边界框,那么在模型测试时我只给出图像吗?
我不确定我是否理解,您具体是什么意思?
我的意思是,如果我有训练和测试图像,并且我有训练和测试图像的边界框,并且我将图像和边界框作为带标签的数据提供给我的模型进行训练,那么在测试模型时,我只提供测试图像,还是提供带边界框(带标签数据)的图像?
你好,我想在一张6000x4000像素的图像中检测一个30x40像素大小的物体。这种方法正确吗?
哇,这可能很有挑战性。
试试看吧。
大家好,我在导入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'属性
有人遇到过这个问题吗?有什么解决方案?
通过重新安装Keras解决
很高兴听到这个消息。
听到这个消息我很难过。也许可以尝试将您的代码和错误发布到stackoverflow上?
嗨,感谢您的教程,非常有帮助!我使用了与您的深度CNN相同的架构,但它完成一个epoch需要10多分钟,而您的看起来只需要30秒左右。据我所知,我的代码与您的相同,我的电脑以前从未这么慢过。有什么可能导致这种情况的原因吗?
也许可以尝试在EC2上训练
https://machinelearning.org.cn/develop-evaluate-large-deep-learning-models-keras-amazon-web-services/
嗨,Jason,
很棒的教程,对我的项目很有帮助。:)
如果您能发布任何关于实时物体检测和定位的文章,例如YOLO或SSD,将非常有帮助。如果您已经有相关文章,能否在此分享链接。谢谢:)
感谢您的建议。
贾森,如果我们的测试图像有其他不属于这个数据集的对象,或者只是没有类别对象的普通图像,该怎么办?
这仍然会分类并匹配我们类别集中的某些东西,我们如何处理这个问题。
我找到的一个解决方案是创建一个只包含负面图像(与现有类别无关)的类别,但在世界上有太多不同的负面图像,很难收集。请解释我们如何能让它更完美。
试试看吧。
嗨,Jason,
我们如何决定图像的卷积层数量,是试错法还是有规则可循?
是的,试错法。我在这里有更多解释
https://machinelearning.org.cn/how-to-configure-the-number-of-layers-and-nodes-in-a-neural-network/
非常感谢,贾森,感谢您的所有文章。它让我有信心使用keras编写简单的深度学习模型。这篇文章真的帮助我创建了我的第一个CNN模型,这是我几天来一直困扰的事情。我只有几个问题。
1) 您是如何推导出每个隐藏层的神经元数量的?我知道我们可以使用scikit-learn中的GridSearchCV进行超参数调优,如您在另一篇博客文章中详述的那样。我能够调优输入层的神经元,但当我尝试调优后续层时出现错误。
2) 我如何检查我的模型是过拟合还是欠拟合?我知道您使用Dropout来帮助减少过拟合。但是有没有办法确定我的模型是过拟合还是欠拟合?
3) 您为什么在两个Conv2D层之后只添加一个MaxPooling2D层?我一直认为在每个卷积层之后都必须进行最大池化。您能对此进行更详细的解释吗?
4) 我正在使用tensorflow-gpu作为我的后端。为了让我的GPU承担处理负载,我必须增加batch_size。我只是好奇想知道batch_size在处理速度显著提高的同时如何影响准确性。
干得好!
模型配置是反复试验,在这里了解更多
https://machinelearning.org.cn/faq/single-faq/how-many-layers-and-nodes-do-i-need-in-my-neural-network
学习曲线可以诊断过拟合,在这里了解更多
https://machinelearning.org.cn/faq/single-faq/what-is-the-difference-between-overfitting-and-underfitting
模型设计中几乎没有规则,使用最适合您问题的方法。
批量大小可以加快或减慢模型学习的速度,您可以在这里学习
https://machinelearning.org.cn/faq/single-faq/what-is-the-difference-between-a-batch-and-an-epoch
谢谢您,先生。我也会仔细阅读这些链接。
我有一个小小的建议。您使用的示例没有太多步骤来准备训练和测试数据集。如果有人想用自己的图像文件而不是标准的CIFAR-10来创建CNN模型呢?这就是我遇到很多问题的地方,这不像其他有监督的机器学习代码那样简单。我经过多次尝试和错误才最终弄明白。如果您能提供一个使用自有数据构建模型的示例(如果您还没有写过关于这个的帖子),那将对像我这样的初学者非常有帮助。这只是我的个人意见,因为只有我知道编写一个端到端程序有多么困难。我假设会有更多像我一样对深度学习新手的人。
再次感谢您的所有博客文章。
很好的建议,谢谢。
嗨,Jason,
我正在做一个类似的项目,需要确定扫描图像中是否存在手写签名。
您能建议一些解决这个问题的方法吗,以获得签名是否存在的是或否作为输出。
谢谢
您也许可以使用经典计算机视觉技术来解决这个问题,也许您不需要学习模型?
例如,如果文档上的空白处不为空,则表示有签名。
嗨,Jason,
您的文章对我理解卷积神经网络的实现帮助很大。
谢谢你。
我想知道我是否可以使用相同的概念通过CNN来区分不同类型的硬币?
可能。
嗨,Jason,
我正在使用Keras库通过CNN检测路面漏水。如何决定要应用的卷积层数以及conv2d函数中的值。我从哪里可以了解这些事物的基本知识。漏水数据集不可用,所以我自己下载图像创建数据集,那么我需要多少数据才能获得更好的结果。我可以用400张图像训练模型吗,因为我找不到更多的图像
我建议测试一系列不同的模型配置,以发现最适合您特定问题的方法。
嗨,贾森……这是关于CNN的一篇很棒的帖子,感谢这篇精彩的文章。
如果您能告诉我如何实现此目标定位,我将不胜感激……提前致谢????
感谢您的建议。
嗨,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)
但我没有得到准确率,它正在报错。语法有什么问题
也许尝试将您的代码和错误发布到stackoverflow?
嗨,刚开始深度学习
猫和狗
但我的准确率停留在50%
我尝试了dropout、正则化和数据免疫
这里有一些建议。
https://machinelearning.org.cn/improve-deep-learning-performance/
嗨,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)的?
此致
滤波器就是权重,例如8个5x5的3通道滤波器。
嗨,Json,
你能告诉我或给我一个关于如何保存模型并用它来预测一些新图像的链接吗?
是的,请参阅这篇关于保存模型的文章
https://machinelearning.org.cn/save-load-keras-deep-learning-models/
请参阅这篇关于进行预测的文章
https://machinelearning.org.cn/how-to-make-classification-and-regression-predictions-for-deep-learning-models-in-keras/
这是一个图像分类问题,而不是目标识别/检测问题。
这是对物体照片的分类。
确实,它不是目标识别。
嗨,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)
以下是我的简短代码
关于错误消息,你能告诉我哪里出了问题吗
这是我在这里回答的一个常见问题
https://machinelearning.org.cn/faq/single-faq/can-you-read-review-or-debug-my-code
你好,Jason
我想知道加载所有图像在某个时候是否会导致内存崩溃。
那么……Keras有什么方法可以直接从文件夹读取图像,而不是一次性全部加载到内存中吗?
此致
如果你的RAM不够,你可以使用数据生成器进行渐进式加载,这里有描述
https://machinelearning.org.cn/how-to-load-large-datasets-from-directories-for-deep-learning-with-keras/
感谢您的分享,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')
因为输入数据已经有颜色通道,可以直接建模。
抱歉,我发错了细节。我想要向您展示的正确细节
# 加载数据
(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')
嗨,在这个例子中您提到了数据增强,但没有使用这个博客。如果我们在这个例子中使用增强,它会提高性能吗?
有可能,特别是如果你的增强可以减少网络的噪声,让它学得更好。