【计算机视觉】深度学习框架-Keras

2023-10-27

1. 从零开始训练网络

1.1 搭建网络基本架构

网络的最终目标是,输入一张手写数字图片后,网络输出该图片对应的数字。

我们的代码要导出三个接口,分别完成以下功能:

1,初始化initialisation,设置输入层,中间层,和输出层的节点数。

2,训练train:根据训练数据不断的更新权重值

3,查询query,把新的数据输入给神经网络,网络计算后输出答案。(推理)

完成以上代码后,神经网络的大体框架就完成了,我们留下最重要的train函数,也就是通过训练样本训练链路权重的流程到下一步实现

1.2 构建训练网络

实现网络训练功能

自我训练过程分两步:

  1. 第一步是计算输入训练数据,给出网络的计算结果,这点跟我们前面实现的query()功能很像。

  2. 第二步是将计算结果与正确结果相比对,获取误差,采用误差反向传播法更新网络里的每条链路权重。

获取训练数据及预处理

接下来我们就得拿实际数据来训练我们的神经网络了。

我们要做的是读取训练数据,以及数据的预处理(归一化)

1.3 启动训练网络并测试数据

网络的最终目标是,输入一张手写数字图片后,网络输出该图片对应的数字。

由于网络需要从0到9一共十个数字中挑选出一个,于是我们的网络最终输出层应该有十个节点,每个节点对应一个数字。

假设图片对应的是数字0,那么输出层网络中,第一个节点应该输出一个高百分比,其他节点输出低百分比,如果图片对应的数字是9,那么输出层最后一个节点应该输出高百分比,其他节点输出低百分比。

2. 用Keras实现一个简单神经网络

2.1 Keras简介

Keras是基于theano/tensorflow的深度学习框架。是一个高层神经网络API,支持快速实验,能够把你的idea迅速转换为结果,如果有如下需求,可以优先选择Keras:
a)简易和快速的原型设计(keras具有高度模块化,极简,和可扩充特性)
b)支持CNN和RNN,或二者的结合
c)无缝CPU和GPU切换

2.2 MNIST手写数字识别(详细解释步骤)

2.2.1 数据的加载

MINIST数据集是一个公开的数据集,由0〜9手写数字图片和数字标签所组成的,由60000个训练样本和10000个测试样本组成,每个样本都是一张28 * 28像素的灰度手写数字图片。

from tensorflow.keras.datasets import mnist
(train_images, train_labels), (test_images, test_labels) = mnist.load_data()

load_data()函数就会自动从网上下载MNIST数据,加载(下载)数据时顺便做完了训练集(train set)和测试集(test set)的分割。

将训练数据和检测数据加载到内存中(第一次运行需要下载数据,会比较慢):
train_images是用于训练系统的手写数字图片;
train_labels是用于标注图片的信息;
test_images是用于检测系统训练效果的图片;
test_labelstest_images图片对应的数字标签。

2.2.2 对数据做基本确认(该步骤可有可无)

查看训练集和测试集的数据情况

print('train_images.shape = ',train_images.shape)
print('train_labels = ', train_labels)
print('test_images.shape = ', test_images.shape)
print('test_labels', test_labels)

打印结果:
train_images.shape =  (60000, 28, 28)
tran_labels =  [5 0 4 ... 5 6 8]
test_images.shape =  (10000, 28, 28)
test_labels [7 2 1 ... 4 5 6]
  1. train_images.shape打印结果表明,train_images是一个含有60000个元素的数组.数组中的元素是一个二维数组,二维数组的行和列都是28.也就是说,一个数字图片的大小是28*28.
  2. train_lables打印结果表明,第一张手写数字图片的内容是数字5,第二种图片是数字0,以此类推.
  3. test_images.shape的打印结果表示,用于检验训练效果的图片有10000张。
  4. test_labels输出结果表明,用于检测的第一张图片内容是数字7,第二张是数字2,依次类推。

查看测试集的第一张图片

digit = test_images[0]
import matplotlib.pyplot as plt
plt.imshow(digit, cmap=plt.cm.binary)
plt.show()

在这里插入图片描述

2.2.3 搭建神经网络

