2024年7月9日~2024年7月15日周报

目录

一、前言

二、完成情况

2.1 特征图保存方法

2.1.1 定义网络模型

2.1.2 定义保存特征图的钩子函数

2.1.3 为模型层注册钩子

2.1.4 运行模型并检查特征图

2.2 实验情况

三、下周计划


一、前言

        本周的7月11日~7月14日参加了机器培训的学习讨论会,对很多概念有了更深的理解。同时,在空闲时间利用笔记本跑了小批量的数据。

二、完成情况

2.1 特征图保存方法

        在深度学习领域,在网络训练过程中生成每一阶段的特征图是一个常见的需求。

2.1.1 定义网络模型

        首先,需要确定我们当前使用的网络模型,不同的模型结果具有不同的层数和层类型,这将影响特征图的生成。

        这里以InversionNet为例:

class InversionNet(nn.Module):
    def __init__(self, dim1=32, dim2=64, dim3=128, dim4=256, dim5=512, sample_spatial=1.0, **kwargs):
        super(InversionNet, self).__init__()
        self.convblock1 = ConvBlock(5, dim1, kernel_size=(7, 1), stride=(2, 1), padding=(3, 0))
        self.convblock2_1 = ConvBlock(dim1, dim2, kernel_size=(3, 1), stride=(2, 1), padding=(1, 0))
        self.convblock2_2 = ConvBlock(dim2, dim2, kernel_size=(3, 1), padding=(1, 0))
        self.convblock3_1 = ConvBlock(dim2, dim2, kernel_size=(3, 1), stride=(2, 1), padding=(1, 0))
        self.convblock3_2 = ConvBlock(dim2, dim2, kernel_size=(3, 1), padding=(1, 0))
        self.convblock4_1 = ConvBlock(dim2, dim3, kernel_size=(3, 1), stride=(2, 1), padding=(1, 0))
        self.convblock4_2 = ConvBlock(dim3, dim3, kernel_size=(3, 1), padding=(1, 0))
        self.convblock5_1 = ConvBlock(dim3, dim3, stride=2)
        self.convblock5_2 = ConvBlock(dim3, dim3)
        self.convblock6_1 = ConvBlock(dim3, dim4, stride=2)
        self.convblock6_2 = ConvBlock(dim4, dim4)
        self.convblock7_1 = ConvBlock(dim4, dim4, stride=2)
        self.convblock7_2 = ConvBlock(dim4, dim4)
        self.convblock8 = ConvBlock(dim4, dim5, kernel_size=(8, ceil(70 * sample_spatial / 8)), padding=0)

        self.deconv1_1 = DeconvBlock(dim5, dim5, kernel_size=5)
        self.deconv1_2 = ConvBlock(dim5, dim5)
        self.deconv2_1 = DeconvBlock(dim5, dim4, kernel_size=4, stride=2, padding=1)
        self.deconv2_2 = ConvBlock(dim4, dim4)
        self.deconv3_1 = DeconvBlock(dim4, dim3, kernel_size=4, stride=2, padding=1)
        self.deconv3_2 = ConvBlock(dim3, dim3)
        self.deconv4_1 = DeconvBlock(dim3, dim2, kernel_size=4, stride=2, padding=1)
        self.deconv4_2 = ConvBlock(dim2, dim2)
        self.deconv5_1 = DeconvBlock(dim2, dim1, kernel_size=4, stride=2, padding=1)
        self.deconv5_2 = ConvBlock(dim1, dim1)
        self.deconv6 = ConvBlock_Tanh(dim1, 1)

    def forward(self, x):
        # Encoder Part
        x = self.convblock1(x)  # (None, 32, 500, 70)
        x = self.convblock2_1(x)  # (None, 64, 250, 70)
        x = self.convblock2_2(x)  # (None, 64, 250, 70)
        x = self.convblock3_1(x)  # (None, 64, 125, 70)
        x = self.convblock3_2(x)  # (None, 64, 125, 70)
        x = self.convblock4_1(x)  # (None, 128, 63, 70)
        x = self.convblock4_2(x)  # (None, 128, 63, 70)
        x = self.convblock5_1(x)  # (None, 128, 32, 35)
        x = self.convblock5_2(x)  # (None, 128, 32, 35)
        x = self.convblock6_1(x)  # (None, 256, 16, 18)
        x = self.convblock6_2(x)  # (None, 256, 16, 18)
        x = self.convblock7_1(x)  # (None, 256, 8, 9)
        x = self.convblock7_2(x)  # (None, 256, 8, 9)
        x = self.convblock8(x)  # (None, 512, 1, 1)

        # Decoder Part Vmodel
        x = self.deconv1_1(x)  # (None, 512, 5, 5)
        x = self.deconv1_2(x)  # (None, 512, 5, 5)
        x = self.deconv2_1(x)  # (None, 256, 10, 10)
        x = self.deconv2_2(x)  # (None, 256, 10, 10)
        x = self.deconv3_1(x)  # (None, 128, 20, 20)
        x = self.deconv3_2(x)  # (None, 128, 20, 20)
        x = self.deconv4_1(x)  # (None, 64, 40, 40)
        x = self.deconv4_2(x)  # (None, 64, 40, 40)
        x = self.deconv5_1(x)  # (None, 32, 80, 80)
        x = self.deconv5_2(x)  # (None, 32, 80, 80)
        x = F.pad(x, [-5, -5, -5, -5], mode="constant", value=0)  # (None, 32, 70, 70) 125, 100
        x = self.deconv6(x)  # (None, 1, 70, 70)

        return x

