Python光电光对光神经网络非相干光图像低维映射模拟

news2024/12/29 8:36:15

🎯要点

🎯光学神经网络非相干光图像处理 | 🎯光电光对光处理多层光学神经网络 | 🎯光图像传感器构建两层神经网络 | 🎯非相干光输入图像映射到低维空间 | 🎯多层非线性对比浅层线性光神经网络 | 🎯模拟算法图像分类评估:手绘图形、生物细胞图像、实景三维对象。

📜光学和散射用例

🍪语言内容分比

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

🍇Python矩阵矢量乘法优化

数学定义

矩阵乘矩阵

如果 A A A m × n m \times n m×n矩阵并且 B B B n × p n \times p n×p矩阵
A = ( a 11 a 12 ⋯ a 1 n a 21 a 22 ⋯ a 2 n ⋮ ⋮ ⋱ ⋮ a m 1 a m 2 ⋯ a m n ) , B = ( b 11 b 12 ⋯ b 1 p b 21 b 22 ⋯ b 2 p ⋮ ⋮ ⋱ ⋮ b n 1 b n 2 ⋯ b n p ) A =\left(\begin{array}{cccc} a_{11} & a_{12} & \cdots & a_{1 n} \\ a_{21} & a_{22} & \cdots & a_{2 n} \\ \vdots & \vdots & \ddots & \vdots \\ a_{m 1} & a_{m 2} & \cdots & a_{m n} \end{array}\right), \quad B =\left(\begin{array}{cccc} b_{11} & b_{12} & \cdots & b_{1 p} \\ b_{21} & b_{22} & \cdots & b_{2 p} \\ \vdots & \vdots & \ddots & \vdots \\ b_{n 1} & b_{n 2} & \cdots & b_{n p} \end{array}\right) A= a11a21am1a12a22am2a1na2namn ,B= b11b21bn1b12b22bn2b1pb2pbnp
矩阵乘积 C = A B C = A B C=AB (不带乘号或点表示)被定义为 m × p m \times p m×p 矩阵
C = ( c 11 c 12 ⋯ c 1 p c 21 c 22 ⋯ c 2 p ⋮ ⋮ ⋱ ⋮ c m 1 c m 2 ⋯ c m p ) C =\left(\begin{array}{cccc} c_{11} & c_{12} & \cdots & c_{1 p} \\ c_{21} & c_{22} & \cdots & c_{2 p} \\ \vdots & \vdots & \ddots & \vdots \\ c_{m 1} & c_{m 2} & \cdots & c_{m p} \end{array}\right) C= c11c21cm1c12c22cm2c1pc2pcmp
于是
c i j = a i 1 b 1 j + a i 2 b 2 j + ⋯ + a i n b n j = ∑ k = 1 n a i k b k j c_{i j}=a_{i 1} b_{1 j}+a_{i 2} b_{2 j}+\cdots+a_{i n} b_{n j}=\sum_{k=1}^n a_{i k} b_{k j} cij=ai1b1j+ai2b2j++ainbnj=k=1naikbkj
对于 i = 1 , … , m i=1, \ldots, m i=1,,m j = 1 , … , p j=1, \ldots, p j=1,,p

也就是说,乘积的条目 c i j c_{i j} cij是通过将 A A A的第 i i i行和 B B B的第 j j j列的条目逐项相乘,然后求和得到的这些 n n n 乘积。换句话说, c i j c_{i j} cij A A A 的第 i i i 行和 B B B 的第 j j j 列的点积。

因此, A B A B AB 也可以写成
C = ( a 11 b 11 + ⋯ + a 1 n b n 1 a 11 b 12 + ⋯ + a 1 n b n 2 ⋯ a 11 b 1 p + ⋯ + a 1 n b n p a 21 b 11 + ⋯ + a 2 n b n 1 a 21 b 12 + ⋯ + a 2 n b n 2 ⋯ a 21 b 1 p + ⋯ + a 2 n b n p ⋮ ⋮ ⋱ ⋮ a m 1 b 11 + ⋯ + a m n b n 1 a m 1 b 12 + ⋯ + a m n b n 2 ⋯ a m 1 b 1 p + ⋯ + a m n b n p ) C =\left(\begin{array}{cccc} a_{11} b_{11}+\cdots+a_{1 n} b_{n 1} & a_{11} b_{12}+\cdots+a_{1 n} b_{n 2} & \cdots & a_{11} b_{1 p}+\cdots+a_{1 n} b_{n p} \\ a_{21} b_{11}+\cdots+a_{2 n} b_{n 1} & a_{21} b_{12}+\cdots+a_{2 n} b_{n 2} & \cdots & a_{21} b_{1 p}+\cdots+a_{2 n} b_{n p} \\ \vdots & \vdots & \ddots & \vdots \\ a_{m 1} b_{11}+\cdots+a_{m n} b_{n 1} & a_{m 1} b_{12}+\cdots+a_{m n} b_{n 2} & \cdots & a_{m 1} b_{1 p}+\cdots+a_{m n} b_{n p} \end{array}\right) C= a11b11++a1nbn1a21b11++a2nbn1am1b11++amnbn1a11b12++a1nbn2a21b12++a2nbn2am1b12++amnbn2a11b1p++a1nbnpa21b1p++a2nbnpam1b1p++amnbnp
因此,当且仅当 A A A 中的列数等于 B B B 中的行数(在本例中为 n n n)时,才定义乘积 A B A B AB

