小白入门深度学习|第三篇:深度学习初体验(代码片段)

K同学啊 K同学啊     2022-12-12     505

关键词:


🚀 我的环境:

  • 语言环境:Python3.6.5
  • 编译器:Jupyter Notebook
  • 深度学习环境:TensorFlow2.4.1

🚀 往期内容:

  1. 小白入门深度学习 | 第一篇:配置深度学习环境
  2. 小白入门深度学习 | 第二篇:编译器的使用-Jupyter Notebook

🚀 本文选自专栏:《小白入门深度学习》
🚀 推荐精品专栏:《夜深人静写算法》


一、深度学习是什么

深度学习(DL, Deep Learning)是机器学习(ML, Machine Learning)领域中一个新的研究方向,它被引入机器学习使其更接近于最初的目标——人工智能(AI, Artificial Intelligence)。–引自百度百科

深度学习(deep learning)是机器学习的分支,是一种以人工神经网络为架构,对资料进行表征学习的算法。–引自维基百科

“深度学习”这四个字拆解成两个词就是“深度”和“学习”。“学习”大概是我们学生时代接触最频繁的词,那时候的学习就是上课、做题,最终通过考试。如果更抽象一点描述,学习就是认知的过程,从未知到已知的探索与思考过程。最早的学习,1+1=2,想想我们是怎么学习的?伸出一只手指,再伸出一只手指,数一数,两只手指那就是2。

这里定义一个概念,输入和输出,输入就是已知的信息,输出就是由输入获得的认知的结果。我们将一个从已有的信息,通过计算、判断和推理得到结果的认知过程统称为“学习”。

如何让机器也可以进行学习呢?学术界为此提出了“神经网络”的概念。人脑中负责活动的基本单元是神经元,这些神经元互相连接成一个被称为神经网络的庞大结构。由此,学术界模仿人脑“神经网络“建立一个人工神经网络(ANN),我们通常也简称为神经网络。

将1+1=2用神经网络可以表示为如下结构。

我们将“1”、“+”、“1”与“2”同时作为输入不断训练神经网络(不断告诉机器1+1=2),在训练若干次后,神经网络将会学会“1+1=2”。同样的,我们将1+2=3放入神经网络中去,不断进行训练,若干次后神经网络也将学会1+2=3。如此循环往复,我们可以教会神经网络进行加法运算,进而可以让神经网络学会算术运算,我们把这个过程称为深度学习。

深度学习在生活中的应用不仅仅局限于此,在自动驾驶、语音识别、自动机器翻译、即时视觉翻译(拍照翻译)、目标识别等等领域也都有重要应用,例如:手机上的小爱同学、地铁口的人脸识别…

下面我将通过对 MNIST 手写数字的识别进一步讲解深度学习,带领大家体验一次完整的深度学习实现的全过程。

假设现在我们手上很多张手写的数字图片,需要通过深度学习让机器“认识”这些图片上的数字,然后告诉我们每一张图片上的数字是多少。

那么我们应该如何实现呢?总体的思路如下:

  • 我们先拿出 6 万张图片给机器进行学习(需要告诉机器每一个图片上写的是哪一个数字)。
  • 在学习后,再拿出1万张机器没“见过”的图片给它进行识别,让它告诉我们,图片上写的是哪一个数字。
  • 重复上面的过程,直到机器可以认识手写的数字。

至此,完成便可实现手写数字识别这一效果。

二、实现过程

程序执行步骤:

  • ① 学习6万张图片上的数字
  • ② 用1万张图片测试机器的学习效果(这1万张不参与①的训练)
  • ③ 重复①、②

使用的编译器为Jupyter Notebook,如果你不太熟,可以先看看前面的文章:【小白入门深度学习 | 第二篇:编译器的使用-Jupyter Notebook】

如果你对下面的代码不是很理解,没有关系的,后面的文章中我会对每个部分展开更详细的解释。现在你需要做的是:了解每一个模块实现的功能,从整体上把握整份代码。

1. 准备数据

导入数据

import tensorflow as tf
from tensorflow.keras import datasets, layers, models

# 加载数据集
(train_images, train_labels), (test_images, test_labels) = datasets.mnist.load_data()

# 输出数据形状
train_images.shape, test_images.shape
((60000, 28, 28), (10000, 28, 28))

准备好 6 万张带有标签的训练图片让机器进行学习。1 万张测试图片让机器进行识别,测试其是否学会了。(60000, 28, 28) 表示为:60000 张 28*28 像素的图片。

可视化

这里我们用第三方库 matplotlib 输出手写数字图片,看看我们的手写数字(数据集)是什么样子的。

