政安晨:【深度学习实践】【使用 TensorFlow 和 Keras 为结构化数据构建和训练神经网络】(二)—— 深度神经网络

政安晨的个人主页政安晨

欢迎 👍点赞✍评论⭐收藏

收录专栏: TensorFlow与Keras实战演绎

希望政安晨的博客能够对您有所裨益,如有不足之处,欢迎在评论区提出指正!

概述

深度神经网络(Deep Neural Network,DNN)是一种机器学习模型由多个神经网络层组成,每层都包含多个神经元节点。相比浅层神经网络,深度神经网络具有更多的隐藏层,能够处理更复杂的问题。

深度神经网络的核心思想是通过多层非线性变换来逐步提取输入数据的高级特征表示。每一层的神经元通过权重和偏置进行计算,并通过激活函数进行非线性映射。数据从输入层经过多个隐藏层传递,最终输出一个预测结果。

深度神经网络的训练通常使用反向传播算法该算法通过计算预测结果与实际值之间的误差,并根据误差调整每一层中的权重和偏置,以提高模型的准确性。训练过程需要大量的数据和计算资源,但深度神经网络在图像识别、语音识别、自然语言处理等领域取得了很大的成功。

深度神经网络的发展得益于大数据和计算硬件的进步。随着深度学习领域的不断发展,出现了许多经典的深度神经网络模型,如卷积神经网络(Convolutional Neural Network,CNN)用于图像处理循环神经网络(Recurrent Neural Network,RNN)用于序列数据处理,以及生成对抗网络(Generative Adversarial Network,GAN)用于生成新的数据等。

总之深度神经网络是一种强大的机器学习模型,通过多层非线性变换和反向传播算法,能够学习到复杂的特征表示,广泛应用于各种领域的问题求解。


现在我们开始全面介绍深度神经网络,并通过它为网络添加隐藏层,揭示复杂关系。

引言

在这篇文章中,我们将看到如何构建能够学习深度神经网络著名的复杂关系的神经网络。

这里的关键思想是模块化通过从简单的功能单元建立一个复杂的网络

我们已经看到线性单元如何计算线性函数 - 现在我们将看到如何将这些单个单元组合和修改以模拟更复杂的关系。

神经网络通常将其神经元组织成层。当我们将具有共同输入集的线性单元集合在一起时,我们得到一个稠密层

一个由两个线性单元组成的密集层,接收两个输入和一个偏差

你可以将神经网络中的每一层看作是进行某种相对简单的转换。

通过一系列深层的层次,神经网络可以以越来越复杂的方式转变输入。在经过良好训练的神经网络中,每一层都是一个将我们逐渐接近解决方案的转换。

许多种层次

在 Keras 中,"layer" 是一种非常通用的概念。 一个 layer 本质上是一种数据转换方式。许多 layer,比如卷积层和循环层,通过使用神经元来转换数据,它们的主要区别在于它们所形成的连接模式。其他的 layer 则用于特征工程或者简单的算术运算。

激活函数

事实证明,两个没有任何中间层的密集层并不比单个密集层更好。密集层本身无法将我们从线条和平面的世界中移出。我们需要的是一些非线性的东西,我们需要的是激活函数

没有激活函数,神经网络只能学习线性关系。为了拟合曲线,我们需要使用激活函数。

激活函数就是我们对于每个层的输出(激活)应用的一种函数最常见的是修正线性单元函数max(0,x)。

整流器函数的图表是一条线其负部分被"整流"为零将这个函数应用于神经元的输出将使数据产生弯曲,使我们远离简单的直线。

当我们将整流器连接到线性单元时,我们得到一个整流线性单元或ReLU(修正线性单元)。因此,将整流函数称为"ReLU函数"是很常见的。

应用ReLU激活到线性单元意味着输出变为max(0, w * x + b),我们可以将其在图表中绘制如下

堆叠密集层

现在我们有了一些非线性性,让我们看看如何堆叠层来进行复杂的数据转换。

一堆密集层构成了一个“全连接”的网络。

输出层之前的层有时被称为隐藏层,因为我们从未直接看到它们的输出。

现在,请注意最后(输出)层是一个线性单元(意味着没有激活函数)。

这使得这个网络适用于回归任务,我们试图预测某个任意数值。其他任务(如分类)可能需要在输出上使用激活函数。

构建序列模型

我们一直在使用的Sequential模型将按顺序连接一个层的列表:第一层获得输入,最后一层产生输出。这创建了上图所示的模型

from tensorflow import keras
from tensorflow.keras import layersmodel = keras.Sequential([# the hidden ReLU layerslayers.Dense(units=4, activation='relu', input_shape=[2]),layers.Dense(units=3, activation='relu'),# the linear output layer layers.Dense(units=1),
])

