Torch中`Transformer`的中文注释

解析torch官方代码脚本文件:transformer.py。版本:1.9.1+cu111。

首先查看《Torch中多头注意力MultiheadAttention的中文注释》解析;
最后查看下方transformer解析。
话不多说,看代码吧!

import copy
from typing import Optional, Anyimport torch
from torch import Tensor
from .. import functional as F
from .module import Module
from .activation import MultiheadAttention
from .container import ModuleList
from ..init import xavier_uniform_
from .dropout import Dropout
from .linear import Linear
from .normalization import LayerNormclass Transformer(Module):r"""这是一个变换器模型,用户可以根据需要修改其属性。该架构基于论文《Attention Is All You Need》。该论文由Ashish Vaswani、Noam Shazeer、Niki Parmar、Jakob Uszkoreit、Llion Jones、Aidan N Gomez、Lukasz Kaiser和Illia Polosukhin于2017年发表,在神经信息处理系统进展(Advances in Neural Information Processing Systems)的第6000至6010页。用户可以使用对应的参数构建BERT模型(参见https://arxiv.org/abs/1810.04805)。参数如下:d_model:编码器/解码器输入中预期的特征数量(默认为512)。nhead:多头注意力模型中的头数(默认为8)。num_encoder_layers:编码器中子编码层的数量(默认为6)。num_decoder_layers:解码器中子解码层的数量(默认为6)。dim_feedforward:前馈网络模型的维度(默认为2048)。dropout:丢弃率(默认为0.1)。activation:编码器/解码器中间层的激活函数,可选relu或gelu(默认为relu)。custom_encoder:自定义编码器(默认为None)。custom_decoder:自定义解码器(默认为None)。layer_norm_eps:层归一化组件中的eps值(默认为1e-5)。batch_first:如果设为True,则输入和输出张量将以(批次,序列,特征)的形式提供。默认值为False(序列,批次,特征)。Examples::>>> transformer_model = nn.Transformer(nhead=16, num_encoder_layers=12)>>> src = torch.rand((10, 32, 512))>>> tgt = torch.rand((20, 32, 512))>>> out = transformer_model(src, tgt)Note: A full example to apply nn.Transformer module for the word language model is available inhttps://github.com/pytorch/examples/tree/master/word_language_model__init__:batch_first: 如果为 True,则输入和输出张量将按 (batch, seq, feature) 的顺序提供;否则,顺序为 (seq, batch, feature)。编码器和解码器组件:self.encoder: 如果提供了 custom_encoder,则直接使用这个自定义编码器;否则,创建一个标准的 TransformerEncoder 实例,它由多个 TransformerEncoderLayer 层堆叠构成。self.decoder: 同样地,如果提供了 custom_decoder,则直接使用;否则,创建一个标准的 TransformerDecoder 实例,由多个 TransformerDecoderLayer 层构成。"""def __init__(self, d_model: int = 512, nhead: int = 8, num_encoder_layers: int = 6,num_decoder_layers: int = 6, dim_feedforward: int = 2048, dropout: float = 0.1,activation: str = "relu", custom_encoder: Optional[Any] = None, custom_decoder: Optional[Any] = None,layer_norm_eps: float = 1e-5, batch_first: bool = False,device=None, dtype=None) -> None:factory_kwargs = {'device': device, 'dtype': dtype}super(Transformer, self).__init__()if custom_encoder is not None:self.encoder = custom_encoderelse:encoder_layer = TransformerEncoderLayer(d_model, nhead, dim_feedforward, dropout,activation, layer_norm_eps, batch_first,**factory_kwargs)encoder_norm = LayerNorm(d_model, eps=layer_norm_eps, **factory_kwargs)self.encoder = TransformerEncoder(encoder_layer, num_encoder_layers, encoder_norm)if custom_decoder is not None:self.decoder = custom_decoderelse:decoder_layer = TransformerDecoderLayer(d_model, nhead, dim_feedforward, dropout,activation, layer_norm_eps, batch_first,**factory_kwargs)decoder_norm = LayerNorm(d_model, eps=layer_norm_eps, **factory_kwargs)self.decoder = TransformerDecoder(decoder_layer, num_decoder_layers, decoder_norm)self._reset_parameters()self.d_model = d_modelself.nhead = nheadself.batch_first = batch_firstdef forward(self, src: Tensor, tgt: Tensor, src_mask: Optional[Tensor] = None, tgt_mask: Optional[Tensor] = None,memory_mask: Optional[Tensor] = None, src_key_padding_mask: Optional[Tensor] = None,tgt_key_padding_mask: Optional[Tensor] = None, memory_key_padding_mask: Optional[Tensor] = None) -> Tensor:r"""接受并处理带有掩码的源序列和目标序列。参数:src: 输入到编码器的序列(必需)。tgt: 输入到解码器的序列(必需)。src_mask: 源序列的加性掩码(可选)。tgt_mask: 目标序列的加性掩码(可选)。memory_mask: 编码器输出的加性掩码(可选)。src_key_padding_mask: 每批源键的ByteTensor掩码(可选)。tgt_key_padding_mask: 每批目标键的ByteTensor掩码(可选)。memory_key_padding_mask: 每批记忆键的ByteTensor掩码(可选)。形状:- src: :math:`(S, N, E)`,如果`batch_first`为真,则为`(N, S, E)`。- tgt: :math:`(T, N, E)`,如果`batch_first`为真,则为`(N, T, E)`。- src_mask: :math:`(S, S)`。- tgt_mask: :math:`(T, T)`。- memory_mask: :math:`(T, S)`。- src_key_padding_mask: :math:`(N, S)`。- tgt_key_padding_mask: :math:`(N, T)`。- memory_key_padding_mask: :math:`(N, S)`。注意: [src/tgt/memory]_mask确保位置i能访问未被掩码的位置。如果提供的是ByteTensor,非零位置不允许访问,而零位置保持不变。如果提供的是BoolTensor,`True`的位置不允许访问,而`False`值将保持不变。如果提供的是FloatTensor,它将被添加到注意力权重中。[src/tgt/memory]_key_padding_mask提供了在键中应被注意力忽略的指定元素。如果提供的是ByteTensor,非零位置将被忽略,而零位置保持不变。如果提供的是BoolTensor,值为`True`的位置将被忽略,而值为`False`的位置将保持不变。- 输出: :math:`(T, N, E)`,如果`batch_first`为真,则为`(N, T, E)`。注意: 由于变换器模型中的多头注意力架构,变换器的输出序列长度与输入序列(即解码的目标)的长度相同。其中S是源序列长度,T是目标序列长度,N是批次大小,E是特征数量。Examples:>>> output = transformer_model(src, tgt, src_mask=src_mask, tgt_mask=tgt_mask)"""if not self.batch_first and src.size(1) != tgt.size(1):raise RuntimeError("the batch number of src and tgt must be equal")elif self.batch_first and src.size(0) != tgt.size(0):raise RuntimeError("the batch number of src and tgt must be equal")if src.size(2) != self.d_model or tgt.size(2) != self.d_model:raise RuntimeError("the feature number of src and tgt must be equal to d_model")memory = self.encoder(src, mask=src_mask, src_key_padding_mask=src_key_padding_mask)output = self.decoder(tgt, memory, tgt_mask=tgt_mask, memory_mask=memory_mask,tgt_key_padding_mask=tgt_key_padding_mask,memory_key_padding_mask=memory_key_padding_mask)return outputdef generate_square_subsequent_mask(self, sz: int) -> Tensor:r"""Generate a square mask for the sequence. The masked positions are filled with float('-inf').Unmasked positions are filled with float(0.0)."""mask = (torch.triu(torch.ones(sz, sz)) == 1).transpose(0, 1)mask = mask.float().masked_fill(mask == 0, float('-inf')).masked_fill(mask == 1, float(0.0))return maskdef _reset_parameters(self):r"""Initiate parameters in the transformer model."""for p in self.parameters():if p.dim() > 1:xavier_uniform_(p)class TransformerEncoder(Module):r"""TransformerEncoder is a stack of N encoder layers参数:- encoder_layer: TransformerEncoderLayer类的一个实例(必需)。- num_layers: 编码器中子编码器层的数量(必需)。- norm: 层归一化组件(可选)。__init__:encoder_layer: 这是单个编码器层的实例,通常由 TransformerEncoderLayer 构造。num_layers: 表示要堆叠的编码器层数量。norm: 可选参数,用于指定层归一化组件。在初始化过程中,通过 _get_clones 函数复制 encoder_layer 指定次数来创建编码器层的列表,这个列表存储在 self.layers 中。self.num_layers 存储了编码器层数量,而 self.norm 则保存了提供的层归一化组件(如果有)Examples::>>> encoder_layer = nn.TransformerEncoderLayer(d_model=512, nhead=8)>>> transformer_encoder = nn.TransformerEncoder(encoder_layer, num_layers=6)>>> src = torch.rand(10, 32, 512)>>> out = transformer_encoder(src)"""__constants__ = ['norm']def __init__(self, encoder_layer, num_layers, norm=None):super(TransformerEncoder, self).__init__()self.layers = _get_clones(encoder_layer, num_layers)self.num_layers = num_layersself.norm = normdef forward(self, src: Tensor, mask: Optional[Tensor] = None, src_key_padding_mask: Optional[Tensor] = None) -> Tensor:r"""依次通过编码器层传递输入.参数:Src:给编码器的序列(必需的)。Mask: SRC序列的掩码(可选)。Src_key_padding_mask:每批SRC键的掩码(可选)。形状:请参阅Transformer类中的文档。流程:src: 输入序列,是必须提供的参数。mask: 可选参数,用于输入序列的掩码。src_key_padding_mask: 可选参数,用于每批次源键的掩码。在前向传播中,数据 src 依次通过每一个编码器层,其中可以使用 mask 和 src_key_padding_mask 来控制哪些部分需要被忽略。最后,如果提供了层归一化组件 norm,那么整个编码器的输出将会通过该组件进行归一化处理"""output = srcfor mod in self.layers:output = mod(output, src_mask=mask, src_key_padding_mask=src_key_padding_mask)if self.norm is not None:output = self.norm(output)return outputclass TransformerDecoder(Module):r"""TransformerDecoder 是由 N 个解码器层堆叠而成的模块参数:decoder_layer: 必须提供的 TransformerDecoderLayer() 类的一个实例。这定义了单个解码器层的行为和结构。num_layers: 解码器中包含的子解码器层数量,这是一个必需的参数,决定了解码器的深度。norm: 层归一化组件,这是一个可选参数,用于在解码器所有层的输出之后执行归一化操作,有助于稳定训练过程并加速收敛。Examples::>>> decoder_layer = nn.TransformerDecoderLayer(d_model=512, nhead=8)>>> transformer_decoder = nn.TransformerDecoder(decoder_layer, num_layers=6)>>> memory = torch.rand(10, 32, 512)>>> tgt = torch.rand(20, 32, 512)>>> out = transformer_decoder(tgt, memory)"""__constants__ = ['norm']def __init__(self, decoder_layer, num_layers, norm=None):super(TransformerDecoder, self).__init__()self.layers = _get_clones(decoder_layer, num_layers)self.num_layers = num_layersself.norm = normdef forward(self, tgt: Tensor, memory: Tensor, tgt_mask: Optional[Tensor] = None,memory_mask: Optional[Tensor] = None, tgt_key_padding_mask: Optional[Tensor] = None,memory_key_padding_mask: Optional[Tensor] = None) -> Tensor:r"""依次通过解码器层传递输入(和掩码)。参数:Tgt:到解码器的序列(必需)。存储器:来自编码器最后一层的序列(必需)。Tgt_mask: TGT序列的掩码(可选)。Memory_mask:内存序列的掩码(可选)。Tgt_key_padding_mask:每批TGT键的掩码(可选)。Memory_key_padding_mask:每批内存键的掩码(可选)。形状:请参阅Transformer类中的文档。"""output = tgtfor mod in self.layers:output = mod(output, memory, tgt_mask=tgt_mask,memory_mask=memory_mask,tgt_key_padding_mask=tgt_key_padding_mask,memory_key_padding_mask=memory_key_padding_mask)if self.norm is not None:output = self.norm(output)return outputclass TransformerEncoderLayer(Module):r"""`TransformerEncoderLayer` 由自注意力(self-attn)和前馈网络(feedforward network)组成。这个标准的编码器层基于论文 "Attention Is All You Need"。Ashish Vaswani, Noam Shazeer, Niki Parmar, Jakob Uszkoreit, Llion Jones, Aidan N Gomez,Lukasz Kaiser, 和 Illia Polosukhin。2017年。注意力就是你所需要的。在《神经信息处理系统进展》期刊中,第6000至6010页。用户在应用过程中可以对其进行修改或以不同方式实现。参数:d_model: 输入中预期特征的数量(必需)。nhead: 多头注意力模型中的头数(必需)。dim_feedforward: 前馈网络模型的维度(默认=2048)。dropout: dropout的值(默认=0.1)。activation: 中间层的激活函数,可选relu或gelu(默认=relu)。layer_norm_eps: 层归一化组件中的eps值(默认=1e-5)。batch_first: 如果设为`True`,则输入和输出张量将按照(batch, seq, feature)的形式提供。默认:`False`。Examples::>>> encoder_layer = nn.TransformerEncoderLayer(d_model=512, nhead=8)>>> src = torch.rand(10, 32, 512)>>> out = encoder_layer(src)Alternatively, when ``batch_first`` is ``True``:>>> encoder_layer = nn.TransformerEncoderLayer(d_model=512, nhead=8, batch_first=True)>>> src = torch.rand(32, 10, 512)>>> out = encoder_layer(src)__init__:self_attn: 使用 MultiheadAttention 实现的自注意力机制。linear1, linear2: 用于前馈网络的线性层。dropout: 用于前馈网络中的Dropout操作。norm1, norm2: 层归一化层,用于自注意力和前馈网络之后。dropout1, dropout2: 用于残差连接后的Dropout操作。activation: 激活函数,根据传入的activation参数选择。"""__constants__ = ['batch_first']def __init__(self, d_model, nhead, dim_feedforward=2048, dropout=0.1, activation="relu",layer_norm_eps=1e-5, batch_first=False,device=None, dtype=None) -> None:factory_kwargs = {'device': device, 'dtype': dtype}super(TransformerEncoderLayer, self).__init__()self.self_attn = MultiheadAttention(d_model, nhead, dropout=dropout, batch_first=batch_first,**factory_kwargs)# Implementation of Feedforward modelself.linear1 = Linear(d_model, dim_feedforward, **factory_kwargs)self.dropout = Dropout(dropout)self.linear2 = Linear(dim_feedforward, d_model, **factory_kwargs)self.norm1 = LayerNorm(d_model, eps=layer_norm_eps, **factory_kwargs)self.norm2 = LayerNorm(d_model, eps=layer_norm_eps, **factory_kwargs)self.dropout1 = Dropout(dropout)self.dropout2 = Dropout(dropout)self.activation = _get_activation_fn(activation)def __setstate__(self, state):if 'activation' not in state:state['activation'] = F.relusuper(TransformerEncoderLayer, self).__setstate__(state)def forward(self, src: Tensor, src_mask: Optional[Tensor] = None, src_key_padding_mask: Optional[Tensor] = None) -> Tensor:r"""Pass the input through the encoder layer.Args:src: the sequence to the encoder layer (required).src_mask: the mask for the src sequence (optional).src_key_padding_mask: the mask for the src keys per batch (optional).Shape:see the docs in Transformer class.forword flow:首先通过自注意力层(self_attn)处理输入src,得到src2。将src与经过Dropout操作的src2相加,然后通过层归一化(norm1)。接着,src通过前馈网络,依次经过linear1、激活函数、dropout、linear2、dropout2,再与src相加,最后通过层归一化(norm2)。"""src2 = self.self_attn(src, src, src, attn_mask=src_mask,key_padding_mask=src_key_padding_mask)[0]src = src + self.dropout1(src2)src = self.norm1(src)src2 = self.linear2(self.dropout(self.activation(self.linear1(src))))src = src + self.dropout2(src2)src = self.norm2(src)return srcclass TransformerDecoderLayer(Module):r"""`TransformerDecoderLayer` 由自注意力(self-attn)、多头注意力(multi-head-attn)和前馈网络(feedforward network)组成。这个标准的解码器层基于论文 "Attention Is All You Need"。Ashish Vaswani, Noam Shazeer, Niki Parmar, Jakob Uszkoreit, Llion Jones, Aidan N Gomez,Lukasz Kaiser, 和 Illia Polosukhin。2017年。注意力就是你所需要的一切。在《神经信息处理系统进展》期刊中,第6000至6010页。用户在应用过程中可以对其进行修改或以不同方式实现。参数:d_model: 输入中预期特征的数量(必需)。nhead: 多头注意力模型中的头数(必需)。dim_feedforward: 前馈网络模型的维度(默认=2048)。dropout: dropout的值(默认=0.1)。activation: 中间层的激活函数,可选relu或gelu(默认=relu)。layer_norm_eps: 层归一化组件中的eps值(默认=1e-5)。batch_first: 如果设为`True`,则输入和输出张量将按照(batch, seq, feature)的形式提供。默认:`False`。Examples::>>> decoder_layer = nn.TransformerDecoderLayer(d_model=512, nhead=8)>>> memory = torch.rand(10, 32, 512)>>> tgt = torch.rand(20, 32, 512)>>> out = decoder_layer(tgt, memory)Alternatively, when ``batch_first`` is ``True``:>>> decoder_layer = nn.TransformerDecoderLayer(d_model=512, nhead=8, batch_first=True)>>> memory = torch.rand(32, 10, 512)>>> tgt = torch.rand(32, 20, 512)>>> out = decoder_layer(tgt, memory)__init__:self_attn: 自注意力机制,用于处理目标序列内部的关系。multihead_attn: 多头注意力机制,用于处理目标序列和记忆序列之间的关系。linear1, linear2: 前馈网络的两个线性层。dropout: 用于前馈网络中的Dropout操作。norm1, norm2, norm3: 三个层归一化层,分别应用于自注意力、多头注意力和前馈网络之后。dropout1, dropout2, dropout3: 用于残差连接后的Dropout操作。activation: 激活函数,根据activation参数确定。"""__constants__ = ['batch_first']def __init__(self, d_model, nhead, dim_feedforward=2048, dropout=0.1, activation="relu",layer_norm_eps=1e-5, batch_first=False, device=None, dtype=None) -> None:factory_kwargs = {'device': device, 'dtype': dtype}super(TransformerDecoderLayer, self).__init__()self.self_attn = MultiheadAttention(d_model, nhead, dropout=dropout, batch_first=batch_first,**factory_kwargs)self.multihead_attn = MultiheadAttention(d_model, nhead, dropout=dropout, batch_first=batch_first,**factory_kwargs)# Implementation of Feedforward modelself.linear1 = Linear(d_model, dim_feedforward, **factory_kwargs)self.dropout = Dropout(dropout)self.linear2 = Linear(dim_feedforward, d_model, **factory_kwargs)self.norm1 = LayerNorm(d_model, eps=layer_norm_eps, **factory_kwargs)self.norm2 = LayerNorm(d_model, eps=layer_norm_eps, **factory_kwargs)self.norm3 = LayerNorm(d_model, eps=layer_norm_eps, **factory_kwargs)self.dropout1 = Dropout(dropout)self.dropout2 = Dropout(dropout)self.dropout3 = Dropout(dropout)self.activation = _get_activation_fn(activation)def __setstate__(self, state):if 'activation' not in state:state['activation'] = F.relusuper(TransformerDecoderLayer, self).__setstate__(state)def forward(self, tgt: Tensor, memory: Tensor, tgt_mask: Optional[Tensor] = None, memory_mask: Optional[Tensor] = None,tgt_key_padding_mask: Optional[Tensor] = None, memory_key_padding_mask: Optional[Tensor] = None) -> Tensor:r"""使输入(及掩码)通过解码器层进行处理。参数:tgt: 需要送入解码器层的序列(必需)。memory: 来自编码器最后一层的序列(必需)。tgt_mask: 对于目标序列的掩码(可选)。memory_mask: 对于记忆序列的掩码(可选)。tgt_key_padding_mask: 每个批次的目标序列键的掩码(可选)。memory_key_padding_mask: 每个批次的记忆序列键的掩码(可选)。形状:请参阅Transformer类中的文档。流程:首先,目标序列通过自注意力机制处理,结果与原目标序列残差连接后进行层归一化。然后,处理后的目标序列与记忆序列通过多头注意力机制交互,结果与目标序列残差连接后进行层归一化。最后,目标序列通过前馈神经网络,包括线性层、激活函数、Dropout和另一个线性层,处理后的结果与目标序列残差连接后进行层归一化。"""tgt2 = self.self_attn(tgt, tgt, tgt, attn_mask=tgt_mask,key_padding_mask=tgt_key_padding_mask)[0]tgt = tgt + self.dropout1(tgt2)tgt = self.norm1(tgt)tgt2 = self.multihead_attn(tgt, memory, memory, attn_mask=memory_mask,key_padding_mask=memory_key_padding_mask)[0]tgt = tgt + self.dropout2(tgt2)tgt = self.norm2(tgt)tgt2 = self.linear2(self.dropout(self.activation(self.linear1(tgt))))tgt = tgt + self.dropout3(tgt2)tgt = self.norm3(tgt)return tgtdef _get_clones(module, N):return ModuleList([copy.deepcopy(module) for i in range(N)])def _get_activation_fn(activation):if activation == "relu":return F.reluelif activation == "gelu":return F.geluraise RuntimeError("activation should be relu/gelu, not {}".format(activation))

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

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

