深入理解PyTorch中的Hook机制:特征可视化的重要工具与实践

news2024/11/18 11:49:46

文章目录

  • 一、前言
    • 1. 特征可视化的重要性
    • 2. PyTorch中的hook机制简介
  • 二、Hook函数概述
    • 1. Tensor级别的hook:register_hook()
    • 2. Module级别的hook
  • 三、register_forward_hook()详解
    • 1. 功能与使用场景
    • 2. 示例代码与解释
    • 3. 在特征可视化中的具体应用
  • 四、register_backward_hook()详解
    • 1. 功能与使用场景
    • 2. 示例代码与解释
    • 3. 在特征可视化中的具体应用
  • 五、register_hook()详解
    • 1. 功能与使用场景(相对于module级别的hook)
    • 2. 示例代码与解释
    • 3. 在特征可视化中的具体应用
  • 六、总结
    • 1. hook函数在PyTorch特征可视化中的重要性
    • 2. 如何根据实际需求灵活运用不同的hook函数


一、前言

1. 特征可视化的重要性

特征可视化是深度学习研究和开发中的重要工具,它可以帮助我们更好地理解和解释神经网络的行为。特征可视化可以有以下几个方面的应用:

  1. 模型理解:通过可视化中间层的特征,我们可以了解模型在处理输入数据时的学习过程和决策依据,这对于诊断和改进模型性能至关重要。
  2. 问题诊断:特征可视化可以帮助我们识别潜在的问题,如过度fitting、梯度消失或爆炸、不恰当的初始化等。
  3. 知识发现:通过对特征的可视化分析,研究人员可能发现数据中未曾预料到的模式或结构,这些新发现的知识可以进一步提升模型的设计和训练策略。
  4. 教育与交流:特征可视化是一种强大的教育工具,它能够以直观的方式展示深度学习模型的工作原理,使得非专业人士也能理解并参与到讨论中来。

2. PyTorch中的hook机制简介

PyTorch是一个流行的深度学习框架,以其动态图和易于使用的接口而受到广泛欢迎。在其设计中,hook机制是一个非常实用的功能,它允许开发者在不修改网络结构的前提下,介入到模型的前向传播和反向传播过程中。

Hook机制主要通过以下三种函数实现:

  • register_forward_hook():这个函数允许我们在某个模块的前向传播完成后注册一个回调函数。这个回调函数会接收到该模块的输入和输出,从而让我们有机会获取和分析中间层的输出特征。
  • register_backward_hook():与register_forward_hook()类似,这个函数允许我们在反向传播过程中注册一个回调函数。这个回调函数会在计算完模块的梯度后被调用,接收模块的输入梯度和输出梯度,这有助于我们理解和可视化梯度流动的过程。
  • register_hook():这是一个更底层的接口,可以直接在Tensor级别注册hook。当该Tensor的梯度被计算时,注册的回调函数会被调用。这为自定义梯度计算、监控特定变量的梯度行为以及进行更复杂的操作提供了灵活性。

通过巧妙地使用hook机制,研究人员和开发者能够在不影响模型正常运行的情况下,深入探索和可视化神经网络的内部工作原理,进而提升模型的性能和可解释性。在后续的章节中,我们将详细探讨这些hook函数的具体使用方法和应用场景。


二、Hook函数概述

1. Tensor级别的hook:register_hook()

  • 定义与基本用法
    register_hook()是Tensor级别的hook函数,允许我们在某个Tensor的梯度计算过程中插入自定义操作。当该Tensor的梯度在反向传播中被计算时,注册的回调函数会被调用。这个回调函数接收一个参数,即该Tensor的梯度,且不应修改输入的梯度值,但可以返回一个新的梯度值供后续计算使用。
    基本用法如下:
tensor = torch.tensor(...)  # 或者是模型中的任意Tensor
hook = tensor.register_hook(callback_function)

其中,callback_function是我们自定义的回调函数,它接受一个梯度张量作为输入。

  • 在特征可视化中的应用
    在特征可视化中,register_hook()可以用于监控和分析特定Tensor的梯度信息。例如,我们可以使用它来检查梯度是否出现消失或爆炸的问题,或者可视化梯度在整个网络中的分布情况。这有助于我们理解模型的学习过程和优化行为,从而进行针对性的改进。

