Informer代码

2024-06-12 01:52
文章标签 代码 informer

本文主要是介绍Informer代码,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

main_informer

from exp.exp_informer import Exp_Informer
# 将 Exp_Informer 从 exp.exp_informer 模块导入到当前命名空间
parser = argparse.ArgumentParser(description='[Informer] Long Sequences Forecasting')
#创建了一个 ArgumentParser 对象实例,并将其赋值给变量 parser
#使用 description 参数为这个命令行解析器设置了一个描述,
#即 '[Informer] Long Sequences Forecasting'。这个描述会在用户请求帮助(通过命令行输入 --help 或 -h)时显示给用户。
parser.add_argument('--model', type=str, required=False, default='informer',help='model of experiment, options: [informer, informerstack, informerlight(TBD)]')
#定义了一个命令行参数--model
#type=str:指定参数的类型为字符串(str)。
#required=False:指定这个参数不是必需的,即用户可以选择不提供这个参数。在argparse中,如果不明确指定required参数,它的默认值是False,所以这里其实可以省略不写。
#default='informer':如果用户在命令行中没有提供--model参数,则使用默认值'informer'。
#help:这是一个描述性字符串,当用户在命令行中使用--help选项时,会显示这个字符串作为--model参数的说明。
parser.add_argument('--data', type=str, required=False, default='ETTh1', help='data')
#type=str:指定参数的类型为字符串(str)。
#required=False:指定这个参数不是必需的,即用户可以选择不提供这个参数。由于required的默认值是False,所以这一行其实可以省略不写,但显式写出来可以增加代码的可读性。
#default='ETTh1':如果用户在命令行中没有提供--data参数,则使用默认值'ETTh1'
parser.add_argument('--root_path', type=str, default='./data/ETT/', help='root path of the data file')
#用于指定数据文件的根路径
#'--root_path':这是参数的名称,用户在命令行中通过--root_path来指定这个参数的值。
#type=str:指定参数的类型为字符串(str),这意味着用户应该提供一个字符串值作为这个参数的值。
#default='./data/ETT/':如果用户没有在命令行中提供--root_path参数的值,那么将使用默认值'./data/ETT/'
parser.add_argument('--data_path', type=str, default='ETTh1.csv', help='data file')    
#用于指定数据文件的路径和名称。
#'--data_path':这是参数的名称,用户在命令行中通过--data_path来指定这个参数的值。
#type=str:指定参数的类型为字符串(str),这意味着用户应该提供一个字符串值作为这个参数的值。
#default='ETTh1.csv':如果用户没有在命令行中提供--data_path参数的值,那么将使用默认值'ETTh1.csv'。
parser.add_argument('--features', type=str, default='M', help='forecasting task, options:[M, S, MS]; M:multivariate predict multivariate, S:univariate predict univariate, MS:multivariate predict univariate')
#用于指定预测任务的特性
#'--features':这是参数的名称,用户在命令行中通过--features来指定这个参数的值。
#type=str:指定参数的类型为字符串(str),这意味着用户应该提供一个字符串值作为这个参数的值。
#default='M':如果用户没有在命令行中提供--features参数的值,那么将使用默认值'M'。
#M(多变量预测多变量)、S(单变量预测单变量)和MS(多变量预测单变量)

存疑 OT

parser.add_argument('--target', type=str, default='OT', help='target feature in S or MS task')
#用于指定在单变量预测(S)或多变量预测单变量(MS)任务中作为目标的特征。
#default='OT':如果用户没有在命令行中提供--target参数的值,那么将使用默认值'OT'
parser.add_argument('--freq', type=str, default='h', help='freq for time features encoding, options:[s:secondly, t:minutely, h:hourly, d:daily, b:business days, w:weekly, m:monthly], you can also use more detailed freq like 15min or 3h')
#用于指定时间特征编码的频率
#default='h':如果用户没有在命令行中提供--freq参数的值,那么将使用默认值'h',代表小时(hourly)。
#help:这是参数的帮助信息,它描述了参数的作用和可用的选项。这里,它说明了时间特征编码频率的多个选项,包括秒(secondly)、分钟(minutely)、小时(hourly)、日(daily)、工作日(business days)、周(weekly)和月(monthly)。此外,用户还可以使用更详细的频率,如15min或3h。
parser.add_argument('--checkpoints', type=str, default='./checkpoints/', help='location of model checkpoints')
#用于指定模型检查点的存储位置
#default='./checkpoints/':如果用户没有在命令行中提供--checkpoints参数的值,那么将使用默认值'./checkpoints/',这是一个指向当前目录下名为checkpoints的子目录的路径。
parser.add_argument('--seq_len', type=int, default=96, help='input sequence length of Informer encoder')
#用于指定Informer编码器的输入序列长度
#default=96:如果用户没有在命令行中提供--seq_len参数的值,那么将使用默认值96。
parser.add_argument('--label_len', type=int, default=48, help='start token length of Informer decoder')
#用于指定Informer解码器的起始标记(start token)长度
#help:这是参数的帮助信息,它描述了参数的作用,即Informer解码器的起始标记长度。

