<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Pytorch on 111qqz's blog</title><link>https://111qqz.com/en/tags/pytorch/</link><description>Recent content in Pytorch on 111qqz's blog</description><generator>Hugo -- gohugo.io</generator><language>en</language><copyright>© 2015-2026 111qqz</copyright><lastBuildDate>Sun, 17 Dec 2023 18:22:24 +0800</lastBuildDate><atom:link href="https://111qqz.com/en/tags/pytorch/index.xml" rel="self" type="application/rss+xml"/><item><title>[施工中] cupy与torch的导入顺序不同对计算结果的影响</title><link>https://111qqz.com/en/post/%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0/2023-12-17-cupy-torch-import-order-impact/</link><pubDate>Sun, 17 Dec 2023 18:22:24 +0800</pubDate><guid>https://111qqz.com/en/post/%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0/2023-12-17-cupy-torch-import-order-impact/</guid><description>&lt;h2 class="relative group"&gt;背景
 &lt;div id="背景" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#%e8%83%8c%e6%99%af" aria-label="Anchor"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h2&gt;
&lt;p&gt;公司内部的基于torch的toolbox发现某个版本之后,结果发生了偏移. 通过一系列排查,发现当导入cupy和torch的顺序不同时，计算结果会有所差异。
也就是说,如下两段代码会导致模型训练等环节的计算得到不同的结果.&lt;/p&gt;</description></item><item><title>pytorch 函数笔记</title><link>https://111qqz.com/en/post/%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0/2018-02-23-pytorch-function-notes/</link><pubDate>Fri, 23 Feb 2018 02:55:25 +0000</pubDate><guid>https://111qqz.com/en/post/%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0/2018-02-23-pytorch-function-notes/</guid><description>&lt;p&gt;记录一些常用的&amp;hellip;总去查文档也是有点麻烦&lt;/p&gt;
&lt;pre&gt;&lt;code&gt; * 
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 class="relative group"&gt;tensor.view 的作用是reshape 比如 a = torch.range(1, 16) 得到一个tensor  that has 16 elements from 1 to 16. 在a=a.view(4,4)就得到了一个4&lt;em&gt;4的tensor。 需要注意reshape之后元素的个数不能改变(16==4&lt;/em&gt;4)  参数-1的作用是，我懒得算这一维度应该是多少,（由于元素个数不能改变）所以希望自动被计算。**需要注意的是，只有一个维度可以写-1。 **不过view和reshape有些区别：&lt;em&gt;reshape always copies memory. view never copies memory&lt;/em&gt;
 &lt;div id="tensorview-的作用是reshape-比如a--torchrange1-16-得到一个tensor-that-has-16-elements-from-1-to-16-在aaview44就得到了一个44的tensor-需要注意reshape之后元素的个数不能改变1644-参数-1的作用是我懒得算这一维度应该是多少由于元素个数不能改变所以希望自动被计算需要注意的是只有一个维度可以写-1不过view和reshape有些区别reshape-always-copies-memory-view-never-copies-memory" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#tensorview-%e7%9a%84%e4%bd%9c%e7%94%a8%e6%98%afreshape-%e6%af%94%e5%a6%82a--torchrange1-16-%e5%be%97%e5%88%b0%e4%b8%80%e4%b8%aatensor-that-has-16-elements-from-1-to-16-%e5%9c%a8aaview44%e5%b0%b1%e5%be%97%e5%88%b0%e4%ba%86%e4%b8%80%e4%b8%aa44%e7%9a%84tensor-%e9%9c%80%e8%a6%81%e6%b3%a8%e6%84%8freshape%e4%b9%8b%e5%90%8e%e5%85%83%e7%b4%a0%e7%9a%84%e4%b8%aa%e6%95%b0%e4%b8%8d%e8%83%bd%e6%94%b9%e5%8f%981644-%e5%8f%82%e6%95%b0-1%e7%9a%84%e4%bd%9c%e7%94%a8%e6%98%af%e6%88%91%e6%87%92%e5%be%97%e7%ae%97%e8%bf%99%e4%b8%80%e7%bb%b4%e5%ba%a6%e5%ba%94%e8%af%a5%e6%98%af%e5%a4%9a%e5%b0%91%e7%94%b1%e4%ba%8e%e5%85%83%e7%b4%a0%e4%b8%aa%e6%95%b0%e4%b8%8d%e8%83%bd%e6%94%b9%e5%8f%98%e6%89%80%e4%bb%a5%e5%b8%8c%e6%9c%9b%e8%87%aa%e5%8a%a8%e8%a2%ab%e8%ae%a1%e7%ae%97%e9%9c%80%e8%a6%81%e6%b3%a8%e6%84%8f%e7%9a%84%e6%98%af%e5%8f%aa%e6%9c%89%e4%b8%80%e4%b8%aa%e7%bb%b4%e5%ba%a6%e5%8f%af%e4%bb%a5%e5%86%99-1%e4%b8%8d%e8%bf%87view%e5%92%8creshape%e6%9c%89%e4%ba%9b%e5%8c%ba%e5%88%abreshape-always-copies-memory-view-never-copies-memory" aria-label="Anchor"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt; * 
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 class="relative group"&gt;torch.squeeze  将输入张量形状中的&lt;code&gt;1&lt;/code&gt; 去除并返回。 如果输入是形如(A×1×B×1×C×1×D)，那么输出形状就为： (A×B×C×D)当给定&lt;code&gt;dim&lt;/code&gt;时，那么挤压操作只在给定维度上。例如，输入形状为: (A×1×B), &lt;code&gt;squeeze(input, 0)&lt;/code&gt; 将会保持张量不变，只有用 &lt;code&gt;squeeze(input, 1)&lt;/code&gt;，形状会变成 (A×B)。注意： 返回张量与输入张量共享内存，所以改变其中一个的内容会改变另一个。
 &lt;div id="torchsqueeze将输入张量形状中的1去除并返回-如果输入是形如a1b1c1d那么输出形状就为abcd当给定dim时那么挤压操作只在给定维度上例如输入形状为a1bsqueezeinput-0将会保持张量不变只有用squeezeinput-1形状会变成ab注意-返回张量与输入张量共享内存所以改变其中一个的内容会改变另一个" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#torchsqueeze%e5%b0%86%e8%be%93%e5%85%a5%e5%bc%a0%e9%87%8f%e5%bd%a2%e7%8a%b6%e4%b8%ad%e7%9a%841%e5%8e%bb%e9%99%a4%e5%b9%b6%e8%bf%94%e5%9b%9e-%e5%a6%82%e6%9e%9c%e8%be%93%e5%85%a5%e6%98%af%e5%bd%a2%e5%a6%82a1b1c1d%e9%82%a3%e4%b9%88%e8%be%93%e5%87%ba%e5%bd%a2%e7%8a%b6%e5%b0%b1%e4%b8%baabcd%e5%bd%93%e7%bb%99%e5%ae%9adim%e6%97%b6%e9%82%a3%e4%b9%88%e6%8c%a4%e5%8e%8b%e6%93%8d%e4%bd%9c%e5%8f%aa%e5%9c%a8%e7%bb%99%e5%ae%9a%e7%bb%b4%e5%ba%a6%e4%b8%8a%e4%be%8b%e5%a6%82%e8%be%93%e5%85%a5%e5%bd%a2%e7%8a%b6%e4%b8%baa1bsqueezeinput-0%e5%b0%86%e4%bc%9a%e4%bf%9d%e6%8c%81%e5%bc%a0%e9%87%8f%e4%b8%8d%e5%8f%98%e5%8f%aa%e6%9c%89%e7%94%a8squeezeinput-1%e5%bd%a2%e7%8a%b6%e4%bc%9a%e5%8f%98%e6%88%90ab%e6%b3%a8%e6%84%8f-%e8%bf%94%e5%9b%9e%e5%bc%a0%e9%87%8f%e4%b8%8e%e8%be%93%e5%85%a5%e5%bc%a0%e9%87%8f%e5%85%b1%e4%ba%ab%e5%86%85%e5%ad%98%e6%89%80%e4%bb%a5%e6%94%b9%e5%8f%98%e5%85%b6%e4%b8%ad%e4%b8%80%e4%b8%aa%e7%9a%84%e5%86%85%e5%ae%b9%e4%bc%9a%e6%94%b9%e5%8f%98%e5%8f%a6%e4%b8%80%e4%b8%aa" aria-label="Anchor"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt; * 
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 class="relative group"&gt;torch.unsqueeze  返回一个新的张量，对输入的制定位置插入维度 1 注意： 返回张量与输入张量共享内存，所以改变其中一个的内容会改变另一个。如果&lt;code&gt;dim&lt;/code&gt;为负，则将会被转化dim+input.dim()+1
 &lt;div id="torchunsqueeze返回一个新的张量对输入的制定位置插入维度-1-注意-返回张量与输入张量共享内存所以改变其中一个的内容会改变另一个如果dim为负则将会被转化diminputdim1" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#torchunsqueeze%e8%bf%94%e5%9b%9e%e4%b8%80%e4%b8%aa%e6%96%b0%e7%9a%84%e5%bc%a0%e9%87%8f%e5%af%b9%e8%be%93%e5%85%a5%e7%9a%84%e5%88%b6%e5%ae%9a%e4%bd%8d%e7%bd%ae%e6%8f%92%e5%85%a5%e7%bb%b4%e5%ba%a6-1-%e6%b3%a8%e6%84%8f-%e8%bf%94%e5%9b%9e%e5%bc%a0%e9%87%8f%e4%b8%8e%e8%be%93%e5%85%a5%e5%bc%a0%e9%87%8f%e5%85%b1%e4%ba%ab%e5%86%85%e5%ad%98%e6%89%80%e4%bb%a5%e6%94%b9%e5%8f%98%e5%85%b6%e4%b8%ad%e4%b8%80%e4%b8%aa%e7%9a%84%e5%86%85%e5%ae%b9%e4%bc%9a%e6%94%b9%e5%8f%98%e5%8f%a6%e4%b8%80%e4%b8%aa%e5%a6%82%e6%9e%9cdim%e4%b8%ba%e8%b4%9f%e5%88%99%e5%b0%86%e4%bc%9a%e8%a2%ab%e8%bd%ac%e5%8c%96diminputdim1" aria-label="Anchor"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h3&gt;