2. Module级别的hook

  1. register_forward_hook()
  • 定义与基本用法
    register_forward_hook()是Module级别的hook函数,它允许我们在某个模块的前向传播完成后注册一个回调函数。这个回调函数会在模块的前向传播结束后被调用,接收三个参数:模块本身、输入、输出。
    基本用法如下:
def forward_hook(module, input, output):
	# 对输入、输出或模块进行操作
	pass
module = SomePyTorchModule()
hook = module.register_forward_hook(forward_hook)
  • 在前向传播过程中的特征提取和可视化
    在特征可视化中,register_forward_hook()是一个非常有用的工具。我们可以在感兴趣的中间层注册forward hook,获取其输出特征,并进行可视化。这可以帮助我们理解模型在不同层次上学习到的特征表示,例如在卷积神经网络中查看过滤器的响应,或者在循环神经网络中观察隐藏状态的变化。
  1. register_backward_hook()
  • 定义与基本用法
    register_backward_hook()同样是Module级别的hook函数,但它在反向传播过程中被调用。当模块的输出梯度计算完毕后,注册的回调函数会被调用,接收三个参数:模块本身、输入梯度、输出梯度。

    基本用法如下:

def backward_hook(module, grad_input, grad_output):
	# 对输入梯度、输出梯度或模块进行操作
	pass
module = SomePyTorchModule()
hook = module.register_backward_hook(backward_hook)
  • 在反向传播过程中的梯度分析和可视化
    在梯度分析和可视化中,register_backward_hook()可以帮助我们监控和理解反向传播过程中梯度的流动和变化。通过注册backward hook,我们可以检查梯度的大小和分布,识别潜在的梯度问题,如梯度消失或爆炸,并据此调整模型结构或优化器参数。此外,梯度的可视化也可以提供有关模型训练过程的重要见解,帮助我们优化模型性能和稳定性。

三、register_forward_hook()详解

1. 功能与使用场景

register_forward_hook()是PyTorch中的一个模块级别的hook函数,主要用于在模型的前向传播过程中插入自定义操作。当模块的前向传播计算完毕后,注册的回调函数会被调用。
该函数的主要功能和使用场景包括:

  1. 特征提取:通过获取和分析模块的输入和输出,可以提取中间层的特征表示,用于后续的可视化或分析。
  2. 网络理解:通过观察不同层次的特征表示,可以帮助研究人员理解模型的学习过程和决策依据,提高模型的可解释性。
  3. 诊断问题:在回调函数中检查输入和输出,可以识别潜在的问题,如数据异常、层间不匹配等。

2. 示例代码与解释

以下是一个使用register_forward_hook()的基本示例:

import torch
import torch.nn as nn

class SimpleModel(nn.Module):
    def __init__(self):
        super(SimpleModel, self).__init__()
        self.conv = nn.Conv2d(1, 3, kernel_size=3)
    def forward(self, x):
        return self.conv(x)

model = SimpleModel()

def forward_hook(module, inputs, output):
    print(f"Module: {module}")
    print(f"Input: {inputs[0].shape}")
    print(f"Output: {output.shape}")

hook = model.conv.register_forward_hook(forward_hook)
input_data = torch.randn(1, 1, 28, 28, requires_grad=True)
output = model(input_data)
hook.remove()

在这个示例中,我们首先定义了一个简单的卷积神经网络,并在其内部的卷积层注册了一个forward_hook。当前向传播计算完该卷积层的输出时,我们的回调函数forward_hook会被调用,打印出模块、输入和输出的信息。结果如下:

Module: Conv2d(3, 6, kernel_size=(3, 3), stride=(1, 1))
Input: torch.Size([1, 1, 28, 28])
Output: torch.Size([1, 3, 26, 26])

3. 在特征可视化中的具体应用

  1. 中间层输出的可视化

中间层输出的可视化是深度学习研究中的一个重要工具,它可以帮助我们了解模型在处理输入数据时的学习过程和特征表示。