import matplotlib.pyplot as plt

# 设置窗口大小为 20*12 单位英寸
plt.figure(figsize=(20,12))

for i in range(20):
    # 设置子图行数为5,列数为10,i+1表示第几个子图
    plt.subplot(5,10,i+1)
    
    # 去掉坐标轴刻度
    plt.xticks([])
    plt.yticks([])
    
    # 显示图片
    plt.imshow(train_images[i], cmap=plt.cm.binary)
    # 显示标签
    plt.xlabel(train_labels[i])
plt.show()

调整图片格式

需要将图片调整为特定格式程序才可以进行学习

#调整数据到我们需要的格式
train_images = train_images.reshape((60000, 28, 28, 1))
test_images  = test_images.reshape((10000, 28, 28, 1))

# 输出数据sahpe
train_images.shape,test_images.shape,train_labels.shape,test_labels.shape
((60000, 28, 28, 1), (10000, 28, 28, 1), (60000,), (10000,))

(60000, 28, 28, 1):表示为:60000张 28*28 的灰度图片,最后一个数字为1时,代表灰度图片;为3时代表彩色图片。

2. 构建神经网络模型

我们将图片输入到网络,图片首先会将其数字化,紧接着通过卷积层提取图片上这个数字的特征,最后通过数字的特征判断这个数字是哪一个。结构图如下:

上面的结构图中,向我们展示了五层结构,那么每一层具体是用来做什么的呢?

  • 输入层:用于将数据输入到神经网络
  • 卷积层:使用卷积核提取图片特征,卷积核相当于一个小型的“特征提取器”
  • Flatten层:将多维的输入一维化,常用在卷积层到全连接层的过渡
  • 全连接层:起到“特征提取器”的作用
  • 输出层:输出结果

卷积核与全连接层从某些方面上讲都有提取特征的作用,但是所采用的方法是不同的。

这部分为深度学习的核心内容,我将在第四部分(构建模型)重点向大家进行更详细深入的讲解,现在我们主要任务是跑通整个程序,从整体上了解一下深度学习是什么。

model = models.Sequential([    # 
    layers.Conv2D(32, (3, 3), input_shape=(28, 28, 1)), # 卷积层:提取图片特征
    layers.Flatten(),         # Flatten层:将二维图片压缩为一维形式
    layers.Dense(100),        # 全连接层:将特征进行进一步压缩
    layers.Dense(10)          # 输出层:输出结果
])

# 打印网络结构
model.summary()
Model: "sequential"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
conv2d (Conv2D)              (None, 26, 26, 32)        320       
_________________________________________________________________
flatten (Flatten)            (None, 21632)             0         
_________________________________________________________________
dense (Dense)                (None, 100)               2163300   
_________________________________________________________________
dense_1 (Dense)              (None, 10)                1010      
=================================================================
Total params: 2,164,630
Trainable params: 2,164,630
Non-trainable params: 0
_________________________________________________________________

3. 编译模型

在这一步,我们需要设置模型的优化器,损失函数、评价函数:

  • 优化器:帮助模型更好的训练
  • 损失函数:用于估量预测值与真实值的不一致程度
  • 评价函数:评价模型的质量
model.compile(optimizer='adam',      # adam是优化器的一种
              loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True), # 损失函数的一种计算方法
              metrics=['accuracy'])  #采用准确率来评价模型

4. 训练模型

将数据传入模型进行训练,传入的数据分为训练数据、验证数据两部分。训练数据(训练集)用于训练模型,验证数据(验证集)用于监测模型的效果。epochs 表示模型的学习轮数(次数)。

"""
train_images   :训练数据的图片
train_labels   :训练图片对应的标签
epochs         :训练轮数
validation_data:验证数据
"""
history = model.fit(train_images, train_labels, epochs=3, 
                    validation_data=(test_images, test_labels))
Epoch 1/3
1875/1875 [==============================] - 39s 20ms/step - loss: 32.1691 - accuracy: 0.8110 - val_loss: 1.1053 - val_accuracy: 0.8700
Epoch 2/3
1875/1875 [==============================] - 42s 22ms/step - loss: 0.8161 - accuracy: 0.8832 - val_loss: 0.5099 - val_accuracy: 0.8955
Epoch 3/3
1875/1875 [==============================] - 36s 19ms/step - loss: 0.4562 - accuracy: 0.8920 - val_loss: 0.4225 - val_accuracy: 0.8843

5. 预测

# 打印我们想要进行预测的图片
plt.imshow(test_images[1])
<matplotlib.image.AxesImage at 0x14695a3cfd0>