使用tensorflow.Keras搭建一个有效识别图案的神经网络

from tensorflow.keras import models
from tensorflow.keras import layers
#模型构建
network = models.Sequential()
#隐藏层结点个数为512,激活函数为relu,输入为一个28*28的图像	
network.add(layers.Dense(512, activation='relu', input_shape=(28*28,)))
#输出层 输出节点个数为10,结点映射到1到0之间
network.add(layers.Dense(10, activation='softmax'))
  1. layers:表示神经网络中的一个数据处理层。(dense:全连接层)

  2. models.Sequential():顺序模型,表示把每一个数据处理层串联起来,即通过一层层神经网络连接构建深度神经网络。通过model.add()叠加一些网络层如LSTM和Dense。

  3. layers.Dense(…):构造一个数据处理层。

  4. input_shape(28*28,):表示当前处理层接收的数据格式必须是长和宽都是28的二维数组,后面的“,“表示数组里面的每一个元素到底包含多少个数字都没有关系.

  5. softmax用于多分类过程中,它将多个神经元的输出映射到[0,1]区间内,故可以看成是某个类的概率,从而来进行多分类。假设我们有一个数组V,V_i表示V中的第i个元素,计算softmax值公式为:
    S i = e V i ∑ j e V i S_i=\frac{e^{V_i}}{\sum_je^{V_i}} Si=jeVieVi

搭建完模型后使用compile()函数进行编译

# 编译
network.compile(optimizer='rmsprop', loss='categorical_crossentropy',
               metrics=['accuracy'])

compile()函数参数介绍

  1. optimizer:优化器/优化算法
  2. loss:描述模型预测值与真实值的差距大小。两种常见的算法——均值平方差(MSE)和交叉熵。
  3. metric:在训练和测试过程中需要监控的指标/度量。正确分类的比例用"accuracy"即可。注意metrics参数的传递方法是指定一个列表,这意味着可以指定的性能度量项可以不限于一项。

2.2.4 数据标准化

将数据从二维数组变为一位数组,然后数据归一化处理(在把数据输入到网络模型之前)

train_images = train_images.reshape((60000, 28*28))
train_images = train_images.astype('float32') / 255

test_images = test_images.reshape((10000, 28*28))
test_images = test_images.astype('float32') / 255
  1. reshape(60000, 28*28):train_images数组原来含有60000个元素,每个元素是一个28行,28列的二维数组,现在把每个二维数组转变为一个含有28*28个元素的一维数组.
  2. astype(“float32”)/255: 由于数字图案是一个灰度图,图片中每个像素点值的大小范围在0到255之间。/255就是把每个像素点的值从范围0-255转变为范围在0-1之间的浮点值。

把图片对应的标记也做一个更改(该步骤可有可无)

如果没有对标签进行处理,在预测推理时,只需使用argmax函数将概率最大的位置输出即可

from tensorflow.keras.utils import to_categorical
print("before change:" ,test_labels[0])
train_labels = to_categorical(train_labels)
test_labels = to_categorical(test_labels)
print("after change: ", test_labels[0])
运行结果:
before change: 7
after change:  [0. 0. 0. 0. 0. 0. 0. 1. 0. 0.]

to_categoricall(数据的类别标签, 总类别数):将类别标签向量转换为二进制(只有0和1)的矩阵类型表示。每一个标签用矩阵的对应的行向量来表示。

目前所有图片的数字图案对应的是0到9。例如test_images[0]对应的是数字7的手写图案,那么其对应的标记test_labels[0]的值就是7。我们需要把数值7变成一个含有10个元素的数组,然后在第8个元素设置为1,其他元素设置为0。test_lables[0] 的值由7转变为数组[0,0,0,0,0,0,0,1,0,0]

2.2.5 训练模型

把数据输入模型进行训练

#指定了训练5轮,小批量训练数据块大小为128个数据样本
network.fit(train_images, train_labels, epochs=5, batch_size = 128)

训练过程:
Epoch 1/5

  128/60000 [..............................] - ETA: 1:49 - loss: 2.3711 - acc: 0.0625
  384/60000 [..............................] - ETA: 44s - loss: 1.9454 - acc: 0.3516 
    ······
    ······
