跟姥爷深度学习2 TensorFlow的基本用法

news2024/9/26 3:32:36

一、前言

前面我们浅用TensorFlow做了个天气预测,虽然效果不咋样,但算是将整个流程跑通了。这一篇我们在之前基础上对TensorFlow的一些参数进行简单介绍,在接口文件的基础上了解各参数的简单含义和用法。

二、再次构建模型

我们先将之前的冗余代码都删除,做个简单的模型训练和预测。

 

 

 

三、可以修改的参数

这些代码中我们主要能修改的包括:网络模型调整、网络配置修改、训练的方式。下面我们逐一来看。

 

1、网络模型构造

1)tf.keras.Sequential()

这一句的含义是实例化一个model1,再往model1里按顺序堆叠层组织就可以构建神经网络了(后面的model1.add操作)。

2)model1.add(layers.Dense(16))

这一句的含义是向model1里加一层神经网络,神经网络的样式由layers.Dense来定义。

3)layers.Dense(16)

这一句的含义是生成由16个神经元组成的一层神经网络,其中Dense的含义是“一个常规的全连接NN层”,也是比较常规常用的层。既然有Dense,那其实就还有其他类型的层结构,比较常见的有(参考链接:https://www.bbsmax.com/A/D854PnYW5E/):

Dense层:全连接层

Activation层:激活层对一个层的输出施加激活函数

dropout层:为输入数据施加Dropout。Dropout将在训练过程中每次更新参数时按一定概率(rate)随机断开输入神经元,Dropout层用于防止过拟合。

Flatten层:Flatten层用来将输入“压平”,即把多维的输入一维化,常用在从卷积层到全连接层的过渡。Flatten不影响batch的大小。

Reshape层:Reshape层用来将输入shape转换为特定的shape

Permute层:Permute层将输入的维度按照给定模式进行重排,例如,当需要将RNN和CNN网络连接时,可能会用到该层。所谓的重排也就是交换两行

....(还有很多就不列举了)

目前我们也不用搞明白这些层具体的用法,知道有多种类型的神经网络结构就行了。目前我们就使用Dense即可。

4)Dense的参数

 

units

正整数,输出空间的维度。可以理解就是神经元个数。

activation

要使用的激活函数。如果未指定任何内容,则不应用任何激活(即。“线性”激活:a(x) = x)。激活函数非常有用,我们下面还要详细说。

use_bias

网络层是否使用偏差向量。作用就是决定卷积层输出是否有b。默认都是True的,在一些特殊场景下可能需要设置False。

kernel_initializer

这个是设置神经网络内部如何进行初始化,默认的glorot_uniform含义是“均匀分布初始化器”。自然还有其他初始化方式,后面要详细说。

bias_initializer

偏置向量的初始值设定项。也就是设置b如何初始化。我们理解这个b也是神经网络的一部分就行了。默认的zeros就是初始值为0。它与kernel_initializer一样有很多种初始化方式,后面详细说。

kernel_regularizer

应用于核权重矩阵的正则化器函数。正则项在优化过程中层的参数或层的激活值添加惩罚项。用处是防止过拟合。

bias_regularizer

应用于偏置向量的正则化器函数。就是施加在b上的惩罚项,也是用于防止过拟合。

activity_regularizer

应用于层输出的正则化器函数。就是施加在激活函数上的惩罚项,还是防止过拟合。

kernel_constraint

应用于核权重矩阵的约束函数。简单来说就是让神经网络中的参数值限定在某个范围,还是防止过拟合,不过很少使用。

bias_constraint

应用于偏置向量的约束函数。同上,还是不常用的。

5)Dense参数与神经网络的结构

如果单看前面Dense参数的解释你大概率会云里雾里,但如果对神经网络的内部结构有一点了解的话,就比较容易理解了,下面我尝试三言两语来描述一下神经网络的内部细节,看是否会有点帮助。

