2024/7/7周报

文章目录

  • 摘要
  • Abstract
  • 文献阅读
    • 题目
    • 问题
    • 本文贡献
    • 问题描述
    • 图神经网络
    • Framework
    • 实验
      • 数据集
      • 实验结果
  • 深度学习
    • MAGNN模型相关代码
    • GNN
    • 为什么要用GNN?
    • GNN面临挑战
  • 总结

摘要

本周阅读了一篇用于多变量时间序列预测的多尺度自适应图神经网络的文章,多变量时间序列(MTS)预测在智能应用的自动化和最优化中发挥着重要作用。这是一项具有挑战性的任务。本文提出了一种多尺度自适应图神经网络(MAGNN)来解决上述问题。MAGNN利用多尺度金字塔网络在不同的时间尺度上保持潜在的时间依赖关系。作者还开发了一个基于尺度的融合模块,有效地促进了不同时间尺度上的协作,并自动捕捉贡献的时间模式的重要性。在六个真实数据集上的实验表明,MAGNN在各种设置下的性能都优于最先进的方法。

Abstract

This week,an article on multi-scale adaptive graph neural network for multivariable time series prediction is readed. Multivariable time series (MTS) prediction plays an important role in the automation and optimization of intelligent applications. This is a challenging task. In this paper, a multi-scale adaptive graph neural network (MAGNN) is proposed to solve the above problems. MAGNN uses multi-scale pyramid network to maintain potential time dependence on different time scales. The author also developed a scale-based fusion module, which effectively promoted the cooperation on different time scales and automatically captured the importance of the contribution time pattern. Experiments on six real data sets show that the performance of MAGNN is better than the most advanced methods in various settings.

文献阅读

题目

Multi-Scale Adaptive Graph Neural Network for Multivariate Time Series Forecasting

问题

1)传统的方法,如向量自回归(VAR)、时间正则化矩阵分解(TRMF)、向量自回归滑动平均(VARMA)和高斯过程(GP),往往依赖于严格的平稳假设,无法捕捉变量之间的非线性相关性。
2)注意机制和基于记忆的网络模型侧重于时间相关性的建模,将MTS的输入处理为向量,并假设单个变量的预测值受所有其他变量的影响,这在实际应用中是不合理的,也是很难满足的。例如,一条街道的TrafficflOWS很大程度上受到邻近街道的影响,而来自远处街道的影响相对较小。
3)现有的GNN模型只考虑了单个时间尺度上的时间依赖关系,这可能不能正确地反映许多现实世界场景中的变化。已有的工作学习共享邻接矩阵来表示丰富的变量间依赖关系,这使得模型偏向于学习一种突出的共享时态模式。

本文贡献

1)提出MAGNN,它学习一种既能综合反映多尺度时态模式又能反映特定尺度变量间依赖关系的时态表示。
2)设计了一个自适应图学习模块,用于探索不同时间尺度下丰富和隐含的变量间依赖关系,以及一个基于尺度的融合模块,用于促进这些特定尺度的时间表示之间的协作,并自动捕获贡献的时间模式的重要性。
3)在六个真实世界的MTS基准数据集上进行广泛的实验。实验结果表明,该方法的性能优于目前最先进的方法。

问题描述

本文主要研究MTS预测。在形式上,给定一个输入的时间序列数据在这里插入图片描述,其中在这里插入图片描述表示时间步t的值,N是变量维度,在这里插入图片描述表示第t个时间步的第i个变量的值,MTS预测的目的是预测未来在时间步t+h的值在这里插入图片描述,其中h表示需要预测的未来时间步数。这个问题可以表述为:在这里插入图片描述。式中F为映射函数,θ表示所有可学习的参数。

然后,存在如下几种关于MTS预测的定义:

定义1:MTS数据用图结构表示。图被定义为G=(V,E),其中V表示节点集,|V|=N,E是边集。假设在这里插入图片描述,将第i个变量视为第i个节点在这里插入图片描述在这里插入图片描述的值是的特征,每条边在这里插入图片描述的都表明vi和vj之间存在变量间的依赖关系。