相关文章

CesiumJS【Basic】- #057 绘制纹理填充多边形(Primitive方式)

文章目录 绘制纹理填充多边形(Primitive方式)1 目标2 代码2.1 main.ts绘制纹理填充多边形(Primitive方式) 1 目标 使用Primitive方式绘制绘制纹理填充多边形 2 代码 2.1 main.ts import * as Cesium from cesium;const viewer = new Cesium.Viewer

测试Andrew NG的语言翻译Agent

我正在测试 Andrew Ng 的语言翻译 A​​I 代理系统及其在逆变换下的稳定性。 给定源语言的文本,我们应用翻译函数 f,然后应用 f 的逆。它应该是不变的: 但是,数学与语言翻译有什么关系? 在完美的系统中,从…

springboot异常产生原因

DataIntegrityViolationException Cause: java.sql.SQLException: Field ‘id’ doesn’t have a default value org.springframework.dao.DataIntegrityViolationException: ### Error updating database. Cause: java.sql.SQLException: Field id doesnt have a default …

Android音频管理器探索与应用

在Android应用开发中,音频管理器是一个至关重要的组件,它负责处理设备的音频功能,包括音量控制、音频路由、音效处理以及与其他应用的音频交互。本文将深入探讨Android音频管理器的功能和应用,帮助开发者更好地理解和利用这一关键…