下面是一个使用register_forward_hook()进行中间层输出可视化的示例:

import matplotlib.pyplot as plt

def feature_visualization_hook(module, inputs, output):
    # 将输出特征图转换为RGB图像
    output = output.permute(0, 2, 3, 1)
    feature_map = output.detach().squeeze().numpy()
    feature_map -= feature_map.min()
    feature_map /= feature_map.max()
    feature_map *= 255
    feature_map = feature_map.astype(np.uint8)
    # print(feature_map.shape)
    plt.imshow(feature_map, cmap='gray')
    plt.title(f"Feature Map at Module {module}")
    plt.show()

hook = model.conv.register_forward_hook(feature_visualization_hook)
input_data = torch.randn(1, 1, 28, 28)
output = model(input_data)
hook.remove()

结果如下

Module: Conv2d(1, 3, kernel_size=(3, 3), stride=(1, 1))
Input: torch.Size([1, 1, 28, 28])
Output: torch.Size([1, 3, 26, 26])

中间层输出可视化

在这个示例中,我们在每次前向传播计算完卷积层的输出后,都会将其转换为灰度图像并进行可视化,以便观察模型在处理输入数据时学习到的特征表示。

  1. 网络理解与诊断

通过register_forward_hook(),我们可以深入理解模型的工作原理,并诊断可能存在的问题。

下面是一个使用register_forward_hook()进行网络理解与诊断的示例:

def network_inspection_hook(module, inputs, output):
    # 检查输入和输出的形状是否匹配
    if len(inputs[0]) != len(output):
        print(f"Mismatched input and output shapes at module {module}: {input.shape} vs {output.shape}")

    # 计算输出的平均值和标准差
    mean = output.mean().item()
    std = output.std().item()

    print(f"Module: {module}")
    print(f"Input: {inputs[0].shape}")
    print(f"Output: {output.shape}, Mean: {mean:.4f}, Std: {std:.4f}")

hook = model.conv.register_forward_hook(network_inspection_hook)
input_data = torch.randn(2, 1, 28, 28)
output = model(input_data)
hook.remove()

结果如下:

Module: Conv2d(1, 3, kernel_size=(3, 3), stride=(1, 1))
Input: torch.Size([2, 1, 28, 28])
Output: torch.Size([2, 3, 26, 26]), Mean: -0.0609, Std: 0.5219

在这个示例中,我们在每次前向传播计算完卷积层的输出后,都会检查输入和输出的形状是否匹配,并计算输出的平均值和标准差。这些信息可以帮助我们理解模型的行为,并识别潜在的问题,如层间不匹配、激活函数饱和等。


四、register_backward_hook()详解

1. 功能与使用场景

register_backward_hook()是PyTorch中的一个模块级别的hook函数,主要用于在模型的反向传播过程中插入自定义操作。当模块的输出梯度计算完毕后,注册的回调函数会被调用。
该函数的主要功能和使用场景包括:

  1. 梯度监控:通过获取和分析模块的输入和输出梯度,可以监控模型在训练过程中的梯度行为,识别潜在的梯度问题,如梯度消失或爆炸。
  2. 优化策略实施:可以在回调函数中实现自定义的优化策略,如梯度裁剪、权重衰减等。
  3. 可视化:通过提取和处理梯度信息,可以进行梯度分布的可视化,帮助研究人员理解模型的学习过程和优化行为。

2. 示例代码与解释

以下是一个使用register_backward_hook()的基本示例:

import torch
import torch.nn as nn
torch.random.manual_seed(0)
class SimpleModel(nn.Module):
    def __init__(self):
        super(SimpleModel, self).__init__()
        self.linear = nn.Linear(10, 5)

    def forward(self, x):
        return self.linear(x)

model = SimpleModel()

def backward_hook(module, grad_input, grad_output):
    print(f"Module: {module}")
    for x in grad_input:
        if x is None: continue
        print(f"Input Gradients: {x.shape}")
    for x in grad_output:
        if x is None: continue
        print(f"Output Gradients: {x.shape}")

hook = model.linear.register_backward_hook(backward_hook)

input_data = torch.randn(1, 10, requires_grad=True)
target_data = torch.randn(5)

