第三章:人工智能深度学习教程-基础神经网络(第三节-Tensorflow 中的多层感知器学习)

news2024/11/27 12:38:40

在本文中,我们将了解多层感知器的概念及其使用 TensorFlow 库在 Python 中的实现。

多层感知器 

多层感知也称为MLP。它是完全连接的密集层,可将任何输入维度转换为所需的维度。多层感知是具有多个层的神经网络。为了创建神经网络,我们将神经元组合在一起,以便某些神经元的输出是其他神经元的输入。

神经网络和 TensorFlow的简单介绍可以在这里找到:

  • 神经网络
  • TensorFlow 简介

多层感知器有一个输入层,对于每个输入,有一个神经元(或节点),它有一个输出层,每个输出有一个节点,它可以有任意数量的隐藏层,每个隐藏层可以有任意数量的节点。多层感知器 (MLP) 的示意图如下所示。

在上面的多层感知器图中,我们可以看到有三个输入,因此有三个输入节点,隐藏层有三个节点。输出层有两个输出,因此有两个输出节点。输入层中的节点接受输入并将其转发以进行进一步处理,在上图中,输入层中的节点将其输出转发到隐藏层中的三个节点中的每一个,并且以同样的方式,隐藏层处理信息并将其传递到输出层。 

多层感知中的每个节点都使用 sigmoid 激活函数。sigmoid 激活函数将实数值作为输入,并使用 sigmoid 公式将其转换为 0 到 1 之间的数字。

现在我们已经完成了多层感知的理论部分,让我们继续使用TensorFlow库在python中实现一些代码。

逐步实施

第1步:导入必要的库。 

Python3

# 导入模块
import tensorflow as tf
import numpy as np
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Flatten
from tensorflow.keras.layers import Dense
from tensorflow.keras.layers import Activation
import matplotlib.pyplot as plt

这段代码导入了一些常用的Python库,包括TensorFlow(用于深度学习)、NumPy(用于数值计算)、Keras(用于构建神经网络模型)以及Matplotlib(用于绘图和数据可视化)。这些库通常用于机器学习、深度学习和数据可视化任务。

步骤 2:下载数据集。

TensorFlow 允许我们读取 MNIST 数据集,我们可以将其直接加载到程序中作为训练和测试数据集。

Python3

(x_train, y_train), (x_test, y_test) = tf.keras.datasets.mnist.load_data()

这段代码从 TensorFlow 的 Keras 库中加载 MNIST 数据集。数据集被分成两部分:

  • (x_train, y_train) 包含了训练数据,其中 x_train 是训练图像的集合,y_train 是对应的训练标签集合。
  • (x_test, y_test) 包含了测试数据,其中 x_test 是测试图像的集合,y_test 是对应的测试标签集合。

MNIST 数据集是一个经典的手写数字识别数据集,通常用于机器学习和深度学习任务,例如训练神经网络来识别手写数字。

输出:

从 https://storage.googleapis.com/tensorflow/tf-keras-datasets/mnist.npz 下载数据

11493376/11490434 [================================] – 2s 0us/步

第三步:现在我们将像素转换为浮点值。

Python3

# 将数据转换为浮点数
x_train = x_train.astype('float32')
x_test = x_test.astype('float32')

# 归一化图像像素值,将像素值除以 255
灰度范围 = 255
x_train /= 灰度范围
x_test /= 灰度范围

这段代码执行以下操作:

  1. 使用 .astype('float32') 将训练数据 x_train 和测试数据 x_test 中的图像数据转换为浮点数格式,以便进行数值计算。

  2. 将图像的像素值归一化,通过将每个像素值除以 255,将像素值从原始范围(0到255)缩放到新的范围(0到1)。这是常见的数据预处理步骤,有助于提高模型的训练效果。

这些操作是为了准备数据以供深度学习模型使用,以便更好地进行训练和预测。

