TensorFlow学习之:深度学习基础

news/2024/5/3 13:07:00/文章来源:https://blog.csdn.net/www_tlj/article/details/137606762

神经网络基础

神经网络是深度学习的核心,它们受人脑的结构和功能启发,能够通过学习大量数据来识别模式和解决复杂问题。神经网络的基本工作原理包括前向传播和反向传播两个阶段。

前向传播(Forward Propagation)

前向传播是神经网络进行预测的过程。数据从输入层开始,经过隐藏层,最后到达输出层。在每一层,数据都会通过节点(神经元)进行处理,并通过激活函数进行非线性转换。

  1. 输入层:接收输入数据。例如,在图像识别任务中,输入层的神经元数量通常等于图像的像素数。
  2. 隐藏层:一个或多个隐藏层对数据进行进一步处理。每个神经元在这些层中都会接收前一层所有神经元的输出作为输入。
  3. 输出层:生成最终的预测结果。输出层的神经元数量通常取决于任务的类型(例如,在分类任务中等于类别数)。

每个神经元的输出计算公式为:

反向传播(Backpropagation)

反向传播是神经网络学习和更新参数的过程。它通过计算损失函数(如均方误差或交叉熵损失)相对于网络参数的梯度,然后使用这些梯度来更新网络的权重和偏置,从而减小预测错误。

  1. 计算损失:首先,计算网络输出和实际值之间的误差(损失)。
  2. 梯度计算:然后,利用链式法则自输出层向输入层逐层计算每个参数(权重和偏置)对损失的影响(梯度)。
  3. 更新参数:最后,使用梯度下降或其他优化算法根据计算出的梯度更新网络的参数。

这个过程会在训练数据上重复多次(训练迭代),每次迭代都会使神经网络的预测更加准确。

激活函数

激活函数在神经网络中非常重要,它引入非线性因素,使得神经网络能够学习和模拟复杂的函数。没有激活函数,即使网络有多个隐藏层,它也只能表示线性关系。

常用的激活函数包括:

  • ReLU(Rectified Linear Unit):最常用的激活函数,对于正输入保持不变,对于负输入则输出0。
  • Sigmoid:将输入映射到0和1之间,常用于二分类任务的输出层。
  • Tanh(Hyperbolic Tangent):将输入映射到-1和1之间,形状和Sigmoid类似但范围更广。
  • Softmax:将输入映射为概率分布,常用于多分类任务的输出层。

神经网络通过前向传播进行预测,通过反向传播进行学习,利用激活函数引入非线性,这些都是实现其强大功能的关键因素。理解这些基本概念是深入学习深度学习的基础。

构建简单的神经网络

使用TensorFlow构建和训练一个简单的全连接神经网络是学习深度学习的基础。全连接网络,也称为密集网络,是最简单的神经网络结构,其中网络中的每个神经元都与前一层的所有神经元相连。这里,我们将通过构建一个用于手写数字识别(MNIST数据集)的全连接网络来演示这个过程。

步骤 1: 导入必要的库

首先,我们需要导入TensorFlow和其他可能需要的库。如果你还没有安装TensorFlow,请先按照官方指南进行安装。

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

步骤 2: 加载数据集

MNIST数据集包含了60000个训练样本和10000个测试样本,每个样本是一个28x28的灰度手写数字图像。

mnist = tf.keras.datasets.mnist(x_train, y_train), (x_test, y_test) = mnist.load_data()
x_train, x_test = x_train / 255.0, x_test / 255.0  # 归一化

步骤 3: 构建模型

接下来,我们使用tf.keras来构建一个简单的全连接网络。这个网络将包含一个输入层,几个隐藏层,和一个输出层。

model = models.Sequential([layers.Flatten(input_shape=(28, 28)),  # 将28x28的图像展平为一个784维的向量layers.Dense(128, activation='relu'),  # 第一个隐藏层,128个节点layers.Dropout(0.2),  # 防止过拟合layers.Dense(10, activation='softmax')  # 输出层,10个节点对应10个类别
])

在这里,Dense是全连接层。第一个Dense层有128个神经元并使用ReLU激活函数。Dropout层随机地将输入单元的一部分设置为0,有助于防止过拟合。最后一个Dense层是输出层,使用Softmax激活函数输出预测的概率分布。

步骤 4: 编译模型

在训练模型之前,我们需要编译它,设置优化器、损失函数和评估指标。

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

这里我们使用adam优化器和sparse_categorical_crossentropy损失函数,这是处理多分类问题常用的设置。评估指标使用准确率。

步骤 5: 训练模型

现在,我们可以训练模型了。

model.fit(x_train, y_train, epochs=5)

这里,epochs=5表示我们将整个数据集迭代5次。

步骤 6: 评估模型

