吴恩达深度学习课程二: 改善深层神经网络 第三周:超参数调整,批量标准化和编程框架(五)框架演示

news/2025/11/20 17:10:34/文章来源:https://www.cnblogs.com/Goblinscholar/p/19247767

此分类用于记录吴恩达深度学习课程的学习笔记。
课程相关信息链接如下:

  1. 原课程视频链接:[双语字幕]吴恩达深度学习deeplearning.ai
  2. github课程资料,含课件与笔记:吴恩达深度学习教学资料
  3. 课程配套练习(中英)与答案:吴恩达深度学习课后习题与答案

本篇为第二课的第三周内容,3.11的内容,也是本周理论部分的最后一篇。


本周为第二课的第三周内容,你会发现这周的题目很长,实际上,作为第二课的最后一周内容,这一周是对基础部分的最后补充。
在整个第一课和第二课部分,我们会了解到最基本的全连接神经网络的基本结构和一个完整的模型训练,验证的各个部分。
之后几课就会进行更多的实践和进阶内容介绍,从“通用”走向“特化”。
总的来说这周的难度不高,但也有需要理解的内容,我仍会在相对较难理解的部分增加更多基础和例子,以及最后的“人话版”总结。

本篇的内容关于框架高效性的演示,本课程这里开始正式引入深度学习的编程框架TensorFlow,并没有理解上的难度,只需要了解相应的语法即可。

1. Tensorflow的高效性

此前的我们的实践主要使用 PyTorch,PyTorch 与 TensorFlow 是目前最主流的两个深度学习框架,使用它们的开发者几乎占到了整个生态的绝大多数。二者虽然起初有一些明显的差别,但随着一代代更新,也越发的相似,并不存在明显的优劣之分。

要提前说明的是,课程中对Tensorflow的演示只限于反向传播部分,用来展示框架的高效性。我们先进行复现,之后再进行一些拓展。

1.1 Tensorflow1.x 的反向传播

这部分我们就复现一下课程的内容。
假设现在有一个损失函数如下:

\[J(W) = W^2-10W+25 \]

你可能已经知道这个函数最小时 \(W=5\) 了,现在我们看看通过 Tensorflow 来最小化这个损失函数的过程。
首先还是导库,这段语法我们在课程一第二周的代码实践里已经介绍过了,就不再多提了。

import numpy as np
import tensorflow as tf

然后来看第一步:初始化用于优化和反向更新的变量。

# 1.定义用于反向传播,可以更新的变量
w = tf.Variable(0,dtype = tf.float32)
# 0:初值 
# dtype = tf.float32 : 数据类型为32位浮点数
# 你可以直接把它理解为c语言里的 float w =0; 只是在tf里强调为进行反向传播和优化的变量。

然后我们把刚刚的损失函数代码化,这里要说明的一点是,如果你看过原视频,视频里还用了另一种方法来表示,但那种较为繁琐,在实际编码中很少在定义函数中使用,就不展示了。

# 2.定义损失函数
cost = w**2 - 10w + 25

继续,调用梯度下降法来最小化损失函数:

# 3.进行反向传播
train = tf.train.GradientDescentOptimizer(0.01).minimize(cost)
# GradientDescentOptimizer 直译:梯度下降优化器,实际上,这个方法在更新中已经被移除。
# 0.01 :学习率
# minimize(cost) :类方法,最小化损失函数

现在,我们就可以看看如何开始训练,这里就是tf 的一些固定设置。
要强调一点的是,这种“启动会话”的语法是tensorflow1.x的语法,在2.x的版本中有了更便捷的语法。
但有趣的是这种语法并没有被淘汰,1.x拥有较强的兼容性和稳定性,2.x带来的重构会让很多使用1.x的项目出现bug,因此使用1.x仍是很多人的选择。

# 4.初始化和创建会话
init = tf.global_variables_initializer() # 初始化所有 TensorFlow 变量,固定语法。
session = tf.Session() # 创建一个 TensorFlow 会话,用于执行计算,固定语法。
session.run(init) # 执行初始化操作,初始化图中的变量,固定语法。
print(session.run(w)) # 打印变量 w的值(在初始化之后,它应该是 0.0)。