定义2:加权邻接矩阵。图的加权邻接矩阵在这里插入图片描述是一种用于存储边权重的数学表示方法,其中如果在这里插入图片描述在这里插入图片描述;如果在这里插入图片描述在这里插入图片描述。对于没有任何先验知识的纯MTS数据,需要学习多图的加权邻接矩阵来表示丰富且隐式的变量间依赖关系。据此,MTS预测公式可修改为:在这里插入图片描述。其中在这里插入图片描述表示能被GNN用于MTS预测的图集。

图神经网络

论文方法中应用的图卷积操作定义如下:
在这里插入图片描述
其中G=(V,E,A)是一个带加权邻接矩阵的图,x是节点的表示,σ是一个激活函数,θ是可学习的参数矩阵,A\hat{}=I_{n}+A是具有自连接的邻接矩阵,D\hat{}A\hat{}的对角度矩阵,在这里插入图片描述。通过将图卷积操作多层堆叠,可以聚合多阶的邻居信息。

多尺度GNN,又称分层GNN,通常在细粒度图的基础上分层构建粗粒度图。MAGNN关注时间维度的尺度,与一般的多尺度GNN非常不同,后者主要关注空间维度的尺度。MAGNN引入了一个多尺度金字塔网络,将原始时间序列转换为从较小尺度到较大尺度的特征表示,在该网络上,它学习每个尺度下具有相同大小的特定尺度图,并对每个图使用公式在这里插入图片描述定义的基本GNN。

Framework

下图说明了MAGNN的框架,它包括四个主要部分:a)多尺度金字塔网络,用于在不同的时间尺度上保持底层的时间层次;b)自适应图学习模块,用于自动推断变量间的依赖关系;c)多尺度时间图神经网络,用于捕获各种尺度特定的时间模式;d)尺度级融合模块,用于有效地促进跨不同时间尺度的协作。
在这里插入图片描述
MAGNN框架的4个主要部分组成具体作用如下:(a)两个并行的卷积神经网络和每层的逐点相加将特征表示从较小尺度分层变换到较大尺度;(b)自适应图学习模块将节点嵌入和尺度嵌入作为输入,并输出特定尺度的邻接矩阵;©将每个尺度特定的特征表示和邻接矩阵输入到时序图神经网络(TGNN)中,以获得尺度特定的表示。(d)加权融合特定尺度表示以捕获贡献的时间模式。最终的多尺度表示被送入包括两个卷积神经网络的输出模块以获得预测值。

实验

数据集

为了评估MAGNN的性能,在六个公共基准数据集上进行了实验:太阳能、交通、电力、汇率、纳斯达克和METR-LA。表一汇总了数据集的统计数据,6个公共基准数据集的详细情况如下:
太阳能:此数据集包含从国家可再生能源实验室收集的太阳能,2007年从阿拉巴马州的137个光伏发电厂每10分钟采样一次。
交通:此数据集包含加州交通部的道路使用率(在0到1之间),这些数据是从2015年到2016年旧金山湾区的862个传感器每小时汇总的。
用电量:此数据集包含UCI机器学习存储库的用电量,从2012年到2014年每小时汇总321个客户端的用电量。R汇率:该数据集包含八个国家的汇率,从1990年到2016年每天都进行抽样。
Nasdaq:这个数据集包含82家公司的股票价格,从2016年7月到2016年12月每分钟抽样一次。
METR-LA:此数据集包含洛杉矶县的平均车速,这些车速是从2012年3月至2012年6月高速公路上的207个环路探测器收集的5分钟数据。
将六个数据集按时间顺序分为训练集(60%)、验证集(20%)和测试集(20%)。
在这里插入图片描述
输入窗口大小T设置为168。学习率设置为0.001。使用ADAM优化器,所有可训练的参数都可以通过反向传播进行优化。对于所有数据集,尺度数为4。多尺度金字塔网络中的CNN的核大小从金字塔网络的第一层到最后一层分别设置为1×7、1×6和1×3,所有CNN的步长设置为2。作者分别设置地平线h={3,6,12,24},对于Nasdaq数据集,预测范围被设置为3到24分钟,对于METR-LA数据集,从15到120分钟,对于太阳能数据集,从30到240分钟,对于交通和电力数据集,从3到24小时,对于汇率数据集,从3到24天。预测范围越大,预测就越难。