59520/60000 [============================>.] - ETA: 0s - loss: 0.0380 - acc: 0.9884
60000/60000 [==============================] - 5s 79us/sample - loss: 0.0379 - acc: 0.9885
  1. train_images:用于训练的手写数字图片;
  2. train_labels:对应的是图片的标记;
  3. epochs:每次计算的循环是五次
  4. batch_size:每次网络从输入的图片数组中随机选取128个作为一组进行计算。把batch_size传递给模型,它自动计算需要分为多少个mini-batch。如果除不尽的话,是向下取整,最后不足部分舍弃。
    • batch mode(批量模式):将整个数据集作为一个数据块训练。若batch_size等于训练集大小就是batch mode。
    • minibatch mode(小批量模式):分为多个数据块(通常是相同大小的)逐个处理。
    • stochastic mode:逐个数据进行训练处理。batch_size=1时的minibatch mode的特例。

2.2.6 性能评估

上一步骤已经训练好模型了,将测试数据输入,检验网络学习后的图片识别效果

test_loss, test_acc = network.evaluate(test_images, test_labels, verbose=1)
print(test_loss) 
print('test_acc', test_acc)
运行结果
0.07136689759036526
test_acc 0.9796

evaluate()函数用于进行模型性能评估,将test_images, test_labels一起传递给evaluate()函数即可。

识别效果与硬件有关(CPU/GPU).

2.2.7 预测推理

输入一张手写数字图片到网络中,看看它的识别效果

先来看看手写图片

(train_images, train_labels), (test_images, test_labels) = mnist.load_data()
digit = test_images[1]
plt.imshow(digit, cmap=plt.cm.binary)
plt.show()

在这里插入图片描述

将图片数据输入模型进行训练

test_images = test_images.reshape((10000, 28*28))
res = network.predict(test_images)#预测函数
#前面数据处理时,将训练集的数字变成了只含有0和1的数组,故此时模型输出的是一个10维向量,当哪个的概率最大时将对应位置的赋值为1
print(res[1])
print("the number for the picture is : ", res[1].argmax())
#for i in range(res[1].shape[0]):
#    if (res[1][i] == 1):
#        print("the number for the picture is : ", i)
#        break
        
运行结果:
[0. 0. 1. 0. 0. 0. 0. 0. 0. 0.]
the number for the picture is : 2
#the number for the picture is :  2

【代码实现】直接调用接口

from tensorflow.keras.datasets import mnist
(train_images, train_labels), (test_images, test_labels) = mnist.load_data()
print('train_images.shape = ',train_images.shape)
print('train_labels = ', train_labels)
print('test_images.shape = ', test_images.shape)
print('test_labels', test_labels)

digit = test_images[0]
import matplotlib.pyplot as plt
plt.imshow(digit, cmap=plt.cm.binary)
plt.show()


from tensorflow.keras import models
from tensorflow.keras import layers

network = models.Sequential()
network.add(layers.Dense(512, activation='relu', input_shape=(28*28,)))
network.add(layers.Dense(10, activation='softmax'))

network.compile(optimizer='rmsprop', loss='categorical_crossentropy',
               metrics=['accuracy'])
      

train_images = train_images.reshape((60000, 28*28))
train_images = train_images.astype('float32') / 255

test_images = test_images.reshape((10000, 28*28))
test_images = test_images.astype('float32') / 255


from tensorflow.keras.utils import to_categorical
print("before change:" ,test_labels[0])
train_labels = to_categorical(train_labels)
test_labels = to_categorical(test_labels)
print("after change: ", test_labels[0])


network.fit(train_images, train_labels, epochs=5, batch_size = 128)


test_loss, test_acc = network.evaluate(test_images, test_labels, verbose=1)
print(test_loss) 
print('test_acc', test_acc)


