Python(TensorFlow)衍射光学层卷积算法模拟(英伟达GPU)

🎯要点

🎯衍射光学卷积算法模拟 | 🎯模拟或数字电子计算之前加入一层光学计算 | 🎯前馈卷积神经网络计算成像系统对输入图像进行分类 | 🎯相位掩模利用线性空间不变成像系统执行固有卷积

📜用例 Python非线性光学映射数据压缩算法

🍪语言内容分比

在这里插入图片描述
在这里插入图片描述

🍇Python随机梯度下降算法

成本函数或损失函数是通过改变决策变量来最小化(或最大化)的函数。许多机器学习方法都在解决表面下的优化问题。它们倾向于通过调整模型参数(如神经网络的权重和偏差、随机森林或梯度提升的决策规则等)来最小化实际输出和预测输出之间的差异。

在回归问题中,通常具有输入变量 x = ( x 1 , … , x r ) x =\left(x_1, \ldots, x_r\right) x=(x1,,xr) 的向量和实际输出 y y y。您想要找到一个将 x x x 映射到预测响应 f ( x ) f( x ) f(x) 的模型,以便 f ( x ) f( x ) f(x) 尽可能接近 y y y。例如,您可能想要根据某人在公司工作的年数或教育水平等输入来预测某人的工资等输出。

您的目标是最小化预测 f ( x ) f( x ) f(x) 与实际数据 y y y 之间的差异。这种差异称为残差。在此类问题中,您希望最小化残差平方和,其残差平方和 = Σ i ( y i − f ( x i ) ) 2 =\Sigma_{ i }\left(y_{ i }-f\left( x _{ i }\right)\right )^2 =Σi(yif(xi))2 对于所有观测值 i = 1 , … , n i=1, \ldots, n i=1,,n,其中 n n n 是观测值总数。或者,您可以使用均方误差 (MSE = SSR ⁡ / n ) =\operatorname{SSR} / n) =SSR/n) 代替残差平方和。

最小化残差平方和和均方误差都使用实际输出和预测输出之差的平方。差异越小,预测越准确。差异为零表示预测与实际数据相同。

通过调整模型参数来最小化残差平方和或均方误差。例如,在线性回归中,你想要找到函数 f ( x ) = b 0 + b 1 x 1 + ⋯ + b r x r f( x )=b_0+b_1 x_1+\cdots+b_{ r } x_{ r } f(x)=b0+b1x1++brxr,因此你需要确定权重 b 0 , b 1 , … , b r b_0, b_1, \ldots , b_{ r } b0,b1,,br 最小化残差平方和或均方误差。

在分类问题中,输出 y y y 是分类的,通常为 0 或 1 。例如,您可能尝试预测电子邮件是否是垃圾邮件。在二进制输出的情况下,可以方便地最小化交叉熵函数,该函数也取决于实际输出 y i y_{ i } yi 和相应的预测 p ( x i ) p\left( x _{ i }\right) p(xi)
H = − ∑ i ( y i log ⁡ ( p ( x i ) ) + ( 1 − y i ) log ⁡ ( 1 − p ( x i ) ) ) H=-\sum_i\left(y_i \log \left(p\left( x _i\right)\right)+\left(1-y_i\right) \log \left(1-p\left( x _i\right)\right)\right) H=i(yilog(p(xi))+(1yi)log(1p(xi)))
在常用于解决分类问题的逻辑回归中,函数 p ( x ) p( x ) p(x) f ( x ) f( x ) f(x) 定义如下:
p ( x ) = 1 1 + exp ⁡ ( − f ( x ) ) f ( x ) = b 0 + b 1 x 1 + ⋯ + b r x r \begin{gathered} p( x )=\frac{1}{1+\exp (-f( x ))} \\ f( x )=b_0+b_1 x_1+\cdots+b_r x_r \end{gathered} p(x)=1+exp(f(x))1f(x)=b0+b1x1++brxr
同样,您需要找到权重 b 0 、 b 1 、 … 、 b r b_0、b_1、\ldots、b_r b0b1br,但这一次它们应该最小化交叉熵函数。

在微积分中,函数的导数显示当您修改其参数时值的变化量。导数对于优化很重要,因为零导数可能表示最小值、最大值或鞍点。