实验结果

六个数据集上所有方法的结果总结如下表(按RSE表示):
在这里插入图片描述
在六个真实数据集上的实验表明,MAGNN在各种设置下的性能都优于最先进的方法。

深度学习

MAGNN模型相关代码

from layer import *
# from AGCRN import *
import torchclass magnn(nn.Module):def __init__(self, gcn_depth, num_nodes, device, dropout=0.3, subgraph_size=20, node_dim=40, conv_channels=32, gnn_channels=32, scale_channels=16, end_channels=128, seq_length=12, in_dim=1, out_dim=12, layers=3, propalpha=0.05, tanhalpha=3, single_step=True):super(magnn, self).__init__()self.num_nodes = num_nodesself.dropout = dropoutself.device = deviceself.single_step = single_stepself.filter_convs = nn.ModuleList()self.gate_convs = nn.ModuleList()self.scale_convs = nn.ModuleList()self.gconv1 = nn.ModuleList()self.gconv2 = nn.ModuleList()self.norm = nn.ModuleList()self.seq_length = seq_lengthself.layer_num = layersself.gc = graph_constructor(num_nodes, subgraph_size, node_dim, self.layer_num, device)if self.single_step:self.kernel_set = [7, 6, 3, 2]else:self.kernel_set = [3, 2, 2]self.scale_id = torch.autograd.Variable(torch.randn(self.layer_num, device=self.device), requires_grad=True)# self.scale_id = torch.arange(self.layer_num).to(device)self.lin1 = nn.Linear(self.layer_num, self.layer_num) self.idx = torch.arange(self.num_nodes).to(device)self.scale_idx = torch.arange(self.num_nodes).to(device)self.scale0 = nn.Conv2d(in_channels=in_dim, out_channels=scale_channels, kernel_size=(1, self.seq_length), bias=True)self.multi_scale_block = multi_scale_block(in_dim, conv_channels, self.num_nodes, self.seq_length, self.layer_num, self.kernel_set)# self.agcrn = nn.ModuleList()length_set = []length_set.append(self.seq_length-self.kernel_set[0]+1)for i in range(1, self.layer_num):length_set.append( int( (length_set[i-1]-self.kernel_set[i])/2 ) )for i in range(self.layer_num):"""RNN based model"""# self.agcrn.append(AGCRN(num_nodes=self.num_nodes, input_dim=conv_channels, hidden_dim=scale_channels, num_layers=1) )self.gconv1.append(mixprop(conv_channels, gnn_channels, gcn_depth, dropout, propalpha))self.gconv2.append(mixprop(conv_channels, gnn_channels, gcn_depth, dropout, propalpha))self.scale_convs.append(nn.Conv2d(in_channels=conv_channels,out_channels=scale_channels,kernel_size=(1, length_set[i])))self.gated_fusion = gated_fusion(scale_channels, self.layer_num)# self.output = linear(self.layer_num*self.hidden_dim, out_dim)self.end_conv_1 = nn.Conv2d(in_channels=scale_channels,out_channels=end_channels,kernel_size=(1,1),bias=True)self.end_conv_2 = nn.Conv2d(in_channels=end_channels,out_channels=out_dim,kernel_size=(1,1),bias=True)def forward(self, input, idx=None):seq_len = input.size(3)assert seq_len==self.seq_length, 'input sequence length not equal to preset sequence length'scale = self.multi_scale_block(input, self.idx)# self.scale_weight = self.lin1(self.scale_id)self.scale_set = [1, 0.8, 0.6, 0.5]adj_matrix = self.gc(self.idx, self.scale_idx, self.scale_set)outputs = self.scale0(F.dropout(input, self.dropout, training=self.training))out = []out.append(outputs)for i in range(self.layer_num):"""RNN-based model"""# output = self.agcrn[i](scale[i].permute(0, 3, 2, 1), adj_matrix) # B T N D# output = output.permute(0, 3, 2, 1)output = self.gconv1[i](scale[i], adj_matrix[i])+self.gconv2[i](scale[i], adj_matrix[i].transpose(1,0))scale_specific_output = self.scale_convs[i](output)out.append(scale_specific_output)# concatenate# outputs = outputs + scale_specific_output# mean-pooling    # outputs = torch.mean(torch.stack(out), dim=0)out0 = torch.cat(out, dim=1)out1 = torch.stack(out, dim = 1)if self.single_step:outputs = self.gated_fusion(out0, out1)x = F.relu(outputs)x = F.relu(self.end_conv_1(x))x = self.end_conv_2(x)return x, adj_matrix