Informer解码器输入的结构:

  1. 起始标记序列(Start Token Series, label_len):这部分是已知的序列标签,长度由label_len参数指定。在训练时,这些标签可能是真实数据的一部分,而在预测时,它们可能是基于历史数据生成的。
  2. 零填充序列(Zero Padding Series, pred_len):这部分是零填充的序列,长度由pred_len参数指定。在训练时,这个部分可能用于指定模型应该预测的时间范围。在预测时,这部分是模型试图预测的序列,但开始时填充为零,因为模型将基于起始标记序列和模型内部的状态来生成这些预测值。
parser.add_argument('--pred_len', type=int, default=24, help='prediction sequence length')
#用于指定Informer的预测序列长度。
#help:这是参数的帮助信息,它描述了参数的作用,即预测序列的长度
parser.add_argument('--enc_in', type=int, default=7, help='encoder input size')
#用于指定Informer编码器的输入大小。
parser.add_argument('--dec_in', type=int, default=7, help='decoder input size')
#用于指定Informer解码器(或任何其他解码器组件)的输入大小
parser.add_argument('--c_out', type=int, default=7, help='output size')
#用于指定模型(很可能是Informer或类似的序列模型)的输出大小。
parser.add_argument('--d_model', type=int, default=512, help='dimension of model')
#用于指定模型(如Informer、Transformer等)的维度大小。
parser.add_argument('--n_heads', type=int, default=8, help='num of heads')
#用于指定多头注意力机制(Multi-Head Attention)中“头”(head)的数量。
parser.add_argument('--e_layers', type=int, default=2, help='num of encoder layers')
#用于指定编码器(Encoder)中堆叠的层数
parser.add_argument('--d_layers', type=int, default=1, help='num of decoder layers')
#用于指定解码器(decoder)中层的数量。
parser.add_argument('--s_layers', type=str, default='3,2,1', help='num of stack encoder layers')
#用于指定堆叠编码器(stacked encoder)中每一层的层数。
#这里的“堆叠编码器”可能指的是多个编码器层(如Transformer编码器层)的堆叠组合,每层可以有不同的层数。
parser.add_argument('--d_ff', type=int, default=2048, help='dimension of fcn')
#用于指定一个全连接网络(fully-connected network,或称为前馈网络feed-forward network)的维度。
parser.add_argument('--factor', type=int, default=5, help='probsparse attn factor')
#用于指定一个与“probsparse attention”(概率稀疏注意力)相关的因子

存疑 padding含义

parser.add_argument('--padding', type=int, default=0, help='padding type')
#依赖于特定的上下文或库,其中整数被用作枚举或标记来表示不同的填充类型
parser.add_argument('--distil', action='store_false', help='whether to use distilling in encoder, using this argument means not using distilling', default=True)
#用于控制是否在编码器(encoder)中使用知识蒸馏(distilling)技术。
#action='store_false':这表示当用户在命令行中明确提供--distil参数时,实际上是将该参数的值设置为False。
#通常,如果我们使用action='store_true'(这是默认值),不提供参数时值为False,提供了参数时值为True。
#但在这里,我们使用action='store_false'来反转这个行为,因为描述中说明“使用这个参数意味着不使用蒸馏”。
parser.add_argument('--dropout', type=float, default=0.05, help='dropout')
#用于控制模型中的丢弃率(dropout rate)
#丢弃率是在训练神经网络时用于防止过拟合的一种技术,其中在每次前向传播时,神经网络中的某些节点(或连接)会被随机地“丢弃”或“关闭”
parser.add_argument('--attn', type=str, default='prob', help='attention used in encoder, options:[prob, full]')
#用于指定在编码器(encoder)中使用的注意力(attention)机制类型。
#'prob'指的是一种基于概率的注意力机制,
#'full'自注意力(self-attention)或某种类型的全局注意力(global attention),

