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

政安晨的个人主页政安晨

欢迎 👍点赞✍评论⭐收藏

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

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

这篇文章中,咱们将使用Keras和TensorFlow训练一个神经网络,如果您是第一次看到这篇文章,那就是训练您的第一个神经网络。

前言

随机梯度下降(Stochastic Gradient Descent,简称SGD)是深度学习中最常用的优化算法之一。它是一种迭代的优化算法,用于求解目标函数的最小值。

在深度学习中,目标是通过不断调整模型的参数来最小化损失函数。

SGD的基本思想是每次迭代时,随机选择一小批训练样本(称为一个mini-batch),计算这个mini-batch的梯度,并用梯度的负方向更新模型的参数。这样反复进行迭代,直到达到停止条件为止。

与传统的梯度下降算法不同,SGD每次迭代只利用一个mini-batch来估计梯度,因此计算速度更快。此外,在数据比较多的情况下,SGD还具有一定的随机性,能够逃离局部最小值,从而更有可能达到全局最小值。

然而,SGD也存在一些问题。由于每次迭代只使用一个mini-batch,因此梯度估计可能不够准确,导致更新方向不够理想,收敛速度较慢。为了解决这个问题,可以使用一些改进的SGD算法,如批量梯度下降(Batch Gradient Descent)、动量法(Momentum)、Adam等。

总的来说,SGD是深度学习中非常重要的优化算法,能够高效地训练深度神经网络模型。它的简单性和可扩展性使其成为了深度学习中的核心算法之一。


在这个系列的前两篇文章中,我们学习了如何通过堆叠稠密层来构建全连接网络。当网络首次创建时,所有的权重都是随机设置的 - 网络还不知道任何东西。

在本文中,我们将看到如何训练神经网络我们将看到神经网络如何学习

与所有机器学习任务一样,我们首先需要一组训练数据训练数据中的每个示例由一些特征(输入)和一个期望的目标结果(输出)组成。训练网络意味着调整其权重,使其能够将特征转化为目标结果。

例如,在80种麦片数据集中,我们希望有一个网络可以获取每种麦片的“糖分”、“纤维”和“蛋白质”含量,并预测该麦片的“卡路里”含量。如果我们成功地训练了一个网络来做到这一点,那么它的权重必须以某种方式表示这些特征与目标结果之间的关系,如训练数据所示。

除了训练数据,我们还需要两个东西

一个“损失函数”,用于衡量网络的预测效果。 一个“优化器”,用于告诉网络如何调整权重。

损失函数

我们已经了解了如何为网络设计架构,但我们还没有看到如何告诉网络解决什么问题。

这就是损失函数的工作。

损失函数衡量的是目标的真实值与模型预测值之间的差异

不同的问题需要不同的损失函数

我们一直在研究回归问题,其中的任务是预测一些数值--比如80种谷物中的卡路里,红酒质量评分。其他回归任务可能包括预测房屋价格或汽车燃油效率。

回归问题常用的损失函数是平均绝对误差(MAE)对于每个预测值y_pred,MAE通过计算真实目标值y_true与预测值之间的绝对差abs(y_true - y_pred)来衡量它们之间的差异。

在数据集上的总MAE损失是所有这些绝对差异的均值

平均绝对误差是拟合曲线与数据点之间的平均距离

除了MAE之外,你可能在回归问题中看到其他的损失函数,如均方误差(MSE)或Huber损失(在Keras中都可用)。

在训练过程中,模型将使用损失函数作为指导,找到其权重的正确值(较低的损失更好)。换句话说,损失函数告诉网络它的目标。

优化器 - 随机梯度下降

我们已经描述了我们希望网络解决的问题,但现在我们需要说明如何解决这个问题。

这是优化器的工作优化器是一种调整权重以最小化损失的算法。

几乎所有用于深度学习的优化算法都属于一种称为随机梯度下降(SGD)的算法家族。它们是迭代算法,在训练网络时分步进行。

训练的一个步骤如下所示

1. 抽样一些训练数据,并通过网络进行预测。

2. 衡量预测结果与真实值之间的损失。

3. 最后,调整权重以使损失减小。