多个自变量 v 1 , … , v r v_1, \ldots, v_{ r } v1,,vr 的函数 C C C 的梯度用 ∇ C ( v 1 , … , v r ) \nabla C\left(v_1, \ldots, v_{ r }\right) C(v1,,vr) 表示,并定义为 C C C 对每个自变量的偏导数的向量函数: ∇ C = ( ∂ C / ∂ v 1 , … , ∂ C / v r ) \nabla C=\left(\partial C / \partial v_1, \ldots, \partial C / v_r\right) C=(C/v1,,C/vr)。符号 ∇ \nabla 称为 nabla。

函数 C C C 在给定点的梯度的非零值定义了 C C C 最快增长的方向和速率。使用梯度下降时,您对成本函数下降最快的方向感兴趣。该方向由负梯度 − ∇ C -\nabla C C 确定。

基本梯度下降

这是该算法的基本实现,从任意点开始,迭代地将其移向最小值,并返回一个有望达到或接近最小值的点:

def gradient_descent(gradient, start, learn_rate, n_iter):vector = startfor _ in range(n_iter):diff = -learn_rate * gradient(vector)vector += diffreturn vector

在应用gradient_descent()之前,您可以添加另一个终止条件:

import numpy as npdef gradient_descent(gradient, start, learn_rate, n_iter=50, tolerance=1e-06
):vector = startfor _ in range(n_iter):diff = -learn_rate * gradient(vector)if np.all(np.abs(diff) <= tolerance):breakvector += diffreturn vector

您只需要一条语句来测试梯度下降实现:

>>> gradient_descent(
...     gradient=lambda v: 2 * v, start=10.0, learn_rate=0.2
... )
2.210739197207331e-06

随机梯度下降算法

随机梯度下降算法是梯度下降的一种改进。在随机梯度下降中,您仅使用观测值的随机一小部分而不是全部来计算梯度。在某些情况下,这种方法可以减少计算时间。

import numpy as npdef sgd(gradient, x, y, start, learn_rate=0.1, batch_size=1, n_iter=50,tolerance=1e-06, dtype="float64", random_state=None
):if not callable(gradient):raise TypeError("'gradient' must be callable")dtype_ = np.dtype(dtype)x, y = np.array(x, dtype=dtype_), np.array(y, dtype=dtype_)n_obs = x.shape[0]if n_obs != y.shape[0]:raise ValueError("'x' and 'y' lengths do not match")xy = np.c_[x.reshape(n_obs, -1), y.reshape(n_obs, 1)]seed = None if random_state is None else int(random_state)rng = np.random.default_rng(seed=seed)vector = np.array(start, dtype=dtype_)learn_rate = np.array(learn_rate, dtype=dtype_)if np.any(learn_rate <= 0):raise ValueError("'learn_rate' must be greater than zero")batch_size = int(batch_size)if not 0 < batch_size <= n_obs:raise ValueError("'batch_size' must be greater than zero and less than ""or equal to the number of observations")n_iter = int(n_iter)if n_iter <= 0:raise ValueError("'n_iter' must be greater than zero")tolerance = np.array(tolerance, dtype=dtype_)if np.any(tolerance <= 0):raise ValueError("'tolerance' must be greater than zero")for _ in range(n_iter):rng.shuffle(xy)for start in range(0, n_obs, batch_size):stop = start + batch_sizex_batch, y_batch = xy[start:stop, :-1], xy[start:stop, -1:]grad = np.array(gradient(x_batch, y_batch, vector), dtype_)diff = -learn_rate * gradif np.all(np.abs(diff) <= tolerance):breakvector += diffreturn vector if vector.shape else vector.item()

随机梯度下降的动量

