专栏首页用户5033944的专栏手把手搭建一个【卷积神经网络】
原创

手把手搭建一个【卷积神经网络】

前言

本文介绍卷积神经网络的入门案例,通过搭建和训练一个模型,来对10种常见的物体进行识别分类;使用到CIFAR10数据集,它包含10 类,即:“飞机”,“汽车”,“鸟”,“猫”,“鹿”, “狗”,“青蛙”,“马”,“船”,“卡车” ;共 60000 张彩色图片;通过搭建和训练卷积神经网络模型,对图像进行分类,能识别出图像是“汽车”,或“鸟”,还是其它。

思路流程

  1. 导入 CIFAR10 数据集
  2. 探索集数据,并进行数据预处理
  3. 构建模型(搭建神经网络结构、编译模型)
  4. 训练模型(把数据输入模型、评估准确性、作出预测、验证预测)
  5. 使用训练好的模型

一、导入 CIFAR10 数据集

使用到CIFAR10数据集,它包含10 类,即:“飞机”,“汽车”,“鸟”,“猫”,“鹿”, “狗”,“青蛙”,“马”,“船”,“卡车” ;共 60000 张彩色图片;

此数据集中 50000 个样例被作为训练集(每张图片对于一个标签),剩余 10000 个样例作为测试集(每张图片也对于一个标签)。类别之间相互独立,不存在重叠的部分。使用以下代码完成数据集导入:

(train_images, train_labels), (test_images, test_labels) = datasets.cifar10.load_data()

二、探索集数据,并进行数据预处理

将测试集的前 30 张图片和类名打印出来

class_names = ['airplane', 'automobile', 'bird', 'cat', 'deer',
               'dog', 'frog', 'horse', 'ship', 'truck']

plt.figure(figsize=(10,10))
for i in range(30):
    plt.subplot(5,6,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()

打印出来的效果是这样的:

数据集预处理

下面进行数据集预处理,将像素的值标准化至0到1的区间内:

# 将像素的值标准化至0到1的区间内。
train_images, test_images = train_images / 255.0, test_images / 255.0

为什么是除以255呢?由于图片的像素范围是0~255,我们把它变成0~1的范围,于是每张图像(训练集、测试集)都除以255。

三、构建模型

常见卷积神经网络(CNN),主要由几个 卷积层Conv2D 和 池化层MaxPooling2D 层组成。卷积层池化层的叠加实现对输入数据的特征提取,最后连接全连接层实现分类。

1)特征提取——卷积层池化层

CNN 的输入是张量 (Tensor) 形式的 (image_height, image_width, color_channels),包含了图像高度、宽度及颜色信息。通常图像使用 RGB 色彩模式,color_channels(R,G,B) 分别对应 RGB 的三个颜色通道,即:image_height 和 image_width 根据图像的像素高度、宽度决定;color_channels是3,对应RGB的3通道。

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'))

查看一下网络模型:tf.keras.utils.plot_model(model)

在上面的模型种每个 Conv2D 和 MaxPooling2D 层的输出都是一个三维的张量 (Tensor),其形状描述了 (height, width, channels)。越深的层中,宽度和高度都会收缩。

2)实现分类——全连接层

Dense 层等同于全连接 (Full Connected) 层,通过上面的卷积层和池化层,我们已经提取到图像的特征了,下面通过搭建Dense 层实现分类。

Dense 层的输入为向量(一维),但前面层的输出是3维的张量 (Tensor) 即:(4, 4, 64)。因此您需要将三维张量展开 (Flatten) 到1维,之后再传入一个或多个 Dense 层。

model.add(layers.Flatten())
model.add(layers.Dense(64, activation='relu'))
model.add(layers.Dense(10))

CIFAR 数据集有 10 个类,因此您最终的 Dense 层需要 10 个输出及一个 softmax 激活函数。

查看完整的 CNN 结构:tf.keras.utils.plot_model(model)

或者用这样方式看看:model.summary()

可以看出,在被传入两个 Dense 层之前,通过Flatten层处理后,形状为 (4, 4, 64) 的输出被展平成了形状为 (1024) 的向量。

3)编译模型

主要是为模型选择损失函数loss、优化器 optimizer、衡量指标metrics(通常用准确度accuracy 来衡量的)

model.compile(optimizer='adam',
              loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
              metrics=['accuracy'])

四、训练模型

这里我们输入准备好的训练集数据(包括图像、对应的标签),测试集的数据(包括图像、对应的标签),模型一共训练10次

history = model.fit(train_images, train_labels, epochs=10, 
                    validation_data=(test_images, test_labels))

下图是训练过程的截图:

通常loss越小越好,对了解释下什么是loss;简单来说是 模型预测值 和 真实值 的相差的值,反映模型预测的结果和真实值的相差程度;

通常准确度accuracy 越高,模型效果越好。

评估模型

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,  test_labels, verbose=2)
print("测试集的准确度", test_acc)

看看效果:

五、使用模型

通常使用 model.predict( ) 函数进行预测。

完成代码:

import tensorflow as tf
from tensorflow.keras import datasets, layers, models
import matplotlib.pyplot as plt

# 导入 CIFAR10 数据集
(train_images, train_labels), (test_images, test_labels) = datasets.cifar10.load_data()

# 将测试集的前 30 张图片和类名打印出来
class_names = ['airplane', 'automobile', 'bird', 'cat', 'deer',
               'dog', 'frog', 'horse', 'ship', 'truck']