矩阵乘矢量

长度为 n n n 的向量 x x x 可以被视为列向量,对应于 n × 1 n \times 1 n×1 矩阵 X X X,其条目由 X i 1 = x i X _{i 1}= x _i Xi1=xi 给出 如果 $A $ 是一个 m × n m \times n m×n 矩阵, A x A x Ax 表示的矩阵乘以向量乘积就是向量 y y y,将其视为列向量,等于 m × 1 m \times 1 m×1 矩阵 A X A X AX。在索引表示法中,这相当于:
y i = ∑ j = 1 n a i j x j y_i=\sum_{j=1}^n a_{i j} x_j yi=j=1naijxj
看待这个问题的一种方法是假设从“普通”向量到列向量以及返回的变化是隐式的。

类似地,长度为 n n n 的向量 x x x 可以被视为行向量,对应于 1 × n 1 \times n 1×n 矩阵。为了清楚地表明行向量的含义,在这种情况下通常将其表示为列向量的转置;因此,人们会看到诸如 x T A x ^{ T } A xTA 之类的符号。

恒等式 x T A = ( A T x ) T x ^{ T } A =\left( A ^{ T } x \right)^{ T } xTA=(ATx)T 成立。在索引表示法中,如果 A A A n × p n \times p n×p 矩阵,则 x T A = y T x ^{ T } A = y ^{ T } xTA=yT 相当于: y k = ∑ j = 1 n x j a j k y_k=\sum_{j=1}^n x_j a_{ j k} yk=j=1nxjajk

代码优化示例

许多数值计算库都具有高效的矢量化操作实现。矩阵乘法、查找点积等操作非常高效。这些操作的实现是为了利用 CPU 中的多个核心,并将计算卸载到 GPU(如果可用)。通常,矩阵和向量的操作由 BLAS(基本线性代数子程序)提供。一些示例是 Intel MKL、OpenBLAS、cuBLAS 等。

首先我们创建两个矩阵,以便我们可以用它来检查我们的实现是否正确。

import tensorflow as tf
import numpy as np
tf.__version__ # 2.0.0

a = np.random.normal(size=(200, 784)).astype('float32')
b = np.random.normal(size=(784, 10)).astype('float32')

expected = np.matmul(a, b)

不使用外部库实现功能,

def py_matmul1(a, b):
    ra, ca = a.shape
    rb, cb = b.shape
    assert ca == rb, f"{ca} != {rb}"
    
    output = np.zeros(shape=(ra, cb))
    for i in range(ra):
        for j in range(cb):
            for k in range(rb):
                output[i, j] += a[i, k] * b[k, j]
                
    return output

%time result = py_matmul1(a, b)
assert result.shape == expected.shape
assert np.allclose(result, expected, rtol=1e-02), (result, expected)

执行时,在我的计算机上需要 1.38 秒。它相当慢,可以大大改进。如果您注意到,最内层循环基本上是在计算两个向量的点积。在这种情况下,两个向量分别是 a 和 b 的第 i 行和第 j 列。所以让我们用点积实现删除最内层循环。

矢量优化一:

def py_matmul2(a, b):
    ra, ca = a.shape
    rb, cb = b.shape
    assert ca == rb, f"{ca} != {rb}"
    
    output = np.zeros(shape=(ra, cb))
    for i in range(ra):
        for j in range(cb):
	        # we replaced the loop with dot product
            output[i, j] = np.dot(a[i], b[:,j])
                
    return output

%time result = py_matmul2(a, b)
assert result.shape == expected.shape
assert np.allclose(result, expected, rtol=1e-02), (result, expected)

此实现仅需 6 毫秒。与原始实现相比,这是一个巨大的改进。由于内部循环本质上是在计算点积,我们将其替换为 np.dot 函数,并传递矩阵 a 中的第 i 行和矩阵 b 中的第 j 列。

矢量优化二:

现在让我们删除迭代矩阵 b 的列的 for 循环。

def py_matmul3(a, b):
    ra, ca = a.shape
    rb, cb = b.shape
    assert ca == rb, f"{ca} != {rb}"
    
    output = np.zeros(shape=(ra, cb))
    for i in range(ra):
        output[i] = np.dot(a[i], b)
        
                
    return output