存疑,三种编码特征分别是什么

parser.add_argument('--embed', type=str, default='timeF', help='time features encoding, options:[timeF, fixed, learned]')
#用于指定时间特征(time features)的编码方式
#'timeF':这可能表示使用某种基于时间的特征编码(如周期性编码、位置编码等),具体取决于模型的实现。
#'fixed':这可能表示使用固定的时间特征编码,这些编码可能是在模型训练之前就已经确定好的,不随训练过程而变化。
#'learned':这表示时间特征的编码将由模型自己学习得出,即在训练过程中作为模型参数的一部分进行学习和优化。
parser.add_argument('--activation', type=str, default='gelu',help='activation')
#用于指定神经网络中激活函数(activation function)的类型
#'gelu'是一个常见的激活函数,全称为Gaussian Error Linear Unit(高斯误差线性单元)。
#除了'gelu'之外,还有许多其他常见的激活函数,如'relu'(Rectified Linear Unit,修正线性单元)、'sigmoid'、'tanh'等。
parser.add_argument('--output_attention', action='store_true', help='whether to output attention in ecoder')
#用于控制是否在编码器(encoder)的输出中包含注意力(attention)信息。
#这个参数使用action='store_true',意味着该参数不需要一个额外的值来指定其状态,只需要在命令行中包含这个参数就会将其设置为True。
parser.add_argument('--do_predict', action='store_true', help='whether to predict unseen future data')
#用于控制是否对未见过的未来数据进行预测。
#这个参数使用action='store_true',意味着当这个参数在命令行中被指定时,其值会被自动设置为True,而不需要另外指定一个值。
parser.add_argument('--mix', action='store_false', help='use mix attention in generative decoder', default=True)
#用于控制是否在生成式解码器(generative decoder)中使用混合注意力(mix attention)。
#这个参数使用action='store_false',意味着当该参数在命令行中被指定时,它的值会被设置为False。如果不指定这个参数,那么它将使用默认值True
parser.add_argument('--cols', type=str, nargs='+', help='certain cols from the data files as the input features')
#允许用户指定从数据文件中选择的某些列作为输入特征。
#参数type=str表示该参数的值应该被解释为字符串,但因为我们还指定了nargs='+',所以用户可以提供多个列名,它们会被解析为一个字符串列表。
#'--cols':这是参数的名称,用户可以通过在命令行中包含--cols后跟一个或多个列名来指定参数。
#type=str:这表示--cols后面跟的每个值都应该是字符串类型。
#nargs='+':这表示--cols参数后面应该跟至少一个值(列名),并且这些值将被收集到一个列表中。例如,--cols col1 col2 col3会被解析为一个包含三个字符串'col1', 'col2', 和 'col3'的列表。
parser.add_argument('--num_workers', type=int, default=0, help='data loader num workers')
#用于指定数据加载器(data loader)在后台使用的工作进程数量。
#这个参数使用type=int来确保参数值是一个整数,并设置了默认值为0,意味着如果不指定该参数,
#数据加载器将不会使用额外的后台工作进程(即只在主进程中加载数据)。
parser.add_argument('--itr', type=int, default=2, help='experiments times')
#用于设置实验次数。
parser.add_argument('--train_epochs', type=int, default=6, help='train epochs')
#用于指定模型训练的轮数(epochs)。
parser.add_argument('--batch_size', type=int, default=32, help='batch size of train input data')
#用于指定训练过程中的配置选项。是用于设置训练轮数的。
parser.add_argument('--patience', type=int, default=3, help='early stopping patience')
#用于指定早停法(early stopping)的耐心值(patience)。
#早停法是一种在模型训练过程中用来防止过拟合的策略,其原理是监控模型在验证集上的性能,并在性能不再提升时提前终止训练。
#这意味着默认情况下,如果模型在连续3个epoch的验证集性能都没有提升,那么训练就会提前终止。
parser.add_argument('--learning_rate', type=float, default=0.0001, help='optimizer learning rate')
#用于指定优化器(optimizer)的学习率(learning rate)。学习率是深度学习中非常重要的一个超参数,它决定了模型在训练过程中参数更新的步长。
parser.add_argument('--des', type=str, default='test',help='exp description')
#用于指定实验的描述(description)。该参数接受一个字符串(str)类型的值,并有一个默认值'test'。
parser.add_argument('--loss', type=str, default='mse',help='loss function')
#用于指定损失函数(loss function)
parser.add_argument('--lradj', type=str, default='type1',help='adjust learning rate')
#用于指定如何调整学习率(learning rate adjustment)
parser.add_argument('--use_amp', action='store_true', help='use automatic mixed precision training', default=False)
#用于控制是否使用自动混合精度(Automatic Mixed Precision, AMP)训练。
#自动混合精度是一种优化技术,可以在不损失模型准确性的情况下提高训练速度和减少显存使用。
#default=False:如果用户在命令行中没有指定--use_amp参数,那么它将使用默认值False,即不使用自动混合精度训练。
parser.add_argument('--inverse', action='store_true', help='inverse output data', default=False)
#用于控制是否逆序(或反转)输出数据。action='store_true'意味着当这个参数在命令行中被指定时,其对应的值将被设置为True。
#如果没有在命令行中指定该参数,它将使用默认值False。
parser.add_argument('--use_gpu', type=bool, default=True, help='use gpu')
#用于控制是否使用GPU(图形处理器)来运行代码。
#这个参数接受一个布尔值(bool),并且有一个默认值True,意味着如果用户在命令行中没有明确指定,那么默认会尝试使用GPU。
parser.add_argument('--gpu', type=int, default=0, help='gpu')
#用于指定使用哪个GPU进行计算。这个参数接受一个整数(int)类型的值,表示GPU的索引,
#通常是从0开始的。如果没有在命令行中指定这个参数,那么它将使用默认值0,即第一个GPU(如果有多个GPU的话)。
parser.add_argument('--use_multi_gpu', action='store_true', help='use multiple gpus', default=False)
#用于控制是否使用多个GPU来运行代码。参数的类型被设置为action='store_true',
#这意味着当这个参数在命令行中被指定时,其对应的值将被设置为True。如果没有在命令行中指定该参数,它将使用默认值False,即不使用多个GPU。
parser.add_argument('--devices', type=str, default='0,1,2,3',help='device ids of multile gpus')
#它允许用户指定多个GPU的ID,用于在多个GPU上运行代码。这个参数接受一个字符串(str)类型的值,
#其中包含了多个GPU的ID,通常这些ID是以逗号分隔的。如果没有在命令行中指定这个参数,
#那么它将使用默认值'0,1,2,3',即默认尝试使用ID为0、1、2、3的GPU(如果它们存在的话)。
args = parser.parse_args()
#args 通常是一个由 parse_args() 方法返回的命名空间对象,该对象包含了从命令行解析出来的所有参数值。
#当你使用 parser.add_argument() 添加参数定义后,parse_args() 方法会解析命令行中提供的参数,并将它们作为属性存储在返回的 args 命名空间中。
args.use_gpu = True if torch.cuda.is_available() and args.use_gpu else False
#根据两个条件来设置 args.use_gpu 的值:
#torch.cuda.is_available():检查是否有可用的 CUDA GPU。
#args.use_gpu:假设这是从命令行参数中获取的,表示用户是否希望使用 GPU。
if args.use_gpu and args.use_multi_gpu:# 移除args.devices字符串中的空格(假设用户可能在输入设备ID时误加了空格)  args.devices = args.devices.replace(' ','')# 使用逗号作为分隔符,将args.devices字符串分割为一个设备ID列表  device_ids = args.devices.split(',')# 将设备ID列表中的每个字符串转换为整数,并存储在args.device_ids列表中  args.device_ids = [int(id_) for id_ in device_ids]# 取出args.device_ids列表中的第一个设备ID,并存储在args.gpu中(这通常是主GPU的ID)args.gpu = args.device_ids[0]