(train_images, train_labels), (test_images, test_labels) = mnist.load_data()
digit = test_images[1]
plt.imshow(digit, cmap=plt.cm.binary)
plt.show()
test_images = test_images.reshape((10000, 28*28))
res = network.predict(test_images)
print(res[1])
#print("the number for the picture is : ", res[1].argmax())
for i in range(res[1].shape[0]):
    if (res[1][i] == 1):
        print("the number for the picture is : ", i)
        break
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【计算机视觉】深度学习框架-Keras 的相关文章

  • 可视化 TFLite 图并获取特定节点的中间值?

    我想知道是否有办法知道 tflite 中特定节点的输入和输出列表 我知道我可以获得输入 输出详细信息 但这不允许我重建发生在Interpreter 所以我要做的是 interpreter tf lite Interpreter model
  • ValueError:请使用“Layer”实例初始化“TimeDistributed”层

    我正在尝试构建一个可以在音频和视频样本上进行训练的模型 但出现此错误ValueError Please initialize TimeDistributed layer with a Layer instance You passed Te
  • 异常:加载数据时 URL 获取失败

    我正在尝试设置我的机器来运行 Tensorflow 2 我从未使用过 Tensorflow 只是下载了 Python 3 7 我不确定这是否是我的机器的问题 我按照上面列出的安装说明进行操作TensorFlow 的网站 https www
  • Keras:多类 NLP 任务中 model.evaluate 与 model.predict 的准确性差异

    我正在使用以下代码在 keras 中为 NLP 任务训练一个简单模型 训练集 测试集和验证集的变量名称是不言自明的 该数据集有 19 个类 因此网络的最后一层有 19 个输出 标签也是 one hot 编码的 nb classes 19 m
  • Keras model.predict 函数给出输入形状错误

    我已经在 Tensorflow 中实现了通用句子编码器 现在我正在尝试预测句子的类概率 我也将字符串转换为数组 Code if model model type universal classifier basic class probs
  • 验证 Transformer 中多头注意力的实现

    我已经实施了MultiAttention head in Transformers 周围有太多的实现 所以很混乱 有人可以验证我的实施是否正确 DotProductAttention 引用自 https www tensorflow org
  • 默认情况下,Keras 自定义层参数是不可训练的吗?

    我在 Keras 中构建了一个简单的自定义层 并惊讶地发现参数默认情况下未设置为可训练 我可以通过显式设置可训练属性来使其工作 我无法通过查看文档或代码来解释为什么会这样 这是应该的样子还是我做错了什么导致默认情况下参数不可训练 代码 im
  • 为什么我的结果仍然无法重现?

    我想要为 CNN 获得可重复的结果 我使用带有 GPU 的 Keras 和 Google Colab 除了建议插入某些代码片段 这应该允许再现性 之外 我还在层中添加了种子 This is the first code snipped to
  • 将 Keras 集成到 SKLearn 管道?

    我有一个 sklearn 管道 对异构数据类型 布尔 分类 数字 文本 执行特征工程 并想尝试使用神经网络作为我的学习算法来拟合模型 我遇到了输入数据形状的一些问题 我想知道我想做的事情是否可能 或者我是否应该尝试不同的方法 我尝试了几种不
  • 如何理解SpatialDropout1D以及何时使用它?

    偶尔我会看到一些模型正在使用SpatialDropout1D代替Dropout 例如 在词性标记神经网络中 他们使用 model Sequential model add Embedding s vocabsize EMBED SIZE i
  • 获取每个训练实例的损失值 - Keras

    我想获得每个实例的损失值作为模型训练 history model fit 例如 上面的代码返回每个时期的损失值 而不是小批量或实例 做这个的最好方式是什么 有什么建议么 在这个 keras 官方文档页面的末尾 正是您要寻找的内容https
  • 如何使用 Keras ImageDataGenerator 预测单个图像?

    我已经训练 CNN 对图像进行 3 类分类 在训练模型时 我使用 keras 的 ImageDataGenerator 类对图像应用预处理功能并重新缩放它 现在我的网络在测试集上训练得非常准确 但我不知道如何在单图像预测上应用预处理功能 如
  • keras:zca 美白卡住了 train_datagen.fit()

    我尝试将 zca whitening 与 keras 图像处理选项一起使用 但计算陷入困境并且永远不会结束 我导致问题的代码部分如下所示 train datagen ImageDataGenerator rotation range 30
  • 在 R 中使用深度网络和 MNIST 数据读取手写数字第 3 部分

    我尝试编写一个基于深度网络的程序来读取手写数字 我在 Youtube 上找到了一个代码 https www youtube com watch v 5bso 5X7Zu4 https www youtube com watch v 5bso
  • Tensorflow 可变图像输入大小(自动编码器、放大......)

    Edit WARNING不建议使用不同图像大小的图像 因为张量需要具有相同的大小才能实现并行化 我一直在寻找解决方案 了解如何使用不同大小的图像作为神经网络的输入 Numpy 第一个想法是使用numpy 然而 由于每个图像的大小不同 我无法
  • Colab 上没有名为“tensorflow.compat.v2”的模块

    我正在关注这个https thebinarynotes com how to train mask r cnn on the custom dataset https thebinarynotes com how to train mask
  • L-BFGS 是否有 tf.keras.optimizers 实现?

    有人有 L BFGS 算法的 Tensorflow 2 tf keras 子类吗 如果想使用 L BFGS 目前有两个 官方 选项 TF概率 SciPy 优化 这两个选项使用起来相当麻烦 尤其是在使用自定义模型时 因此 我计划实现 tf k
  • Keras 显示 GPU 训练速度没有任何改进(部分 GPU 使用?!)

    我正在尝试在我的 Jupyter Notebook 的 AWS p2 xlarge 实例上的 GPU 而不是 CPU 上训练我的模型 我正在使用tensorflow gpu后端 仅tensorflow gpu已安装并在中提到requirem
  • 尝试校准keras模型

    我正在尝试通过 Sklearn 实现来校准我的 CNN 模型CalibratedClassifierCV 尝试将其包装为KerasClassifier并覆盖预测功能但没有成功 有人可以说我做错了什么吗 这是模型代码 def create m
  • Keras,如何获取每一层的输出?

    我已经用 CNN 训练了一个二元分类模型 这是我的代码 model Sequential model add Convolution2D nb filters kernel size 0 kernel size 1 border mode