最后,我们评估模型在测试集上的性能。

 
test_loss, test_acc = model.evaluate(x_test, y_test, verbose=2)
print('\nTest accuracy:', test_acc)

这个简单的全连接网络在MNIST数据集上就能达到相当不错的准确率。

通过以上步骤,你可以看到使用TensorFlow构建和训练全连接网络是相对直接的。TensorFlow提供了丰富的API和工具,使得从构建到训练再到评估模型的整个过程都变得简单高效。随着深入学习,你将能够构建更复杂的模型来解决更多样化的问题。

损失函数和优化器

在深度学习中,损失函数(Loss Function)和优化器(Optimizer)是训练神经网络的核心组件。损失函数衡量模型预测与实际值之间的差距,优化器则用于根据损失函数的梯度更新模型的权重,以最小化损失。

损失函数

损失函数是模型性能的量化度量,它计算了模型预测值与实际标签值之间的差异。根据任务的不同,选择合适的损失函数是至关重要的。

  • 均方误差(Mean Squared Error, MSE):用于回归问题,计算预测值和真实值之间差值的平方和的均值。公式为

  • 交叉熵损失(Cross-Entropy Loss)

  • Hinge损失:常用于支持向量机(SVM)中,但也可以用于训练深度学习模型,特别是在一些二分类问题上。

优化器

优化器负责模型训练过程中的权重更新。选择合适的优化器可以加速模型的训练并提高模型的性能。

  • 随机梯度下降(Stochastic Gradient Descent, SGD):最基本的优化器,按照梯度下降的方向更新权重,可选地加入动量(Momentum)来加速训练。

  • Adam:结合了AdaGrad和RMSProp优化器的优点,通过计算梯度的一阶矩估计和二阶矩估计来调整学习率,通常在实践中表现良好。

  • RMSprop:适用于非平稳目标的优化器,通过除以一个衰减的平均值来调整学习率。

  • AdaGrad:通过累积过去梯度的平方来调整每个参数的学习率,适合处理稀疏数据。

选择损失函数和优化器

选择哪个损失函数和优化器取决于具体的应用场景和问题类型。例如,对于多类分类问题,常用的损失函数是分类交叉熵损失,而优化器则可以选择Adam,因为它在许多情况下都能提供良好的性能和快速收敛。

总之,损失函数定义了模型的优化目标,而优化器定义了如何达到这个目标。在深度学习中合理选择并调整它们对于训练有效的模型至关重要。

过拟合和正则化

在深度学习中,过拟合是一个常见问题,它发生在模型对训练数据学得太好,以至于损失了对新数据的泛化能力。过拟合的模型在训练集上表现出色,但在验证集或测试集上表现较差。为了缓解这个问题,正则化技术被广泛应用。

过拟合的原因

  • 数据集太小:模型没有足够的数据来学习泛化的特征,而是记住了训练数据的特点。
  • 模型太复杂:模型的参数过多,学习能力太强,导致模型学到了训练数据的噪声。

解决过拟合的方法

数据增强

增加数据的多样性可以有效减少过拟合。对于图像数据,可以通过旋转、缩放、裁剪等方法来增加数据集的大小和多样性。

降低模型复杂度

减少模型的大小(例如,减少网络层或每层的神经元数量)可以减轻过拟合,但这可能会影响模型的学习能力。

正则化技术

正则化是一种限制模型复杂度的方法,以提高模型的泛化能力。常见的正则化技术包括:

  • L1和L2正则化:在损失函数中添加一个正则项,L1正则化倾向于生成稀疏权重矩阵,L2正则化可以防止权重变得太大。

  • Dropout:在训练过程中随机“丢弃”一部分神经元(即将它们的输出设置为0),这可以被看作是从原始网络中采样出大量不同的子网络来共同决定最终结果,从而增加网络的泛化能力。

  • 早停(Early Stopping):在训练过程中,如果验证集的性能在连续多个epoch后不再提高,则提前终止训练。这可以防止模型在训练集上过度拟合。

批归一化(Batch Normalization)

虽然批归一化主要用于加速深度网络的训练,但它也有轻微的正则化效果,因为它为每层的输入引入了噪声。

代码示例:使用Dropout正则化

在TensorFlow中,可以通过添加Dropout层来实现Dropout正则化。

model = models.Sequential([layers.Flatten(input_shape=(28, 28)),layers.Dense(128, activation='relu'),layers.Dropout(0.2),  # Dropout层layers.Dense(10, activation='softmax')
])

小结

处理过拟合问题是构建高性能深度学习模型的关键步骤。通过合理选择数据处理方法、调整模型结构、应用正则化技术等手段,可以有效提高模型在未见数据上的泛化能力。在实践中,通常需要尝试不同的策略组合,以找到最适合特定问题和数据集的解决方案。

