如何更新torch.tensor指定位置间的值?

有很多时候,我们需要对深度学习过程中的tensor进行一些非整齐、离散化的赋值操作,例如我们让网络的一支输出可能的索引值,而另外一支可能需要去取对应索引值的内容。PyTorch提供了几种方法实现上述操作,但是其实际效果之间存在差异,在这里整理一下。

这三者的参数名相像,但实际上对各参数的定义有差别,要仔细跟据参数类型和例子好好分析。

  • torch 本笔记引用自PyTorch中文文档 包torch包含了多维疑是的数据结构及基于其上的多种数学操作。 1...

  • 该文章为转载文章,作者简介:汪剑,现在在出门问问负责推荐与个性化。曾在微软雅虎工作,从事过搜索和推荐相关工作。 T...

  • 安全感来源于什么?来源于自己的能力。 为什么最近一直很焦虑很抑郁?晚上睡不着,压力山大? 我仔细分析了下,终极原因...

  • 文 与秋 一 母亲不见了。 父亲气喘吁吁地打电话给我已经是下午六点多了,我正准备下班回家。听电话里父亲焦急的声音,...

  • 《时间地图》 1.人类能够超越其他地球生物成为地球主宰,是因为人类拥有“符号语言”,通过语言、文字积累知识,形成共...

  • 你倚在窗前点燃第一支烟 随着烟雾你的眸子移向天边 你向我谈起他 地板上的一只酒瓶倒下 随后倾倒了你心中的千军万马 ...

  • 我始终坚信:投资——是一种生活态度! 这篇文章可能会写很长时间,写这篇文章的主要目的就是为了时刻记录自己的投资经...

}

y是一个一维向量,y.shape[0] 得到的是这个一维向量中元素的个数。

}

有很多骚操作可以用,按照具体需求选择性能最佳的一款:

所有代码示例都是交换矩阵src的0、2两行

1、可以用tf.gather或者tf.embedding_look_up按照需要的行列顺序直接提取出目标矩阵。这个操作简单粗暴,而且是可导的,导数是用稀疏形式表示的。gather通常是从成千上万行矩阵里提取几行几列,所以他的导数设计为了一种稀疏表示形式,但是在交换这个案例下,你gather了所有行列,使得一个密集导数用稀疏表示法表示了,所以性能可能有所下降。

2、可以用gather、embeddinglookup、slice等提取要交换的行列,然后用tf.tensor_scatter_nd_update把提取的行列更新到对应位置。这个方法比较优雅,效率也不错,也是可导的,导数是用密集矩阵表示。

3、用split把矩阵按照行或列切片成list,向对list操作一样手动交换后再concat。这个方法既不优雅,也不高效。面对巨型矩阵concat可能直接爆显存,需要移到内存里concat,大多数时候不推荐,但也不是不能用,当然这个方法也可导。

还有很多方法,比如用Variable的内置函数scatter_update,assign,类似还有用tf.where更新原矩阵,更加霸道的可以直接乘一个初等行变换矩阵,去查查tf的api,应该还有更多方法任君选择。

ps:不启动梯度带时建议直接对src变量重复赋值,不要再创建dst了,开启静态编译时能玄学省显存。开启xla编译的可以忽略,level1 xla已经很省显存了。

}

我要回帖

更多关于 更改jupyterlab默认路径 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信