(建议结合很久以前写的博文:https://mbb.eet-china.com/blog/3887969-408491.html)

简单来说,神经网络内部大体由4个函数组成:

传播函数、激活函数、反向传播函数、损失函数

这4个函数要实现的核心功能包括:

向前预测、输出映射、反向优化、损失计算

用一个公式来表达:

Y = w*f(X)+b

其中X是我们的输入,Y是预测结果,“标注”我们可以用label_Y来标识,含义是理论上应该正确的Y值。

那么所谓的训练就是:

  1. 随机给一个w和b值,再输入X计算得到Y(向前预测)
  2. 计算得到的Y不能直接使用,我们再用激活函数将Y运算一下得到真正的Y值(激活函数)
  3. 比较label_Y与Y的值得到损失loss(与标注对比)
  4. 根据损失来优化w和b(反向传播)

当我们输入大量的X和Y值后,就能将w和b调教成更加合适的数值,w、b的值也就是我们的训练出来的模型,这样当我们需要预测时,输入一个X1就能得到一个合适的Y1。

 

所以,类比来看:

  1. features = pd.read_csv('训练集.csv')是导入训练数据X
  2. model1 = tf.keras.Sequential();model1.add(layers.Dense(16))是生成并初始化了w和b,要注意w和b不是一个数,而是一组数字。
  3. labels_avg = np.array(features[avg])是将“标注”存起来,也就是label_Y
  4. model1.fit()执行的训练就是传播函数+激活函数+对比结果+反向传播
  5. 反向传播的目的就是更新w和b(优化参数)。

接着我们再看一下Dense的参数就比较好理解了。

units

设置神经元的个数,同时也就是设置了w和b的数值维度(一部分)。w和b的数值维度由神经元个数和神经网络层数共同决定。

activation

设置激活函数。通过w*f(X)+b计算出Y后,再对Y执行的一个运算就是激活函数,这里设置使用什么样的运算

use_bias

设置是否使用b,不使用的话公式就变成了w*f(X)

kernel_initializer

设置w的初始化值,比如全部初始化成0,或者初始化成一些随机数,或者是符合正态分布的随机数。

bias_initializer

设置b的初始化值

kernel_regularizer

设置对w施加的正则化函数。每一次预测优化w的值后,为了让w不过拟合(w的值过于向训练数据优化),就做一次惩罚运算,让w的值更随机一点。

bias_regularizer

设置对b施加的正则化函数。防止过拟合,原理同上。

activity_regularizer

设置对Y施加的正则化函数。防止过拟合,原理同上。

kernel_constraint

设置让w的值限定在某个范围,还是防止过拟合,很少使用。

bias_constraint

设置让b的值限定在某个范围,同上,还是不常用的。

6)Dense的可选参数

Units

神经元的个数

正整数。比如10就是这一层网络使用10个神经元

用法:model1.add(layers.Dense(10))

Activation

激活函数

用法:model1.add(layers.Dense(10,activation=’relu’))

activation=’softmax’

activation=’softplus’

activation=’softsign’

activation=’relu’

activation=’tanh’

activation=’sigmoid’

activation=’hard_sigmoid’

activation=’linear’

这么多知道啥意思也没用,可以挨个试试看,最常用的就是relu

use_bias

是否使用b

默认就是True

用法:model1.add(layers.Dense(10,use_bias=True))

kernel_initializer

w的初始化值

用法:model1.add(layers.Dense(10,kernel_initializer=’glorot_uniform’))

kernel_initializer=’zeros’ 全0初始化

kernel_initializer=’one’ 全1初始化

kernel_initializer=’constant’ 初始化为固定值

kernel_initializer=’random_uniform’ 均匀分布

kernel_initializer=’random_normal’ 正态分布

kernel_initializer=’truncated_normal’ 产生截断的正态分布

kernel_initializer=’identity’ 单位矩阵

kernel_initializer=’orthogonal’ 正交