这种调整的步骤可以一直小到你接受为止,当然,这种调整也是有限度的,是有边界的。

使用随机梯度下降训练神经网络。

每个迭代的训练数据样本被称为一个小批量(通常简称为“批量”),而完整的一轮训练数据被称为一个周期。

你训练的周期数决定了网络将会看到每个训练样本的次数。

上面左边第一幅图淡红色的点表示整个训练集,而实心红点表示小批量。每当看到一个新的小批量时,它会将权重(斜率w和y截距b)向着该批量上的正确值进行调整。一批一批地训练,最终线条会收敛到最佳拟合。你可以看到,随着权重接近其真实值,损失越来越小。

学习率和批大小

请注意,该行只在每个批次的方向上进行了小幅度的偏移(而不是完全移动)。这些偏移的大小由学习率决定。较小的学习率意味着网络需要看到更多的小批量数据,才能使其权重收敛到最佳值。

学习率和小批量大小是对训练过程影响最大的两个参数。它们之间的相互作用常常是微妙的,选择这些参数的正确方式并不总是明显的。(我们将在练习中探讨这些影响。)

幸运的是,对于大多数工作来说,不必进行广泛的超参数搜索就能获得令人满意的结果。Adam是一种具有自适应学习率的SGD算法,它适用于大多数问题,无需任何参数调整(在某种意义上它是“自我调节的”)。Adam是一个非常好的通用优化器。

添加损失函数和优化器

定义模型后,可以使用模型的compile方法添加损失函数和优化器:

model.compile(optimizer="adam",loss="mae",
)

请注意,我们可以仅通过一个字符串来指定损失函数和优化器。您也可以通过Keras API直接访问这些(如果您想要调整参数的话),但对于我们来说,使用默认值就可以了。

名字有什么重要性?

梯度是一个向量,告诉我们权重需要朝着哪个方向前进。

更准确地说,它告诉我们如何改变权重,以使损失函数最快地变化。

我们将这个过程称为梯度下降,因为它使用梯度来沿着损失曲线向最小值降低。

随机意味着“由机会决定”。

我们的训练是随机的,因为小批量是从数据集中随机抽取的样本。这就是为什么它被称为随机梯度下降(SGD)!

例子 - 红酒品质

现在我们知道我们需要开始训练深度学习模型的一切了。那么让我们来看看它的实际效果吧!我们将使用红酒质量数据集。

该数据集包含大约1600种葡萄牙红葡萄酒的理化测量数据。还包括每种葡萄酒的品质评级,评级是通过盲品测试得出的。我们能否通过这些测量数据来预测葡萄酒的品质感知程度?

我们已经将所有的数据准备工作放在了下一个隐藏单元中。

这并不是后面讨论的关键,所以你可以随意跳过它。现在你可能要注意的一件事是,我们已经将每个特征重新缩放到了区间 [0,1]。正如我们将在第5课中讨论的那样,神经网络在输入具有相同的尺度时表现最佳。

import pandas as pd
from IPython.display import displayred_wine = pd.read_csv('../input/dl-course-data/red-wine.csv')# Create training and validation splits
df_train = red_wine.sample(frac=0.7, random_state=0)
df_valid = red_wine.drop(df_train.index)
display(df_train.head(4))# Scale to [0, 1]
max_ = df_train.max(axis=0)
min_ = df_train.min(axis=0)
df_train = (df_train - min_) / (max_ - min_)
df_valid = (df_valid - min_) / (max_ - min_)# Split features and target
X_train = df_train.drop('quality', axis=1)
X_valid = df_valid.drop('quality', axis=1)
y_train = df_train['quality']
y_valid = df_valid['quality']

这个网络应该有多少个输入?

我们可以通过查看数据矩阵中的列数来发现这一点。确保在这里不包括目标变量('quality'),只包括输入特征。

print(X_train.shape)

十一个列意味着十一个输入。

我们选择了一个三层网络,有超过1500个神经元。这个网络应该能够学习数据中相当复杂的关系。

from tensorflow import keras
from tensorflow.keras import layersmodel = keras.Sequential([layers.Dense(512, activation='relu', input_shape=[11]),layers.Dense(512, activation='relu'),layers.Dense(512, activation='relu'),layers.Dense(1),
])