output = model(input_data)
loss = torch.mean((output - target_data) ** 2)
loss.backward()
hook.remove()

结果如下:

Module: Linear(in_features=10, out_features=5, bias=True)
Input Gradients: torch.Size([5])
Input Gradients: torch.Size([1, 10])
Input Gradients: torch.Size([10, 5])
Output Gradients: torch.Size([1, 5])

在这个示例中,我们首先定义了一个简单的线性模型,并在其内部的线性层注册了一个backward_hook。当反向传播计算完该线性层的梯度时,我们的回调函数backward_hook会被调用,打印出模块、输入梯度和输出梯度的信息。

3. 在特征可视化中的具体应用

  1. 梯度裁剪的监控
    梯度裁剪是一种常用的正则化技术,用于防止梯度爆炸。通过注册register_backward_hook(),我们可以监控模型中每个模块的梯度大小,并在梯度超过预设阈值时进行裁剪。
    下面是一个简单的梯度裁剪监控示例:
clipping_threshold = 0.1

def gradient_clipping_hook(module, grad_input, grad_output):
    # 检查梯度是否存在
    grad_input = [g for g in grad_input if g is not None]
    grad_output = [g for g in grad_output if g is not None]

    # 获取当前模块的最大梯度值
    max_gradient = max(max(torch.abs(g).max().item() for g in gradients) for gradients in [grad_input, grad_output] if gradients)

    if max_gradient > clipping_threshold:
        print(f"Gradient clipping triggered at module {module} with max gradient: {max_gradient}")
        # 对输入和输出梯度进行裁剪
        grad_input = [torch.clip(g, -clipping_threshold, clipping_threshold) if g is not None else None for g in grad_input]
        grad_output = [torch.clip(g, -clipping_threshold, clipping_threshold) if g is not None else None for g in grad_output]


hook = model.linear.register_backward_hook(gradient_clipping_hook)

input_data = torch.randn(1, 10, requires_grad=True)
target_data = torch.randn(5)
# 进行前向和反向传播
output = model(input_data)
loss = torch.mean((output - target_data) ** 2)
loss.backward()

# 移除钩子
hook.remove()

我们故意把阈值设小,结果如下

Gradient clipping triggered at module Linear(in_features=10, out_features=5, bias=True) with max gradient: 1.5577800273895264
  1. 梯度分布的可视化
    通过register_backward_hook(),我们可以获取模型中每个模块的梯度信息,并进行可视化,以了解梯度的分布情况。
    下面是一个使用matplotlib进行梯度分布可视化的示例:
import matplotlib.pyplot as plt

def gradient_distribution_hook(module, grad_input, grad_output):
    gradients = grad_input + grad_output

    for g in gradients:
        plt.hist(g.detach().flatten().numpy(), bins=50, alpha=0.5)
    plt.xlabel("Gradient Value")
    plt.ylabel("Frequency")
    plt.title(f"Gradient Distribution at Module {module}")
    plt.show()

hook = model.linear.register_backward_hook(gradient_distribution_hook)
input_data = torch.randn(1, 10, requires_grad=True)
target_data = torch.randn(5)
# 进行前向和反向传播
output = model(input_data)
loss = torch.mean((output - target_data) ** 2)
loss.backward()
hook.remove()

结果如下:
梯度分布的可视化

在这个示例中,我们在每次反向传播计算完梯度后,都会绘制梯度分布的直方图,以便观察梯度的分布情况。这有助于我们识别潜在的梯度问题,并据此调整模型结构或优化器参数。


五、register_hook()详解

1. 功能与使用场景(相对于module级别的hook)

register_hook()是Tensor级别的hook函数,它允许我们在某个Tensor的梯度计算过程中插入自定义操作。相对于module级别的hook(如register_forward_hook()register_backward_hook()),register_hook()提供了更细粒度的控制,可以直接在Tensor级别进行操作。

该函数的主要功能和使用场景包括:

  1. 变量级别的梯度监控:通过在特定Tensor上注册hook,可以精确地监控和分析该变量的梯度信息,而不仅仅局限于整个模块的输入和输出梯度。
  2. 自定义计算图操作的跟踪:在某些情况下,我们可能需要在计算图中插入自定义的操作或计算,register_hook()提供了一个方便的接口来实现这一点。