最后开始训练,打印训练完的参数:

# 5.训练
for i in range(1000):session.run(train) #进行一千次训练
print(session.run(w))# 打印训练完的w

我们给出完整代码

import numpy as np
import tensorflow as tfw = tf.Variable(0,dtype = tf.float32)
cost = w**2 - 10*w + 25
train = tf.train.GradientDescentOptimizer(0.01).minimize(cost)init = tf.global_variables_initializer()
session = tf.Session()
session.run(init)
print(session.run(w))for i in range(1000):session.run(train) 
print(session.run(w))

现在,如果像课程里一样使用 tensorflow1.x来运行,你就可以看到w从0到无限接近5的训练效果
就像课程里这样:
Pasted image 20251120112008

我们没有定义反向传播,没有定义更新公式,没有定义求导方法,这一切都由框架帮我们封装在我们调用的函数里,这就是框架的高效性所在。

1.2 Tensorflow2.x 的反向传播

无论如何,2.x在2019年就已经发布了,虽然1.x仍占有一定份额,但与时俱进仍然是必要的,我们来看看上面的代码在2.x版本里是什么样的。

import tensorflow as tf
# 1. 定义变量 w,通过“.”自动识别为32位浮点型
w = tf.Variable(0.) # 2.优化器的API替换: GradientDescentOptimizer → SGD
optimizer = tf.keras.optimizers.SGD(learning_rate=0.01)# 3.没有会话机制,可以直接打印参数
print(w)
# numpy()是w的数值部分
print(w.numpy())# 3. 训练循环
for i in range(200):# GradientTape 是 TF2 的自动求导工具,# 相当于一个“梯度记录器”:所有在 tape 下发生的计算# 都会被记录,用来事后求梯度。with tf.GradientTape() as tape:# 每次循环都重新计算损失,GradientTape 会追踪计算过程cost = w**2 - 10*w + 25# 自动求梯度# 这一步在 TF1.x 中被封装在minimize(cost)里。grads = tape.gradient(cost, [w])# 使用优化器(SGD)根据梯度更新 w# TF1.x 中 session.run(train) 就在内部完成了这一步。optimizer.apply_gradients(zip(grads, [w]))# 4.打印最终 w
print(w.numpy())

其结果如下:
Pasted image 20251120161131

可以看到同样几乎完成了cost的最小化。

很明显,TF的1.x和2.x有了很多API和机制上的不同,这带来了一定程度的“陌生感”。
但无论如何,这种很庞大的,完整的框架都需要一定的学习时间,有一个熟练使用的过程。

2. pytorch 和 Tensorflow

上两部分只是用了一个简单的cost来演示框架在反向传播中的高效性,现在我们已经了解了这一点,我们可以通过调用框架里的模块和方法来简便的完成复杂网络的构建。
现在,我们再对比一下框架间的不同。
还是用我们一直在每周的代码实践部分更新的pytorch框架中的网络结构:

class NeuralNetwork(nn.Module):  def __init__(self):  super().__init__()  self.flatten = nn.Flatten()  self.hidden1 = nn.Linear(128 * 128 * 3, 1024)  self.hidden2 = nn.Linear(1024, 512)  self.hidden3 = nn.Linear(512, 128)  self.hidden4 = nn.Linear(128, 32)  self.hidden5 = nn.Linear(32, 8)  self.hidden6 = nn.Linear(8, 3)  self.relu = nn.ReLU()  # 输出层  self.output = nn.Linear(3, 1)  self.sigmoid = nn.Sigmoid()  # Xavier初始化输出层  init.xavier_uniform_(self.output.weight)  def forward(self, x):  x = self.flatten(x)  x = self.relu(self.hidden1(x))  x = self.relu(self.hidden2(x))  x = self.relu(self.hidden3(x))  x = self.relu(self.hidden4(x))  x = self.relu(self.hidden5(x))  x = self.relu(self.hidden6(x))  x = self.sigmoid(self.output(x))  return x

如果你看过之前每周的代码实践部分,想必对这段代码并不陌生。
如果你没有这方面的基础也不用担心,这只是使用另一个框架构建的网络结构。
而用Tensorflow来构建这个网络是这样,你会发现二者很相似