2.1.2 定义保存特征图的钩子函数

        接下来,定义特征图保存函数。PyTorch提供了register_forward_hook方法,允许在模型的特定层上注册一个回调函数,该函数将在该层的前向传播之后被调用。因此,我们可以利用这个机制来自动保存每个阶段的特征图。钩子方法(hook method)是回调函数(callback function)的一种,它相当于一个监测器,在消息传递的过程中,捕获自己感兴趣的内容,然后去处理。

import torch  
  
# 全局的字典用于存储特征图  
feature_maps = {}  
  
def save_feature_map(module, input, output):  
    # 'module' 是注册了钩子的模块(在这里以一个convblock为例)  
    # 'input' 是该模块的输入  
    # 'output' 是该模块的输出,即我们要保存的特征图  
    # 我们需要一种方式来唯一标识每个convblock,这里我们简单地使用模块的名称  
    key = module.__class__.__name__ if hasattr(module, '__class__') else type(module).__name__  
    if key.startswith('ConvBlock'):  # 假设所有convblock类的名称都以'ConvBlock'开头  
        feature_maps[key] = output.detach().cpu()  # 保存特征图到CPU  
  
# 注意:上面的key获取方式是基于假设的,需要根据实际的convblock类名来调整

2.1.3 为模型层注册钩子

        然后,需要再模型初始化初始化或某个适当的地方,为这些convblock注册钩子。这里为所有的convblock层注册钩子,也可以单独注册。

# 一个方法来注册所有ConvBlock的钩子
def register_ConvBlock_hooks(self):
    for name, module in self._modules.items():
        if isinstance(module, convblock):
            handle = module.register_forward_hook(self.save_feature_map)
            self.hook_handles.append((name, handle))

2.1.4 运行模型并检查特征图

        在训练循环中,除了正常的梯度计算和参数更新外,还需要确保特征图保存机制被正确触发。在每个epoch或每个batch之后,根据需求保存特征图。

def save_feature_map(self, module, input, output):
    # 打印输出尺寸作为示例
    print(f"Feature map shape from {module._get_name()}: {output.shape}")
    # 假设我们想要保存第一个批次和第一个通道的特征图
    batch_idx, channel_idx = 0, 0

    # 提取特征图的一个批次和一个通道
    feature_map = output[batch_idx, channel_idx, :, :]

    # 将tensor从GPU(如果有)移动到CPU,并转换为numpy数组
    feature_map_np = feature_map.detach().cpu().numpy()

    # 归一化特征图到[0, 1]
    feature_map_np = (feature_map_np - feature_map_np.min()) / (feature_map_np.max() - feature_map_np.min())

    # 使用PIL或其他库保存图像
    # 由于PIL期望的是[0, 255]的整数,需要将归一化后的图像乘以255并转换为uint8
    image = Image.fromarray((feature_map_np * 255).astype(np.uint8))

    # 为模块创建一个唯一的名称(这里只是示例)
    module_name = module.__class__.__name__ + "_" + str(id(module))

    # 保存图像
    image_path = f"{module_name}_feature_map.png"
    image.save(image_path)
    print(f"Saved feature map to {image_path}")

         目前只能生成灰度图像,在生成彩色图片时遇到问题,报错如下所示,下周解决该问题。 