2. 示例代码与解释

以下是一个使用register_hook()的基本示例:

import torch

# 创建一个随机张量
x = torch.randn(3, 4, requires_grad=True)
# 定义一个回调函数
def gradient_hook(grad):
    print(f"Gradient of x: {grad.shape}")
# 在张量x上注册梯度hook
x.register_hook(gradient_hook)
# 创建一个依赖于x的张量y,并进行前向传播计算
y = x ** 2
out = y.mean()
out.backward()

结果如下

Gradient of x: torch.Size([3, 4])

在这个示例中,我们在张量x上注册了一个梯度hook。当反向传播计算x的梯度时,我们的回调函数gradient_hook会被调用,打印出x的梯度信息。

3. 在特征可视化中的具体应用

  1. 变量级别的梯度监控

通过register_hook(),我们可以精确地监控和分析模型中特定变量的梯度信息。

下面是一个使用register_hook()进行变量级别梯度监控的示例:

class SimpleModel(nn.Module):
    def __init__(self):
        super(SimpleModel, self).__init__()
        self.conv = nn.Conv2d(1, 3, kernel_size=3)
    def forward(self, x):
        return self.conv(x)

model = SimpleModel()

def gradient_monitor_hook(grad):
    print(f"Gradient of weight tensor: {grad.norm().item():.4f}")

# 获取模型的第一个卷积层的权重张量
conv_weight = model.conv.weight

# 在权重张量上注册梯度hook
hook = conv_weight.register_hook(gradient_monitor_hook)

input_data = torch.randn(1, 1, 28, 28)
output = model(input_data)

# 计算损失并进行反向传播
loss = output.mean()
loss.backward()
hook.remove()

在这个示例中,我们在模型的第一个卷积层的权重张量上注册了一个梯度hook。每当反向传播计算这个权重张量的梯度时,我们的回调函数gradient_monitor_hook会被调用,打印出权重张量的梯度范数。

  1. 自定义计算图操作的跟踪

在某些情况下,我们可能需要在计算图中插入自定义的操作或计算。register_hook()提供了一个方便的接口来实现这一点。

下面是一个使用register_hook()进行自定义计算图操作跟踪的示例:

class SimpleModel(nn.Module):
    def __init__(self):
        super(SimpleModel, self).__init__()
        self.fc1 = nn.Linear(2, 3)
        self.fc2 = nn.Linear(3, 4)

    def forward(self, x):
        y = self.fc1(x)
        y = self.fc2(y)
        return y

model = SimpleModel()

def custom_operation_hook(grad):
    # 对梯度进行自定义操作,例如指数平滑
    smoothed_grad = grad * 0.9 + grad.detach() * 0.1
    return smoothed_grad

# 获取模型的第一个全连接层的权重张量
fc1_weight = model.fc1.weight

# 在权重张量上注册梯度hook
hook = fc1_weight.register_hook(custom_operation_hook)

input_data = torch.randn(1, 2)
output = model(input_data)

# 计算损失并进行反向传播
loss = output.mean()
loss.backward()
hook.remove()

在这个示例中,我们在模型的第一个全连接层的权重张量上注册了一个梯度hook。每当反向传播计算这个权重张量的梯度时,我们的回调函数custom_operation_hook会被调用,对梯度进行指数平滑处理,然后返回修改后的梯度。这样,我们就在计算图中插入了一个自定义的操作。


六、总结

1. hook函数在PyTorch特征可视化中的重要性

hook函数在PyTorch特征可视化中扮演着至关重要的角色。通过使用register_forward_hook(), register_backward_hook()和register_hook(),研究人员和开发者能够深入到神经网络的内部工作流程中,提取和分析关键的信息。

这些hook函数使得我们能够:

  1. 监控和理解模型的中间层特征表示,这对于解释模型的行为、识别潜在问题以及优化模型性能至关重要。
  2. 实时监控梯度信息,检测梯度消失或爆炸等常见问题,从而调整优化策略和模型参数。
  3. 在不修改模型结构的前提下,自定义计算图操作和梯度计算,为研究和开发提供了极大的灵活性。
  4. 通过特征可视化,提高模型的可解释性和透明度,有助于建立用户对模型的信任。