import tensorflow as tf
from tensorflow.keras import layers, modelsclass NeuralNetwork(tf.keras.Model):def __init__(self):super(NeuralNetwork, self).__init__()self.flatten = layers.Flatten()#1.网络层设置,少了“接水管”过程,会自动适配上一层输出大小。#2.激活函数改为包含在层参数里。self.hidden1 = layers.Dense(1024, activation='relu')self.hidden2 = layers.Dense(512, activation='relu')self.hidden3 = layers.Dense(128, activation='relu')self.hidden4 = layers.Dense(32, activation='relu')self.hidden5 = layers.Dense(8, activation='relu')self.hidden6 = layers.Dense(3, activation='relu')self.output = layers.Dense(1, activation='sigmoid')def call(self, x):x = self.flatten(x)x = self.hidden1(x)x = self.hidden2(x)x = self.hidden3(x)x = self.hidden4(x)x = self.hidden5(x)x = self.hidden6(x)x = self.output(x)return xmodel = NeuralNetwork()# 3.初始化
# 对于 ReLU激活函数,TensorFlow默认使用 He 初始化
# 对于 sigmoid(或者其他饱和激活函数),TensorFlow 默认使用Xavier初始化
initializer = tf.initializers.GlorotUniform()
model.output.kernel_initializer = initializer

在大体结构相似下二者仍有各自的不同之处,因为框架的庞大,本篇展示的只是冰山一角。
总的来说,框架的本质还是使用别人封装好的代码,在了解,学习的基础上,使用什么框架,框架的什么版本都还是应以适合自己为主。

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

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

相关文章

Pandoc Markdown 转 Word

📝 Pandoc Markdown 转 Word 0. 准备工作安装 Pandoc:下载地址 适用场景:将 LLM 生成的 Markdown(含 LaTeX 公式、表格、代码)无损转换为可编辑的 Word 文档。1. 基础模式:直接转换 如果不关心字体、行距等排版…

探索性测试:理论根基、实践精髓与未来趋势——精细解析核心原理、实操策略与多元化应用影响

引言 在当今信息化社会,软件已成为支撑各行各业高效运作的关键载体,其质量直接影响到用户体验、业务运行乃至企业竞争力。随着软件复杂度的不断提升以及市场对快速迭代和高质量交付的需求日益迫切,传统的线性、预定…

184天 横向移动

工作太忙了,都没时间学习NTLM攻击

P11958 「ZHQOI R1」划分