存疑 各个字母含义

data_parser = {'ETTh1':{'data':'ETTh1.csv','T':'OT','M':[7,7,7],'S':[1,1,1],'MS':[7,7,1]},'ETTh2':{'data':'ETTh2.csv','T':'OT','M':[7,7,7],'S':[1,1,1],'MS':[7,7,1]},'ETTm1':{'data':'ETTm1.csv','T':'OT','M':[7,7,7],'S':[1,1,1],'MS':[7,7,1]},'ETTm2':{'data':'ETTm2.csv','T':'OT','M':[7,7,7],'S':[1,1,1],'MS':[7,7,1]},'WTH':{'data':'WTH.csv','T':'WetBulbCelsius','M':[12,12,12],'S':[1,1,1],'MS':[12,12,1]},'ECL':{'data':'ECL.csv','T':'MT_320','M':[321,321,321],'S':[1,1,1],'MS':[321,321,1]},'Solar':{'data':'solar_AL.csv','T':'POWER_136','M':[137,137,137],'S':[1,1,1],'MS':[137,137,1]},
}
#'data': 这是一个字符串,指定了数据集的文件路径
#'T': 这也是一个字符串,可能表示目标变量(Target Variable)或主要关心的度量(Metric)的名称。
#'M': 这是一个整数列表,长度通常为3,可能表示输入数据的时间步长(Time Steps)或窗口大小(Window Size)的不同维度。
#'S': 这是一个整数列表,长度也为3,可能表示在每个时间步长(或窗口)上的采样间隔(Sampling Interval)。
#'MS': 这是一个整数列表,长度也为3,可能与 'M' 和 'S' 类似,但可能表示某种特定处理或组合后的时间步长和采样间隔。
## 检查命令行参数 args.data 是否在 data_parser 字典的键中 
if args.data in data_parser.keys():# 如果在,则获取与 args.data 对应的字典值,存储到 data_info 变量中 data_info = data_parser[args.data]# 从 data_info 字典中取出 'data' 键对应的值,作为数据文件路径,并赋值给 args.data_path  args.data_path = data_info['data']# 从 data_info 字典中取出 'T' 键对应的值,单变量预测(S)或多变量预测单变量(MS)任务中作为目标的特征。,并赋值给 args.targetargs.target = data_info['T']#data_info 字典中取出与 args.features 对应的值(这里假设是 'M', 'S', 或 'MS')  # 并将其解包为三个变量,分别赋值给 args.enc_in, args.dec_in, args.c_out args.enc_in, args.dec_in, args.c_out = data_info[args.features]
# 将args.s_layers字符串中的空格替换为空(即删除空格),然后按照逗号分隔成列表  
# 接着,将列表中的每个元素(预期为字符串)转换为整数,并重新赋值给args.s_layers  
args.s_layers = [int(s_l) for s_l in args.s_layers.replace(' ','').split(',')]
# 将args.freq的值直接赋值给args.detail_freq,这可能用于存储原始的频率值供后续使用 
args.detail_freq = args.freq
# 取args.freq字符串的最后一个字符,并重新赋值给args.freq  
# 这可能用于简化或标准化频率的表示,例如从'H1'、'M15'等中提取'H'或'M'  
args.freq = args.freq[-1:]print('Args in experiment:')
print(args)