我们将像素值转换为浮点值以进行预测。将数字更改为灰度值将是有益的,因为值会变小并且计算会变得更容易和更快。由于像素值的范围是从 0 到 256,除了 0 之外,范围是 255。因此,将所有值除以 255 会将其转换为从 0 到 1 的范围

第 4 步:了解数据集的结构

Python3

# 输出特征矩阵的形状
print("特征矩阵:", x_train.shape)

# 输出目标矩阵的形状
print("目标矩阵:", x_test.shape)

# 输出特征矩阵的形状
print("特征矩阵:", y_train.shape)

# 输出目标矩阵的形状
print("目标矩阵:", y_test.shape)

这段代码执行以下操作:

  • print("特征矩阵:", x_train.shape) 输出训练特征矩阵 x_train 的形状,以显示训练数据中图像的数量和每个图像的维度。

  • print("目标矩阵:", x_test.shape) 输出测试目标矩阵 x_test 的形状,以显示测试数据中图像的数量和每个图像的维度。

  • print("特征矩阵:", y_train.shape) 输出训练特征矩阵 y_train 的形状,以显示训练数据中标签的数量。

  • print("目标矩阵:", y_test.shape) 输出测试目标矩阵 y_test 的形状,以显示测试数据中标签的数量。

这些输出有助于了解数据集的规模和维度,以便更好地理解数据的结构。

输出:

特征矩阵: (60000, 28, 28)
目标矩阵: (10000, 28, 28)
特征矩阵: (60000,)
目标矩阵: (10000,)

因此,我们得到训练数据集中有 60,000 条记录,测试数据集中有 10,000 条记录,并且数据集中的每个图像的大小为 28×28。

第 5 步:可视化数据。

Python3

fig, ax = plt.subplots(10, 10)

k = 0
for i in range(10):
    for j in range(10):
        ax[i][j].imshow(x_train[k].reshape(28, 28), aspect='auto')
        k += 1

plt.show()

这段代码执行以下操作:

  • 创建一个包含10行和10列的子图(图表),这些子图将用于显示手写数字图像。
  • 使用循环 for i in range(10)for j in range(10) 遍历这个图表中的所有子图。
  • 在每个子图中,使用 imshow 函数显示训练数据集中的图像。x_train[k] 是一个28x28像素的图像,reshape(28, 28) 用于将图像的形状调整为28x28像素。
  • k 用于迭代训练数据集中的不同图像。
  • 最后,通过 plt.show() 显示图表,以查看手写数字图像。

这段代码的输出是一个包含100个手写数字图像的图表,用于可视化数据集中的样本。

输出

第 6 步:形成输入层、隐藏层和输出层。

Python3

这段代码创建了一个顺序模型(Sequential Model),其中包含了以下层次:

  1. Flatten(input_shape=(28, 28)):输入层,将28行 * 28列的数据重新整形为一个包含784个神经元的一维层。这是因为深度学习模型通常需要一维的输入数据。

  2. Dense(256, activation='sigmoid'):第一个隐藏层,包含256个神经元,激活函数为'sigmoid'。这一层的任务是学习数据中的特征表示。

  3. Dense(128, activation='sigmoid'):第二个隐藏层,包含128个神经元,激活函数为'sigmoid'。同样,这一层用于学习更高级的特征表示。

  4. Dense(10, activation='sigmoid'):输出层,包含10个神经元,激活函数为'sigmoid'。这一层通常用于多类别分类问题,例如手写数字识别,其中每个神经元对应一个数字类别。

这个模型的结构定义了层次和每个层次的神经元数量,以便用于训练和预测任务。

model = Sequential([
    # 将28行 * 28列的数据重新整形为28*28行
    Flatten(input_shape=(28, 28)),
    
    # 密集层1
    Dense(256, activation='sigmoid'),
    
    # 密集层2
    Dense(128, activation='sigmoid'),
    
    # 输出层
    Dense(10, activation='sigmoid'),
])

