适合推广的网站有哪些,青岛seo外包服务,深圳住房和城乡建设厅官网,企业策划是什么意思文章目录 前言1、torch.cat 函数2、索引、维度扩展和张量的广播3、切片操作3.1、 encoded_first_node3.2、probs 4、长难代码分析4.1、selected4.1.1、multinomial(1)工作原理#xff1a; 总结 前言 1、torch.cat 函数
torch.cat 函数将两个张量拼接起来#xff0c;具体地是… 文章目录 前言1、torch.cat 函数2、索引、维度扩展和张量的广播3、切片操作3.1、 encoded_first_node3.2、probs 4、长难代码分析4.1、selected4.1.1、multinomial(1)工作原理 总结 前言 1、torch.cat 函数
torch.cat 函数将两个张量拼接起来具体地是在第三个维度dim2上进行拼接。注dim取值范围是0~2
node_xy_demand torch.cat((node_xy, node_demand[:, :, None]), dim2)其中所用参数为
node_xy reset_state.node_xy
# shape: (batch, problem, 2)
node_demand reset_state.node_demand
# shape: (batch, problem)若要拼接node_xy 与node_demand 需要将node_demand 进行维度拓展即 node_demand[:, :, None])
node_xy torch.tensor([[[1, 2], [3, 4]], [[5, 6], [7, 8]]])node_demand torch.tensor([[[10], [20]], [[30], [40]]])node_xy_demand torch.tensor([[[ 1, 2, 10], [ 3, 4, 20]],[[ 5, 6, 30], [ 7, 8, 40]]]) 2、索引、维度扩展和张量的广播
_ self.decoder.regret_embedding[None, None, :].expand(encoded_nodes.size(0), 1, self.decoder.regret_embedding.size(-1))self.decoder.regret_embedding是一个张量。self.decoder.regret_embedding[None, None, :]增加regret_embedding的维度。维度扩展成 (1, 1, D)
.expand(encoded_nodes.size(0), 1, self.decoder.regret_embedding.size(-1))expand 用来沿特定维度复制张量以实现广播。encoded_nodes.size(0) 返回的是 encoded_nodes 张量的第一个维度大小。1 表示第二个维度的大小。self.decoder.regret_embedding.size(-1) 返回的是 self.decoder.regret_embedding 的最后一个维度的大小也就是嵌入的维度 D 总结 将张量建立为所需维度在此为三维使用expand沿着新建维度进行拓展到所需形状。 3、切片操作
3.1、 encoded_first_node encoded_first_node self.encoded_nodes[:, [0], :]这行代码中的切片操作是从 self.encoded_nodes 中提取特定的数据部分
: 表示选择所有批次的样本保留第一个维度batch。[0] 表示选择每个样本中的第一个节点因此提取的是第一个节点的嵌入向量。: 表示选择该节点的所有嵌入维度即保留第三个维度embedding的所有值。
最终经过这些操作encoded_first_node 的形状为 (batch, 1, embedding)即每个样本只包含第一个节点的嵌入向量保留了嵌入维度。
3.2、probs
probs[:, :, :-1]这是对 probs 张量的切片操作作用是从 probs 的第三个维度即最后一个维度中移除最后一列。
selected probs.argmax(dim2)argmax(dim2) 表示在 probs 张量的第3维度类别维度上找到每个样本中概率最大的类别索引。 argmax 返回的是最大值的索引而不是最大值本身。 4、长难代码分析
4.1、selected
selected probs.reshape(batch_size * pomo_size, -1).multinomial(1).squeeze(dim1).reshape(batch_size, pomo_size)prob的shape: (batch, pomo, problem1) probs.reshape(batch_size * pomo_size, -1) 这一步将 probs 的形状从 (batch, pomo, problem 1) 转变为 (batch * pomo, problem 1)。-1表示自动推算出第二维的大小即 problem 1新的形状 (batch * pomo, problem 1)。 multinomial(1) multinomial(1) 用于从给定的概率分布中选择一个类别。它会返回一个形状为 (batch_size * pomo_size, 1) 的张量每一行选择一个元素的索引代表从 probs 中选择的元素。 .squeeze(dim1) squeeze(dim1) 是去除第二个维度索引维度将形状变为 (batch_size * pomo_size)。 .reshape(batch_size, pomo_size) 最后通过 reshape(batch_size, pomo_size) 将张量恢复到原来的形状 (batch_size, pomo_size)即每个批次对应一个选择的元素索引。
4.1.1、multinomial(1)工作原理 输入 multinomial(1) 需要一个形状为 (N, C) 的张量其中 N 是样本的数量C 是类别的数量。这个张量表示每个样本在各个类别下的概率分布。 输出 multinomial(1) 返回一个形状为 (N, 1) 的张量每个元素是该样本选择的类别的索引。
具体来说multinomial(1) 会根据每个类别的概率从概率分布中选取一个类别。这个选择是随机的但是会遵循给定的概率分布即概率较大的类别被选中的几率较高概率较小的类别被选中的几率较低。 总结