输出测试集中第一张图片的预测数组

pre = model.predict(test_images)
pre[1]
array([ 12.474585 ,   1.1173537,  21.654232 ,  16.206923 , -10.989567 ,
        17.235504 ,  19.404213 , -22.553476 ,  13.221286 , -10.19972  ],
      dtype=float32)

这组浮点数对应着0~9,最大的浮点数对应着的数字就是神经网络的预测结果。

import numpy as np

# 输出预测结果
pre_num = np.argmax(pre[1])
print("模型的预测结果为:",pre_num)
模型的预测结果为: 2

三、总结

我们通过算术学习、MNIST手写数字识别了解了什么是深度学习,也用TensorFlow2实现了MNIST手写数字识别,从整体上了解了一个深度学习程序是什么样子的,应该有哪些步骤。在接下来的文章中我们逐一详细了解深度学习每一个部分的内容。

课后练手项目(附代码+讲解)

🚀 卷积神经网络篇:

  1. 深度学习100例-卷积神经网络(CNN)实现mnist手写数字识别 | 第1天
  2. 深度学习100例-卷积神经网络(CNN)彩色图片分类 | 第2天
  3. 深度学习100例-卷积神经网络(CNN)服装图像分类 | 第3天
  4. 深度学习100例-卷积神经网络(CNN)花朵识别 | 第4天
  5. 深度学习100例-卷积神经网络(CNN)天气识别 | 第5天
  6. 深度学习100例-卷积神经网络(VGG-16)识别海贼王草帽一伙 | 第6天
  7. 深度学习100例-卷积神经网络(VGG-19)识别灵笼中的人物 | 第7天
  8. 深度学习100例-卷积神经网络(ResNet-50)鸟类识别 | 第8天
  9. 深度学习100例-卷积神经网络(AlexNet)手把手教学 | 第11天
  10. 深度学习100例-卷积神经网络(CNN)识别验证码 | 第12天
  11. 深度学习100例-卷积神经网络(Inception V3)识别手语 | 第13天
  12. 深度学习100例-卷积神经网络(Inception-ResNet-v2)识别交通标志 | 第14天
  13. 深度学习100例-卷积神经网络(CNN)实现车牌识别 | 第15天
  14. 深度学习100例-卷积神经网络(CNN)识别神奇宝贝小智一伙 | 第16天
  15. 深度学习100例-卷积神经网络(CNN)注意力检测 | 第17天

🚀 循环神经网络篇:

  1. 深度学习100例-循环神经网络(RNN)实现股票预测 | 第9天
  2. 深度学习100例-循环神经网络(LSTM)实现股票预测 | 第10天

🚀 循环神经网络篇:

  1. 深度学习100例-生成对抗网络(GAN)手写数字生成 | 第18天

未完~

持续更新 欢迎 点赞👍、收藏⭐、关注👀

  • 点赞👍:点赞给我持续更新的动力
  • 收藏⭐️:收藏后你能够随时找到文章
  • 关注👀:关注我第一时间接收最新文章

深度学习100例|第27天-卷积神经网络(cnn):艺术作品识别(代码片段)

...;来自专栏:《深度学习100例》如果你是一名深度学习小白可以先看看我这个专门为你写的专栏:《小白入门深度学习》小白入门深度学习|第一篇:配置深度学习环境小白入门深度学习|第二篇:编译器的使用-Jupyte... 查看详情

深度学习之tensorflow安装与初体验(代码片段)

深度学习之TensorFlow安装与初体验学习前搞懂一些关系和概念首先,搞清楚一个关系:深度学习的前身是人工神经网络,深度学习只是人工智能的一种,深层次的神经网络结构就是深度学习的模型,浅层次的神经网络结构是浅度... 查看详情

小白入门深度学习|第一篇:配置深度学习环境(代码片段)

文章目录一、配置Python3环境二、安装CPU版本的tf2环境三、安装jupyternotebook四、安装GPU版本tf2环境1.找到显卡对应的CUDA2.下载相应的CUDA3.下载相应的cudnn4.添加环境变量5.安装tensorflow-gpu一、配置Python3环境这里推荐去Python官网下载安... 查看详情

pytorch深度学习50篇·······第三篇:非监督学习(代码片段)

兄弟萌,我咕里个咚今天又杀回来了,有几天时间可以不用驻场了,喜大普奔,终于可以在有网的地方码代码了,最近驻场也是又热又心累啊,抓紧这几天,再更新一点的新东西。今天主要讲一下非监... 查看详情

✨订阅须知✨|《小白入门深度学习》(代码片段)