网络层定义如下:

from __future__ import division
import torch
import torch.nn as nn
from torch.nn import init
import numbers
import torch.nn.functional as F
import numpy as npclass nconv(nn.Module):def __init__(self):super(nconv,self).__init__()def forward(self,x, A):x = torch.einsum('ncvl,vw->ncwl',(x,A))return x.contiguous()class dy_nconv(nn.Module):def __init__(self):super(dy_nconv,self).__init__()def forward(self,x, A):x = torch.einsum('ncvl,nvwl->ncwl',(x,A))return x.contiguous()class linear(nn.Module):def __init__(self,c_in,c_out,bias=True):super(linear,self).__init__()self.mlp = torch.nn.Conv2d(c_in, c_out, kernel_size=(1, 1), padding=(0,0), stride=(1,1), bias=bias)def forward(self,x):return self.mlp(x)class layer_block(nn.Module):def __init__(self, c_in, c_out, k_size):super(layer_block, self).__init__()self.conv_output = nn.Conv2d(c_in, c_out, kernel_size=(1, 1), stride=(1, 2))self.conv_output1 = nn.Conv2d(c_in, c_out, kernel_size=(1, k_size), stride=(1, 1), padding=(0, int( (k_size-1)/2 ) ) )self.output = nn.MaxPool2d(kernel_size=(1,3), stride=(1,2), padding=(0,1))self.conv_output1 = nn.Conv2d(c_in, c_out, kernel_size=(1, k_size), stride=(1, 1) )self.output = nn.MaxPool2d(kernel_size=(1,3), stride=(1,2))self.relu = nn.ReLU()def forward(self, input):conv_output = self.conv_output(input) # shape (B, D, N, T)conv_output1 = self.conv_output1(input)output = self.output(conv_output1)return self.relu( output+conv_output[...,-output.shape[3]:] )# return self.relu( conv_output )class multi_scale_block(nn.Module):def __init__(self, c_in, c_out, num_nodes, seq_length, layer_num, kernel_set, layer_norm_affline=True):super(multi_scale_block, self).__init__()self.seq_length = seq_lengthself.layer_num = layer_numself.norm = nn.ModuleList()self.scale = nn.ModuleList()for i in range(self.layer_num):self.norm.append(nn.BatchNorm2d(c_out, affine=False))#     # self.norm.append(LayerNorm((c_out, num_nodes, int(self.seq_length/2**i)),elementwise_affine=layer_norm_affline))#     self.norm.append(LayerNorm((c_out, num_nodes, length_set[i]),elementwise_affine=layer_norm_affline))self.start_conv = nn.Conv2d(c_in, c_out, kernel_size=(1, 1), stride=(1, 1))self.scale.append(nn.Conv2d(c_out, c_out, kernel_size=(1, kernel_set[0]), stride=(1, 1)))for i in range(1, self.layer_num):self.scale.append(layer_block(c_out, c_out, kernel_set[i]))def forward(self, input, idx): # input shape: B D N Tself.idx = idxscale = []scale_temp = inputscale_temp = self.start_conv(scale_temp)# scale.append(scale_temp)for i in range(self.layer_num):scale_temp = self.scale[i](scale_temp)# scale_temp = self.norm[i](scale_temp)# scale_temp = self.norm[i](scale_temp, self.idx)# scale.append(scale_temp[...,-self.k:])scale.append(scale_temp)return scaleclass top_down_path(nn.Module):def __init__(self, c_in, c_out_1, c_out_2, c_out_3, c_out_4):super(top_down_path, self).__init__()self.down1 = nn.Conv2d(c_in, c_out_1, kernel_size=(1, 1), stride=(1, 1))self.down2 = nn.Conv2d(c_out_1, c_out_2, kernel_size=(1, 7), stride=(1, 2), padding=(0, 2))self.down3 = nn.Conv2d(c_out_2, c_out_3, kernel_size=(1, 6), stride=(1, 2))self.down4 = nn.Conv2d(c_out_3, c_out_4, kernel_size=(1, 3), stride=(1, 2))self.up3 = nn.ConvTranspose2d(c_out_4, c_out_3, kernel_size=(1,3), stride=(1,2))# self.up3 = nn.MaxUnpool2d()self.up2 = nn.ConvTranspose2d(c_out_3, c_out_2, kernel_size=(1,6), stride=(1,2), output_padding=(0,1))self.up1 = nn.ConvTranspose2d(c_out_2, c_out_1, kernel_size=(1,7), stride=(1,2))def forward(self, input):down_1 = self.down1(input)down_2 = self.down2(down_1)down_3 = self.down3(down_2)down_4 = self.down4(down_3)up_3 = self.up3(down_4)output_3 = down_3 + up_3up_2 = self.up2(output_3)output_2 = down_2 + up_2up_1 = self.up3(output_2)output_1 = down_1[:,:,:,1:] + up_1return down_4, output_3, output_2, output_1class gated_fusion(nn.Module):def __init__(self, skip_channels, layer_num, ratio=1):super(gated_fusion, self).__init__()# self.reduce = torch.mean(x,dim=2,keepdim=True)self.dense1 = nn.Linear(in_features=skip_channels*(layer_num+1), out_features=(layer_num+1)*ratio, bias=False)self.dense2 = nn.Linear(in_features=(layer_num+1)*ratio, out_features=(layer_num+1), bias=False)def forward(self, input1, input2):se = torch.mean(input1, dim=2, keepdim=False)se = torch.squeeze(se)se = F.relu(self.dense1(se))se = F.sigmoid(self.dense2(se))se = torch.unsqueeze(se, -1)se = torch.unsqueeze(se, -1)se = torch.unsqueeze(se, -1)x = torch.mul(input2, se)x = torch.mean(x, dim=1, keepdim=False)return xclass prop(nn.Module):def __init__(self,c_in,c_out,gdep,dropout,alpha):super(prop, self).__init__()self.nconv = nconv()self.mlp = linear(c_in,c_out)self.gdep = gdepself.dropout = dropoutself.alpha = alphadef forward(self,x,adj):adj = adj + torch.eye(adj.size(0)).to(x.device)d = adj.sum(1)h = xdv = da = adj / dv.view(-1, 1)for i in range(self.gdep):h = self.alpha*x + (1-self.alpha)*self.nconv(h,a)ho = self.mlp(h)return hoclass mixprop(nn.Module):def __init__(self,c_in,c_out,gdep,dropout,alpha):super(mixprop, self).__init__()self.nconv = nconv()self.mlp = linear((gdep+1)*c_in,c_out)self.gdep = gdepself.dropout = dropoutself.alpha = alphadef forward(self,x,adj):adj = adj + torch.eye(adj.size(0)).to(x.device)d = adj.sum(1)h = xout = [h]a = adj / d.view(-1, 1)for i in range(self.gdep):h = self.alpha*x + (1-self.alpha)*self.nconv(h,a)out.append(h)ho = torch.cat(out,dim=1)ho = self.mlp(ho)return hoclass graph_constructor(nn.Module):def __init__(self, nnodes, k, dim, layer_num, device, alpha=3):super(graph_constructor, self).__init__()self.nnodes = nnodesself.layers = layer_numself.emb1 = nn.Embedding(nnodes, dim)self.emb2 = nn.Embedding(nnodes, dim)self.lin1 = nn.ModuleList()self.lin2 = nn.ModuleList()for i in range(layer_num):self.lin1.append(nn.Linear(dim,dim))self.lin2.append(nn.Linear(dim,dim))self.device = deviceself.k = kself.dim = dimself.alpha = alphadef forward(self, idx, scale_idx, scale_set):nodevec1 = self.emb1(idx)nodevec2 = self.emb2(idx)adj_set = []for i in range(self.layers):nodevec1 = torch.tanh(self.alpha*self.lin1[i](nodevec1*scale_set[i]))nodevec2 = torch.tanh(self.alpha*self.lin2[i](nodevec2*scale_set[i]))a = torch.mm(nodevec1, nodevec2.transpose(1,0))-torch.mm(nodevec2, nodevec1.transpose(1,0))adj0 = F.relu(torch.tanh(self.alpha*a))mask = torch.zeros(idx.size(0), idx.size(0)).to(self.device)mask.fill_(float('0'))s1,t1 = adj0.topk(self.k,1)mask.scatter_(1,t1,s1.fill_(1))# print(mask)adj = adj0*maskadj_set.append(adj)return adj_setclass graph_constructor_full(nn.Module):def __init__(self, nnodes, k, dim, layer_num, device, alpha=3):super(graph_constructor_full, self).__init__()self.nnodes = nnodesself.layers = layer_numself.emb1 = nn.Embedding(nnodes, dim)self.emb2 = nn.Embedding(nnodes, dim)self.lin1 = nn.ModuleList()self.lin2 = nn.ModuleList()for i in range(self.layers):self.lin1.append(nn.Linear(dim,dim))self.lin2.append(nn.Linear(dim,dim))self.device = deviceself.k = kself.dim = dimself.alpha = alphaself.static_feat = static_featdef forward(self, idx, scale_idx, scale_set):nodevec1 = self.emb1(idx)nodevec2 = self.emb2(idx)adj_set = []for i in range(self.layers):nodevec1 = torch.tanh(self.alpha*self.lin1[i](nodevec1*scale_set[i]))nodevec2 = torch.tanh(self.alpha*self.lin2[i](nodevec2*scale_set[i]))a = torch.mm(nodevec1, nodevec2.transpose(1,0))-torch.mm(nodevec2, nodevec1.transpose(1,0))adj0 = F.relu(torch.tanh(self.alpha*a))adj_set.append(adj0)return adj_setclass graph_constructor_one(nn.Module):def __init__(self, nnodes, k, dim, layer_num, device, alpha=3, static_feat=None):super(graph_constructor_one, self).__init__()self.nnodes = nnodesself.layers = layer_numself.emb1 = nn.Embedding(nnodes, dim)self.emb2 = nn.Embedding(nnodes, dim)self.lin1 = nn.ModuleList()self.lin2 = nn.ModuleList()self.lin1 = nn.Linear(dim,dim)self.lin2 = nn.Linear(dim,dim)self.device = deviceself.k = kself.dim = dimself.alpha = alphaself.static_feat = static_featdef forward(self, idx, scale_idx, scale_set):nodevec1 = self.emb1(idx)nodevec2 = self.emb2(idx)adj_set = []nodevec1 = torch.tanh(self.alpha*self.lin1(nodevec1))nodevec2 = torch.tanh(self.alpha*self.lin2(nodevec2))a = torch.mm(nodevec1, nodevec2.transpose(1,0))-torch.mm(nodevec2, nodevec1.transpose(1,0))adj0 = F.relu(torch.tanh(self.alpha*a))mask = torch.zeros(idx.size(0), idx.size(0)).to(self.device)mask.fill_(float('0'))s1,t1 = adj0.topk(self.k,1)mask.scatter_(1,t1,s1.fill_(1))adj = adj0*maskreturn adj