2.2 实验情况

        在本周对设计的实验进行了验证,在验证过程中发现选择合适的学习率很重要,指标相差也很大。

        目前的网络结构效果在5000的 CurveFaultA 数据集上优于InversionNet,但是不知道大数据集上表现如何。

        损失函数的表现在小数据集上不太明显,部分指标较好,但是部分指标不好。

三、下周计划

  1. 利用工作站完成实验;

  2. 验证特征图保存方法是否适用;

  3. 了解高级优化算法;

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

六、 SpringBoot 配置⽂件 ★ ✔【value的引号注意事项、@ConfigurationProperties 、】

六、 SpringBoot 配置⽂件 本节⽬标1. 配置⽂件作⽤2. 配置⽂件快速⼊⼿3. 配置⽂件的格式4. properties 配置⽂件说明4.1 properties 基本语法4.2 读取配置⽂件4.3 properties 缺点分析 5. yml 配置⽂件说明5.1 yml 基本语法5.2 yml 使⽤进阶5.2.1 yml 配置不同数据类型及 nul…

记录些MySQL题集(1)

Innodb 是如何实现事务的? InnoDB是MySQL数据库的一个存储引擎,它支持事务处理。事务处理是数据库管理系统执行过程中的一个逻辑单位,由一个或多个SQL语句组成,这些语句要么全部执行,要么全部不执行,是一个…

Poetry2Image:专为中文古诗词图像生成,忠于原诗意境和语义。

直接基于文本的图像生成通常会导致丢失图像中的关键元素。为了解决此问题,哈工大提出Poetry2Image,通过实施有针对性的图像校正解决这个问题,有效地捕捉这首诗所传达的语义和艺术精髓。 Poetry2Image流程分为如下几步: 搜索和翻译…

免费进销存软件哪个好用?首选象过河

在快节奏的商业环境中,进销存管理一直是不可忽视的重要环节,关乎着企业的运营成本控制和运营效率的高低。传统的纸质记录已难以满足企业发展需求,很多企业管理者为了节约成本,都想寻找一款免费进销存软件。那么,免费进…

(day18) leetcode 204.计数质数

描述 给定整数 n ,返回 所有小于非负整数 n 的质数的数量 。 示例 1: 输入:n 10 输出:4 解释:小于 10 的质数一共有 4 个, 它们是 2, 3, 5, 7 。示例 2: 输入:n 0 输出:0示例 3…

计算机系统复习——文件系统和目录

文件系统 存储管理: 文件系统负责将文件存储在存储设备(如硬盘、固态硬盘)中,并记录文件的位置和大小。 文件访问控制: 文件系统管理文件的访问权限,确保只有授权用户可以读取、写入或执行文件。 数据…

PostgreSQL 中如何解决因长事务阻塞导致的其他事务等待问题?

🍅关注博主🎗️ 带你畅游技术世界,不错过每一次成长机会!📚领书:PostgreSQL 入门到精通.pdf 文章目录 PostgreSQL 中如何解决因长事务阻塞导致的其他事务等待问题?一、了解长事务阻塞的原因&…

Qt进阶版五子棋

五子棋是一种两人对弈的棋类游戏,目标是在横、竖、斜任意方向上连成五个子。在Qt中实现五子棋程序,你需要设计棋盘界面、处理下棋逻辑、判断胜负等。以下是实现一个基本五子棋程序的步骤: 创建项目和界面 使用Qt Creator创建一个新的Qt Widge…

人工智能大模型讲师培训老师叶梓介绍及多模态大模型原理与实践提纲

培训需要解决的问题 通过本次培训,拓展对多模态AI应用领域的视野,帮助团队聚焦AI赋能创新突破,提升对AI服务的技术认知与理解,更好地助力业务智能化业务建设。 培训时长 1天 培训老师介绍 叶梓,工学博士&#xff0…

