基于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()

详细步骤解释

  1. 生成仿真数据集

    • 使用 generate_dataset 函数生成真实相位分布和对应的包裹相位分布。
    • phi_true 是真实相位分布,phi_wrapped 是包裹相位分布。
  2. 自定义数据集类

    • PhaseUnwrappingDataset 类继承自 PyTorch 的 Dataset 类,用于加载和预处理数据。
    • __getitem__ 方法返回一个包裹相位图和对应的真实相位图,并将它们转换为 PyTorch 的 Tensor 格式。
  3. 创建数据加载器

    • DataLoader 用于批量加载数据,并在训练过程中对数据进行随机打乱。
  4. 构建模型

    • PhaseUnwrappingNet 是一个包含编码器和解码器的卷积神经网络模型。
    • 编码器和解码器分别使用卷积层和反卷积层,中间使用 ReLU 激活函数。
    • 最后一层使用 Tanh 激活函数,将输出限制在 [-1, 1] 范围内。
  5. 训练模型

    • 使用均方误差(MSE)作为损失函数,Adam 优化器进行优化。
    • 训练过程中,模型在每个 epoch 的损失会被记录并打印出来。
  6. 测试模型

    • 从数据集中选择一个包裹相位图进行测试,预测其解包裹相位图。
    • 使用 imshow 函数显示真实相位分布、包裹相位分布和恢复的相位分布。

注意事项

  1. 数据集大小:生成的数据集大小需要根据你的硬件资源进行调整。如果内存不足,可以减少 num_samples 或使用更小的图像尺寸。
  2. 模型架构:上述模型是一个简单的 CNN 模型,你可以根据具体任务的复杂性调整模型的层数和参数。
  3. 损失函数:除了 MSE 损失函数,还可以尝试其他损失函数,如 L1 损失或自定义的损失函数,以提高模型的性能。
  4. 数据增强:为了提高模型的泛化能力,可以在训练数据集上应用数据增强技术,如旋转、平移等。

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

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

相关文章

使用 Python 的 pdfplumber 库高效解析 PDF 文件

使用 Python 的 pdfplumber 库高效解析 PDF 文件 PDF 文件是日常办公和数据处理中常见的文件格式,而 pdfplumber 是一个专为 PDF 文件解析设计的 Python 库,可以轻松提取文本、表格、图像等内容。本文将介绍 pdfplumber 的基本功能、使用方法&#xff0…

Java实现IP代理池

文章目录 Java实现IP代理池一、引言二、构建IP代理池1、代理IP的获取2、代理IP的验证1. 导入必要的库2. 设置代理IP和端口3. 发起HTTP请求4. 检查请求结果5. 完整的验证方法 注意事项 三、使用IP代理池四、总结 Java实现IP代理池 一、引言 在网络爬虫或者需要频繁请求网络资源…

微服务保护和分布式事务

文章目录 一、微服务保护1.1 微服务保护方案:1.1.1 请求限流:1.1.2 线程隔离:1.1.3 服务熔断: 1.2 Sentinel:1.2.1 介绍和安装:1.2.2 微服务整合: 1.3 请求限流:1.4 线程隔离&#x…

后端 Java发送邮件 JavaMail 模版 20241128测试可用

配置授权码 依赖 <dependency><groupId>javax.mail</groupId><artifactId>javax.mail-api</artifactId><version>1.5.5</version> </dependency> <dependency><groupId>com.sun.mail</groupId><artifa…

MySQL安装与卸载(linux)

MySQL安装与卸载 MySQL8.0.26-安装1. 准备一台Linux服务器2. 下载Linux版MySQL安装包3. 上传MySQL安装包4. 创建目录,并解压5. 安装mysql的安装包6. 启动MySQL服务7. 查询自动生成的root用户密码8. 修改root用户密码9. 创建用户10. 并给root用户分配权限11. 重新连接MySQL MySQ…

LayaBox1.8.4实现自定义3DMesh

实现mesh的原理可参考我写的Unity中的自定义mesh的原理&#xff0c; 碰撞检测算法——分离轴算法在Unity中实现&#xff08;一&#xff09;_unity 自定义高性能碰撞检测方案-CSDN博客 实现可传入shader两张贴图的顶点声明如下&#xff1a; var vertexDeclarationLaya.Vertex…

设置ip和代理DNS的WindowsBat脚本怎么写?

今天分享一个我们在工作时&#xff0c;常见的在Windows中通过批处理脚本&#xff08;.bat 文件&#xff09;来设置IP地址、代理以及DNS 相关配置的示例&#xff0c;大家可以根据实际需求进行修改调整。 一、设置静态IP地址脚本示例 以下脚本用于设置本地连接&#xff08;你可…

施工车辆,工程车类型识别,可识别装载机,搅拌车,挖掘机,拉土车等,支持YOLO,COCO,VOC三种格式带标记

1338总图像数 数据集分割 训练组 87&#xff05; 1170图片 有效集 8% 112图片 测试集 4% 56图片 预处理 自动定向&#xff1a; 已应用 调整大小&#xff1a; 拉伸至 640x640 增强 每个训练示例的输出&#xff1a; 3 旋转&#xff1a; -15 至 15 之间 …