项目:手写数字识别(MNIST数据集)

手写数字识别是机器学习中的一个经典问题,通常使用MNIST数据集来解决。MNIST数据集包含了70,000张大小为28x28像素的手写数字图像,分为60,000张训练图像和10,000张测试图像。每张图像都标有相应的数字(0到9)。解决这个问题的一个标准方法是使用深度学习模型,特别是卷积神经网络(CNN),因为CNN非常适合处理图像数据。

以下是使用TensorFlow构建和训练一个简单CNN模型进行手写数字识别的步骤:

步骤 1: 导入必要的库

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

步骤 2: 加载和准备MNIST数据集

TensorFlow提供了加载MNIST数据集的函数,这些函数会自动下载数据。

mnist = tf.keras.datasets.mnist(train_images, train_labels), (test_images, test_labels) = mnist.load_data()# 归一化图像到0-1范围
train_images, test_images = train_images / 255.0, test_images / 255.0

步骤 3: 构建模型

我们构建一个简单的CNN模型,该模型包括两个卷积层,紧跟着两个池化层,然后是两个全连接层。

model = models.Sequential([layers.Reshape(target_shape=(28, 28, 1), input_shape=(28, 28)),  # 将图像格式从(28, 28)转换为(28, 28, 1)layers.Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1)),layers.MaxPooling2D((2, 2)),layers.Conv2D(64, (3, 3), activation='relu'),layers.MaxPooling2D((2, 2)),layers.Flatten(),layers.Dense(64, activation='relu'),layers.Dense(10, activation='softmax')
])

步骤 4: 编译模型

在训练模型之前,需要指定损失函数、优化器和评估指标。

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

步骤 5: 训练模型

使用训练数据对模型进行训练。

model.fit(train_images, train_labels, epochs=5)

步骤 6: 评估模型

最后,评估模型在测试集上的表现。

test_loss, test_acc = model.evaluate(test_images, test_labels)print('Test accuracy:', test_acc)

总结

通过这个项目,你可以了解到使用卷积神经网络进行图像分类的基本流程。MNIST手写数字识别是深度学习入门的一个非常好的项目,它不仅可以帮助你熟悉TensorFlow的基本操作,还能让你对深度学习模型的构建和训练有一个直观的理解。随着经验的积累,你可以尝试使用更复杂的模型或技术来进一步提高识别准确率。

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

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AI大模型之ChatGPT科普(深度好文)

目录 训练ChatGPT分几步? 如何炼成ChatGPT? 如何微调ChatGPT? 如何强化ChatGPT? 如何调教ChatGPT? AI思维链是什么? GPT背后的黑科技Transformer是什么? Transformer在计算机视觉上CV最佳作品? ChatGPT是人…

修复 Windows 上的 PyTorch 1.1 github 模型加载权限错误

问题: 在 Windows 计算机上执行示例 github 模型加载时,生成了 master.zip 文件的权限错误(请参阅下面的错误堆栈跟踪)。 错误堆栈跟踪: 在[4]中:en2de = torch.hub.load(pytorch/fairseq, transformer.wmt16.en-de, tokenizer=moses, bpe=subword_nmt) 下载:“https://…

【R基础】一组数据计算均值、方差与标准差方法及意义