【人工智能】Transformers之Pipeline(二):自动语音识别(automatic-speech-recognition)

​​​​​​​ 目录 一、引言 二、自动语音识别(automatic-speech-recognition) 2.1 概述 2.2 技术原理 2.2.1 whisper模型 2.2.2 Wav2vec 2.0模型 2.3 pipeline参数 2.3.1 pipeline对象实例化参数​​​​​​​ 2.3.2 pipeline对象使用参数…

HiFi Asia 2024圆满落幕,琛蓝生物分享企业成果

一个时代,一个风口。其中有些风口切中时代脉搏,顺势而为的人因此成功登顶,有些风口则被证伪,热潮散去之后留下一地鸡毛。在当今时代,倘若要寻找下一个时代风口,那么“大健康”毫无疑问是确定性最强大那一个…

BernNet Learning Arbitrary Graph Spectral Filters via Bernstein Approximation

发表于:neurips21 推荐指数: #paper/⭐⭐ 设定:在本文中,h是过滤器. bernstein 多项式逼近(这个证明有点稀里糊涂的,反正我觉得一点点问题,可能因为我水平低) p K ( t ) : ∑ k 0 K θ k ⋅ b k K ( t ) ∑ k 0 K f ( k K ) ⋅ ( K k ) ( 1 − t ) K − k t k . p_K(t):…

下载利器:IDM绿色版/一款Windows平台多线程下载工具

大家好!我是闷声轻创!今天给你们分享一款神器Internet Download Manager(简称IDM)这款软件是需要激活需要付费的【免注册激活,无假冒序列号弹窗】适用于Windows 系统,对于经常需要下载大量数据的用户来说&a…

自定义方法耗时监控告警

自定义方法耗时监控告警 用于记录代码耗时,当代码耗时超过指定阈值时打印告警日志 自定义注解 通过自定义注解的方式可以更方便的使用,只需要在需要做耗时兼容的方法上增加上该注解即可 package com.huakai.springenv.aspect.profiler;import java.lan…

Python与自动化脚本编写

Python与自动化脚本编写 Python因其简洁的语法和强大的库支持,成为了自动化脚本编写的首选语言之一。在这篇文章中,我们将探索如何使用Python来编写自动化脚本,以简化日常任务。 一、Python自动化脚本的基础 1. Python在自动化中的优势 Pyth…

i18n、L10n、G11N 和 T9N 的含义

注:机翻,未校对。 Looking into localization for the first time can be terrifying, if only due to all of the abbreviations. But the meaning of i18n, L10n, G11N, and T9N, are all very easy to understand. 第一次研究本地化可能会很可怕&…

Leetcode3202. 找出有效子序列的最大长度 II

Every day a Leetcode 题目来源:3202. 找出有效子序列的最大长度 II 解法1:动态规划 本题是选与不选的子序列问题,可以尝试给出这样的状态定义: dp[i][j]:以 nums[i] 结尾模 k 后值为 j 的最长子序列的长度。 那么…

el-popover或el-popconfirm中button不展示问题

vue3在使用Element-plus 2.X时&#xff0c;出现el-popover或el-popconfirm中button不展示问题。 正常效果&#xff1a; 第一种错误原因&#xff1a;el-button没有添加 slotreference <template slot-scope"scope"><el-popconfirm title"您确定删除吗…

【Linux】从零开始认识多线程 --- 线程控制

在这个浮躁的时代 只有自律的人才能脱颖而出 -- 《觉醒年代》 从零开始认识多线程 --- 线程控制 1 知识回顾2 线程控制2.1 线程创建2.2 线程等待2.3 线程终止 3 测试运行3.1 小试牛刀 --- 创建线程3.2 探幽析微 --- 理解线程参数3.3 小有心得 --- 探索线程返回3.4 求索无厌 …

CSS技巧专栏:一日一例 2.纯CSS实现 多彩边框按钮特效

大家好,今天是 CSS技巧一日一例 专栏的第二篇《纯CSS实现多彩边框按钮特效》 先看图: 开工前的准备工作 正如昨日所讲,为了案例的表现,也处于书写的习惯,在今天的案例开工前,先把昨天的准备工作重做一遍。 清除浏览器的默认样式定义页面基本颜色设定body的样式清除butt…