%time result = py_matmul3(a, b)
assert result.shape == expected.shape
assert np.allclose(result, expected, rtol=1e-02), (result, expected)

此实现耗时 2.97 毫秒。使用称为广播的技术,我们可以从本质上消除循环,仅使用一行 output[i] = np.dot(a[i], b),我们就可以计算输出矩阵第 i 行的整个值。numpy 所做的是广播向量 a[i],使其与矩阵 b 的形状相匹配。然后它计算每对向量的点积。广播规则在 numpy、tensorflow、pytorch 等主要库中几乎相同。

库优化三:

现在让我们使用 numpy 的内置 matmul 函数。

def py_matmul4(a, b):
    ra, ca = a.shape
    rb, cb = b.shape
    assert ca == rb, f"{ca} != {rb}"
    
    return np.matmul(a, b)
    

%time result = py_matmul4(a, b)
assert result.shape == expected.shape
assert np.allclose(result, expected, rtol=1e-02), (result, expected)

使用numpy的内置matmul函数,需要999 μ 𝜇 s。这是迄今为止我们实施的最快的。

库优化四:

在张量流中,它也与 numpy 非常相似。我们只需要调用 matmul 函数即可。

def py_matmul5(a, b):
    ra, ca = a.shape
    rb, cb = b.shape
    assert ca == rb, f"{ca} != {rb}"
    
    return tf.matmul(a, b)
    
tf_a = tf.constant(a)
tf_b = tf.constant(b)
%time result = py_matmul5(tf_a, tf_b)
assert result.shape == expected.shape
assert np.allclose(result, expected, rtol=1e-02), (result, expected)

TensorFlow 计算结果大约需要 999 μ s。我们可以直接传递 numpy 数组,而不必转换为 TensorFlow 张量,但执行速度会慢一些。在我的实验中,如果我只调用 py_matmul5(a, b),大约需要 10 毫秒,但使用 tf.constant 函数将 numpy 数组转换为 tf.Tensor 可以获得更好的性能。

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

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

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

相关文章

国标POE电源芯片52V转12V 1.5A用AH7691D

​在深入探讨国标POE(Power Over Ethernet)电源芯片AH7691D如何将52V直流电压高效转换为12V 1.5A的稳定输出时,不得不提及其卓越的能效比与可靠性设计。AH7691D作为一款专为POE供电系统设计的降压转换芯片,不仅拥有高精度的电压调…

数据结构入门——03链表

1. 链表的结构 链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表 中的指针链接次序实现的。 结点的data域存放数据元素ai,而next域是一个指针,指向ai的直接后继ai1所在的结点。 1.1链表的分类 实际中要实…

利用matlab生成一注特别的大乐透机选程序

玩法说明: 代码: front randi([1,35],5,5) %前区随机生成(1-35),生成5行5列rear randi([1,12],1,2)%后区随机生成(1-12),生成1行2列front_r []%用来保存前区号码结果 rear_r rear%用来保存后区号码结果for i 1:size(front, 1) % 遍历每一行 for j 1:length(front(i,:)) …

OpenCV图像处理——直线拟合并找出拟合直线的起点与端点

引言 对轮廓进行分析,除了可以对轮廓进行椭圆或者圆的拟合之外,还可以对轮廓点集进行直线拟合。在 OpenCV 中,直线拟合通常是通过 cv::fitLine 函数实现的,该函数采用最小二乘法对一组 2D 或 3D 点进行直线拟合。对于 2D 点集&am…

【数据结构】详细剖析链表,带你实现单链表,双向链表,附链表编程练习题

目录 一. 链表 1. 链表的概念及结构 2. 单链表的实现 2.1 单链表节点结构 2.2 动态申请一个节点 2.3 单链表打印 2.4 单链表尾插 2.5 单链表头插 2.6 单链表尾删 2.7 单链表头删 2.8 单链表查找 2.9 单链表在pos后一位插入x 2.10 单链表删除pos后一位的值 2.11 …

《软件性能测试分析与调优实践之路》(第2版) 读书笔记(一)总体介绍(上)-真正从性能分析与调优来看性能测试

《软件性能测试分析与调优实践之路》(第2版) 是清华大学出版社出版的一本图书,作者为张永清,全书共分为9章,如下图所示 图书介绍:《软件性能测试分析与调优实践之路》(第2版) 1、为什么需要性能测试与分析 1)、了解…

成功交付西班牙足球俱乐部77英寸透明OLED模块订单

2024年8月初,我们完成了来自西班牙知名足球俱乐部的大宗订单交付。此次交付的10台77英寸透明OLED模块,标志着我们在高端显示技术领域迈出的又一重要步伐。这一订单不仅是我们目前单笔数量最多的77英寸模块订单,也是客户首次大规模采购我们产品…