决定模型架构应该是一个过程的一部分。从简单开始,并以验证损失作为指导。

您将在练习中了解更多关于模型开发的内容。

定义模型之后,我们编译优化器和损失函数。

model.compile(optimizer='adam',loss='mae',
)

现在我们准备开始训练!

我们告诉Keras每次将256行训练数据一次性输入优化器(即batch_size),并在整个数据集上重复这个过程10次(即epochs)。

history = model.fit(X_train, y_train,validation_data=(X_valid, y_valid),batch_size=256,epochs=10,
)

你可以看到,在模型训练过程中,Keras会实时更新并显示损失值。

通常,更好的观察损失的方法是将其绘制出来。实际上,fit方法会在训练过程中记录损失值,并保存在一个名为History的对象中。我们将把这些数据转换为Pandas的dataframe格式,以便更容易进行绘图。

import pandas as pd# convert the training history to a dataframe
history_df = pd.DataFrame(history.history)
# use Pandas native plot method
history_df['loss'].plot();

注意随着每个周期的进行,损失逐渐趋于平缓。当损失曲线变得水平时,意味着模型已经学习到了它所能学习的所有知识,没有继续训练更多周期的必要了。

练习:随机梯度下降

介绍

在这个练习中,您将在燃油经济数据集上训练神经网络,然后探索学习率和批处理大小对随机梯度下降(SGD)的影响。

当您准备好后,请运行以下代码:

# Setup plotting
import matplotlib.pyplot as plt
from learntools.deep_learning_intro.dltools import animate_sgd
plt.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)
plt.rc('animation', html='html5')# Setup feedback system
from learntools.core import binder
binder.bind(globals())
from learntools.deep_learning_intro.ex3 import *

在燃油经济数据集中,您的任务是根据其发动机类型或制造年份等特征预测汽车的燃油经济性。

首先通过运行下面的单元格来加载数据集。

import numpy as np
import pandas as pd
from sklearn.preprocessing import StandardScaler, OneHotEncoder
from sklearn.compose import make_column_transformer, make_column_selector
from sklearn.model_selection import train_test_splitfuel = pd.read_csv('../input/dl-course-data/fuel.csv')X = fuel.copy()
# Remove target
y = X.pop('FE')preprocessor = make_column_transformer((StandardScaler(),make_column_selector(dtype_include=np.number)),(OneHotEncoder(sparse=False),make_column_selector(dtype_include=object)),
)X = preprocessor.fit_transform(X)
y = np.log(y) # log transform target instead of standardizinginput_shape = [X.shape[1]]
print("Input shape: {}".format(input_shape))

如果你喜欢的话,可以看一下数据。

在这个案例中,我们的目标是“FE”列,其余列都是特征。

# Uncomment to see original data
fuel.head()
# Uncomment to see processed features
pd.DataFrame(X[:10,:]).head()

下面是定义我们将用于此任务的网络。

from tensorflow import keras
from tensorflow.keras import layersmodel = keras.Sequential([layers.Dense(128, activation='relu', input_shape=input_shape),layers.Dense(128, activation='relu'),    layers.Dense(64, activation='relu'),layers.Dense(1),
])

1.添加损失函数和优化器。

在训练网络之前,我们需要定义要使用的损失函数和优化器。使用模型的compile方法,添加Adam优化器和MAE损失。

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

2.训练模型

一旦您已经定义了模型并使用损失函数和优化器进行了编译,您就可以开始训练了。

使用批量大小为128,在200个周期内训练网络。输入数据为X,目标为y。

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

最后一步是查看损失曲线并评估训练情况。运行下面的单元格以获得训练损失的图表。

import pandas as pdhistory_df = pd.DataFrame(history.history)
# Start the plot at epoch 5. You can change this to get a different view.
history_df.loc[5:, ['loss']].plot();

评估培训成功程度

如果您进一步训练模型,您是否预期损失会进一步减少?

# View the solution (Run this cell to receive credit!)
q_3.check()

你通过学习率和批量大小可以对以下方面进行一定程度的控制:

* 模型训练所花费的时间

* 学习曲线的噪声程度

* 损失的减小程度

为了更好地理解这两个参数,我们将看看线性模型,即最简单的神经网络。

只有一个权重和一个偏置,更容易看出参数的变化会产生什么影响。

下一个单元格将生成类似教程中的动画。

更改learning_rate、batch_size和num_examples(数据点的数量),然后运行该单元格。(可能需要一两分钟。)尝试以下组合,或尝试一些自己的组合:

# YOUR CODE HERE: Experiment with different values for the learning rate, batch size, and number of examples
learning_rate = 0.05
batch_size = 32
num_examples = 256animate_sgd(learning_rate=learning_rate,batch_size=batch_size,num_examples=num_examples,# You can also change these, if you likesteps=50, # total training steps (batches seen)true_w=3.0, # the slope of the datatrue_b=2.0, # the bias of the data
)

学习率和批量大小

这些参数的变化产生了什么影响?在你考虑完后,观察下面代码后进行讨论。

# View the solution (Run this cell to receive credit!)
q_4.check()

小伙伴们可以参考我这个系列中前面的文章搭建环境,自己演练一下,会有更深的理解。

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

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

相关文章

看似简单的SQL,实则就是简单

加班遇到一个SQL问题,本想把别人的SQL改下成SparkSQL,在YARN上运行,然而数据一直对不上。 原SQL ⚠️说明:a.id,b.id没有空的,数据1:1,b.name可能存在空的 select a.id,b.id,b.name from tab…

JDK1.6、1.7、1.8内存区域的变化?

JDK1.6、1.7/1.8内存区域发生了变化,主要体现在方法区的实现: JDK1.6使用永久代实现方法区: JDK1.7时发生了一些变化,将字符串常量池、静态变量,存放在堆上 在JDK1.8时彻底干掉了永久代,而在直接内存中划出…

【每日八股】Java基础经典面试题4

前言:哈喽大家好,我是黑洞晓威,25届毕业生,正在为即将到来的秋招做准备。本篇将记录学习过程中经常出现的知识点以及自己学习薄弱的地方进行总结🥰。 本篇文章记录的Java基础面试题,如果你也在复习的话不妨…

阿里的库存秒杀是如何实现的?

一、阿里的库存秒杀的实现 阿里有很多业务,几十上百个业务线,各自都有一些需要做抢购、秒杀、热点扣将的场景。他们都用哪些方案呢? 我看了很多资料,也找了很多人做交流,最终得到的结论是啥都有,主要总结几个主流的&…

Linux离线部署gitLab及使用教程

一、下载gitLab的linux系统rpm包 地址:Index of /gitlab-ce/yum/el7/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror 找到这个最新版 点击下载 二、上传到linux系统 笔者是在windows系统下的vmware虚拟机中部署安装的,虚拟机中安装了cent…

《C++ Primer 第五版 中文版》第12章 动态内存【阅读笔记 + 个人思考】

《C Primer 第五版 中文版》第12章 动态内存【阅读笔记 个人思考】 12.1 动态内存与智能指针12.1.1 shared_ptr类 静态内存包括:初始化只读数据段,初始化读写数据段,未初始化数据和常量数据段。 详细在下面博客总结: Linux系统下…

商家如何自己零成本免费制作点餐小程序项目完整源码

现在点餐小程序成为餐饮店的标配,顾客只要扫码,即可进入小程序点餐。顾客付款后,后厨自动打印出订单并开始制作。整个过程非常方便流畅,甚至还可以免去收银(或服务)人员。那么,这种餐饮小程序要…

STM32—控制蜂鸣器(定时器)