kernel_initializer=’glorot_normal’ 正态化的Glorot初始化,即Xavier

kernel_initializer=’glorot_uniform’ Glorot均匀分布

除了全0全1,其他都看不懂,反正都可以填进去跑一跑试一试。

bias_initializer

b的初始化值

用法:model1.add(layers.Dense(10,bias_initializer=’zeros’))

可选设置同kernel_initializer

kernel_regularizer

对w施加的正则化

用法:model1.add(layers.Dense(10,kernel_regularizer=regularizers.l2(0.01)))

kernel_regularizer=regularizers.l2(0.01)

kernel_regularizer=regularizers.l1(0.01)

bias_regularizer

对b施加的正则化

同上

activity_regularizer

对Y施加的正则化

同上上

kernel_constraint

w的值限定

一般不使用就不多说了

bias_constraint

b的值限定

一般不使用就不多说了

7)Dense修改参数的实例

A.啥参数也不加

 

训练结果:

 

 B.增加激活函数relu

 

训练结果:看起来差别不大

 

C.增加激活函数softmax

 

训练结果:更差了。所以这个激活函数得选择合适的,而不是瞎选。

 

 D.不使用b

 

训练结果:完全没法看了

 

 E.设置w的初始化值为random_uniform

 

训练结果:效果也是不明显

 

后面的大家可以自己试,累了。

2、对网络的配置

1)model1.compile()

作用是设置优化器、损失函数和准确率评测标准。

 

 

optimizer

设置优化器

用法:

model1.compile(

optimizer=tf.keras.optimizers.SGD(0.001),

loss='mean_squared_error'

)

optimizers.SGD(0.001)

optimizers.Adagrad(0.001)

optimizers.Adadelta(0.001)

optimizers.Adam(0.001)

这里0.001是学习率,简单来说,这个数值就是每次对w和b进行优化的幅度。太大太小都不合适。

loss

损失函数

用法:

model1.compile(

optimizer=tf.keras.optimizers.SGD(0.001),

loss='mean_squared_error'

)

loss='mean_squared_error' # 均方误差

loss='mean_absolute_error' # 平均绝对误差

loss='mean_absolute_percentage_error' # 平均绝对百分比误差

loss='mean_squared_logarithmic_error' # 均方对数误差

loss='kullback_leibler_divergence'

损失函数的目的是计算模型在训练期间应寻求最小化的数量

metrics

评价函数

用法:

model1.compile(

optimizer=tf.keras.optimizers.SGD(0.001),

loss='mean_squared_error',

metrics=accuracy

)

metrics=’accuracy’

metrics=’sparse_accuracy’

metrics=’sparse_categorical_accuracy’

评价函数用于评估当前训练模型的性能

loss_weights

这4个参数用的极少,也找不到啥资料,所以忽略吧。

sample_weight_mode

weighted_metrics

target_tensors

2)compile修改参数的实例

A.SDG

 

训练结果:

 

B.Adagrad

 

训练结果:

 

C.Adadelta

 

训练结果:

 

D.Adam

训练结果:

 

Loss就不演示了,大家自己改着玩吧。

 3、对训练函数的配置

 

x

输入数据

y

标签,也就是训练数据里的正确答案

batch_size

每次训练使用的数据量,一般设置成32、64、128这样,比如有10000个数据,这里你设置成64,那就是将所有数据分成156个组,每次将一组的数据放进去一起训练。主要就是加快训练速度,不然一个一个来得多久。

epochs

总训练次数,比如我们设置的是50,那就是将输入的数据放到模型里训练50次,也就是对模型进行了50次的优化

verbose

日志显示,0为不在标准输出流输出日志信息,1为输出进度条记录,2为每个epoch输出一行记录

callbacks

回调函数,在每个training/epoch/batch结束时,如果我们想执行某些任务,例如模型缓存、输出日志。这个现在用不到不多说。

validation_split