【R基础】一组数据计算均值、方差与标准差方法及意义 均值、方差与标准差是用来描述数据分布情况 均值:用来衡量一组数据整体情况。 数据离散程度度量标准: 方差(均方,s^2,总体参数,离均差平方和&#…

实用工具推荐:如何使用MechanicalSoup进行网页交互

在当今数字化时代,网页交互已经成为日常生活和工作中不可或缺的一部分。无论是自动填写表单、抓取网页数据还是进行网站测试,都需要一种高效而可靠的工具来实现网页交互。而在众多的选择中,MechanicalSoup作为一种简单、易用且功能强大的Pyth…

GitLab教程(一):安装Git、配置SSH公钥

文章目录 序一、Git安装与基本配置(Windows)下载卸载安装基本配置 二、SSH密钥配置 序 为什么要使用代码版本管理工具: 最近笔者确实因为未使用代码版本管理工具遇到了一些愚蠢的问题,笔者因此认为代码版本管理工具对于提高团队…

基于FPGA的以太网相关文章导航

首先需要了解以太网的一些接口协议标准,常见的MII、GMII、RGMII时序,便于后续开发。 【必读】从MII到RGMII,一文了解以太网PHY芯片不同传输接口信号时序! 介绍一款比较老的以太网PHY芯片88E1518,具有RGMII接口&#xf…

防止狗上沙发,写一个浏览器实时识别目标检测功能

家里有一条狗🐶,很喜欢乘人不备睡沙发🛋️,恰好最近刚搬家 狗迎来了掉毛期 不想让沙发上很多毛。所以希望能识别到狗,然后播放“gun 下去”的音频📣。 需求分析 需要一个摄像头📷 利用 chrome…

openHarmony 如何从API9升级到API10

最近用从官方下载的DevEco Studio3.1开发小app, 需要用到第三方库,加载第三方库,并添加代码,编译时如下错误: hvigor Finished :entry:defaultGenerateMetadata… after 3 ms hvigor ERROR: Failed :entry:defaultMergeProfile… …

微信小程序页面交互综合练习 (重点:解决“setData of undefined”报错问题)

一、写一个注册表单,点击“注册”按钮将用户输入的数据带到服务器,并且能在控制台显示参数。 (1)首先,我需要在vscode里面创建一个简易的node.js服务器 //第一步:引入http模块 var http require(http); //第二步:创建…

算法刷题Day30 | 332.重新安排行程、51. N皇后、37. 解数独

目录 0 引言1 重新安排行程1.1 我的解题1.2 更好的解法 2 N皇后2.1 我的解题 3 解数独3.1 我的解题3.2 🙋‍♂️ 作者:海码007📜 专栏:算法专栏💥 标题:算法刷题Day30 | 332.重新安排行程、51. N皇后、37. …

【图论】详解链式前向星存图法+遍历法

细说链式前向星存图法 首先要明白,链式前向星的原理是利用存边来进行模拟图。 推荐左神的视频–建图、链式前向星、拓扑排序 比方说有这样一张图,我们用链式前向星来进行模拟时,可以将每一条边都进行编号,其中,红色的…

刷题DAY49 | LeetCode 121-买卖股票的最佳时机 122-买卖股票的最佳时机II

121 买卖股票的最佳时机(easy) 给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取…

【前端面试3+1】10 npm run dev 发生了什么、vue的自定义指令如何实现、js的数据类型有哪些及其不同、【最长公共前缀】

一、npm run dev发生了什么 运行npm run dev时,通常是在一个基于Node.js的项目中,用来启动开发服务器或者执行一些开发环境相关的任务。下面是一般情况下npm run dev会执行的步骤: 1. 查找package.json中的scripts字段: npm会在项…

双指针,滑动窗口

今天也是闲来无事,想去做一下,之前学过的某个题型,但是在中间突然发现了这个题,那时候年少无知,做不出来,今天也是很轻松的用双指针轻松拿捏,因此发帖。 传送门:逛画展 题解&#x…

VRRP虚拟路由实验(华为)

思科设备参考:VRRP虚拟路由实验(思科) 一,技术简介 VRRP(Virtual Router Redundancy Protocol)是一种网络协议,用于实现路由器冗余,提高网络可靠性和容错能力。VRRP允许多台路由器…

官网下载IDE插件并导入IDE

官网下载IDEA插件并导入IDEA 1. 下载插件2. 导入插件 1. 下载插件 地址:https://plugins.jetbrains.com/plugin/21068-codearts-snap/versions 说明:本次演示以IDEA软件为例 操作: 等待下载完成 2. 导入插件 点击File->setting->Pl…

数据仓库与数据挖掘(第三版)陈文伟思维导图1-5章作业

第一章 概述 8.基于数据仓库的决策支持系统与传统决策支持系统有哪些区别? 决策支持系统经历了4个阶段。 1.基本决策支持系统 是在运筹学单模型辅助决策的基础上发展起来的,以模型库系统为核心,以多模型和数据库的组合形成方案辅助决策。 它…

2024年第八届人工智能与虚拟现实国际会议(AIVR 2024)即将召开!

2024年第八届人工智能与虚拟现实国际会议(AIVR 2024)将2024年7月19-21日在日本福冈举行。人工智能与虚拟现实的发展对推动科技进步、促进经济发展、提升人类生活质量等具有重要意义。AIVR 2024将携手各专家学者,共同挖掘智能与虚拟的无限可能…

利用Sentinel解决雪崩问题(二)隔离和降级

前言: 虽然限流可以尽量避免因高并发而引起的服务故障,但服务还会因为其它原因而故障。而要将这些故障控制在一定范围避免雪崩,就要靠线程隔离(舱壁模式)和熔断降级手段了,不管是线程隔离还是熔断降级,都是对客户端(调…

图片管理系统:原理、设计与实践

title: 图片管理系统:原理、设计与实践 date: 2024/4/9 20:04:25 updated: 2024/4/9 20:04:25 tags: 图片管理存储组织上传采集处理编辑搜索检索展示分享AI应用 第一章:图片管理系统概述 1.1 图片管理系统简介 图片管理系统是一种用于存储、组织、处理…