目录 1 、 电路构成及原理图 2 、编写实现代码 main.c tim_irq.c 3、代码讲解 4、烧录到开发板调试、验证代码 5、检验效果 此笔记基于朗峰 STM32F103 系列全集成开发板的记录。 1 、 电路构成及原理图 定时器中断是利用定时器的计数功能(向上计数或向下计…

ChatGPTGPT4科研应用、数据分析与机器学习、论文高效写作、AI绘图技术教程

原文链接:ChatGPTGPT4科研应用、数据分析与机器学习、论文高效写作、AI绘图技术教程https://mp.weixin.qq.com/s?__bizMzUzNTczMDMxMg&mid2247598798&idx2&sn014f5ae90306a3b1e8fd87ab58561411&chksmfa820329cdf58a3f72799a43016b223057fd1bd02284…

算法系列--动态规划--子序列(1)

💕"深思熟虑的结果往往就是说不清楚。"💕 作者:Mylvzi 文章主要内容:算法系列–动态规划–子序列(2) 今天带来的是算法系列--动态规划--子序列(1),是子序列问题的开篇!带大家初识子序列问题 一.什么是子序列问题 我们…

某蓝队面试经验

背景 据小道消息说今年的国护疑似提前到了五月份,所以最近也是HW面试的一个高峰期啊,这里分享一下上次长亭的蓝队面试问题(附本人的回答,仅供参考) 面试问答 1、谈谈作为蓝队护网过程使用过厂商的设备 这里我回答的…

Spring Boot整合Spring Security

Spring Boot 专栏:Spring Boot 从零单排 Spring Cloud 专栏:Spring Cloud 从零单排 GitHub:SpringBootDemo Gitee:SpringBootDemo Spring Security是针对Spring项目的安全框架,也是Spring Boot底层安全模块的默认技术…

部署Zabbix Agents添加使能监测服务器_Linux平台_Yum源/Archive多模式

Linux平台 一、从yum源脚本安装部署Zabbix-Agent,添加Linux Servers/PC 概述 Zabbix 主要有以下几个组件组成: Zabbix Server:Zabbix 服务端,Zabbix的核心组件,它负责接收监控数据并触发告警,还负责将监控数据持久化到数据库中。 Zabbix Agent:Zabbix客户端,部署在被监…

Hbase 王者荣耀数据表 HBase常用Shell命令

大数据课本: HBase常用Shell命令 在使用具体的Shell命令操作HBase数据之前,需要首先启动Hadoop,然后再启动HBase,并且启动HBase Shell,进入Shell命令提示符状态,具体命令如下: $ cd /usr/local…

Linux--进程(1)

目录 前言 1.冯诺依曼体系结构 2. 操作系统(Operator System)--第一个被加载的软件 3.进程 3.1基本概念 3.2Linux中的PCB 3.3通过系统调用创建子进程-fork初识 fork:创建一个子进程 为什么要创建子进程? fork的原理: 进一步了解fo…

关于OceanBase中旁路导入的应用分享

背景 前段时间,在用户现场协助进行OceanBase的性能测试时,我注意到用户常常需要运用 insert into select 将上亿行的数据插入到一张大宽表里,这样的批量数据插入操作每次都需要耗时半个小时左右。对这一情况,我提议用户尝试采用旁…

【UE5】动画蒙太奇简述

项目资源文末百度网盘自取 动画蒙太奇基本功能 动画蒙太奇(Animation Montage) 可以将多个 动画序列(Animation Sequences) 合并为单个资产并通过蓝图播放,还可以将一个蒙太奇动画切分为多个 蒙太奇分段(M…

Prompt-RAG:在特定领域中应用的革新性无需向量嵌入的RAG技术

论文地址:https://arxiv.org/ftp/arxiv/papers/2401/2401.11246.pdf 原文地址:https://cobusgreyling.medium.com/prompt-rag-98288fb38190 2024 年 3 月 21 日 虽然 Prompt-RAG 确实有其局限性,但在特定情况下它可以有效地替代传统向量嵌入 …

外包干了5年,技术退步明显.......

先说一下自己的情况,大专生,18年通过校招进入杭州某软件公司,干了接近4年的功能测试,今年年初,感觉自己不能够在这样下去了,长时间呆在一个舒适的环境会让一个人堕落! 而我已经在一个企业干了四年的功能测…

DC-5靶机

一.环境搭建 1.下载地址 靶机下载地址:https://download.vulnhub.com/dc/DC-5.zip 2.虚拟机配置 切换nat模式,有问题全选重试和是,打到这了,我感觉这个配置我都不用写了,启动靶机如下图所示即可 二.开始渗透 1.信…