2. 如何根据实际需求灵活运用不同的hook函数

选择和运用hook函数应基于具体的研究目标和实际需求。以下是一些指导原则:

  1. 当需要关注模型的中间层特征表示和网络行为理解时,使用register_forward_hook()。这可以帮助你观察和解释模型在处理输入数据时的学习过程,并进行特征可视化。
  2. 当需要监控和分析模型的梯度信息,识别梯度问题或实施优化策略时,使用register_backward_hook()。这有助于你了解模型的优化过程,并作出相应的调整。
  3. 当需要对单个变量或权重的梯度进行精细控制和分析,或者在计算图中插入自定义操作时,使用register_hook()。这为实现更复杂和特定的任务提供了可能。
  4. 在某些情况下,你可能需要同时使用多个级别的hook来满足不同的需求。例如,你可以同时使用register_forward_hook()和register_backward_hook()来全面了解模型的前向传播和反向传播过程。

总的来说,理解和灵活运用hook函数是提升深度学习研究和开发效率的关键。通过结合不同的hook函数和可视化技术,我们可以更好地理解神经网络的工作原理,优化模型性能,以及解决实际应用中的挑战。

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

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

相关文章

数据结构--图(更新ing~)

树具有灵活性,并且存在许多不同的树的应用,但是就树本身而言有一定的局限性,树只能表示层次关系,比如父子关系。而其他的比如兄弟关系只能够间接表示。 推广--- 图 图形结构中,数据元素之间的关系是任意的。 一、图…

C语言快速排序算法以及代码

接下来我们将用图像模拟来一步步演示快速排序的过程,这样我们将会通过视觉和大脑一起来梳理快速排序的思路。 后文示例的C语言代码将实现图像模拟的过程。 一、图像模拟 快速排序 过程 我们选取十个数字0~9当做我们的排序数字,并将其打乱。然后我们将…

Axure的交互以及情形的介绍

一. 交互 1.1 交互概述 通俗来讲就是,谁用了什么方法做了什么事情,主体"谁"对应的就是axure中的元件,"什么方法"对应的就是交互事件,比如单击事件、双击事件,"什么事情"对应的就是交互…

银河麒麟v10 安装mysql 8.35

银河麒麟v10 安装mysql 8.35 1、下载Mysql安装包2、安装Mysql 8.352.1、安装依赖包2.2、安装Mysql2.3、安装后配置 1、下载Mysql安装包 访问官网下载链接 链接: https://dev.mysql.com/downloads/mysql/ 选择如下 点击下载按钮 下载安装包 2、安装Mysql 8.35 官方安装文档…

挑战52天学小猪佩奇笔记--day25

52天学完小猪佩奇--day25 ​【本文说明】 本文内容来源于对B站UP 脑洞部长 的系列视频 挑战52天背完小猪佩奇----day25 的视频内容总结,方便复习。强烈建议大家去关注一波UP,配合UP视频学习。 day25的主题:生病了 猜台词: Daddy: …

我勒个豆,怎么没人告诉我这个偷懒神器啊

OMG,还有行政人不知道它的吗??再不用真的亏大了啊!! 这东西写啥都可以,只有输入需求马上就写好了啊,什么工作总结,活动策划方案,会议纪要啥啥都可以,全能写啊…

持续集成交付CICD:K8S 通过模板文件自动化完成前端项目应用发布

目录 一、实验 1.环境 2.GitLab 更新deployment文件 3.GitLab更新共享库前端项目CI与CD流水线 4.K8S查看前端项目版本 5.Jenkins 构建前端项目 6.Jenkins 再次构建前端项目 二、问题 1. Jenkins 构建CI 流水线报错 2. Jenkins 构建CI 流水线弹出脚本报错 3. Jenkins…

长短期记忆(LSTM)神经网络-多输入分类