&lt;div class="highlight-wrapper"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 1&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;torch&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Tensor&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 2&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;torch&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;unsqueeze&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 3&lt;/span&gt;&lt;span class="cl"&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 4&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;torch&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;FloatTensor&lt;/span&gt; &lt;span class="n"&gt;of&lt;/span&gt; &lt;span class="n"&gt;size&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="n"&gt;x4&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 5&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;torch&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;unsqueeze&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 6&lt;/span&gt;&lt;span class="cl"&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 7&lt;/span&gt;&lt;span class="cl"&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 8&lt;/span&gt;&lt;span class="cl"&gt; &lt;span class="mi"&gt;3&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 9&lt;/span&gt;&lt;span class="cl"&gt; &lt;span class="mi"&gt;4&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;10&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;torch&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;FloatTensor&lt;/span&gt; &lt;span class="n"&gt;of&lt;/span&gt; &lt;span class="n"&gt;size&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="n"&gt;x1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;11&lt;/span&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;12&lt;/span&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;13&lt;/span&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;14&lt;/span&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 class="relative group"&gt;tensor.expand(&lt;em&gt;size)   扩展tensor.可以保持维度数目不变，每一维度的size增加(比如A&lt;/em&gt;B变到C*D,其中C&amp;gt;=A,D&amp;gt;=B).-1参数表示某一个维度的size不发生改变  . 有可以扩展tensor到更多的维度，新增加的维度会默认放在最前面，并且不能以-1作为参数。
 &lt;div id="tensorexpandsize-扩展tensor可以保持维度数目不变每一维度的size增加比如ab变到cd其中cadb-1参数表示某一个维度的size不发生改变--有可以扩展tensor到更多的维度新增加的维度会默认放在最前面并且不能以-1作为参数" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#tensorexpandsize-%e6%89%a9%e5%b1%95tensor%e5%8f%af%e4%bb%a5%e4%bf%9d%e6%8c%81%e7%bb%b4%e5%ba%a6%e6%95%b0%e7%9b%ae%e4%b8%8d%e5%8f%98%e6%af%8f%e4%b8%80%e7%bb%b4%e5%ba%a6%e7%9a%84size%e5%a2%9e%e5%8a%a0%e6%af%94%e5%a6%82ab%e5%8f%98%e5%88%b0cd%e5%85%b6%e4%b8%adcadb-1%e5%8f%82%e6%95%b0%e8%a1%a8%e7%a4%ba%e6%9f%90%e4%b8%80%e4%b8%aa%e7%bb%b4%e5%ba%a6%e7%9a%84size%e4%b8%8d%e5%8f%91%e7%94%9f%e6%94%b9%e5%8f%98--%e6%9c%89%e5%8f%af%e4%bb%a5%e6%89%a9%e5%b1%95tensor%e5%88%b0%e6%9b%b4%e5%a4%9a%e7%9a%84%e7%bb%b4%e5%ba%a6%e6%96%b0%e5%a2%9e%e5%8a%a0%e7%9a%84%e7%bb%b4%e5%ba%a6%e4%bc%9a%e9%bb%98%e8%ae%a4%e6%94%be%e5%9c%a8%e6%9c%80%e5%89%8d%e9%9d%a2%e5%b9%b6%e4%b8%94%e4%b8%8d%e8%83%bd%e4%bb%a5-1%e4%bd%9c%e4%b8%ba%e5%8f%82%e6%95%b0" aria-label="Anchor"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt; * 
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 class="relative group"&gt;&lt;strong&gt;tensor.contiguous  将一个tensor变成连续的。（一些ops如expand/expand_as会让tensor 不连续）&lt;/strong&gt;
 &lt;div id="tensorcontiguous-将一个tensor变成连续的一些ops如expandexpand_" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#tensorcontiguous-%e5%b0%86%e4%b8%80%e4%b8%aatensor%e5%8f%98%e6%88%90%e8%bf%9e%e7%bb%ad%e7%9a%84%e4%b8%80%e4%ba%9bops%e5%a6%82expandexpand_" aria-label="Anchor"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h3&gt;</description></item></channel></rss>