GNN

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在使用图的时候可以简单的将其划分为下面几步:

1.给定一个图,首先将节点转化为递归单元,将边转化为前馈神经网络;
2.对所有节点执行n次邻域聚合(消息传递)。
3.对所有节点的嵌入向量求和得到图表示H。
4.将H传递到更高的层中,或者使用它来表示图形的独特属性。

为什么要用GNN?

GNN与CNN、RNN的比较,为什么不用CNN或RNN,而用GNN?

GNN 是一种专门为图结构数据设计的神经网络。它可以处理不规则的拓扑结构,并且可以捕捉节点之间的复杂关系。GNN可以通过消息传递和聚合机制来处理不同大小和结构的图数据。由于其适应性和灵活性,GNN 在许多领域,如社交网络分析、化学分子识别和推荐系统等,取得了显著的成功。

选择 GNN 而不是 CNN 或 RNN 的主要原因是数据结构和任务类型。当处理图结构数据或需要捕捉复杂的节点关系时,GNNs是更合适的选择。然而,在处理网格结构数据(如图像)或序列数据(如文本)时,CNN和 RNN可能是更好的选择。

GNN简单来说就是Graph + Nerual Networks,关键问题就是将图的结构和图中每个节点和边的特征转化为一般的神经网络的输入(张量)。