目录 一、程序及算法内容介绍: 基本内容: 亮点与优势: 二、实际运行效果: 三、部分程序: 四、完整程序下载: 一、程序及算法内容介绍: 基本内容: 本代码基于Matlab平台编译&am…

Linux-----17、软件包管理

# 软件包管理 # 1、软件包分类 # ㈠ 软件包类型 二进制包源码包 # ① 二进制包 什么是二进制包?有什么特点? 二进制包,指的是已经 1 好了的软件包,只需要直接安装就可以使用。二进制包,不需要编译,直接…

【人工智能革命】:AIGC时代的到来 | 探索AI生成内容的未来

🎥 屿小夏 : 个人主页 🔥个人专栏 : IT杂谈 🌄 莫道桑榆晚,为霞尚满天! 文章目录 📑前言一. AIGC 技术的概述和发展趋势1.1 AIGC 技术的概述1.2 AIGC 技术的发展趋势 二. AIGC 与元宇…

Java-基础部分(二)

一、抽象类 当编写一个类时,我们往往会为该类定义一些方法,这些方法是用来描述该类的行为方式,那么这些方法都有具体的方法体。 分析事物时,发现了共性内容,就出现向上抽取。会有这样一种特殊情况,就是功…

使用 React 实现自定义数据展示日历组件

目录 背景实现日历组件父组件数据 效果最后 背景 项目中需要实现一个日历组件,并且需要展示月,日所对应的数据(因为项目需求问题,就不统计年数据总量)。网上找了一堆,基本都不大符合项目需求,且…

计算机提示由于找不到vcruntime140_1.dll怎么办,那种修复方法推荐

首先,让我们来了解一下vcruntime140_1.dll是什么。其实,vcruntime140_1.dll是Visual C Redistributable Packages的一部分,它是由Microsoft Visual Studio编写的程序运行时库。它包含了许多用于运行Windows应用程序的函数和资源。因此&#x…

VueStu02-创建一个Vue实例

一、核心步骤 1.准备容器 准备一个盒子div。 2.引包 从官网引包,有开发版本和生产版本之分。 3.创建Vue实例 创建一个Vue实例,new Vue()。 4.指定配置项 指定配置项,用于渲染数据 。 el:指定挂载点。知道自己将来要管理的是…

Python实验作业,爬虫,中国院士信息

实验内容: 爬取中国工程院网页上,把每位院士的简介保存为本地文本文件,把每位院士的照片保存为本地图片,文本文件和图片文件都以院士的姓名为主文件名。 实验代码: import os.path import time from urllib.request …

干货教学!!!RHEL8中ansible中常用模块的使用

内容很长各位大老爷耐心观看 本章主要介绍ansible中最常见模块的使用 文件管理模块软件包管理模块服务管理模块磁盘管理模块用户管理模块防火墙管理模块 ansible的基本用法如下 ansible 机器名 -m 模块x -a “模块的参数” 对被管理机器执行不同的操作,只需要调…

git修改远程commit信息

git 修改远程commit信息 如果你已经把本地commit的信息push到远程了,此时需要修改远程中的commit信息 第一步:git log 查看提交的信息,看下提交的commit日志 如下入所示 第二步:然后确定你需要修改的那一次commit,比如&#xf…

LeetCode Hot100 51.N皇后

题目: 按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。 n 皇后问题 研究的是如何将 n 个皇后放置在 nn 的棋盘上,并且使皇后彼此之间不能相互攻击。 给你一个整数 n ,返回所有不同的 n 皇后问题 的…

Everything 搜索

正则表达式Regex 首先需要开启 Everything 工具在(字符串)查找时,对正则表达式功能的支持: 需要在【菜单栏】⇒ 【Search】⇒ 勾选【Enable Regex】 查看Everything 支持的语法:

统一大语言模型和知识图谱:如何解决医学大模型-问诊不充分、检查不准确、诊断不完整、治疗方案不全面?

统一大语言模型和知识图谱:如何解决医学大模型问诊不充分、检查不准确、诊断不完整、治疗方案不全面? 医学大模型问题如何使用知识图谱加强和补足专业能力?大模型结构知识图谱增强大模型的方法 医学大模型问题 问诊。偏离主诉和没抓住核心。…