基于pytorch使用仿真数据集来训练一个深度学习模型进行相位解包裹
使用 PyTorch 来训练一个深度学习模型进行相位解包裹是一种常见的方法。下面是一个详细的示例,展示如何生成仿真数据集并在 PyTorch 中训练模型。
1. 生成仿真数据集
首先,我们生成一些仿真数据集,包含多个包裹相位图和对应的解包裹相位图。
import numpy as np
import matplotlib.pyplot as plt# 参数设置
nx, ny = 128, 128 # 图像尺寸
num_samples = 1000 # 生成样本数量# 生成仿真数据集
def generate_dataset(num_samples, nx, ny):X, Y = np.meshgrid(np.linspace(-1, 1, nx), np.linspace(-1, 1, ny))true_phases = []wrapped_phases = []for _ in range(num_samples):# 生成真实相位分布phi_true = 3 * np.exp(-(X**2 + Y**2) / 0.2**2) + 2 * np.random.randn(nx, ny)# 生成包裹相位分布phi_wrapped = np.angle(np.exp(1j * phi_true))true_phases.append(phi_true)wrapped_phases.append(phi_wrapped)return np.array(true_phases), np.array(wrapped_phases)# 生成数据集
true_phases, wrapped_phases = generate_dataset(num_samples, nx, ny)# 显示仿真数据
plt.figure(figsize=(12, 6))
plt.subplot(1, 2, 1)
plt.imshow(true_phases[0], cmap='viridis')
plt.title('真实相位分布')
plt.colorbar()plt.subplot(1, 2, 2)
plt.imshow(wrapped_phases[0], cmap='viridis')
plt.title('包裹相位分布')
plt.colorbar()plt.show()
2. 数据预处理
将生成的数据集转换为 PyTorch 的 Tensor
格式,并创建数据加载器(DataLoader)。
import torch
from torch.utils.data import Dataset, DataLoader# 自定义数据集类
class PhaseUnwrappingDataset(Dataset):def __init__(self, wrapped_phases, true_phases):self.wrapped_phases = wrapped_phasesself.true_phases = true_phasesdef __len__(self):return len(self.wrapped_phases)def __getitem__(self, idx):wrapped_phase = self.wrapped_phases[idx]true_phase = self.true_phases[idx]wrapped_phase = torch.tensor(wrapped_phase, dtype=torch.float32).unsqueeze(0) # (1, nx, ny)true_phase = torch.tensor(true_phase, dtype=torch.float32).unsqueeze(0) # (1, nx, ny)return wrapped_phase, true_phase# 创建数据集和数据加载器
dataset = PhaseUnwrappingDataset(wrapped_phases, true_phases)
dataloader = DataLoader(dataset, batch_size=32, shuffle=True)
3. 构建深度学习模型
使用 PyTorch 构建一个卷积神经网络(CNN)模型,包含几个卷积层和反卷积层。
import torch.nn as nnclass PhaseUnwrappingNet(nn.Module):def __init__(self):super(PhaseUnwrappingNet, self).__init__()self.encoder = nn.Sequential(nn.Conv2d(1, 64, kernel_size=3, padding=1),nn.ReLU(),nn.Conv2d(64, 128, kernel_size=3, padding=1),nn.ReLU(),nn.Conv2d(128, 256, kernel_size=3, padding=1),nn.ReLU())self.decoder = nn.Sequential(nn.ConvTranspose2d(256, 128, kernel_size=3, padding=1),nn.ReLU(),nn.ConvTranspose2d(128, 64, kernel_size=3, padding=1),nn.ReLU(),nn.ConvTranspose2d(64, 1, kernel_size=3, padding=1),nn.Tanh() # 使用 Tanh 激活函数将输出限制在 [-1, 1] 范围内)def forward(self, x):x = self.encoder(x)x = self.decoder(x)return x
4. 训练模型
编写训练代码,使用生成的数据集训练模型。
import torch.optim as optim# 创建模型实例
model = PhaseUnwrappingNet()
model = model.to('cuda' if torch.cuda.is_available() else 'cpu')# 定义损失函数和优化器
criterion = nn.MSELoss()
optimizer = optim.Adam(model.parameters(), lr=0.001)# 训练模型
num_epochs = 10
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')for epoch in range(num_epochs):model.train()running_loss = 0.0for batch in dataloader:wrapped_phase, true_phase = batchwrapped_phase = wrapped_phase.to(device)true_phase = true_phase.to(device)# 前向传播outputs = model(wrapped_phase)loss = criterion(outputs, true_phase)# 反向传播和优化optimizer.zero_grad()loss.backward()optimizer.step()running_loss += loss.item()print(f'Epoch [{epoch+1}/{num_epochs}], Loss: {running_loss/len(dataloader):.4f}')# 保存模型
torch.save(model.state_dict(), 'phase_unwrapping_model.pth')
5. 测试模型
从数据集中选择一个包裹相位图进行测试,预测其解包裹相位图。
# 加载模型
model.load_state_dict(torch.load('phase_unwrapping_model.pth'))
model.to(device)
model.eval()# 选择一个测试样本
with torch.no_grad():test_wrapped_phase = wrapped_phases[0].unsqueeze(0).to(device)test_true_phase = true_phases[0].to(device)test_unwrapped_phase = model(test_wrapped_phase).squeeze(0).cpu().numpy()# 显示结果
plt.figure(figsize=(12, 6))
plt.subplot(1, 3, 1)
plt.imshow(true_phases[0], cmap='viridis')
plt.title('真实相位分布')
plt.colorbar()plt.subplot(1, 3, 2)
plt.imshow(wrapped_phases[0], cmap='viridis')
plt.title('包裹相位分布')
plt.colorbar()plt.subplot(1, 3, 3)
plt.imshow(test_unwrapped_phase, cmap='viridis')
plt.title('恢复的相位分布')
plt.colorbar()plt.show()
详细步骤解释
-
生成仿真数据集:
- 使用
generate_dataset
函数生成真实相位分布和对应的包裹相位分布。 phi_true
是真实相位分布,phi_wrapped
是包裹相位分布。
- 使用
-
自定义数据集类:
PhaseUnwrappingDataset
类继承自 PyTorch 的Dataset
类,用于加载和预处理数据。__getitem__
方法返回一个包裹相位图和对应的真实相位图,并将它们转换为 PyTorch 的Tensor
格式。
-
创建数据加载器:
DataLoader
用于批量加载数据,并在训练过程中对数据进行随机打乱。
-
构建模型:
PhaseUnwrappingNet
是一个包含编码器和解码器的卷积神经网络模型。- 编码器和解码器分别使用卷积层和反卷积层,中间使用 ReLU 激活函数。
- 最后一层使用
Tanh
激活函数,将输出限制在 [-1, 1] 范围内。
-
训练模型:
- 使用均方误差(MSE)作为损失函数,Adam 优化器进行优化。
- 训练过程中,模型在每个 epoch 的损失会被记录并打印出来。
-
测试模型:
- 从数据集中选择一个包裹相位图进行测试,预测其解包裹相位图。
- 使用
imshow
函数显示真实相位分布、包裹相位分布和恢复的相位分布。
注意事项
- 数据集大小:生成的数据集大小需要根据你的硬件资源进行调整。如果内存不足,可以减少
num_samples
或使用更小的图像尺寸。 - 模型架构:上述模型是一个简单的 CNN 模型,你可以根据具体任务的复杂性调整模型的层数和参数。
- 损失函数:除了 MSE 损失函数,还可以尝试其他损失函数,如 L1 损失或自定义的损失函数,以提高模型的性能。
- 数据增强:为了提高模型的泛化能力,可以在训练数据集上应用数据增强技术,如旋转、平移等。
相关文章:
基于pytorch使用仿真数据集来训练一个深度学习模型进行相位解包裹
使用 PyTorch 来训练一个深度学习模型进行相位解包裹是一种常见的方法。下面是一个详细的示例,展示如何生成仿真数据集并在 PyTorch 中训练模型。 1. 生成仿真数据集 首先,我们生成一些仿真数据集,包含多个包裹相位图和对应的解包裹相位图。…...
【排序算法】之快速排序篇
思想: 分而治之,通过选定某一个元素作为基准值,将序列分为两部分,左边的序列小于基准值,右边的序列大于基准值, 然后再分别将左序列和右序列进行递归排序,直至每部分有序。 性质:这…...
WebSocket
握手 1 客户端发起握手请求:客户端向服务器发送一个特殊的HTTP请求,其中包含一个Upgrade字段,表明客户端希望将该连接从HTTP协议升级为WebSocket协议。请求的关键部分包括: GET请求:客户端使用GET方法请求与WebSocket…...
适配器模式
适配器模式(Adapter Pattern)详解 定义 适配器模式是一种结构型设计模式,通过将一个类的接口转换为客户期望的另一个接口,使得原本接口不兼容的类可以一起工作。适配器模式又称“包装器(Wrapper)”。 适配…...
Jmeter最新详细安装及修改中文教程(附安装包)
目录 初识:Jmeter 一、下载:Jmeter 二、安装前必要的配置 1.桌面点击菜单栏搜索【cmd】,然后打开命令提示符 2.输入java -version命令 三、安装:Jmeter 1.首先在D盘创建【Jmeter】文件夹,把下载的【Jmeter】压缩…...
Java 语言的起源发展与基本概念(JDK,JRE,JVM)
Java语言的起源 源起 Java语言最初是由Sun Microsystems公司(该公司于2009年被Oracle公司收购)开发的一种编程语言。其创造者是詹姆斯高斯林(James Gosling),他是一位加拿大计算机科学家。其前身名为Oak(橡…...
利用dockerCompose一键部署前后端分离项目
1.Docker Compose介绍 2.将自己准备好的docker-compose.yml文件上传到宿主机 3.查看docker-compose.yml文件 宿主机的文件内容可参考: 项目部署-通过docker手动部署前后端分离项目(全网超级详细 的教程)-CSDN博客 修改宿主机的nginx.conf …...
redis大key和热key
redis中大key、热key 什么是大key大key可能产生的原因大key可能会造成什么影响如何检测大key如何优化删除大key时可能的问题删除大key的策略 热key热key可能导致的问题解决热key的方法 什么是大key 大key通常是指占用内存空间过大或包含大量元素的键值对。 数据量大ÿ…...
在 Linux 系统中根据pid查找软件位置
在 Linux 系统中,如果您知道一个进程的 PID(进程标识符),并且想要找到该进程对应的可执行文件的位置,可以使用以下几种方法: 方法一:使用 ps 命令 ps 命令可以显示进程的详细信息,包括可执行文件的路径。假设您的 PID 是 1234,可以使用以下命令: ps -p 1234 -o co…...
Python开发环境搭建+conda管理环境
下载Miniconda 推荐从清华镜像下载安装包 Index of /anaconda/miniconda/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror 打开网页后,下拉到最后找到Miniconda3-latest前缀的文件,或者网页中直接搜索Miniconda3-latest,都可以找…...
Java 8新特性详解与实战
目录 引言 1. Lambda 表达式(Lambda Expressions) 2. 函数式接口(Functional Interfaces) 3. 流 API(Stream API) 4. 默认方法(Default Methods) 5. Optional 类 6. 新的时间日…...
K8s内存溢出问题剖析:排查与解决方案
文章目录 一、背景二、排查方案:1. 可能是数据量超出了限制的大小,检查数据目录大小2. 查看是否是内存溢出2.1 排查数据量(查看数据目录大小是否超过limit限制)2.2 查看pod详情发现问题 三、解决过程 一、背景 做redis压测过程中…...
Network Link Conditioner Mac 上模拟网络环境工具的安装和使用
前言 Xcode 的模拟器本身是不支持模拟网络环境的,在开发界面的时候,设计会出无网、弱网这种情况的设计图,为了方便在开发过程中实现这些情况的代码逻辑,Network Link Conditioner 就是模拟网络环境的好帮手。 安装 Network Lin…...
SeggisV1.0 遥感影像分割软件【源代码】讲解
在此基础上进行二次开发,开发自己的软件,例如:【1】无人机及个人私有影像识别【2】离线使用【3】变化监测模型集成【4】个人私有分割模型集成等等,不管是您用来个人学习 还是公司研发需求,都相当合适,包您满…...
电子应用设计方案-27:智能淋浴系统方案设计
智能淋浴系统方案设计 一、系统概述 本智能淋浴系统旨在为用户提供舒适、便捷、个性化的淋浴体验,通过集成多种智能技术,实现水温、水流、淋浴模式的精准控制以及与其他智能家居设备的联动。 二、系统组成 1. 喷头及淋浴杆 - 采用可调节角度和高度的设计…...
旋转图像(java)
题目描述: 给定一个 n n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。 你必须在 原地 旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。 代码思路: class Solution {public void ro…...
单片机知识总结(完整)
1、单片机概述 1.1. 单片机的定义与分类 定义: 单片机(Microcontroller Unit,简称MCU)是一种将微处理器、存储器(包括程序存储器和数据存储器)、输入/输出接口和其他必要的功能模块集成在单个芯片上的微型…...
蓝桥杯备赛笔记(一)
这里的笔记是关于蓝桥杯关键知识点的记录,有别于基础语法,很多内容只要求会用就行,无需深入掌握。 文章目录 前言一、编程基础1.1 C基础格式和版本选择1.2 输入输出cin和cout: 1.3 string以下是字符串的一些简介:字符串…...
Spring Boot【四】
单例bean中使用多例bean 1.lookup-method方式实现 当serviceB中调用getServiceA的时候,系统自动将这个方法拦截,然后去spring容器中查找对应的serviceA对象然后返回 2.replaced-method:方法替换 我们可以对serviceB这个bean中的getServiceA…...
linux基础1
声明! 学习视频来自B站up主 泷羽sec 有兴趣的师傅可以关注一下,如涉及侵权马上删除文章,笔记只是方便各位师傅的学习和探讨,文章所提到的网站以及内容,只做学习交流,其他均与本人以及泷羽sec团队无关&#…...
DAMODEL丹摩|部署FLUX.1+ComfyUI实战教程
本文仅做测评体验,非广告。 文章目录 1. FLUX.1简介2. 实战2. 1 创建资源2. 1 ComfyUI的部署操作2. 3 部署FLUX.1 3. 测试5. 释放资源4. 结语 1. FLUX.1简介 FLUX.1是由黑森林实验室(Black Forest Labs)开发的开源AI图像生成模型。它拥有12…...
Python语法基础(三)
🌈个人主页:羽晨同学 💫个人格言:“成为自己未来的主人~” 我们这篇文章来说一下函数的返回值和匿名函数 函数的返回值 我们先来看下面的这一段函数的定义代码 # 1、返回值的意义 def func1():print(111111111------start)num166print…...
计算分数的浮点数值
计算分数的浮点数值 C语言代码C 代码Java代码Python代码 💐The Begin💐点点关注,收藏不迷路💐 两个整数a和b分别作为分子和分母,既分数 a/b ,求它的浮点数值(双精度浮点数,保留小数点…...
Staircase mesh” 和 Conformal mesh区别
一、Staircase Mesh(阶梯状网格) 1.1 含义 阶梯状网格就像是用一个个小方块或者矩形拼接起来的网格。在对几何形状进行划分网格时,它会以一种比较简单直接的方式,使得网格边界呈现出像楼梯台阶一样的形状。比如在模拟一个圆形物体…...
探索未来工业的核心:数字孪生技术深度解析
经过数十年的发展,建模和模拟已成为工程和科学的基石。人们针对改进建模的计算方法进行了大量的研究和开发工作。这些计算机模型对系统设计非常有用,可以削减实验和测试的高昂成本。然而在实操中,还需要跟踪系统随时间的演变情况,…...
dns 服务器简单介绍
dns 服务器分类: 根域名服务器顶级域名服务器权威域名服务器本地域名服务器 dns 的查询过程 国内优秀公共域名 腾讯:DNSPod-免费智能DNS解析服务商-电信_网通_教育网,智能DNS-烟台帝思普网络科技有限公司 119.29.29.29 和 182.254.118.118 阿里…...
SQL基础入门——C++与SQL连接实践
在开发中,C与SQL数据库的连接和交互是非常常见的需求。通过将C与SQL数据库连接起来,我们可以轻松地执行数据存取、查询、更新等操作。C与数据库的集成通常依赖于数据库的连接器或驱动程序,本章节将详细讲解如何在C中使用MySQL Connector与SQL…...
对max_seq_length参数的理解,基于open-instruct框架:中英文解释
使用open-instruct (https://github.com/allenai/open-instruct )框架,对其中的max_seq_length参数的理解记录下来。 bash脚本内容如下: # 设置模型和训练参数 MODEL_NAMEgoogle/gemma-2-2b MACHINE_RANK0 MAIN_PROCESS_IP127.0.0.1 MAIN_PROCESS_PORT2…...
似然分布(Likelihood Distribution)和似然函数(Likelihood Function)有什么区别?中英双语
中文版 在统计学中,似然分布(Likelihood Distribution)和似然函数(Likelihood Function)是两个相关但有所不同的概念。它们都涉及给定参数的情况下,数据出现的概率,但是它们的使用方式和含义有…...
LINUX2.4.x网络安全框架
在分析LINUX2.4.x网络安全的实现之前先简介一下它里面包括的几个重要概念:netfilter、iptables、match、target、nf_sockopt_ops、网络安全功能点的实现。详解会在后面的分析中讲到。 首先是netfilter,它定义了协议栈中的检查点和在检查点上引用的数据结…...
Python毕业设计选题:基于django+vue的智能停车系统的设计与实现
开发语言:Python框架:djangoPython版本:python3.7.7数据库:mysql 5.7数据库工具:Navicat11开发软件:PyCharm 系统展示 管理员登录 管理员功能界面 车主管理 车辆信息管理 车位信息管理 车位类型管理 系统…...
AI界的信仰危机:单靠“规模化”智能增长的假设,正在面临挑战
每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…...
JMeter 并发策略-针对准点秒杀场景的压测实现
一、场景的压测实现 1,创建线程组,10并发用户执行5次; 2,创建 Synchronizing Timer 元件,用于同步线程,设置同步元件 Synchronizing Timer 3,创建 http 请求4,创建 view results in table 元件…...
【如何提升代码工程质量】code review篇
应该对于基本上所有软件相关的公司来说,都有committer机制,即代码写好之后会提交合并请求,待相关人员code review通过后再进行合入,所以code review就是代码合入代码仓库的最后一道关卡,对于代码质量的影响也是不容忽视…...
1041.困于环中的机器人
题目: 解题思路; 由于机器人会一直重复指令,存在重复多次指令才回到原点的情况,需要对不同情况经行分析。 当执行一次指令后回到原点,则机器人永远无法回到原点。当执行一次指令后不回到原点,只有方向向北的无法在多次…...
Python实现IP代理池
文章目录 Python实现IP代理池一、引言二、步骤一:获取代理IP1、第一步:爬取代理IP2、第二步:验证代理IP的有效性 三、步骤二:构建IP代理池四、使用示例1、完整的使用示例2、注意事项3、处理网络问题 五、总结 Python实现IP代理池 …...
【Linux网络编程】第二弹---Socket编程入门指南:从IP、端口号到传输层协议及编程接口全解析
✨个人主页: 熬夜学编程的小林 💗系列专栏: 【C语言详解】 【数据结构详解】【C详解】【Linux系统编程】【Linux网络编程】 目录 1、Socket 编程预备 1.1、理解源 IP 和目的 IP 1.2、认识端口号 1.2.1、端口号范围划分 1.2.2、理解 &q…...
【机器学习】机器学习学习笔记 - 监督学习 - 多项式回归决策树回归 - 03
多项式回归 解决线性回归的准备性不足问题(线性回归只能是直线,多项式回归引入多项式可以是曲线)通过对预测值进行多项式转换, 使得回归模型可以是非线性的多项式回归的优点是可以处理非线性的数据多项式回归的缺点是它对数据进行了多项式转换 加菲工具࿰…...
篡改猴(Tampermonkey)使用指南:为您的浏览器增添超级能力
篡改猴(Tampermonkey)使用指南:为您的浏览器增添超级能力 篡改猴(Tampermonkey) 是一款流行的用户脚本管理工具,可以在浏览器中安装和运行用户脚本,从而增强或自定义网页的功能。无论是去广告、…...
23省赛区块链应用与维护(房屋租凭【下】)
23省赛区块链应用与维护(房屋租凭) 背景描述 随着异地务工人员的增多,房屋租赁成为一个广阔市场。目前,现有技术中的房屋租赁是由房主发布租赁信息,租赁信息发布在房屋中介或租赁软件,租客获取租赁信息后,现场看房,并签订纸质的房屋租赁合同,房屋租赁费用通过中介或…...
Java中三种常用布局方式
引言 在Java Swing和JavaFX中,布局管理器(Layout Managers)用于控制组件(如按钮、文本框等)在容器(如窗口、面板等)内的位置和大小。下面介绍Java Swing中常用的三种布局方式: 1. Fl…...
06_数据类型
数据类型 数据类型分类 JavaScript 语言的每一个值,都属于某一种数据类型。JavaScript 的数据类型,共有六种。(ES6 又新增了第七种 Symbol 类型的值和第八种 BigInt类型,当前课程暂不涉及) 据类型分类 原始类型(基础类型) var age = 20, var name = 尚学堂"; var le…...
及时+准确|主动元数据平台在监管报送场景中的应用实践
面对海量的数据报送需求和日益严格的监管要求,如何实现监管报送的全链路自动化数据质量保障,是金融机构亟待解决的重要课题。本文旨在介绍一种全新的监管报送场景方案,帮助金融机构通过“一键溯源与口径自动盘点、指标同源自动化分析、全链路…...
[python脚本处理文件入门]-18.使用Python进行PDF文件的合并与拆分
哈喽,大家好,我是木头左! Python PDF处理库概览 1. PyPDF2 PyPDF2是一个纯Python编写的库,用于PDF文件的读写和操作。它提供了丰富的功能,包括PDF文件的合并、拆分、加密、解密等。PyPDF2的安装非常简单,只需通过pip即可安装: pip install PyPDF2安装完成后,你就可以…...
4、常量和进制转换
1、常量 1.1、常量 常量是在程序运行中值不能内改变(常数)。 整型:12 55 实型:21.5 字符型常量: ‘A’ 1.2、常量不同进制表示 常量数据在计算机中除了用 十进制 表示,还可以用 二进制、八进制、十六进制表示。 十进制数据&…...
C++:探索哈希表秘密之哈希桶实现哈希
文章目录 前言一、链地址法概念二、哈希表扩容三、哈希桶插入逻辑四、析构函数五、删除逻辑六、查找七、链地址法代码实现总结 前言 前面我们用开放定址法代码实现了哈希表: C:揭秘哈希:提升查找效率的终极技巧_1 对于开放定址法来说&#…...
java函数式编程和Lambda表达式
https://www.bilibili.com/video/BV1fz421C7tj?spm_id_from333.788.videopod.episodes&vd_source12d5954938d20d50645e227a6a728c76 如果一个接口中只有一个方法,那么就可以函数对象化: interface Add {int add(int a, int b);}Add add (a, b) -&…...
【线程】Java多线程代码案例(2)
【线程】Java多线程代码案例(2) 一、定时器的实现1.1Java标准库定时器1.2 定时器的实现 二、线程池的实现2.1 线程池2.2 Java标准库中的线程池2.3 线程池的实现 一、定时器的实现 1.1Java标准库定时器 import java.util.Timer; import java.util.Timer…...
IOU Loss详解
IoU(Intersection over Union是目标检测中常用的指标,用于评估预测框和真实框的重叠程度。基于 IoU 的损失函数(IoU Loss)是通过优化 IoU 值来提升模型预测框的精度。 IoU 的计算公式 给定预测框 ( B_p ) 和真实框 ( B_g )&#…...
nfs服务器
1、简介 NFS (Network File System,网络文件系统)是FreeBSD支持的文件系统中的一种,它允许网络中的计 算机(不同的计算机、不同的操作系统)之间通过TCP/IP网络共享资源,主要在unix系列操作系统上…...