tensorflow-CNN识别不同物体图像
tensorflow-CNN识别不同物体图像
这个是技术文档中经典的一个案例,对不同的图像的类别进行分类
导入 TensorFlow
import tensorflow as tf
from tensorflow.keras import datasets, layers, models
import matplotlib.pyplot as plt
下载并准备 CIFAR10 数据集
CIFAR10 数据集包含 10 类,共 60000 张彩色图片,每类图片有 6000 张。此数据集中 50000 个样例被作为训练集,剩余 10000 个样例作为测试集。类之间相互独立,不存在重叠的部分。
(train_images, train_labels), (test_images, test_labels) = datasets.cifar10.load_data()
# 将像素的值标准化至0到1的区间内。
train_images, test_images = train_images / 255.0, test_images / 255.0
查看一下图片
我们将测试集的前 25 张图片和类名打印出来,来确保数据集被正确加载。
class_names = ['airplane', 'automobile', 'bird', 'cat', 'deer',
'dog', 'frog', 'horse', 'ship', 'truck']
plt.figure(figsize=(10,10))
for i in range(25):
plt.subplot(5,5,i+1)
plt.xticks([])
plt.yticks([])
plt.grid(False)
plt.imshow(train_images[i], cmap=plt.cm.binary)
# 由于 CIFAR 的标签是 array,
# 因此您需要额外的索引(index)。
plt.xlabel(class_names[train_labels[i][0]])
plt.show()
构造卷积神经网络模型
下方展示的 6 行代码声明了了一个常见卷积神经网络,由几个 Conv2D 和 MaxPooling2D 层组成。
CNN 的输入是张量 (Tensor) 形式的 (image_height, image_width, color_channels),包含了图像高度、宽度及颜色信息。不需要输入 batch size。如果您不熟悉图像处理,颜色信息建议您使用 RGB 色彩模式,此模式下,color_channels 为 (R,G,B) 分别对应 RGB 的三个颜色通道(color channel)。在此示例中,我们的 CNN 输入,CIFAR 数据集中的图片,形状是 (32, 32, 3)。可以在声明第一层时将形状赋值给参数 input_shape 。
model = models.Sequential()
model.add(layers.Conv2D(32, (3, 3), activation='relu', input_shape=(32, 32, 3)))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
声明的 CNN 结构是:
model.summary()
在上面的结构中,可以看到每个 Conv2D 和 MaxPooling2D 层的输出都是一个三维的张量 (Tensor),其形状描述了 (height, width, channels)。越深的层中,宽度和高度都会收缩。每个 Conv2D 层输出的通道数量 (channels) 取决于声明层时的第一个参数(如:上面代码中的 32 或 64)。这样,由于宽度和高度的收缩,您便可以(从运算的角度)增加每个 Conv2D 层输出的通道数量 (channels)。
增加 Dense 层
Dense 层等同于全连接 (Full Connected) 层。
在模型的最后,您将把卷积后的输出张量(本例中形状为 (4, 4, 64))传给一个或多个 Dense 层来完成分类。Dense 层的输入为向量(一维),但前面层的输出是3维的张量 (Tensor)。因此您需要将三维张量展开 (flatten) 到1维,之后再传入一个或多个 Dense 层。CIFAR 数据集有 10 个类,因此您最终的 Dense 层需要 10 个输出及一个 softmax 激活函数。
model.add(layers.Flatten())
model.add(layers.Dense(64, activation='relu'))
model.add(layers.Dense(10))
查看完整的 CNN 结构:
model.summary()
可以看出,在被传入两个 Dense 层之前,形状为 (4, 4, 64) 的输出被展平成了形状为 (1024) 的向量。
编译并训练模型
model.compile(optimizer='adam',
loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
metrics=['accuracy'])
history = model.fit(train_images, train_labels, epochs=10,
validation_data=(test_images, test_labels))
评估模型
plt.plot(history.history['accuracy'], label='accuracy')
plt.plot(history.history['val_accuracy'], label = 'val_accuracy')
plt.xlabel('Epoch')
plt.ylabel('Accuracy')
plt.ylim([0.5, 1])
plt.legend(loc='lower right')
plt.show()
test_loss, test_acc = model.evaluate(test_images, tesfffdddd44444et_labels, verbose=2)
print(test_acc)
相关文章
- 文字识别:CRNN
- Linux无法识别Broadcom 802.11abgn无线网卡
- 【问题解决方案】Keras手写数字识别-ConnectionResetError: [WinError 10054] 远程主机强迫关闭了一个现有的连接
- Opencv学习笔记 识别图片中的条码区域
- 有没有高效的记视频笔记方法?--天若OCR文字识别记视频笔记
- Android OCR文字识别 实时扫描手机号(极速扫描单行文本方案)
- Atitit 图像清晰度 模糊度 检测 识别 评价算法 原理
- Atitit 图像处理--图像分类 模式识别 肤色检测识别原理 与attilax的实践总结
- atitit.验证码识别step2------剪贴板ClipBoard copy image图像 attilax总结
- CV之cv2:基于python语言利用cv2库对几何形状图像边界进行识别检测并计算周长/面积以及输出颜色/形状类型之详细攻略
- ML之SVM:基于SVM(支持向量机)之SVC算法对手写数字图片识别进行预测
- 语音识别——基于深度学习的中文语音识别tutorial(代码实践)
- 【项目实战】Python基于卷积神经网络CNN模型和VGG16模型进行图片识别项目实战
- 【Android界面实现】使用GestureOverlayView控件实现手势识别
- 在OpenCV里实现游戏外挂的位置识别
- 在OpenCV里使用SVM识别手写数字
- 利用神经网络进行网络流量识别——特征提取的方法是(1)直接原始报文提取前24字节,24个报文组成596像素图像CNN识别;或者直接去掉header后payload的前1024字节(2)传输报文的大小分布特征;也有加入时序结合LSTM后的CNN综合模型
- 爬虫学习(11):python验证码识别
- 基于文本字符的交易验证码识别0.98+解决方案
- TensorFlow 从入门到精通(3)—— 手写数字识别