自动化解决 reCAPTCHA v2:CapSolver 教程

对于那些经常进行网页爬取的人来说,你是否曾觉得 reCAPTCHA v2 就像是互联网版的过于严格的裁判员,总是在质疑你的真实性?但如果你能够轻松且合规地与这些裁判员达成和解,使你的网络搜索和自动化任务变得更顺畅,那该有…

【HarmonyOS NEXT】实现在当前Ability页面,拉起另一个Ability页面

【需求】 实现类似微信拉起支付页面。在手机应用程管理界面,可以看到同一个应用的两个窗口,如下图 【方案】 在EntryAbility的页面,点击按钮拉新的Ability 【步骤】 为EntryAbility准备页面 新建FirstAbilityPage页面将EntryAbility中的启动…

LivePortrait V3版:新增精确的肖像编辑,精准操控五官比如眉毛鼻子摇头眨眼撇嘴等,本地一键整合包下载

LivePortrait,这个名字听起来就像是魔法,但它其实是现实世界中的黑科技。想象一下,你那尘封已久的相册里,那些定格在时间里的笑脸,突然间动了起来,眨眼、微笑、甚至说话,这不再是电影里的场景&a…

企业源代码也需要加密!源代码加密软件推荐,2024十款软件排行榜

在科技飞速发展的2024年,企业的源代码作为核心资产,其安全性至关重要。为了防止源代码泄露带来的巨大损失,选择一款合适的源代码加密软件势在必行。下面为您呈现 2024 年十款优秀的源代码加密软件排行榜。 1. GitGuardian 实时监控&#xf…

从0到1:AI与低代码如何推动企业创新

引言 在当今瞬息万变的商业环境中,创新已成为企业在激烈市场竞争中立于不败之地的关键驱动力。面对快速变化的市场需求、技术进步和全球化竞争,企业亟需打破传统的增长模式,从而实现真正意义上的突破性创新。“从0到1”这一理念,源…

System V IPC奥秘:解锁共享内存、消息队列与信号量的高效通信之路

🍑个人主页:Jupiter. 🚀 所属专栏:Linux从入门到进阶 欢迎大家点赞收藏评论😊 目录 🍑system V共享内存 🍒共享内存的原理共享内存数据结构查看和删除共享内存资源的命令 🌻共享内存…

Spacedrive:一款基于VDFS的跨平台文件管理器深度解析

前言 你的文件不再被各种设备、云盘束缚,而是像魔法般汇聚在一个地方,触手可及,那将是怎样的畅快淋漓?Spacedrive,这个名字听起来就像是穿越时空的驱动器,它正悄悄改变着我们对文件管理的认知;…

开发物联网驱动拍卖软件平台:如何实现了服务质量的全面提升

在数字化转型的浪潮下,物联网(IoT)技术正深刻地改变着各行各业的运作模式,拍卖行业也不例外。通过物联网的集成应用,拍卖平台能够实现更高效、透明和个性化的服务,极大地提升用户体验和服务质量。本文将以“…

一起学习LeetCode热题100道(44/100)

44.二叉搜索树中第 K 小的元素(学习) 给定一个二叉搜索树的根节点 root ,和一个整数 k ,请你设计一个算法查找其中第 k 小的元素(从 1 开始计数)。 示例 1: 输入:root [3,1,4,null,2], k 1 输出&#…

u盘启动选择uefi还是legacy_u盘启动选择uefi还是legacy详细分析

最近有很多网友问我想用U盘安装系统,按照网上教程按快捷方式(一般是f12)出现选择U盘菜单时,我到底是选择legacy开头的U盘还是uefi开头的U盘,其实这个取决你要安装什么系统或是磁盘分区类型是gpt还是mbr,比如2016年后出来的笔记本和…

EasyRecovery17中文版永久汉化版电脑数据恢复工具下载

🎈🎉安利时间到!今天要跟大家分享的是——EasyRecovery17中文版的最新功能!🎉🎈 🌟✨ “数据恢复小能手” ✨🌟 让我来介绍一下这款软件的主打特点。 EasyRecovery17中文版是一款强…

谷歌账号活动异常,或者申诉回来以后需要手机验证的原因,以及验证手机号的错误操作和正确操作

有一些朋友在使用谷歌账号的时候,会遇到无法直接登录的情况,输入用户名、密码以后,提示说账号活动异常,需要验证手机号。 通常有以下两种情形和界面,出现这种情形的原因分别如下。 一、谷歌账号登录需要输入手机号码…

教你如何训练多模态理解模型

出发点:最近因为工作的需要,在研究多模态理解模型,看了最近一两年比较火的一些论文,感觉Nvidia的VILA工作可以作为比较好的多模态理解模型训练教程,也在这里介绍给大家。 多模态理解模型:也叫Large Vision…