存疑 EXP_Informer是什么

#将名为 Exp_Informer 的变量或对象的值赋给名为 Exp 的变量
Exp = Exp_Informer
# 遍历从0到args.itr-1的整数,args.itr代表实验迭代的次数 
for ii in range(args.itr):# setting record of experiments## 创建一个字符串setting,该字符串用于记录或标识当前实验的设置  # 使用format方法将args中的多个参数组合成一个字符串  setting = '{}_{}_ft{}_sl{}_ll{}_pl{}_dm{}_nh{}_el{}_dl{}_df{}_at{}_fc{}_eb{}_dt{}_mx{}_{}_{}'.format(args.model, args.data, args.features, args.seq_len, args.label_len, args.pred_len,args.d_model, args.n_heads, args.e_layers, args.d_layers, args.d_ff, args.attn, args.factor, args.embed, args.distil, args.mix, args.des, ii)exp = Exp(args) # set experimentsprint('>>>>>>>start training : {}>>>>>>>>>>>>>>>>>>>>>>>>>>'.format(setting))exp.train(setting)print('>>>>>>>testing : {}<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<'.format(setting))exp.test(setting)if args.do_predict:print('>>>>>>>predicting : {}<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<'.format(setting))exp.predict(setting, True)torch.cuda.empty_cache()

这篇关于Informer代码的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1052863

相关文章

活用c4d官方开发文档查询代码

