Open Kylrving opened 2 years ago
作者您好,我运行了您的代码,有一些问题想请教您,比如train训练集中的这两行代码,怎么理解? trainx = torch.Tensor(x).to(device) trainy = torch.Tensor(y[:, :, :, 0]).to(device) 看你的注释是由[B,T,N,C]——>[B,T,N],为什么把结点的特征那一维度去掉呢?,如果数据集的结点特征维度不是文中的1,而是10维,我我需要预测节点的这10维,需要修改吗?有什么影响呢?
你好,具体问题具体分析,这篇文章是预测交通流量,所以取第一维,如果你同时预测10维,保留前10维即可。
嗯嗯,好的感谢,但是我还有一些疑惑就是 trainy = torch.Tensor(y[:, :, :, 0]).to(device)这里,为啥张量维度变成了【B,T,N】的三维张量,不应该是【B,T,N,1】的四维张量吗
请问在model.py的forward里那个输出是如何从(B, T - 8, N, Cout)到(B, 1, N)的?
def forward(self, x):
"""
:param x: B, Tin, N, Cin)
:return: B, Tout, N
"""
x = torch.relu(self.First_FC(x)) # B, Tin, N, Cin
for model in self.STSGCLS:
x = model(x, self.mask)
# (B, T - 8, N, Cout)
need_concat = []
for i in range(self.horizon):
out_step = self.predictLayer[i](x) # (B, 1, N)
need_concat.append(out_step)
out = torch.cat(need_concat, dim=1) # B, Tout, N
del need_concat
return out
作者你好~做个看了你写这个代码很受用,但是还是几个问题不太明白,能不能方便加个微信进行请教一下。
你好,你有什么问题在此留言,我尽量解答
请问在model.py的forward里那个输出是如何从(B, T - 8, N, Cout)到(B, 1, N)的? def forward(self, x): """ :param x: B, Tin, N, Cin) :return: B, Tout, N """ x = torch.relu(self.First_FC(x)) # B, Tin, N, Cin
for model in self.STSGCLS: x = model(x, self.mask) # (B, T - 8, N, Cout) need_concat = [] for i in range(self.horizon): out_step = self.predictLayer[i](x) # (B, 1, N) need_concat.append(out_step) out = torch.cat(need_concat, dim=1) # B, Tout, N del need_concat return out
你好,(B, T - 8, N, Cout)是输入经过整个self.STSGCLS的结果。后面的self.predictLayer[i]过程,是用(B, T - 8, N, Cout)预测 1 horizon step的输出结果,总计12个,每个的输出为 (B, 1, N) ,具体请看 self.predictLayer 部分的代码。
真的感谢作者能耐心的回答我的问题,根据你的提示,我找到了 self.predictLayer[i]过程,它最后的输出是由output_layer决定的,我想的是最终out2的输出是【B,T,N,Cout】,即每个结点的所有预测特征。在output_layer这里我试了很多修改,显示我参数不匹配,所以在此寻求你的帮助。 self.FC1 = nn.Linear(self.in_dim * self.history, self.hidden_dim, bias=True) self.FC2 = nn.Linear(self.hidden_dim, self.horizon, bias=True)
def forward(self, x):
"""
:param x: (B, Tin, N, Cin)
:return: (B, Tout, N)
"""
batch_size = x.shape[0]
x = x.permute(0, 2, 1, 3) # B, N, Tin, Cin
out1 = torch.relu(self.FC1(x.reshape(batch_size, self.num_of_vertices, -1)))
# out1 = torch.relu(self.FC1(x.reshape(batch_size, self.num_of_vertices, self.in_dim * self.history)))
# (B, N, Tin, Cin) -> (B, N, Tin * Cin) -> (B, N, hidden)
out2 = self.FC2(out1) # (B, N, hidden) -> (B, N, horizon)
del out1, batch_size
return out2.permute(0, 2, 1) # B, horizon, N
真的感谢作者能耐心的回答我的问题,根据你的提示,我找到了 self.predictLayer[i]过程,它最后的输出是由output_layer决定的,我想的是最终out2的输出是【B,T,N,Cout】,即每个结点的所有预测特征。在output_layer这里我试了很多修改,显示我参数不匹配,所以在此寻求你的帮助。 self.FC1 = nn.Linear(self.in_dim * self.history, self.hidden_dim, bias=True) self.FC2 = nn.Linear(self.hidden_dim, self.horizon, bias=True)
def forward(self, x): """ :param x: (B, Tin, N, Cin) :return: (B, Tout, N) """ batch_size = x.shape[0] x = x.permute(0, 2, 1, 3) # B, N, Tin, Cin out1 = torch.relu(self.FC1(x.reshape(batch_size, self.num_of_vertices, -1))) # out1 = torch.relu(self.FC1(x.reshape(batch_size, self.num_of_vertices, self.in_dim * self.history))) # (B, N, Tin, Cin) -> (B, N, Tin * Cin) -> (B, N, hidden) out2 = self.FC2(out1) # (B, N, hidden) -> (B, N, horizon) del out1, batch_size return out2.permute(0, 2, 1) # B, horizon, N
你好,我不是很清楚你的提问。你的意思是你把 out1 = torch.relu(self.FC1(x.reshape(batch_size, self.num_of_vertices, -1))) 改为 out1 = torch.relu(self.FC1(x.reshape(batch_size, self.num_of_vertices, self.in_dim * self.history))) 然后报错了吗
作者您好,我运行了您的代码,有一些问题想请教您,比如train训练集中的这两行代码,怎么理解? trainx = torch.Tensor(x).to(device) trainy = torch.Tensor(y[:, :, :, 0]).to(device) 看你的注释是由[B,T,N,C]——>[B,T,N],为什么把结点的特征那一维度去掉呢?,如果数据集的结点特征维度不是文中的1,而是10维,我我需要预测节点的这10维,需要修改吗?有什么影响呢?