需要注意的一些要点:

  • 顺序模型允许我们根据多层感知器的需要逐层创建模型,并且仅限于单输入、单输出的层堆栈。
  • Flatten压平提供的输入而不影响批量大小。例如,如果输入的形状为 (batch_size,),但没有特征轴,则展平会添加额外的通道维度,并且输出形状为 (batch_size, 1)。
  • 激活用于使用 sigmoid 激活函数。
  • 前两个Dense层用于制作全连接模型,并且是隐藏层。
  • 最后一个Dense 层是输出层,包含 10 个神经元,决定图像属于哪个类别。

第7步:编译模型。

Python

model.compile(optimizer='adam', 
			loss='sparse_categorical_crossentropy', 
			metrics=['accuracy'])

这段代码执行了以下操作:

  • optimizer='adam':指定了优化器,即Adam优化器,用于模型的训练。Adam是一种常用的优化算法,用于根据损失函数来调整模型的权重以最小化损失。

  • loss='sparse_categorical_crossentropy':指定了损失函数,即稀疏分类交叉熵损失。这是一种常用于多类别分类问题的损失函数,用于度量模型的性能。

  • metrics=['accuracy']:指定了评估指标,即在训练和评估过程中要计算的性能指标。在这种情况下,我们关注模型的准确度,即正确分类的比例。

模型的编译是为了准备模型进行训练,指定了优化算法、损失函数和评估指标,以便模型可以根据这些设置进行参数的更新和性能的评估。

这里使用的编译函数涉及到损失、优化器和指标的使用。这里使用的损失函数是sparse_categorical_crossentropy,使用的优化器是adam

第8步:拟合模型。

Python3

model.fit(x_train, y_train, epochs=10, 
		batch_size=2000, 
		validation_split=0.2)

这段代码执行了以下操作:

  • x_train:训练数据的特征矩阵。
  • y_train:训练数据的目标(标签)矩阵。
  • epochs=10:指定了训练的周期数,模型将在整个训练数据集上迭代10次。
  • batch_size=2000:指定了每个批次的样本数量,模型将在每个批次中处理2000个样本。这有助于加速训练过程。
  • validation_split=0.2:指定了用于验证的数据集比例,这里是20%。在每个训练周期结束时,模型将使用20%的数据来验证模型性能,以便监控训练的进展和检测过拟合。

这些参数和设置用于模型的训练,让模型能够学习如何正确分类手写数字。

输出:

Epoch 1/10
48/48 [==============================] - 1s 12ms/step - loss: 1.2345 - accuracy: 0.5678 - val_loss: 0.9876 - val_accuracy: 0.6543
...
Epoch 10/10
48/48 [==============================] - 1s 12ms/step - loss: 0.3456 - accuracy: 0.8901 - val_loss: 0.4321 - val_accuracy: 0.8765

在这个示例中,模型经过10个训练周期,每个周期的损失值(loss)和准确度(accuracy)都有所改变。val_lossval_accuracy 是验证集上的损失和准确度,用于监控模型的泛化性能。

请注意,实际的输出结果可能会因训练进程和随机性而异。您可以在训练时查看这些输出以了解模型的性能和训练进度。

第 9 步:查找模型的准确性。

Python3

results = model.evaluate(x_test, y_test, verbose=0)
print('测试损失和准确度:', results)

这段代码执行以下操作:

  • results = model.evaluate(x_test, y_test, verbose=0):使用测试数据 x_test 和相应的测试标签 y_test 来评估模型的性能。verbose=0 表示在评估过程中不输出详细信息。

  • print('测试损失和准确度:', results):输出模型在测试数据上的损失值和准确度。results 包含了这些性能指标的值。

这些输出用于了解模型在测试数据上的性能,包括损失值和准确度等。

 输出:

测试损失和准确度: [0.1234, 0.9876]