import numpy as npdef sgd(gradient, x, y, start, learn_rate=0.1, decay_rate=0.0, batch_size=1,n_iter=50, tolerance=1e-06, dtype="float64", random_state=None
):if not callable(gradient):raise TypeError("'gradient' must be callable")dtype_ = np.dtype(dtype)x, y = np.array(x, dtype=dtype_), np.array(y, dtype=dtype_)n_obs = x.shape[0]if n_obs != y.shape[0]:raise ValueError("'x' and 'y' lengths do not match")xy = np.c_[x.reshape(n_obs, -1), y.reshape(n_obs, 1)]seed = None if random_state is None else int(random_state)rng = np.random.default_rng(seed=seed)vector = np.array(start, dtype=dtype_)learn_rate = np.array(learn_rate, dtype=dtype_)if np.any(learn_rate <= 0):raise ValueError("'learn_rate' must be greater than zero")decay_rate = np.array(decay_rate, dtype=dtype_)if np.any(decay_rate < 0) or np.any(decay_rate > 1):raise ValueError("'decay_rate' must be between zero and one")batch_size = int(batch_size)if not 0 < batch_size <= n_obs:raise ValueError("'batch_size' must be greater than zero and less than ""or equal to the number of observations")n_iter = int(n_iter)if n_iter <= 0:raise ValueError("'n_iter' must be greater than zero")tolerance = np.array(tolerance, dtype=dtype_)if np.any(tolerance <= 0):raise ValueError("'tolerance' must be greater than zero")diff = 0for _ in range(n_iter):# Shuffle x and yrng.shuffle(xy)for start in range(0, n_obs, batch_size):stop = start + batch_sizex_batch, y_batch = xy[start:stop, :-1], xy[start:stop, -1:]grad = np.array(gradient(x_batch, y_batch, vector), dtype_)diff = decay_rate * diff - learn_rate * gradif np.all(np.abs(diff) <= tolerance):breakvector += diffreturn vector if vector.shape else vector.item()

👉参阅、更新:计算思维 | 亚图跨际

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

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

相关文章

大语言模型与多模态大模型loss计算

文章目录 前言一、大语言模型loss计算1、loss计算代码解读2、构建模型输入内容与label标签3、input_ids与labels格式 二、多模态大模型loss计算方法1、多模态loss计算代码解读2、多模态输入内容2、大语言模型输入内容3、图像embending如何嵌入文本embeding 前言 如果看了我前面…

MySQL学习[4] ——MySQL锁

四、MySQL锁 4.1 MySQL有哪些锁&#xff1f; 4.1.1 全局锁 全局锁就是**对整个数据库实例加锁&#xff0c;主要用于全库逻辑备份**等场景。 flush tables with read lock # 加全局锁unlock tables # 解锁加上全局&#xff08;读&#xff09;锁后&#xff0c;整个数据库都…

css实现水滴效果图

效果图&#xff1a; <template><div style"width: 100%;height:500px;padding:20px;"><div class"water"></div></div> </template> <script> export default {data() {return {};},watch: {},created() {},me…

spring mvc工作流程

Spring MVC 是基于模型-视图-控制器&#xff08;MVC&#xff09;设计模式的 Web 框架&#xff0c;它简化了开发 Web 应用程序的流程。下面是 Spring MVC 的工作流程详细介绍&#xff1a; 客户端请求 --> DispatcherServlet --> HandlerMapping --> Controller --&…

Win10 创建新的桌面2,并实现桌面切换

1. Win10 创建新的桌面2 Win - Tab 2. Win10 桌面切换 Ctrl - Win - ←/→ 我们下期见&#xff0c;拜拜&#xff01;

【大模型从入门到精通14】openAI API 构建和评估大型语言模型(LLM)应用2

这里写目录标题 评估大型语言模型&#xff08;LLM&#xff09;输出的方法构建评估标准实施评估协议利用专家比较案例研究评估客户服务聊天机器人学术文本摘要高级评估技术 评估大型语言模型&#xff08;LLM&#xff09;输出的方法 评估大型语言模型&#xff08;LLM&#xff09…

开源免费的表单收集系统TDuck

TDuck&#xff08;填鸭表单&#xff09;是一款开源免费的表单收集系统&#xff0c;它基于Apache 2.0协议开源&#xff0c;用户可以随时下载源码&#xff0c;自由修改和定制&#xff0c;也可以参与到项目的贡献和反馈中。TDuck表单系统不仅支持私有化部署&#xff0c;还提供了丰…

快排/堆排/归并/冒泡/

常见的内排序算法 插入排序 直接插入排序 原理&#xff1a;相当于扑克牌变成有序&#xff0c;先拿第一张&#xff0c;把他调节成有序&#xff0c;再拿第二张&#xff0c;与第一张相比找到第二张的位置&#xff0c;再继续拿第三张&#xff0c;以此类推。 void InsertSort(in…

【C++二分查找 贪心】792. 匹配子序列的单词数

本文涉及的基础知识点 C二分查找 贪心 LeetCode792. 匹配子序列的单词数 给定字符串 s 和字符串数组 words, 返回 words[i] 中是s的子序列的单词个数 。 字符串的 子序列 是从原始字符串中生成的新字符串&#xff0c;可以从中删去一些字符(可以是none)&#xff0c;而不改变其…

关于Vue项目npm快捷键,点击run启动报错,及npm i也报错的解决办法