当你问AI助手比如豆包,如何用python禁止掉xpresso标签时候,它会提示到 这时候要用到两个东西。https://developers.maxon.net/论坛搜索和开发文档 比如这里我就在官方找到正确的id描述 然后我就把参数标签换过来

poj 1258 Agri-Net(最小生成树模板代码)

感觉用这题来当模板更适合。 题意就是给你邻接矩阵求最小生成树啦。~ prim代码:效率很高。172k...0ms。 #include<stdio.h>#include<algorithm>using namespace std;const int MaxN = 101;const int INF = 0x3f3f3f3f;int g[MaxN][MaxN];int n

计算机毕业设计 大学志愿填报系统 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试

🍊作者:计算机编程-吉哥 🍊简介:专业从事JavaWeb程序开发,微信小程序开发,定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事,生活就是快乐的。 🍊心愿:点赞 👍 收藏 ⭐评论 📝 🍅 文末获取源码联系 👇🏻 精彩专栏推荐订阅 👇🏻 不然下次找不到哟~Java毕业设计项目~热门选题推荐《1000套》 目录 1.技术选型 2.开发工具 3.功能

代码随想录冲冲冲 Day39 动态规划Part7

198. 打家劫舍 dp数组的意义是在第i位的时候偷的最大钱数是多少 如果nums的size为0 总价值当然就是0 如果nums的size为1 总价值是nums[0] 遍历顺序就是从小到大遍历 之后是递推公式 对于dp[i]的最大价值来说有两种可能 1.偷第i个 那么最大价值就是dp[i-2]+nums[i] 2.不偷第i个 那么价值就是dp[i-1] 之后取这两个的最大值就是d

pip-tools:打造可重复、可控的 Python 开发环境,解决依赖关系,让代码更稳定

在 Python 开发中,管理依赖关系是一项繁琐且容易出错的任务。手动更新依赖版本、处理冲突、确保一致性等等,都可能让开发者感到头疼。而 pip-tools 为开发者提供了一套稳定可靠的解决方案。 什么是 pip-tools? pip-tools 是一组命令行工具,旨在简化 Python 依赖关系的管理,确保项目环境的稳定性和可重复性。它主要包含两个核心工具:pip-compile 和 pip

D4代码AC集

贪心问题解决的步骤: (局部贪心能导致全局贪心)    1.确定贪心策略    2.验证贪心策略是否正确 排队接水 #include<bits/stdc++.h>using namespace std;int main(){int w,n,a[32000];cin>>w>>n;for(int i=1;i<=n;i++){cin>>a[i];}sort(a+1,a+n+1);int i=1

html css jquery选项卡 代码练习小项目

在学习 html 和 css jquery 结合使用的时候 做好是能尝试做一些简单的小功能,来提高自己的 逻辑能力,熟悉代码的编写语法 下面分享一段代码 使用html css jquery选项卡 代码练习 <div class="box"><dl class="tab"><dd class="active">手机</dd><dd>家电</dd><dd>服装</dd><dd>数码</dd><dd

生信代码入门:从零开始掌握生物信息学编程技能

少走弯路,高效分析;了解生信云,访问 【生信圆桌x生信专用云服务器】 : www.tebteb.cc 介绍 生物信息学是一个高度跨学科的领域,结合了生物学、计算机科学和统计学。随着高通量测序技术的发展,海量的生物数据需要通过编程来进行处理和分析。因此,掌握生信编程技能,成为每一个生物信息学研究者的必备能力。 生信代码入门,旨在帮助初学者从零开始学习生物信息学中的编程基础。通过学习常用

husky 工具配置代码检查工作流:提交代码至仓库前做代码检查

提示:这篇博客以我前两篇博客作为先修知识,请大家先去看看我前两篇博客 博客指路:前端 ESlint 代码规范及修复代码规范错误-CSDN博客前端 Vue3 项目开发—— ESLint & prettier 配置代码风格-CSDN博客 husky 工具配置代码检查工作流的作用 在工作中,我们经常需要将写好的代码提交至代码仓库 但是由于程序员疏忽而将不规范的代码提交至仓库,显然是不合理的 所

Unity3D自带Mouse Look鼠标视角代码解析。

Unity3D自带Mouse Look鼠标视角代码解析。 代码块 代码块语法遵循标准markdown代码,例如: using UnityEngine;using System.Collections;/// MouseLook rotates the transform based on the mouse delta./// Minimum and Maximum values can