你发现一个神秘结论:将序列分成若干不相交段,取段头段尾乘积和一定能够得到答案。于是得到转移式,使用李超即可通过。 一般分段题要么考虑 DS 大力维护,要么考虑斜优,单调性,凸包,要么就是考虑这种神秘结论(通…

Java初尝试:电梯调度迭代开发

前言: 在本学期,我第一次接触到Java这门面向对象的编程语言,此前我已经持续使用了两年多的面向过程的C语言编程,并一直认为掌握好C语言这一门就能解决大部分的问题,但随着这几次从用Java语言实现的电梯调度程序再…

推荐几家烘箱厂家:国内优质供应商实力盘点

烘箱作为工业生产、科研实验等领域的关键设备,其性能稳定性、温度控制精度直接影响生产效率与实验结果。选择技术成熟、服务完善的厂家,是保障设备长期可靠运行的基础。以下为大家推荐几家在烘箱及相关设备领域表现突…

2025年 11月 上海网站建设与小程序一体化搭建方案 甄选推荐

(一)前期需求诊断:锚定上海产业适配方向 业务场景聚焦:先明确核心业务属性,若为跨境电商企业,需锁定多语种切换、跨境支付接口、海外仓实时查询等功能需求;陆家嘴金融科技企业则重点规划资质展示模块、数据加密系统…

2025 年湖南无人机培训机构精选:专业资质、实战教学与就业保障全覆盖!

2025 年湖南无人机培训机构精选:专业资质、实战教学与就业保障全覆盖! 随着湖南省低空经济政策的持续推进,无人机技术在农业植保、电力巡检、地理测绘、应急救援等领域的应用愈发广泛,市场对具备专业资质的无人机飞…

2025年啤酒设备生产厂家权威推荐榜单:啤酒设备厂家/精酿啤酒设备厂家/精酿啤酒厂设备源头厂家精选

在精酿啤酒行业蓬勃发展的当下,一套优质的啤酒设备是酿造成功的关键。 在啤酒酿造行业,设备的性能与稳定性直接影响生产效率与产品质量。据统计,我国啤酒设备市场规模正以年均8%的速度增长,市场竞争日趋激烈。 一套…

java---gradle

java使用gradle构建项目: 可以先下载gradle:https\://services.gradle.org/distributions/gradle-7.6-bin.zip然后解压到合适的目录:打开Idea:设置使用gradle构建SpringBoot项目:https://www.bilibili.com/video/…

2025年行业内评价高的管材品牌推荐,管材源头厂家深度剖析,品牌全面评测,助力家装水管材/市政管材/市政管道/PVC管道/排水管明智之选

随着城市化进程加速和家装品质需求升级,管材行业迎来技术革新与市场扩容的双重机遇。本榜单基于产品质量可靠性、技术创新力、区域服务覆盖度三大核心维度,结合行业协会数据及市场调研反馈,权威解析2025年五大管材品…

工业级主板:宽温宽压加持,24小时不间断运行的工控核心

一、工业场景的“刚性需求”:为何普通主板难以胜任? 在智能制造、车载终端、户外安防、边缘计算等工业场景中,设备运行环境往往充满挑战:零下 40℃的极寒户外、85℃的高温车间、电压波动频繁的偏远工地、电磁干扰严…

MapV-Three地图检索服务:三个API搞定90%的搜索需求

MapV-Three地图检索服务:三个API搞定90%的搜索需求MapV-Three地图检索服务:三个API搞定90%的搜索需求 地图应用开发中,搜索功能是绕不开的话题。用户想找个地方、定位个坐标、或者输入时来点智能提示——这些看似简…

2025最新推荐!云南旅游旅行社口碑排行榜,权威榜单助选云南旅游服务机构

云南以多元民族文化与瑰丽自然景观成为旅游热门地,但旅游市场中旅行社质量良莠不齐,隐性消费、行程缩水、服务断层等问题频发:低价团暗藏强制购物陷阱,承诺的非遗体验沦为走马观花,山区线路用车不合规存安全隐患。…

元宇宙与医疗健康的深度融合:重构诊疗、培训与健康管理新生态 - 指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

详细介绍:python pytest 学习笔记 Day02

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

2025云南冻品批发供应商最新TOP5权威推荐 餐饮店优质冻品源头厂家、烧烤食材品牌选购指南

当前冻品批发领域需求稳步增长,餐饮企业、食品加工厂等采购方对产品品质、品类丰富度及冷链稳定性的要求不断提高,行业竞争也愈发激烈。部分商家存在品质管控缺失、冷链供应链薄弱、产品创新不足等问题,让采购方难以…

赛后总结---Codeforces Round 1064 (Div. 2)(虚拟参赛)

Codeforces Round 1064 (Div. 2) A. Same Difference给定一个长度为 \(n\) 的字符串 \(\{s_i\}\),一次操作可以将 \(s_i\) 替换为 \(s_{i+1}\)。求最终使得 \(\{s_i\}\) 内每个字符都相同的最小操作次数。显然最后一个…

低功耗抗干扰液晶驱动工控仪表段码驱动显示IC VK2C21BA LCD驱动原厂

VK2C21BA是一个点阵式存储映射的LCD驱动器,可支持最大64点(16SEGx4COM)或者最大96点(12SEGx8COM)的LCD屏。单片机可通过I2C接口配置显示参数和读写显示数据,也可通过指令进入省电模式。其高抗干扰,低功耗的特性…

我们的多商户在线客服系统:支持对接多商户商城

vx: llike620 gofly.v1kf.com 嗨,大家好!今天我想跟大家分享我们为多商户在线商城量身打造的客服系统——一个真正为中小企业和商家着想的解决方案。 为什么我们的客服系统与多商户商城完美契合? 想象一下,如果你有…