oracle 用户手册

Oracle用户手册 一、Oracle数据库概述 定义与用途 Oracle数据库是一款功能强大的关系型数据库管理系统(RDBMS)。它用于存储和管理大量的结构化数据,广泛应用于企业级应用、金融系统、电商平台等各种需要高效数据处理和存储的场景。例如,银行使用Oracle数据库来存储客户账户…

新版布谷直播软件源码开发搭建功能更新明细

即将步入2025年也就是山东布谷科技专注直播系统开发,直播软件源码出售开发搭建等业务第9年,山东布谷科技不断更新直播软件功能&#xff0c;以适应当前新市场环境下的新要求。山东布谷科技始终秉承初心&#xff0c;做一款符合广大客户需求的直播系统软件。支持广大客户提交更多个…

科技赋能:企业如何通过新技术提升竞争力的策略与实践

引言 在当今瞬息万变的商业环境中&#xff0c;科技的迅猛发展正在重新定义行业的游戏规则。无论是小型企业还是跨国巨头&#xff0c;都感受到数字化转型的迫切需求。过去&#xff0c;企业竞争力更多依赖于成本控制、资源调配或市场覆盖&#xff0c;而如今&#xff0c;新技术的引…

回调函数-一文读懂

回调函数(Callback Function)是指通过函数指针传递给另一个函数的函数。调用者可以在合适的时机(例如事件发生时)调用这个回调函数。回调函数常用于实现一些插件化或动态响应的设计模式,如事件处理、异步编程、函数定制等。 回调函数的基本概念 定义:回调函数是由一个函…

Python编程实例-实现环形缓冲(Ring Buffer)

实现环形缓冲(Ring Buffer) 文章目录 实现环形缓冲(Ring Buffer)1、了解环形缓冲2、环形缓冲工作原理3、代码实现4、总结1、了解环形缓冲 环形缓冲区(Circular Buffer),又称循环缓冲区或环形队列,是一种固定大小的先进先出(FIFO)数据结构。它广泛应用于实时系统、音频处…

项目自动化部署,持续集成/持续交付(CI/CD)工具有那些?他们的优劣势分别是什么?共计15个工具进行对比分析。

项目自动化部署&#xff0c;持续集成/持续交付&#xff08;CI/CD&#xff09;工具有那些&#xff1f;他们的优劣势分别是什么&#xff1f; 主要对比的工具有&#xff1a;Jenkins 、阿里云云效、华为云DevCloud、腾讯云CODING、百度智能云DevOps、 GitLab CI/CD、CircleCI、Trav…

Web登录页面设计

记录第一个前端界面&#xff0c;暑假期间写的&#xff0c;用了Lottie动画和canvas标签做动画&#xff0c;登录和注册也连接了数据库。 图片是从网上找的&#xff0c;如有侵权私信我删除&#xff0c;谢谢啦~

洛谷 P2385 [USACO07FEB] Bronze Lilypad Pond B C语言 bfs

题目&#xff1a; https://www.luogu.com.cn/problem/P2385 题目看仔细&#xff0c;是M行N列.八个方向数组依靠M1,M2&#xff0c;所以初始化方向数组要在主函数里面&#xff0c;传入bfs函数里。 #include <iostream> #include<algorithm> #include<queue>…

如何在ubuntu上调试core dump

启用core dump 确认ulimit 状态 ulimit -c 如果输出是0&#xff0c;表示core dump被禁用了 运行 ulimit -c unlimited 再次运行 ulimit -c 确认输出是ulimited 设置core dump路径和文件名格式 下面命令表示设置core dump文件在当前目录&#xff08;%e表示程序名&#x…

告别照相馆!使用AI证件照工具HivisionIDPhotos打造在线证件照制作软件

文章目录 前言1. 安装Docker2. 本地部署HivisionIDPhotos3. 简单使用介绍4. 公网远程访问制作照片4.1 内网穿透工具安装4.2 创建远程连接公网地址 5. 配置固定公网地址 前言 本文主要介绍如何在Linux系统使用Docker快速部署一个AI证件照工具HivisionIDPhotos&#xff0c;并结合…

vue3-setup基本使用(非响应式数据)

OptionsAPI与COmpositionAPI 选项式APi Vue2的AP设计是Options&#xff08;配置、选项式&#xff09;风格的 Options类型的 API&#xff0c;数据、方法、计算属性等&#xff0c;是分散在&#xff1a;data、methods、computed中的&#xff0c;若想新增或者修改一个需求&#xff…

通信导航一体化信号设计及接收

研究背景和意义 我国于 2020 年建设完成了第三代北斗卫星导航系统&#xff0c;其在调制方式、电 文速率、短报文功能等都较其他导航系统有较大创新。各大导航系统间抢占轨道和 频率资源以及应用市场&#xff0c;出现了频率资源紧张、导航信号间相互干扰等问题。近十 年来&#…