记录深度学习从0开始(二)

1、索引

张量的索引从维度出发,几个维度就写几个索引。

1.1、符号索引

pytorch中的索引基本遵循python的写法,[start: end: step],下面以一个三维张量为例:

import torch

t = torch.arange(12).reshape(2,2,3)
t

在这里插入图片描述
高维张量的理解:t 是一个3维张量,由2个二维张量构成,这两个二维张量都是由4个一维张量构成,每个一维张量都是由5个0维张量构成。

t[1,1,1]

在这里插入图片描述
上述表明,在第一个维度取第二个位置,第二个维度也取第二个位置,第三个维度同样如此,通俗来讲就是,索引张量t的第二个二维张量的第二行的第二列。就是零维张量tensor(10)

 t[::2,::2,::2]

在这里插入图片描述
在第一个维度从第一个元素步长为2取,在第二个维度以步长为2取,在第三个维度以步长为2取。故索引为t的第一个二维张量的第一行的第一列和第3列。

一维张量和二维张量就不谈了,类似处理即可。

1.2、函数索引

除了符号可以索引外,pytorch还提供了一些函数来进行索引

index = torch.tensor([0,1])
torch.index_select(t,2,index)

在这里插入图片描述
有 3 个参数,第一个时输入的tensor,第二个是维度,第三个是一个列表但是必须用张量表示即一维张量,这个函数索引太不方便了,直接使用符号索引即可,上述结果表明索引t的第3个维度即列,每个2维变量的每一行的第一列和第二列

t[:,:,0:2]

在这里插入图片描述

2 、切片

2.1 view()视图

torch.view()

该方法返回一个视图,占用的内存小,随着原始张量的改变而改变。

2.2、分片chunk函数

均分函数chunk

torch.chunk(t,3,dim=2)

在这里插入图片描述
在第三个维度上对张量t进行3等分

torch.chunk(t,4,dim=2)

在这里插入图片描述
如果不能均分,chunk函数会自动向下补齐,4不行就3,3不行就 2,直至能均分为止。

2.3、split函数

split函数既能均分也能自定义分

torch.split(t,[1,2],2)

在这里插入图片描述
在第三个维度上对张量t按照【1:2】的比例分片

torch.split(t,[1,1,1],2)

在这里插入图片描述
在第三个维度上对张量t按照【1:1:1】的比例分片

3、张量的合并

3.1、拼接函数cat

a = torch.zeros(2,3)
b = torch.ones(2,3)
torch.cat([a,b]) #dim默认取0 

在这里插入图片描述

torch.cat([a,b],dim=1)

在这里插入图片描述
注:shape不一样时会报错

c = torch.ones(3,2)
torch.cat([a,c])

在这里插入图片描述

3.2、堆叠函数stack

torch.stack([a,b])

在这里插入图片描述
a和b分别是维度相同的二维张量,stack函数将二者堆叠形成了一个3维张量,这就是cat和stack的区别。

4 、维度的变换

上一节记录了reshaoe方法改变了张量的维度,这里介绍两个函数,squeeze函数(降维)和unsqueeze(升维)函数
比较好理解。删除不必要的维度,升一个不必要的维度

  a = torch.arange(12)
  a

在这里插入图片描述
此时a是一个一维张量由12个零维张量构成

b =torch.unsqueeze(a,dim=0) #在第一个维度处升维
b

在这里插入图片描述

c = torch.unsqueeze(b,dim =2)
c

在这里插入图片描述
经过两次升维,此时张量c是一个3维张量

torch,squeeze(c)

在这里插入图片描述
squeeze函数去掉不必要的维度后又变成一维张量了。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
for i in range(n): if i % (n//10) == 0: print("%0.1f"%(i/n))#每当完成总任务的10%输出 if i> 0 and i % Delta == 0: # 索引从零开始计数 if Delta > 1: max_k = max(np.array(k_idx_his[-Delta:-1])%K) +1 else: max_k = k_idx_his[-1] +1 K = min(max_k +1, N)#根据历史记录动态调整K的值,以使其能够适应数据流的变化。如果数据流的变化比较平稳,则K的值不会经常变化,这样可以避免频繁的参数更新。如果数据流的变化比较剧烈,则K的值会相应地进行调整,以更好地适应新的数据分布 i_idx = i # 实时信道生成 h_tmp = racian_mec(h0,0.3)#使用Rician衰落模型后的增益值 # 将h0增长到1,以便更好的训练; 这是深度学习中广泛采用的一种技巧 h = h_tmp*CHFACT channel[i,:] = h #变量h_tmp乘以常数CHFACT,然后将结果存储到变量h中。接着,将h赋值给维数组channel的第i行,获取信道增益值 # 实时到达生成 dataA[i,:] = np.random.exponential(arrival_lambda) # 4) LyDROO的排队模型 nn_input = h # 缩放Q和Y到接近1;深度学习技巧 nn_input =np.concatenate( (h, Q[i_idx,:]/10000,Y[i_idx,:]/10000)) # Actor module m_list = mem.decode(nn_input, K, decoder_mode) r_list = [] # 所有候选卸载模式的结果 v_list = [] # 候选卸载模式的目标值 for m in m_list: # Critic module # 为保存在m_list中的所有生成的卸载模式分配资源 r_list.append(Algo1_NUM(m,h,w,Q[i_idx,:],Y[i_idx,:],V)) v_list.append(r_list[-1][0]) # 记录最大奖励指数 k_idx_his.append(np.argmax(v_list)) # Policy update module # 编码最大奖励模式 mem.encode(nn_input, m_list[k_idx_his[-1]]) mode_his.append(m_list[k_idx_his[-1]])#将m_list最后一条历史消息添加到历史消息列表中。 # 存储最大结果 Obj[i_idx],rate[i_idx,:],energy[i_idx,:] = r_list[k_idx_his[-1]]#r_list[k_idx_his[-1]] 中的三个值分别赋值给了三个变量 Obj[i_idx]、rate[i_idx, :]、energy[i_idx, :]怎么修改代码使得结果中不考虑队列积压
最新发布
05-24

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值