在这个示例中,模型在测试数据上的损失值是0.1234,测试准确度是0.9876。这些值表示模型在测试数据上的性能,其中较低的损失值和较高的准确度通常表示更好的性能。实际的数值将根据模型和测试数据而有所不同。 

通过在测试样本上使用model.evaluate(),我们的模型准确率达到了 92% 。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1188347.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

11.9树的表示方法(孩子,父亲,孩子兄弟),树、森林的遍历,一些操作,决策树,前缀树

父亲表示法 优缺点:利用了树中除根结点外每个结点都有唯一的父节点这个性质,很容易找到树根,但是找孩子需要遍历整个线性表。 最近公共祖先 第一种方法,找路径然后比较 如果是搜索树,可以二分查找 不是,…

5年测试经验之谈:2年功能测试、3年自动化测试,从入门到25k...

毕业3年了,学的是环境工程专业,毕业后零基础转行做软件测试。 已近从事测试行业8年了,自己也从事过2年的手工测试,从事期间越来越觉得如果一直在手工测试的道路上前进,并不会有很大的发展,所以通过自己的努…

WordPress Modown 6.2付费下载资源/付费查看内容 wp主题模板+erphpdown11.7

模板简介: 自适应响应式设计,兼容主流浏览器 网格样式与瀑布流样式任意切换 内置SEO优化 自带与主题UI完美兼容搭配的erphpdown前端用户中心页面(此功能若单独找我们定制也需要几百) 收费付费下载资源、付费查看内容、付费观看…

FRC-EP系列--你的汽车数据一站式管家

FRC-EP系列产品主要面向汽车动力总成测试的客户,主要应用方向为残余总线仿真及网关。本文将详细介绍FRC-EP的产品特性和应用场景。 应用场景: 汽车电子生成研发过程中,需要对汽车各个控制器进行仿真测试,典型的测试对象有&#…

通达OA V12 引入thinkphp5.1框架,读取OA的.ini文件

通达OA V12 引入thinkphp5.1框架,读取OA的.ini文件 内容绝对原创,希望对您有帮助。您的打赏,是让我持续更新的牛奶和面包 找到ini文件的绝对路径。$path“”;使用parse_ini_file($path,true,INI_SCANNER_RAW),读取ini文件。 代码如…

Leetcode543. 二叉树的直径

Every day a Leetcode 题目来源:543. 二叉树的直径 解法1:深度优先搜索 首先我们知道一条路径的长度为该路径经过的节点数减 1,所以求直径(即求路径长度的最大值)等效于求路径经过节点数的最大值减 1。 而任意一条…

Python堆栈详细介绍

概要 虽然一些数据结构是通用的并且可以在广泛的应用中使用,但其他数据结构是专门化的并且被设计用于处理特定问题。堆栈就是这样一种专门的结构,以其简单性和非凡的实用性而闻名。 那么,什么是栈呢?从本质上讲,堆栈…

山西电力市场日前价格预测【2023-11-09】

日前价格预测 预测说明: 如上图所示,预测明日(2023-11-09)山西电力市场全天平均日前电价为369.84元/MWh。其中,最高日前电价为784.47元/MWh,预计出现在17: 45。最低日前电价为158.90元/MWh,预计…

漏刻有时百度地图API实战开发(6)多个标注覆盖层级导致不能响应点击的问题

漏刻有时百度地图API实战开发(1)华为手机无法使用addEventListener click 的兼容解决方案漏刻有时百度地图API实战开发(2)文本标签显示和隐藏的切换开关漏刻有时百度地图API实战开发(3)自动获取地图多边形中心点坐标漏刻有时百度地图API实战开发(4)显示指定区域在移动端异常的解…

国产猫罐头可以作为长期主食吗?口碑好的顶级猫罐头推荐

我一直在分析和尝试国产猫罐头,我家猫已经吃了几十款了。今天,我想和大家分享一些关于国产猫罐头的经验和心得。 近年来,国产宠粮市场呈现出爆发趋势,各个猫粮商在配方、营养数据和包装上展开了激烈的角逐,无一不让我…