...微信,拉你进微信交流群,记得备注:CSDN+小白入门深度学习需要定制的同学也可以加我,包括但不限于:期末大作业、毕设指导、Python留学生作业我的微信:专栏的数据获取 查看详情

✨订阅须知✨|《小白入门深度学习》(代码片段)

...微信,拉你进微信交流群,记得备注:CSDN+小白入门深度学习需要定制的同学也可以加我,包括但不限于:期末大作业、毕设指导、Python留学生作业我的微信:专栏的数据获取 查看详情

小白入门深度学习|第二篇:编译器的使用-jupyternotebook(代码片段)

...、安装插件1.安装目录八、后记🚀来自专栏:《小白入门深度学习》一、JupyterNotebook是什么JupyterNotebook是基于网页的用于交互计算的应用程序。其可被应用于全 查看详情

小白入门深度学习|第六篇:tensorflow2回调极速入门

作者:K同学啊本文选自:《小白入门深度学习》配套实例教程:《深度学习100例》文章目录什么是Tensorflow回调?如何使用回调?如何设置早停?Lambda回调动态学习率模型检查点学习率降低LROnPlateau终止OnNaN什么是Tensorflow回调?Tens... 查看详情

小白入门深度学习|第六篇:tensorflow2回调极速入门(代码片段)

作者:K同学啊本文选自:《小白入门深度学习》配套实例教程:《深度学习100例》文章目录什么是Tensorflow回调?如何使用回调?如何设置早停?Lambda回调动态学习率模型检查点学习率降低LROnPlateau终止OnNaN什么... 查看详情

小白入门深度学习|第四篇:配置pytorch环境(代码片段)

文章目录简单的方法:快捷的方法检查是否安装成功简单的方法:进入【官网】,通过官方提供的方法进行安装。这个方法的好处是简单快捷的方法上面的方法属于pip在线安装,比较方便,但是安装速度会慢... 查看详情

国美深度学习初体验,开启社交电商的智能时代!

...京富力万丽酒店举行,此次峰会设有全天的巅峰论坛,及深度学习、人机交互和智+应用等分论坛。国美大数据中心副总监杨骥,将出席深度学习分论坛,做主题为“深度学习开启社交电商智能时代”的演讲。在会前交流中,杨... 查看详情

深度学习基础之numpy,小白轻松入门numpy,送书了!!!(代码片段)

目录1、numpy的安装2、快速入门3.Numpy数组操作4、常用函数5、ndarray和list的区别6、总结送书活动第一期1、numpy的安装pipinstallnumpy2、快速入门2.1数据类型用过C语言的基本上都知道是哪几个类型,毕竟python是c实现的总结一下࿱... 查看详情

深度学习基础之numpy,小白轻松入门numpy,送书了!!!(代码片段)

目录1、numpy的安装2、快速入门3.Numpy数组操作4、常用函数5、ndarray和list的区别6、总结送书活动第一期1、numpy的安装pipinstallnumpy2、快速入门2.1数据类型用过C语言的基本上都知道是哪几个类型,毕竟python是c实现的总结一下࿱... 查看详情

小白入门深度学习|第四篇:配置pytorch环境

查看详情

小白入门深度学习|第一篇:配置深度学习环境

文章目录一、配置Python3环境二、安装CPU版本的tf2环境三、安装jupyternotebook四、安装GPU版本tf2环境1.找到显卡对应的CUDA2.下载相应的CUDA3.下载相应的cudnn4.添加环境变量5.安装tensorflow-gpu一、配置Python3环境这里推荐去Python官网下载安... 查看详情

深度学习入门2022最新版深度学习简介(代码片段)

【深度学习入门2022最新版】第一课深度学习简介概述深度学习vs机器学习机器学习是什么深度学习是什么机器学习和深度学习的区别神经网络机器学习实现二分类神经网络实现二分类TensorFlowPyTorch神经网络的原理张量张量最小值(... 查看详情

头歌平台-深度学习初体验(代码片段)

EduCoder平台:深度学习初体验第1关:什么是神经网络第2关:反向传播第3关:动手实现CNN识别手写数字编程要求:填写python代码,在Begin-End段中构建出如下结构的卷积神经网络:64个5*5的卷积核组成的卷... 查看详情

[深度学习]七行代码体验深度学习的神奇(代码片段)

简介这是深度学习系列的第一节,这个课程是为了让深度学习更能为大众接受,为了那些在机器学习和数学方面没有很深厚背景的同学设计。我们强烈相信深度学习将在很多领域产生变革;比如,这个课程的对象... 查看详情