1.配置idea的npm 2.点击运行按钮 3.结果 分析原因及问题&#xff1a; npm i npm run dev 由于是刚刚从gitlab新拉的前端代码&#xff0c;可能没有用命令install过类似于没有编译过&#xff0c;所以执行一下上面的命令 结果报错如下&#xff1a; F:\tbyf\qjyy\hip-manager-ui&…

密探 -- 渗透测试工具 v1.14 版

1.如何运行 在jdk8环境下&#xff08;在jdk8以上的高版本请参考常见问题1的处理方案&#xff09;运行以下语句运行: java -jar mitan-jar-with-dependencies.jar 若不想输入这么长太长语句&#xff0c;可以通过以下脚本的方式启动&#xff1a; Mac/Linux 环境下&#xff0c;…

计算机网络——HTTP协议详解(上)

一、HTTP协议简单介绍 1.1 什么是HTTP协议 HTTP&#xff08;超文本传输协议&#xff09;是一种用于在Web浏览器和Web服务器之间传输数据的应用层协议。它是一种无状态协议&#xff0c;即服务器不会保留与客户端的任何连接状态信息&#xff0c;每个请求都被视为一个独立的事务。…

Mysql-约束

概念&#xff1a; 约束是作用于表中字段上的规则&#xff0c;用于限制存储在表中的数据。 目的&#xff1a; 保存数据库中数据的正确&#xff0c;有效性和完整性。 分类&#xff1a; 注意事项&#xff1a;约束是作用在数据表中的字段上的&#xff0c;可以在创建表或修改表的时候…

【开端】Java 分页工具类运用

一、绪论 Java系统中&#xff0c;分页查询的场景随处可见&#xff0c;本节介com.baomidou.mybatisplus.core.metadata.IPage;来分页的工具类 二、分页工具类 public class PageUtils implements Serializable { private static final long serialVersionUID 1L; /**…

Luatos-lua For MacOSX

0x00 缘起 看到Luatos-soc-pc项目能够编译到MacOS平台并且运行&#xff0c;所以尝试编译&#xff1b;可是Apple Clang编译器太过于严格&#xff0c;导致编译不通过。遂换到gcc-11编译通过&#xff0c;虽然其中依旧会报错&#xff08;宏定义LUA_USE_MACOSX不起作用&#xff0c;导…

Android 10.0 SystemUI下拉状态栏QSTileView去掉着色效果显示彩色图标功能实现

1.前言 在10.0的系统rom定制化开发中,在关于SystemUI的下拉状态栏中QSTileView的背景颜色设置过程中,在由于 系统原生有着色效果,导致现在某些彩色背景显示不是很清楚效果不好,所以需要去掉QSTileView的默认着色 背景显示原生的彩色背景,接下来就来实现相关功能 如图: 2.…

直击Vue2/3watch的底层逻辑,字符串长度对侦听效率的影响

目录 直击Vue2/3watch的底层逻辑&#xff0c;字符串长度对侦听效率的影响 一、Vue 2的底层原理 二、Vue 3的底层原理 三、基础类型性能消耗 四、数据变化比较原理 1、Vue 2 中的引用类型比较 2、Vue 3 中的引用类型比较 3、字符串比较&#xff08;基础类型比较&#xf…

ARM——体系结构

计算机体系结构&#xff1a;冯诺伊曼 哈佛 冯诺依曼结构 冯诺依曼结构&#xff0c;也称冯诺依曼模型或普林斯顿结构&#xff0c;是根据冯诺依曼提出的存储程序概念设计的计算机体系结构。其主要特点包括&#xff1a; 存储程序&#xff1a;指令与数据都…

解决手机按键失灵!全新检测方案了解一下!

手机按键在手机设备中起着至关重要的作用&#xff0c;手机按键用于执行各种操作&#xff0c;如接听电话、挂断电话、调节音量、开关机等&#xff0c;方便用户进行基本操作。在生产过程中视觉检测需要确保按键的尺寸、形状和表面光滑度符合设计要求&#xff0c;以保证按键的正常…

基于Spring Boot的企业产品档案管理系统

目录 前言 功能设计 系统实现 获取源码 博主主页&#xff1a;百成Java 往期系列&#xff1a;Spring Boot、SSM、JavaWeb、python、小程序 前言 随着企业规模扩张和产品种类增多&#xff0c;手动管理方式不再适应不断增长的需求。因此&#xff0c;本研究的目标是设计和开发…