深度学习:匿名函数lambda函数的使用与numerical_gradient函数
背景:
假设我们有一个简单的线性回归模型,其损失函数是均方误差(MSE):
class LinearModel:def __init__(self):self.W = np.random.randn(1, 1) # 初始化权重def predict(self, x):return np.dot(x, self.W) # 线性预测def loss(self, x, t):y_pred = self.predict(x)return np.mean((y_pred - t) ** 2) # 均方误差# 创建模型实例
model = LinearModel()# 定义输入数据和目标标签
x = np.array([[1], [2], [3]])
t = np.array([[2], [4], [6]])# 定义损失函数
loss_W = lambda W : model.loss(x, t)# 计算损失
current_loss = loss_W(model.W)
print(current_loss)
loss_W = lambda W : self.loss(x, t) :
是一个 lambda 函数,它接受一个参数 W 并返回损失函数的值。具体来说:
lambda W : self.loss(x, t) 定义了一个匿名函数(lambda 函数),它接受一个参数 W。self.loss(x, t) 是损失函数的调用,其中 x 和 t 是损失函数的输入参数。
因此,loss_W 的作用是将参数 W 传递给损失函数 self.loss,并返回损失函数的计算结果。这里的 W 通常是模型中的权重参数,而 x 和 t 分别是输入数据和目标标签。
总结一下,loss_W 是一个接受权重参数 W 并返回损失值的函数。
当然可以将 loss_W 写成一个普通的函数,而不是使用 lambda 表达式。以下是如何将 loss_W 写成一个普通函数的示例:
class LinearModel:def __init__(self):self.W = np.random.randn(1, 1) # 初始化权重def predict(self, x):return np.dot(x, self.W) # 线性预测def loss(self, x, t):y_pred = self.predict(x)return np.mean((y_pred - t) ** 2) # 均方误差# 创建模型实例
model = LinearModel()# 定义输入数据和目标标签
x = np.array([[1], [2], [3]])
t = np.array([[2], [4], [6]])# 定义损失函数
def loss_W(W):model.W = W # 更新模型的权重return model.loss(x, t)# 计算损失
current_loss = loss_W(model.W)
print(current_loss)
在这个例子中:
loss_W 是一个普通的函数,它接受 W 作为参数。在函数内部,首先更新模型的权重 model.W 为传入的 W。然后调用 model.loss(x, t) 计算损失,并返回计算结果。
这种方式与使用 lambda 函数的效果是相同的,但代码的可读性可能会有所提高,特别是对于复杂的逻辑。
以下是梯度的代码,通过下述代码更加深入了解lambda:
def numerical_gradient(f, x):h = 1e-4grad = np.zeros_like(x)for idx in range(x.size):tmp_val = x[idx]x[idx] = tmp_val + hfxh1 = f(x)x[idx] = tmp_val - hfxh2 = f(x)grad[idx] = (fxh1 - fxh2) / (2*h)x[idx] = tmp_valreturn grad
下面的numerical_gradient函数是调用上面函数的
def numerical_gradient(self, x, t):loss_W = lambda W: self.loss(x, t)grads = {}grads['W1'] = numerical_gradient(loss_W, self.params['W1'])grads['b1'] = numerical_gradient(loss_W, self.params['b1'])grads['W2'] = numerical_gradient(loss_W, self.params['W2'])grads['b2'] = numerical_gradient(loss_W, self.params['b2'])return grads
loss函数为:
def predict(self, x):W1, b1 = self.params['W1'], self.params['b1']W2, b2 = self.params['W2'], self.params['b2']a1 = np.dot(x, W1) + b1z1 = sigmoid(a1)a2 = np.dot(z1, W2) + b2y = a2return ydef loss(self, x, t):y = self.predict(x)return self.lastLayer.forward(y, t)
所以在下述代码中
loss_W = lambda W: self.loss(x, t)grads = {}grads['W1'] = numerical_gradient(loss_W, self.params['W1'])grads['b1'] = numerical_gradient(loss_W, self.params['b1'])grads['W2'] = numerical_gradient(loss_W, self.params['W2'])grads['b2'] = numerical_gradient(loss_W, self.params['b2'])
例如grads[‘W1’] = numerical_gradient(loss_W, self.params[‘W1’]) 会调用第一个 numerical_gradient函数用
(f(x+h) - f(x-h))/2*h计算梯度,而由于匿名函数有更新参数的作用,所以当x=self.params[‘W1’]时,计算f(x+h)本例即匿名函数loss_W时会自动将模型中的self.params[‘W1’]=self.params[‘W1’]+h,作用就是匿名函数返回的self.loss(x, t)调用的predict函数里的对应参数会相应更新,这样即可获得在更新后的W1条件下对应的predict输出值从而计算loss。
同理以下
grads[‘b1’] = numerical_gradient(loss_W, self.params[‘b1’])
grads[‘W2’] = numerical_gradient(loss_W, self.params[‘W2’])
grads[‘b2’] = numerical_gradient(loss_W, self.params[‘b2’])
也是一样的原理,使用匿名函数可以在改变后的参数下,返回需要的函数值,很方便。
相关文章:
深度学习:匿名函数lambda函数的使用与numerical_gradient函数
背景: 假设我们有一个简单的线性回归模型,其损失函数是均方误差(MSE): class LinearModel:def __init__(self):self.W np.random.randn(1, 1) # 初始化权重def predict(self, x):return np.dot(x, self.W) # 线性预…...
PHP数据类型
几种常用的数据类型: String(字符串) Integer(整型) Float(浮点型) Boolean(布尔型) NULL(空值) Array(数组) Obje…...
2FA-双因素认证
双因素认证(2FA,Two-Factor Authentication)是一种提高安全性的方法,要求用户在登录或进行某些敏感操作时提供两种不同类型的身份验证信息。这种方法通过引入第二层验证,增加了账户被未经授权访问的难度。 项目结构 …...
解决 Python 中的 TypeError 错误
解决 Python 中的 TypeError 错误 在 Python 编程中,TypeError 是一种常见的错误,通常发生在尝试对不兼容的类型进行操作时。了解这个错误的原因以及如何有效解决它,对于提高代码的可靠性和可读性至关重要。本文将详细讨论 TypeError 的成因…...
快速学会C 语言基本概念和语法结构
😀前言 本篇博文是关于C 语言的基本概念和语法结构,希望你能够喜欢 🏠个人主页:晨犀主页 🧑个人简介:大家好,我是晨犀,希望我的文章可以帮助到大家,您的满意是我的动力&a…...
Python酷库之旅-第三方库Pandas(172)
目录 一、用法精讲 791、pandas.UInt8Dtype类 791-1、语法 791-2、参数 791-3、功能 791-4、返回值 791-5、说明 791-6、用法 791-6-1、数据准备 791-6-2、代码示例 791-6-3、结果输出 792、pandas.UInt16Dtype类 792-1、语法 792-2、参数 792-3、功能 792-4、…...
Linux系统下minio设置SSL证书进行HTTPS远程连接访问
文章目录 1.配置SSL证书使用HTTPS访问2.MINIO SDK 忽略证书验证3.使用受信任的证书 1.配置SSL证书使用HTTPS访问 生成域名对应的SSL证书,下载Apache版本,我目前只发现Apache这个里面有对应的私钥和证书 私钥重命名为private.key证书重命名为public.crt&…...
npm 包的命名空间介绍,以及@typescript-eslint/typescript-eslint
npm 包的命名空间是一个重要的概念,用于组织和管理相关的包。通过命名空间,开发者可以避免命名冲突、增强包的可读性和可维护性。以下是关于 npm 命名空间的详细介绍,并以 typescript-eslint 作为示例。 1. 命名空间的结构 命名空间的格式为…...
ecovadis评估是什么,有什么提成自己评分等级
EcoVadis评估是一个企业社会责任(CSR)评级平台,旨在评估全球供应链的可持续性和道德情况。以下是对EcoVadis评估的详细介绍以及提升其评分等级的方法: 一、EcoVadis评估概述 定义:EcoVadis评估通过一系列框架评估公司…...
Vue3中ref、toRef和toRefs之间有什么区别?
前言 Vue 3 引入了组合式 API,其中 ref、toRef 和 toRefs 是处理响应式数据的核心工具。作为高级计算机工程师,我们有必要深入理解这些工具的细微差别,以便在实际项目中更加高效地管理状态。本文将详细解析 ref、toRef 和 toRefs 的区别&…...
react开发技巧
/* eslint-disable no-useless-escape */ const Validator { isEmail: /^([a-zA-Z0-9_\.\-])\(([a-zA-Z0-9\-])\.)([a-zA-Z0-9]{2,4})$/, // 校验邮箱 isPhoneNumber: /^1[3456789]\d{9}$/, // 手机号码验证 isMobileNumber: /^(\(\d{3,4}\)|\d{3,4}-|\s)?\d{7,14}$/, //…...
HarmonyOS第一课——HarmonyOS介绍
HarmonyOS第一课 HarmonyOS介绍 HarmonyOS是新一代的智能终端操作系统(泛终端服务的载体); 智慧互联协同,全场景交互体验; 核心技术理念: 一次开发 多次部署: 预览 可视化开发UI适配 事件交…...
XCode16中c++头文件找不到解决办法
XCode16中新建Framework,写完自己的c代码后,提示“<string> file not found”等诸如此类找不到c头文件的错误。 工程结构如下: App是测试应用,BoostMath是Framework。基本结构可以参考官方demo:Mix Swift and …...
CSS - 保姆级面试基础扫盲版本一
盒子模型 盒子模型定义: 当对一个盒子模型进行文档布局的时候,浏览器的渲染引擎会根据标准之一的CSS盒子模型(CSS basic box model),将所有元素表示成一个个矩阵盒子。 一个盒子通常由四部分组成:border p…...
51c自动驾驶~合集2
我自己的原文哦~ https://blog.51cto.com/whaosoft/11491137 #BEVWorld BEV潜在空间构建多模态世界模型,全面理解自动驾驶~一、引言 世界模型建模了有关环境的知识,其可以通过给定的条件对未来进行合理的想象。未来想象要求世界模型具有物理规律的理解…...
Redis后台任务有哪些
Redis后台任务 为了有更好的性能表现,redis对于一些比较耗时的操作会异步执行,不阻塞线上请求。文章从源码(redis7.0)来看,aof、rdb文件的关闭,aof文件的刷盘以及部分内存释放会采用异步方式,在后台线程中执行。接下来…...
TPair<TKey, TValue> 键值对
在 Delphi(或更准确地说是 Object Pascal,Delphi 的编程语言)中,TList<T> 是泛型列表的一个实现,其中 T 是列表中元素的类型。TPair<TKey, TValue> 是一个包含两个元素的记录(record࿰…...
【杂谈】城市规划教育的危与机
城市规划教育的危与机 (赵燕菁 原文为作者在 第21届中国城市规划学科发展论坛上的发言,有删减和改动)如有侵权,立即删除 过去几年,尤其是从2022年后房地产市场的下行开始,中国的城市规划陷入前所未有的危…...
金融工程--pine-script 入门
背景 脚本基本组成 指标 常见的趋势类指标:均线类(MAs)、支撑/压力位(Support/Resistance)、趋势线(Trend Lines)、趋势通道(Trend Channels)、一目均衡表(Ichimoku)和 艾略特波浪(ElliotWave)。 均线指标 策略 策略种类 在TradingView上,有许多交易…...
Vue3 跨标签页或跨窗口通信
在 Vue 应用中,跨标签页或跨窗口的通信通常涉及到两个或多个浏览器标签页之间的信息共享。由于每个标签页或窗口都是独立的 JavaScript 执行环境,它们不能直接通过 Vue 或其他 JavaScript 库来直接相互通信。但是,有一些方法可以实现这种跨标…...
TVA 与传统工业视觉:技术内核与应用分野(5)
重磅预告:本专栏将独家连载新书《AI视觉技术:从入门到进阶》精华内容。本书是《AI视觉技术:从进阶到专家》的权威前导篇,特邀美国 TypeOne 公司首席科学家、斯坦福大学博士 Bohan 担任技术顾问。Bohan先生师从美国三院院士、“AI教…...
AI编程助手Code-Buddy:本地优先、插件化架构与工程实践全解析
1. 项目概述:一个为开发者量身打造的智能代码伙伴 最近在逛GitHub的时候,发现了一个挺有意思的项目,叫 runkids/code-buddy 。光看名字,“代码伙伴”,就让人感觉这应该是个能帮我们写代码、解决开发问题的工具。点进…...
RAG:解锁大语言模型新能力,告别幻觉与知识陈旧!
本文深入解析了检索增强生成(RAG)架构,旨在解决传统大语言模型因知识局限而产生的幻觉、陈旧等问题。RAG通过在生成答案前检索外部知识库,提升回答的准确性和时效性。文章详细介绍了RAG的架构类型(如无微调、检索器微调…...
2025届毕业生推荐的五大降AI率平台横评
Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 当前,在生成式AI普及应用这个阶段,内容辨识度偏高这种情况࿰…...
从DenseNet到特征复用:揭秘密集连接如何重塑卷积网络
1. 密集连接:卷积网络的第三次进化 记得我第一次跑图像分类任务时,用的还是传统的VGG网络。那时候为了提升准确率,只能不断堆叠卷积层,结果模型体积像吹气球一样膨胀到500MB。直到2017年遇到DenseNet,才发现原来只需要…...
告别300MB限制!用ZotFile插件+坚果云,打造你的免费Zotero文献同步方案
告别300MB限制!用ZotFile插件坚果云打造高效文献同步方案 在学术研究的日常中,文献管理工具Zotero无疑是许多人的得力助手。然而,免费账户仅有的300MB存储空间,对于需要处理大量PDF文献的研究者来说,往往显得捉襟见肘。…...
深度学习提取结构光条中心线项目的对比实验与消融实验统计分析方法研究
深度学习提取结构光条中心线项目的对比实验与消融实验统计分析方法研究 1 引言 线结构光三维测量技术凭借其非接触、高精度、快速测量等优势,在工业测量、三维重建、智能制造等领域得到了广泛应用。在结构光视觉测量系统中,光条中心线的提取精度直接决定了三维重建和尺寸测…...
技术解析:OBS Source Record - 独立源录制解决方案
技术解析:OBS Source Record - 独立源录制解决方案 【免费下载链接】obs-source-record 项目地址: https://gitcode.com/gh_mirrors/ob/obs-source-record OBS Source Record插件通过创新的滤镜架构,解决了多源独立录制的技术难题,为…...
意义如何保持活性:一项基于岐金兰哲学体系的系统性阐释
意义如何保持活性:一项基于岐金兰哲学体系的系统性阐释导论:一座理论大厦的蓝图本文旨在对岐金兰哲学体系进行系统性阐释。这一体系围绕一个核心问题展开:意义如何在系统中保持活性,而非走向僵死?这一追问看似抽象&…...
如何快速清理重复图片:AntiDupl.NET智能去重工具的完整指南
如何快速清理重复图片:AntiDupl.NET智能去重工具的完整指南 【免费下载链接】AntiDupl A program to search similar and defect pictures on the disk 项目地址: https://gitcode.com/gh_mirrors/an/AntiDupl 你是否曾因硬盘空间被重复图片悄无声息地吞噬而…...