随机推荐

  • 代码:如何在 C# 中实现将大型 Excel 文件导出为 CSV ?

    在本主题中 我们将介绍如何在 C 中将大型 Excel 文件导出为CSV的问题 下面给出的在 C 应用程序中以编程方式将 Excel 文件转换为 CSV 格式的步骤以及简单易行的代码将为您提供所需的解决方案 开发人员在处理像XLSX或XLS
  • Python request-html cv2获取网络图片【canvas base64图片】

    测试网站 http www porters vip captcha clicks html import cv2 import base64 import numpy as np import nest asyncio nest async
  • 电子设计大赛需要具备的知识

    具体的说 有 一 基础知识1 电路原理2 数字电路3 模拟电路 重点 4 元器件的简介二 软件方面 总体编程能力 1 单片机基础与编程 重点 单片机内部结构与工作原理 单片机接口电路 单片机程序设计 单片机开发系统 51系列或AVR单片机
  • 【转】Stephen Wolfram写的乔布斯的回忆录

    无意间在微博上看到Stephen Wolfram也写了回忆Jobs的博客 感觉这个人的名字是相当熟悉 后来看到Mathematica这个软件的名字时就感到非常亲切了 这款软件是以前用过的一款非常强大的数学工具软件 可以解决公式计算 解方程组
  • 产品命名规则(自用)

    产品命名规则 自用 产品id命名规则 共8 型号 3 relay类型 1 计量计类型 1 最大值 1 阶段 1 注 型号 根据产品形态定义 如smartplus 可以定义成sp1 sp是smartplus缩写 1是序号 如果有相同类型 sp
  • 在STM32上创建一个自己的操作系统

    参考文章 http www cnblogs com ansersion p 4328800 html 上面是我的微信和QQ群 欢迎新朋友的加入 之前看了蛮多帖子 不过苦于自己对着基本上是门外汉 基本上只明白个大概 幸亏找到一个分享源码的帖子
  • 阅读resyschina推荐引擎文章感受一

    1 推荐目的在于帮助用户做决策 买到更合适的东西 而促销的目的在于销售商品 2 推荐帮助用户找到感兴趣但是没有想到的东西serendipity 惊喜 3 首页上位置对系统的结果有重大影响 4 推荐系统和搜索的区别在于 推荐系统不需要用户进行
  • YOLO项目服务器配置及云硬盘挂载问题

    资源包配置 首先便是conda虚拟环境创建了 这里我们便不一一赘述了 大家可以参考博主先前的文章 然后就是pytorch的安装了 这里可以使用conda命令或者是pip命令 首先是conda命令 博主在第一个服务器时的安装方式就是这个 很正
  • 关于硬件问题造成的MCU死机,过来人简单的谈一谈

    关于MCU死机问题 近期小编在出差期间遇到多起 且原因不同 所以 今日小白借此机会讲一讲因硬件问题造成的MCU死机 MCU不良 在遇到死机问题时 已经可以判定是硬件原因造成的前提下 大多人的选择是交叉验证MCU 先判定是否是MCU单体不良造
  • 软考-嵌入式系统设计师-笔记:嵌入式系统的项目开发与维护

    文章目录 系统开发过程及其项目管理 过程模型 过程评估 软件能力成熟度模型 CMM 能力成熟度模型集成 CMMI 工具与环境 ISO ICE 25010系统和软件质量模型 系统分析知识 系统设计知识 系统设计概述 结构化设计 面向对象设计
  • 接口的静态方法

    静态接口方法 从java开始 接口当中允许使用静态方法 public static 返回值类型 方法名称 参数列表 方法体 提示 就是将abstract或者default换成static即可 带上方法体 方法样式 public interf
  • 老版本的 mybatis-generator 使用示例

    文章目录 main 入口 generatorConfig xml log4j properties main 入口 import java io File import java util ArrayList import java uti
  • c++返回数组引用的函数(4种方法)

    分享返回数组引用的4种方法 普通法 类型别名 尾置返回类型 decltype include
  • CSS层叠上下文

    在学习z index属性的时候 限制了能够使用z index属性的元素 那么为什么有的元素能够使用z index 因为他创建了一个层叠上下文 对于这个词的理解首先要理解上下文 上下文这个名词的出现有很多地方 块级格式上下文 执行上下文 在不
  • 【转载】VC常用小技巧(2)

    项目 如何干净的删除一个类 1 先删除项目中对应的 h和 cpp文件 选中后用 Delete键删除 2 保存后退出项目 到文件夹中删除实际的 h和 cpp文件 3 删除 clw文件 4 重新进入项目 进行全部重建 rebuild all 如
  • 批处理常用命令及用法

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 批处理常用命令及用法大全 阅读本文需要一定的dos基础概念 象 盘符 文件 目录 文件夹 子目录 根目录 当前目录每个命令的完整说明请加 参数参考微软的帮助文档可以看到 在
  • 前端 - 实习两个星期总结

    文章目录 吐槽 总结 新人建议 项目学习到的 今天已经是菜鸟实习的第二个星期了 怎么说呢 反正就是进的一个不大不小的厂 做着不难不易的事 菜鸟现在主要做的就是适配 现在就来总结一下 不过这之前 菜鸟不得不吐槽一波 吐槽 1 菜鸟进的是一家国
  • kvm常见故障及解决

    一 启动虚拟机Connection reset by peer virsh start vmhost1error Failed to start domain vmhost1error Unable to read from monitor
  • 浙江大学计算机学院最权威的老师,浙江大学计算机科学与技术专业导师介绍:郑能干...

    姓名 郑能干 性别 男 职称 副教授 在岗性质 全职在岗 学院 系 计算机科学与技术学院 招生资格类别 硕士生导师 研究方向 人工智能嵌入式系统神经信息工程普适计算 Email zng cs zju edu cn 个人简介 郑能干 男 19
  • 【计算机视觉】深度学习框架-Keras

    文章目录 1 从零开始训练网络 1 1 搭建网络基本架构 1 2 构建训练网络 1 3 启动训练网络并测试数据 2 用Keras实现一个简单神经网络 2 1 Keras简介 2 2 MNIST手写数字识别 详细解释步骤 2 2 1 数据的加