GNN面临挑战

目前,GNN面临的挑战主要包括:1)如何有效处理大规模图数据;2)如何增强GNN的表达能力,以捕捉更为复杂的图结构;3)如何解决图数据中的不确定性和噪声问题。

总结

下周将继续学习GNN的一些相关数学知识,从理论上进一步理解GNN。

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

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

相关文章

SAP已下发EWM的交货单修改下发状态

此种情况针对EWM未接收到ERP交货单时,可以使用此程序将ERP交货单调整为未分配状态,在进行调整数据后,然后使用VL06I(启用自动下发EWM配置,则在交货单修改保存后会立即下发EWM)重新下发EWM系统。 操作步骤如…

3ds Max渲染曝光过度怎么办?

3dmax效果图云渲染平台——渲染100 以3ds Max 2025、VR 6.2、CR 11.2等最新版本为基础,兼容fp、acescg等常用插件,同时LUT滤镜等参数也得到了同步支持。 注册填邀请码【7788】可领30元礼包和免费渲染券哦~ 遇到3ds Max渲染过程中曝光过度的问题&#xf…

SLF4J的介绍与使用(有logback和log4j2的具体实现案例)

目录 1.日志门面的介绍 常见的日志门面 : 常见的日志实现: 日志门面和日志实现的关系: 2.SLF4J 的介绍 业务场景(问题): SLF4J的作用 SLF4J 的基本介绍 日志框架的绑定(重点&#xff09…

跨越界限的温柔坚守

跨越界限的温柔坚守 —— 郑乃馨与男友的甜蜜抉择在这个光怪陆离、瞬息万变的娱乐圈里,每一段恋情像是夜空中划过的流星,璀璨短暂。然而,当“郑乃馨与男友甜蜜约会”的消息再次跃入公众视野,它不仅仅是一段简单的爱情故事&#xf…

iOS中多个tableView 嵌套滚动特性探索

嵌套滚动的机制 目前的结构是这样的,整个页面是一个大的tableView, Cell 是整个页面的大小,cell 中嵌套了一个tableView 通过测试我们发现滚动的时候,系统的机制是这样的, 我们滑动内部小的tableView, 开始滑动的时候&#xff0c…

C/C++ 代码注释规范及 doxygen 工具

参考 谷歌项目风格指南——注释 C doxygen 风格注释示例 ubuntu20 中 doxygen 文档生成 doxygen 官方文档 在 /Doxygen/Special Command/ 章节介绍 doxygen 的关键字 注释说明 注释的目的是提高代码的可读性与可维护性。 C 风格注释 // 单行注释/* 多行注释 */ C 风格注…

【论文阅读笔记】Meta 3D AssetGen

【论文阅读笔记】Meta 3D AssetGen: Text-to-Mesh Generation with High-Quality Geometry, Texture, and PBR Materials Info摘要引言创新点 相关工作T23D基于图片的3d 重建使用 PBR 材料的 3D 建模。 方法文本到图像:从文本中生成阴影和反照率图像Image-to-3D:基于pbr的大型重…

搭建NEMU与QEMU的DiffTest环境(动态库方式)

搭建NEMU与QEMU的DiffTest环境(动态库方式) 1 DiffTest原理简述2 编译NEMU3 编译qemu-dl-difftest3.1 修改NEMU/scripts/isa.mk3.2 修改NEMU/tools/qemu-dl-diff/src/diff-test.c3.3 修改NEMU/scripts/build.mk3.4 让qemu-dl-difftest带调试信息3.5 编译…

安卓的组件

人不走空 🌈个人主页:人不走空 💖系列专栏:算法专题 ⏰诗词歌赋:斯是陋室,惟吾德馨 目录 🌈个人主页:人不走空 💖系列专栏:算法专题 ⏰诗词歌…

【Linux】打包命令——tar

打包和压缩 虽然打包和压缩都涉及将多个文件组合成单个实体,但它们之间存在重要差异。 打包和压缩的区别: 打包是将多个文件或目录组合在一起,但不对其进行压缩。这意味着打包后的文件大小可能与原始文件相同或更大。此外,打包…

数字化精益生产系统--APS 排程管理系统

APS(Advanced Planning and Scheduling)排程管理系统,即高级生产计划与排程系统,是一种高度智能化的计划和排程系统。它通过整合各种生产和供应链数据,运用先进的算法和数据模型,根据各种约束条件&#xff…

MySQL篇三:数据类型

文章目录 前言1. 数值类型1.1 tinyint类型1.2 bit类型1.3 小数类型1.3.1 float1.3.2 decimal 2. 字符串类型2.1 char2.2 varchar2.3 char和varchar比较 3. 日期类型4. enum和set 前言 数据类型分类: 1. 数值类型 1.1 tinyint类型 在MySQL中,整型可以指…

【Java13】包

“包”这个机制,类似于分组。主要作用是区分不同组内的同名类。例如,高三三班有一个“王五”,高二八班也有一个“王五”。高三三班和高三八班就是两个不同的包。 Java中的包(package)机制主要提供了类的多层命名空间&…

HTTP长连接

长连接优点 HTTP为什么要开启长连接呢? 主要是为了节省建立的时间,请求可以复用同一条TCP链路,不用重复进行三握+四挥 如果没有长连接,每次请求都做三握+四挥 如果有长链接,在一个 TCP 连接中可以持续发送多份数据而不会断开连接,即请求可以复用TCP链路 长连接缺点 …

第六十八回 东平府误陷九纹龙 宋公明义释双枪将-文心大模型ernie-speed免费使用方法

宋江和卢俊义抓阄儿,宋江打东平府,卢俊义打东昌府,谁先打下谁做梁山泊主。宋江带领林冲、花荣、刘唐等二十八人,卢俊义带领吴用、公孙胜、关胜等二十八人。 宋江等人到了东平府外安山镇,郁保四和王定六自告奋勇去下战…

代码随想录第45天|动态规划

300.最长递增子序列 参考 dp[i] 表示以 i 为结尾的最长递增子序列长度递推公式: 使用 i 和 j 判断 dp[i] max(dp[j] 1, dp[i])每次 j 都需要从头遍历 初始化: dp[i] 1 class Solution { public:int lengthOfLIS(vector<int>& nums) {vector<int> dp(nums…

国产化新标杆:TiDB 助力广发银行新一代总账系统投产上线

随着全球金融市场的快速发展和数字化转型的深入推进&#xff0c;金融科技已成为推动银行业创新的核心力量。特别是在当前复杂多变的经济环境下&#xff0c;银行业务的高效运作和风险管理能力显得尤为重要。总账系统作为银行会计信息系统的核心&#xff0c;承载着记录、处理和汇…

2024年06月CCF-GESP编程能力等级认证Python编程二级真题解析

本文收录于专栏《Python等级认证CCF-GESP真题解析》&#xff0c;专栏总目录&#xff1a;点这里&#xff0c;订阅后可阅读专栏内所有文章。 一、单选题&#xff08;每题 2 分&#xff0c;共 30 分&#xff09; 第 1 题 小杨父母带他到某培训机构给他报名参加CCF组织的GESP认证…

云动态摘要 2024-07-07

给您带来云厂商的最新动态,最新产品资讯和最新优惠更新。 最新优惠与活动 数据库上云优选 阿里云 2024-07-04 RDS、PolarDB、Redis、MongoDB 全系产品新用户低至首年6折起! [免费体验]智能助手ChatBI上线 腾讯云 2024-07-02 基于混元大模型打造,可通过对话方式生成可视化…

18_特征金字塔网络FPN结构详解

1.1 简介 在深度学习领域&#xff0c;尤其是计算机视觉和目标检测任务中&#xff0c;Feature Pyramid Networks (FPN) 是一种革命性的架构设计&#xff0c;它解决了多尺度特征检测和融合的关键问题。FPN最初由何凯明等人在2017年的论文《Feature Pyramid Networks for Object …