plt.figure(figsize=(10,10))
for i in range(30):
    plt.subplot(5,6,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()

# 下面进行数据集预处理,将像素的值标准化至0到1的区间内:
train_images, test_images = train_images / 255.0, test_images / 255.0

# 构建模型
# 1)特征提取——卷积层与池化层
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'))
# 2)实现分类——全连接层
model.add(layers.Flatten())
model.add(layers.Dense(64, activation='relu'))
model.add(layers.Dense(10))
# 3)编译模型
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,  test_labels, verbose=2)
print("测试集的准确度", test_acc)

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 手把手使用numpy搭建卷积神经网络

    在每个前向传播的函数中,在参数更新时会有一个反向传播过程;此外,在前向传播过程会缓存一个参数,用于在反向传播过程中计算梯度。

    用户1631856
  • “花朵分类“ 手把手搭建【卷积神经网络】

    本文介绍卷积神经网络的入门案例,通过搭建和训练一个模型,来对几种常见的花朵进行识别分类;

    一颗小树x
  • 卷积神经网络详解(二)——自己手写一个卷积神经网络

    作者:Charlotte77数学系的数据挖掘民工 博客专栏:http://www.cnblogs.com/charlotte77/ 个人公众号:Charlott...

    企鹅号小编
  • 04.卷积神经网络 W1.卷积神经网络(作业:手动/TensorFlow 实现卷积神经网络)

    0 padding 会在图片周围填充 0 元素(下图 p ...

    Michael阿明
  • 神经网络体系搭建(三)——卷积神经网络

    本篇是神经网络体系搭建的第三篇,解决体系搭建的卷积神经网络相关问题,详见神经网络体系搭建(序) 卷积神经网络(CNN) ? CNN是什么 卷积神经网络是一种空间...

    刘开心_1266679
  • Tensorflow2——卷积神经网络的搭建

    ***** 以下有关代码全是在jupyter notebook 里面调试完后曾,如果直接复制粘贴到pycharm可能不太行,自己得改改

    Albert_xiong
  • 如何入手卷积神经网络

    从 Alex Krizhevsky 及其朋友通过 ImageNet 公布这项技术至今,不过才七年。ImageNet 是一个大规模图像识别竞赛,每年都会举办,识别...

    机器之心
  • 如何入手卷积神经网络

    从 Alex Krizhevsky 及其朋友通过 ImageNet 公布这项技术至今,不过才七年。ImageNet 是一个大规模图像识别竞赛,每年都会举办,识别...

    磐创AI
  • 【深度学习系列】卷积神经网络详解(二)——自己手写一个卷积神经网络

    Screenshot (15).png   上篇文章中我们讲解了卷积神经网络的基本原理,包括几个基本层的定义、运算规则等。本文主要写卷积神经网络如何进行一次完...

    Charlotte77
  • 手把手教你用 TensorFlow 实现卷积神经网络(附代码)

    在知乎上看到一段介绍卷积神经网络的文章,感觉讲的特别直观明了,我整理了一下。首先介绍原理部分。 通过一个图像分类问题介绍卷积神经网络是如何工作的。下面是卷积神经...

    AI研习社
  • 用keras搭建3D卷积神经网络

    资源: 3D卷积神经网络相关博客:http://blog.csdn.net/lengxiaomo123/article/details/68926778 ker...

    企鹅号小编
  • CNN卷积神经网络模型搭建

    前段时间尝试使用深度学习来识别评测过程中的图片,以减少人力成本。目前是在深度学习框架Keras(后端使用TensorFlow)下搭建了一个CNN卷积神经网络模型...

    用户5521279
  • 卷积神经网络(CNN)新手指南

    引言 卷积神经网络:听起来像是生物与数学还有少量计算机科学的奇怪结合,但是这些网络在计算机视觉领域已经造就了一些最有影响力的创新。2012年神经网络开始崭露头角...

    AI科技评论
  • 卷积神经网络新手指南之二

    卷积神经网络新手指南之二 ? 引言 本文将进一步探讨有关卷积神经网络的更多细节,注:以下文章中部分内容较为复杂,为了保证其简明性,部分内容详细解释的研究文献会标...

    AI科技评论
  • 开发 | 手把手教你用 TensorFlow 实现卷积神经网络(附代码)

    AI科技评论按:本文作者徐凯文,原文载于作者个人博客,已获授权。 在知乎上看到一段介绍卷积神经网络的文章,感觉讲的特别直观明了,我整理了一下。首先介绍原理部分。...

    AI科技评论
  • 使用tensorflow构建一个卷积神经网络

    本文是对tensforflow官方入门教程的学习和翻译,展示了创建一个基础的卷积神经网络模型来解决图像分类问题的过程。具体步骤如下

    生信修炼手册
  • 手把手教你用PyTorch创建首个神经网络

    随着深度学习领域日益渐火以及网络上的前沿文章铺天盖地地出现,人们很容易将深度学习视为是只对数学博士开放的高级领域——但本文要证明这种观点是错的。

    人工智能小咖
  • 手动搭建BP神经网络

    数据集采用著名的MNIST数据集,来自美国国家标准与技术研究所,由来自250个不同人手写的数字构成,其中50%是高中学生,50%来自人口普查局的工作人员。测试集...

    luxuantao
  • TensorFlow系列专题(十四): 手把手带你搭建卷积神经网络实现冰山图像分类

    这里我们要解决的任务是来自于Kaggle上的一道赛题(https://www.kaggle.com/c/statoil-iceberg-classifier-c...

    磐创AI

扫码关注云+社区

领取腾讯云代金券