0~1之间的浮点数,用来指定训练集的一定比例数据作为验证集。

validation_data

形式为(X,y)的tuple,是指定的验证集。此参数将覆盖validation_spilt。也就是不使用训练数据里的数据作为验证集,而是从外部另外输入。实际上这个验证集对训练没有影响,只是方便你看现在训练的效果。

shuffle

表示是否在训练过程中随机打乱输入样本的顺序

class_weight

很少用到

sample_weight

initial_epoch

四、模型的存储和调用

我们训练好以后,想要保存起来咋弄呢,非常简单。

 

五、回顾

本篇我们将TensorFlow主要用到的方法和参数进行简单的介绍,大家可以自己挨个换着试试。另外还将模型的保存和调用也演示了一下。

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

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

相关文章

基于组合双向拍卖的共享储能机制研究(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

规模化敏捷框架之LeSS

Scrum 是目前比较流行的敏捷框架,Scrum 敏捷开发团队由产品负责人(Product Owner)、敏捷教练(Scrum Master)、软件开发人员和其他合作人员组成。团队在这个指导框架下协同工作、开发、创造和交付有价值的产品来解决复杂…

易基因:METTL3介导的m6A甲基化谱调控肌肉干细胞成肌细胞状态转换|发育分化

2020年9月29日,《Cell Death Discovery》(IF: 7.109)杂志发表了题为“A defined N6-methyladenosine (m6A) profile conferred by METTL3 regulates muscle stem cell/myoblast state transitions”的研究论文,研究通过MeRIP-seq&…

静态时序分析Static Timing Analysis2——建立时间和保持时间的时序检查

文章目录前言一、建立时间检查1、寄存器到寄存器2、输入端口到寄存器3、寄存器到输出端口4、输入端口到输出端口二、保持时间检查1、寄存器到寄存器2、输入端口到寄存器3、寄存器到输出端口4、输入端口到输出端口前言 2023.4.11 继续学习STA,前面听的感觉好迷糊&am…

Android---性能优化之图片压缩

质量压缩 质量压缩会用到 Bitmap.compress()。 public boolean compress(Bitmap.CompressFormat format, int quality, OutputStream stream); 这个方法有三个参数: Bitmap.CompressFormat format:图像的压缩格式(jpeg ,png, webp&#xf…

C++STL大全----容器篇(上)

(一)概念 STL,英文全称 standard template library,中文可译为标准模板库或者泛型库,其包含有大量的模板类和模板函数,是 C 提供的一个基础模板的集合,用于完成诸如输入/输出、数学计算等功能。…

数据库第一个实验

啦啦啦啦啦,数据库终于要实验了,很担心做不好,要是挂了怎么办 只是自己的作业,可能会有问题,欢迎前来指正 一、题目(100分) 一、创建后面给出的这6个表(20分) 二、用不同…

Ubuntu20.04 个人配置和i3美化

Ubuntu20.04 个人配置和i3美化 本文是基于个人习惯和审美,快速配置一个新ubuntu的步骤。脚本在资源里给出,但仍有部分配置文件需在脚本执行后手动修改,文中已用红色字体标出 更新apt源 备份原来的源更换阿里源 # 备份 sudo mv /etc/apt/sources.list…

Camunda流程引擎查询接口API介绍

Camunda流程引擎底层采用了mybatis作为ORM框架,并封装了一套自己的数据查询接口,以下是几种可以Camunda流程引擎中查询数据的方式。 Java 查询API 。使用 Fluent Java API 来查询流程引擎实体,比如流程实例、任务等。REST 查询API 。通过 RE…

SpringMVC启动流程方式分析-三种方式

SpringMVC的启动方式 本文所叙述的是springmvc放入Tomcat servlet容器的启动方式 第一种Web.xml文件配置 使用传统的web.xml配置文件, 指定DispatchServlet ,当然如果想要父子容器的效果指定一个ContextLoaderListener 上下文加载监听器就行&#xff…

少儿编程 电子学会图形化编程等级考试Scratch三级真题解析(选择题)2022年12月

2022年12月Scratch等级考试一级真题解析 选择题(共25题,每题2分,共50分) 1、默认小猫角色和气球角色都是显示状态,小猫程序如下图所示,气球没有程序,点击绿旗,舞台上最终显示的效果是 A、可能出现6个不同位置的小猫和6个小球 B、可能出现6个不同位置的小猫和1个气球…

【嵌入式Linux】Jetson nano GPIO应用 | 驱动开发 | 官方gpiolib、设备树与chip_driver

GPIO子系统 0.暴露给应用层 应用 $ echo 79 > /sys/class/gpio/export //导出79号gpio 引脚,使得可在应用层访问 $ echo out > /sys/class/gpio/gpio79/direction //设置 为输出 $ echo 1 > /sys/class/gpio/gpio79/value //输出高电平 开灯 $ echo 0…

win10系统部署-zabbix客户端

一、下载win10系统 zabbix客户端 下载地址: 根据自己需求下载 https://www.zabbix.com/cn/download二、win系统安装客户端 1、解压安装包 c:\zabbix 2、编辑zabbix\conf\zabbix_agentd.conf文件 Server127.0.0.1,IP IP是你的zabbix服务器端地址 ServerActive127…

C++的GUI库

1. Qt Qt是一个跨平台的C应用程序开发框架。广泛用于开发GUI程序,这种情况下又被称为部件工具箱。也可用于开发非GUI程序,例如控制台工具和服务器。 2. MFC 微软基础类库(英语:Microsoft Foundation Classes,简称MFC&a…

罗丹明-聚乙二醇-生物素RB-PEG-Biotin;Biotin-PEG-Rhodamine,PEG2000

RB-PEG-Biotin 罗丹明-聚乙二醇-生物素 中文名称:罗丹明-聚乙二醇-生物素 英文名称:RB-PEG-Biotin 分子量(PEG ):2000、3400、5000,其他分子量可以定制。 用 途:仅供科研实验使用。 性状&…

TiDB 6.1/6.5 在 Rocky Linux 8 中的部署升级与 PITR 初体验

作者: 沈阳盛京征信有限公司 原文来源: https://tidb.net/blog/5fa1612a 本文档的主要内容为: TiDB v6.1.0 在 Rocky Linux 8.7 中的离线部署 TiDB v6.1.0 -> TiDB v6.5.1 升级 TiFlash 扩缩容 Haproxy 部署 br 物理备份与恢复 基…

递归算法(JS实现代码)

📝个人主页:爱吃炫迈 💌系列专栏:数据结构与算法 🧑‍💻座右铭:道阻且长,行则将至💗 文章目录递归算法递归的思想递归三要素递归的编程模型递归一般应用场景递归经典案例…

​力扣解法汇总1026. 节点与其祖先之间的最大差值

目录链接: 力扣编程题-解法汇总_分享记录-CSDN博客 GitHub同步刷题项目: https://github.com/September26/java-algorithms 原题链接:力扣 描述: 给定二叉树的根节点 root,找出存在于 不同 节点 A 和 B 之间的最大值…

05、SpringBoot开发实用篇

一、热部署什么是热部署?简单说就是你程序改了,现在要重新启动服务器,嫌麻烦?不用重启,服务器会自己悄悄的把更新后的程序给重新加载一遍,这就是热部署。热部署的功能是如何实现的呢?这就要分两…

【技术】封装自己的 Maven Archetype Maven 原型

封装自己的 Maven Archetype Maven 原型 为什么要封装 Maven Archetype?如何封装 Maven Archetype?核心步骤具体步骤构建项目构建原型 archetypeIDEA 导入自定义原型 如何删除自定义的 Maven Archetype ? 为什么要封装 Maven Archetype? 用…