和数链“分布式存储”技术结合隐私计算让数据更安全

存储是IT业的核心技术,全球存储行业历经半个世纪的洗礼,在技术和需求相互促进的演变下沧桑变幻,经历桌面级存储、企业级存储、云存储多次迭代变迁。 目前的存储方式主要是“大数据中心”等集中式存储,随着数据规模和复杂度的迅速…

安卓RadioButton设置图片大小

RadioButton都不陌生,一般我们都会设置图片在里面,这就涉及一个问题,图片的大小。如果图片过大,效果很不理想。搜了很多方法,都不理想。无奈只能自己研究了 代码如下: 1,一个简单的 RadioButt…

SOLIDWORKS跨版本升级后卡顿、运行缓慢...如何处理这些情况?

不知道各位有没有发生过以下情况: 以前一直使用的solidworks版本是旧版比如2018版,但过了几年把solidworks升级到最新版后,可能会出现以前版本保存的内容在新版本里打开后打开速度缓慢或者进行更改后保存会需要很长时间才能保存完毕甚至是会…

Python 框架学习 Django篇 (九) 产品发布、服务部署

我们前面编写的所有代码都是在windows上面运行的,因为我们还处于开发阶段 当我们完成具体任务开发后,就需要把我们开发的网站服务发布给真正的用户 通常来说我们会选择一台公有云服务器比如阿里云ecs,现在的web服务通常都是基于liunx操作系统…

Hbuilder打包项目为h5

Hbuilder打包项目为h5 manifest.json 配置 修改 web 配置下的 页面标题、路由模式、运行的基础路径 发行 H5 发行 填入网站标题和网站域名 编译 编译完成之后存放在 unpackage/dist/build/h5 目录下

OpenCV 输出文本

PutText() 输出文本 OpenCV5 将支持中文字符的输出, 当前版本OpenCV4原生不支持, 可以使用Contrib包FreeType方式实现, 不过比较麻烦.为了省事, 也可以通过将Mat转成bitmap,然后使用GDI方式输出中文字符. 示例代码 /// <summary>/// OpenCV暂时不能支持中文字符输出,显示…

卓越进行时 | 赛宁助力职业院校实践“岗课赛证训创”育人模式

11月7日&#xff0c;赛宁网安邀请南京城市职业学院网络安全学科师生走进网络安全卓越中心&#xff0c;为大一新生提供“职业导学” 和“岗位认知”的综合性实践课程&#xff0c;帮助学生提升对于网络安全专业和未来职业的认知水平&#xff0c;进一步深化校企合作人才培养的持续…

centos中安装的goland配置sdk报错:所选的目录不是Go SDK的有效主路经

选中目录后一直报错&#xff1a; 正确的位置&#xff1a; 原因竟然是使用 解压go1.21.4.linux-amd64.tar.gz 包出来&#xff0c;少了scr和test目录&#xff0c;重新解压后可以正确设定SDK主目录。 有同样问题的可以确认一下。 tar -C /usr/local -zxvf go1.19.2.linux-amd64.…

rabbitmq下载安装教程

1.首先需要下载erlang和rabbitmq安装包&#xff1a; 官网下载比较慢&#xff0c;通过网盘下载&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1fM2BrJqefyzUDZD4tfZLIg 提取码&#xff1a;5hsu 2.安装&#xff0c;傻瓜式安装就可以&#xff0c;可以自定义自己要安装的目…

封装一个中间大两头小的轮播图(vue-awesome-swiper、vue2)

需求 先看效果图 对vue来说&#xff0c;element-UI是有相应的轮播组件&#xff08;走马灯&#xff09;的&#xff0c;但相对简单的 如上面的两头大中间小轮播&#xff0c;element上文档这款很类似&#xff0c;但不适用&#xff0c;因为卡片之间底层移动和间距是依赖js实现的…