请确保将所有的层一起作为一个列表传递,如[layer, layer, layer, ...],而不是作为单独的参数传递。要向层添加激活函数,只需在激活参数中给出其名称

练习:一起创建一个深度神经网络

介绍

在这个练习中,我们将看到如何通过在Sequential模型中堆叠层来构建深度神经网络通过在隐藏层后添加激活函数,我们使网络能够学习数据中更复杂(非线性)的关系。

您将构建一个具有多个隐藏层的神经网络,然后探索一些超出ReLU的激活函数。

代码如下:

import tensorflow as tf# Setup plotting
import matplotlib.pyplot as pltplt.style.use('seaborn-whitegrid')
# Set Matplotlib defaults
plt.rc('figure', autolayout=True)
plt.rc('axes', labelweight='bold', labelsize='large',titleweight='bold', titlesize=18, titlepad=10)# Setup feedback system
from learntools.core import binder
binder.bind(globals())
from learntools.deep_learning_intro.ex2 import *

在具体的数据集中,您的任务是根据不同配方预测混凝土的抗压强度。

下面这段中已经有数据集存在。(我们使用的Kaggle来进行演绎

输入形状

这个任务的目标是'CompressiveStrength'列。其余列是我们将用作输入的特征。这个数据集的输入形状应该是什么?

# YOUR CODE HERE
input_shape = ____# Check your answer
q_1.check()# Lines below will give you a hint or solution code
#q_1.hint()
#q_1.solution()

定义一个具有隐藏层的模型

现在创建一个模型,其中包含三个隐藏层,每个隐藏层都有512个单元,使用ReLU激活函数。确保包括一个输出层,并且没有激活函数,并且将输入形状作为参数传递给第一层。

参考代码如下:

from tensorflow import keras
from tensorflow.keras import layers# YOUR CODE HERE
model = ____# Check your answer
q_2.check()# Lines below will give you a hint or solution code
#q_2.hint()
#q_2.solution()

我写了一个示例:

from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Densemodel = Sequential()
model.add(Dense(512, activation='relu', input_shape=(input_shape,)))
model.add(Dense(512, activation='relu'))
model.add(Dense(512, activation='relu'))
model.add(Dense(1, activation=None))

激活层

让我们来探索一些激活函数。

将激活函数附加到稠密层的常见方式是将其作为定义的一部分,并使用激活参数。然而有时候你可能希望在稠密层和其激活函数之间加入其他层。(我们将在第5课中使用批归一化的例子来看一个例子。)在这种情况下,我们可以使用自己的激活层来定义激活函数,如下所示:

layers.Dense(units=8),
layers.Activation('relu')

这与普通的方式完全相等:layers.Dense(units=8, activation='relu')。重写以下模型,使每个激活函数都在自己的激活层中。

### YOUR CODE HERE: rewrite this to use activation layers
model = keras.Sequential([layers.Dense(32, activation='relu', input_shape=[8]),layers.Dense(32, activation='relu'),layers.Dense(1),
])# Check your answer
q_3.check()# Lines below will give you a hint or solution code
#q_3.hint()
#q_3.solution()

可选:ReLU的替代方案

ReLU(Rectified Linear Unit)是一种常用的激活函数,它在神经网络中被广泛使用。然而,除了ReLU之外,还有一些替代方案可以用作激活函数,具体如下:

  1. Sigmoid函数:Sigmoid函数将输入值映射到一个介于0和1之间的连续输出。它在早期的神经网络中广泛使用,但在深度神经网络中的性能较差。

  2. Tanh函数:Tanh函数是双曲正切函数,它将输入值映射到一个介于-1和1之间的连续输出。与Sigmoid函数类似,Tanh函数在早期的神经网络中使用较多,但在深度神经网络中也存在梯度消失问题。

  3. Leaky ReLU:Leaky ReLU是对ReLU的改进,它在负数输入时引入了一个小的斜率,以避免ReLU的神经元死亡问题。Leaky ReLU的数学表达式为f(x) = max(ax, x),其中a是一个很小的常数。

  4. Parametric ReLU (PReLU):PReLU是对Leaky ReLU的进一步改进,它不是使用固定的斜率,而是将负数区域的斜率作为一个可学习的参数来确定。这使得神经网络可以更好地适应不同的数据集。

  5. Exponential Linear Units (ELUs):ELU是一种具有负数区域的激活函数,类似于Leaky ReLU和PReLU,但它具有更平滑的曲线。ELU可以缓解梯度消失问题,并且在某些任务中比ReLU表现更好。

总而言之,虽然ReLU是最常用的激活函数之一,但在某些情况下,上述的替代方案可能会更适合特定的神经网络架构和任务。

“relu”激活函数的变体有很多,包括“elu”,“selu”和“swish”等,你可以在Keras中使用它们。在特定任务中,有时一个激活函数比另一个表现更好,因此在开发模型时可以考虑尝试不同的激活函数。ReLU激活函数在大多数问题上表现良好,因此是一个很好的起点。

让我们来看看其中几个图形。将激活函数从 'relu' 更改为上面提到的其他一种。然后运行单元格以查看图形。(查阅文档以获取更多想法。)

# YOUR CODE HERE: Change 'relu' to 'elu', 'selu', 'swish'... or something else
activation_layer = layers.Activation('relu')x = tf.linspace(-3.0, 3.0, 100)
y = activation_layer(x) # once created, a layer is callable just like a functionplt.figure(dpi=100)
plt.plot(x, y)
plt.xlim(-3, 3)
plt.xlabel("Input")
plt.ylabel("Output")
plt.show()

后面的文章中咱们将会学习到如何训练一个神经网络。

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

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

相关文章

SQLiteC/C++接口详细介绍sqlite3_stmt类(六)

返回:SQLite—系列文章目录 上一篇:SQLiteC/C接口详细介绍sqlite3_stmt类(五) 下一篇: SQLiteC/C接口详细介绍sqlite3_stmt类(七) 17. sqlite3_clear_bindings函数 sqlite3_clear_bindings函…

Day44:WEB攻防-PHP应用SQL盲注布尔回显延时判断报错处理增删改查方式

目录 PHP-MYSQL-SQL操作-增删改查 PHP-MYSQL-注入函数-布尔&报错&延迟 基于布尔的SQL盲注-逻辑判断(需要有回显,没回显搞不了)跟union需要的条件差不多 基于时间的SQL盲注-延时判断(不需要任何回显) 基于报错的SQL盲注-报错回显(需要报错回显,没报错回…

【LabVIEW FPGA入门】FPGA 存储器(Memory)

可以使用内存项将数据存储在FPGA块内存中。内存项以2kb为倍数引用FPGA目标上的块内存。每个内存项引用一个单独的地址或地址块,您可以使用内存项访问FPGA上的所有可用内存。如果需要随机访问存储的数据,请使用内存项。 内存项不消耗FPGA上的逻辑资源&…

leetcode 2671

leetcode 2671 题目 例子 思路1 使用哈希&#xff0c; unordered_map 是基于hash 实现的key,val 存储。 代码1 class FrequencyTracker {unordered_map<int, int>m;public:FrequencyTracker() { }void add(int number) {if(m.find(number) m.end()){m.insert({num…

备战蓝桥杯---牛客寒假算法基础集训6

1.并查集数学 分析&#xff1a; 首先我们知道算数基本定理&#xff0c;如果两个数有大于1的质因子&#xff0c;那么我们就需要把他们放在同一个集合&#xff0c;因此我们可以用欧拉刷出1e6范围内的素数&#xff0c;然后依次看输入的数。 拿202*2*5举例子&#xff0c;我们在求…

算法系列--链表刷题(二)

&#x1f495;"轻舟已过万重山"&#x1f495; 作者&#xff1a;Mylvzi 文章主要内容&#xff1a;算法系列–链表刷题(二) 今天为大家带来的是算法系列--链表刷题(二),带来了几道经典的有关链表的面试题(合并K个有序列表) 1.两数相加 https://leetcode.cn/problems/a…

测试ALPHA开发板CAN1的设备树文件

一. 简介 前面一篇文章学习了 ALPHA开发板上的 CAN接口的设备节点信息&#xff0c;文章如下&#xff1a; ALPHA开发板修改CAN的设备树节点信息-CSDN博客 本文对设备树文件进行测试&#xff0c;即开发板加载 .dtb设备树文件。 二. 加载测试 CAN的设备树文件 1. 拷贝设备树…

fiddler过滤器使用,隐藏图片、js、css请求

如果抓包过程中不想查看图片、js、css请求&#xff0c;或者只想抓某个ip或者某个网页下的请求&#xff0c;可以在过滤器中设置。 &#xff08;1&#xff09;没有开启过滤器 可以看出所有的请求都会抓取&#xff0c;cs、js、图片请求都有 &#xff08;2&#xff09;开启过滤器 …

dubbo 源码系列之-集群三板斧---负载均衡(二)

在上一课时我们了解了 LoadBalance 接口定义以及 AbstractLoadBalance 抽象类的内容&#xff0c;还详细介绍了 ConsistentHashLoadBalance 以及 RandomLoadBalance 这两个实现类的核心原理和大致实现。本课时我们将继续介绍 LoadBalance 的剩余三个实现。 LeastActiveLoadBala…

MySQL | 视图

视图是一个虚拟表&#xff0c;其内容由查询定义。同真实的表一样&#xff0c;视图包含一系列带有名称的列和行数据。视图的数据变化会影响到基表&#xff0c;基表的数据变化也会影响到视图。 1. 基本使用 1.1. 创建视图 create view 视图名 as select语句&#xff1b; 创建测…

hcip实验

一、实验拓扑 二、实验划分 AR1的Serial3/0/0接口&#xff1a;192.168.1.1/24&#xff1b; AR2的Serial3/0/0接口&#xff1a;192.168.1.2/24&#xff1b; AR2的Serial3/0/1和4/0/0的聚合接口&#xff1a;192.168.2.2/24&#xff1b; AR3的Serial3/0/0和3/0/1的聚合接口&am…

网络安全实训Day8

写在前面 网络工程终于讲完了。这星期到了网络安全技术部分。 网络安全实训-网络安全技术 网络安全概述 信息安全&#xff1a;所有保障计算机硬件、系统、软件、数据不因有意或无意的行为导致的服务中断、数据损坏或丢失等安全事件的保障技术 网络安全&#xff1a;基于计算机…

C/C++之内存旋律:星辰大海的指挥家

个人主页&#xff1a;日刷百题 系列专栏&#xff1a;〖C/C小游戏〗〖Linux〗〖数据结构〗 〖C语言〗 &#x1f30e;欢迎各位→点赞&#x1f44d;收藏⭐️留言&#x1f4dd; ​ ​ 一、C/C内存分布 我们先来了解一下C/C内存分配的几个区域&#xff0c;以下面的代码为例来看…

机器学习——决策树剪枝算法

机器学习——决策树剪枝算法 决策树是一种常用的机器学习模型&#xff0c;它能够根据数据特征的不同进行分类或回归。在决策树的构建过程中&#xff0c;剪枝算法是为了防止过拟合&#xff0c;提高模型的泛化能力而提出的重要技术。本篇博客将介绍剪枝处理的概念、预剪枝和后剪…

C语言内存函数(1)【memcpy函数的使用与模拟实现】【memmove函数的使用和模拟实现】

关于内存函数有四个函数需要我们学习。分别是memcpy&#xff0c;memmove&#xff0c;memset和memcmp。都在头文件string.h里面。 一.memcpy函数的使用 一提到这个函数&#xff0c;我们可能会联想到strcpy函数&#xff0c;但strcpy函数是针对字符串的拷贝。但是我们在写代码的…

百度文心一言(ERNIE bot)API接入Android应用

百度文心一言&#xff08;ERNIE bot&#xff09;API接入Android应用实践 - 拾一贰叁 - 博客园 (cnblogs.com) Preface: 现在生成式AI越来越强大了&#xff0c;想在android上实现一个对话助手的功能&#xff0c;大概摸索了一下接入百度文心一言API的方法。 与AI助手交换信息的…

C++类的6个默认成员函数(构造)

C类和对象基础-CSDN博客https://blog.csdn.net/lh11223326/article/details/136834917?spm1001.2014.3001.5501 目录 1.构造函数 概念 特性 2.析构函数 概念 特性 3.拷贝构造函数 概念 特征 4.赋值运算符重载&#xff08;构造实现&#xff09; 运算符重载 赋值运算…

Kafka快速入门及使用

入门 官网 简介 Kafka是一个分布式的流媒体平台应用&#xff1a; 消息系统日志收集用户行为追踪流式处理 特点 高吞吐量消息持久化高可靠性高扩展性 常用术语 Broker&#xff1a;集群中的服务器Zookeeper&#xff1a;服务管理Topic&#xff1a;主题&#xff0c;Kafka发…

Linux/openEuler系统部署spring boot+vue前后端分离项目(nginx均衡代理)

Linux/openEuler系统部署spring bootvue前后端分离项目&#xff08;nginx均衡代理&#xff09; 1、系统环境准备&#xff0c;安装openjdk和nginx还有MySQL&#xff0c;咱们本文先连接主机mysql进行登录&#xff08;linux上的mysql服务可以先不安装&#xff09; 可以看我前面的…

springboot精品源码

springboot精品源码 所有项目都包括&#xff1a;源码数据库文件开题LW说明文档运行视频 请看主页资料联系。 项目类型包括: 1 SpringBoot学生心理咨询评估系统 2 基于SpringBoot的网上订餐系统 3 大学生租房平台的设计与实现 4 SpringBoot房屋租赁系统 5 基于SpringBoot的课…