[译]全栈Redux实战

本文乱译自一篇英文博文(Full-Stack Redux Tutorial),本人英语能力不足,技术能力有限,如有错误,多多包涵。 #关于ReduxReactImmutable的测试先行开发综合指南 Redux是最近发生在js界令人兴奋的事儿。它把…

提升Unity WebGL游戏启动速度

一、查看启动耗时 通过修改unity-namespace.js中hideTimeLogModal为false,显示timelog开发者可以看到小游戏目前的启动首屏时长: 将其设置为false后,启动小程序后就会显示启动耗时 要知道各个阶段的含义,我们必要理解启动流程。 …

springboot 整合 mybatis-plus

一.前言 1. mybatis-plus是什么 mybatis-plus是一个对mybati框架的拓展框架,它在mybatis框架基础上做了许多的增强,帮助我们快速的进行代码开发。目前企业开发中,使用mybati的项目基本会选择使用mybatis-plus来提升开发效率。 2.官网地址&…

LT8668SXC 、LT8668SX-D 、LT8668SX三种芯片的相似与不同

一、LT8668SXC(支持eDP输出) 定义:LT8668SXC配置在HDMI2.1标准下工作,最大数据速率为8Gbps。 LT8668SXC还可以配置为在Type-C输入或DP1.4a下工作,数据速率高达8.1Gbps。 eDP1.4b输出由8个数据通道组成,支持RBR (1.62Gbps)、HBR (2…

比较多种msvcr110.dll丢失的解决方法,哪一种更加方便?

当遇到“msvcr110.dll丢失”这种问题时,这通常意味着你的系统中缺少了Microsoft Visual C 2012 Redistributable的组件。下面我将详细介绍五种解决方法,并对比它们的优点。 一.多种msvcr110.dll丢失的解决方法 方法 1: 重新安装Microsoft Visual C 2012…

Redis持久化的三种方式(RDB、AOF和混合)

Redis持久化的三种方式(RDB、AOF和混合) 目录 Redis持久化的三种方式(RDB、AOF和混合)介绍RDB示例1.配置文件2.触发 RDB 快照保存3.验证 AOF示例1.配置文件2.校验 混合型持久化存储配置文件 介绍 Redis数据主要存储与内存中,因此如果服务器意外重启、宕机、崩溃&am…

乘积最大子数组

代码实现&#xff1a; 方法一&#xff1a;暴力法 方法二&#xff1a;动态规划 int maxProduct(int *nums, int numsSize) {long imax nums[0], imin nums[0], res nums[0];for (int i 1; i < numsSize; i) {if (nums[i] < 0) {int temp imax;imax imin;imin temp;…

自动生成网站sitemap

要在 Next.js 和 Contentlayer 项目中实现自动生成 Sitemap 的功能&#xff0c;你可以编写一个脚本&#xff0c;在每次生成文档后自动生成 Sitemap。以下是一个示例脚本&#xff0c;你可以根据自己的需求进行调整。 步骤 1&#xff1a;安装必要的依赖 首先&#xff0c;你需要…

【加密与解密】【08】Java加密算法详解

文章目录 Java加密库摘要算法MD5代码实现SHA256代码实现HmacMD5代码实现CRC32代码实现对称加密算法查看JDK支持的算法Base64代码实现DES代码实现DESede代码实现AES代码实现RC代码实现IDEA代码实现PBE代码实现非对称加密算法DH秘钥交换算法数学原理DH算法代码实现RSA算法代码实现…

【python全栈系列】day03-python数据类型-Number

python3中有六个标准的数据类型:Number&#xff08;数字&#xff09;String&#xff08;字符串&#xff09;List&#xff08;列表&#xff09; Tuple&#xff08;元组&#xff09; Set&#xff08;集合&#xff09;Dictionary&#xff08;字典&#xff09; 下面我们就用几天的…

学会python——用python编写一个电子时钟(python实例十七)

目录 1.认识Python 2.环境与工具 2.1 python环境 2.2 Visual Studio Code编译 3.电子时钟程序 3.1 代码构思 3.2代码实例 3.3运行结果 4.总结 1.认识Python Python 是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。 Python 的设计具有很强的可读性…

thinkphp8 执行 db:: 需要引入什么

在ThinkPHP8中&#xff0c;执行数据库操作需要使用Db类。为了执行Db::静态调用&#xff0c;您需要引入think\facade\Db类。 在您的控制器或模型文件顶部&#xff0c;使用以下代码引入Db类&#xff1a; use think\facade\Db; 然后您就可以使用Db类来执行数据库操作&#xff0c;…

【Python】从Word文档中提取表格的方法

在Python中&#xff0c;从Word文档&#xff08;通常是.doc或.docx格式&#xff09;中提取表格可以使用第三方库&#xff0c;如python-docx。以下是使用python-docx库从Word文档中提取表格的基本步骤&#xff1a; 安装python-docx库&#xff1a; 如果你还没有安装这个库&#xf…

今天的A股,让人惊愕了,2个耐人寻味的重要信号,有望迎来下一个超级风口!

今天的A股&#xff0c;让人惊愕了&#xff0c;你知道是为什么吗&#xff1f;盘面上出现2个耐人寻味的重要信号&#xff0c;有望迎来下一个超级风口&#xff01; 1、今天两市低开低走&#xff0c;但大消费劲头十足&#xff0c;连中免这样的大体量都涨停了&#xff0c;另外消费茅…

爬虫-网页基础

HTML 基本语法 HTML&#xff1a;Hyper Text Markup Language, 超文本标记语言&#xff0c;是计算机语言的一种&#xff0c;由元素构成。 p元素 <p>Web 真好玩&#xff01;</p> 由三大部分组成 开始标签&#xff1a;一对尖括号中间包裹这元素名称元素内容&#x…

SaaS运营:如何根据“客户漏斗”定制合作伙伴营销策略?

将你的合作伙伴营销策略与你的客户漏斗模型相结合&#xff0c;可以显著提升你的营销效果。通过瞄准客户旅程中的每一个阶段&#xff0c;你可以增加客户参与度并推动转化&#xff0c;从而将你的促销活动提升到新的高度——这仅仅是一个以数据为支撑的方法。 为了探讨如何在漏斗…