<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>编程与诗|飒白的个人博客|飒白的闲话仓库|一位主播和程序员的奇妙组合体</title>
  
  
  <link href="/atom.xml" rel="self"/>
  
  <link href="https://www.tjzzz.com/"/>
  <updated>2022-01-27T07:07:35.878Z</updated>
  <id>https://www.tjzzz.com/</id>
  
  <author>
    <name>飒白</name>
    
  </author>
  
  <generator uri="https://hexo.io/">Hexo</generator>
  
  <entry>
    <title>侯捷c++笔记：c++泛型与高级用法</title>
    <link href="https://www.tjzzz.com/posts/17f37c03.html"/>
    <id>https://www.tjzzz.com/posts/17f37c03.html</id>
    <published>2022-01-27T06:59:38.782Z</published>
    <updated>2022-01-27T07:07:35.878Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="\assets\css\APlayer.min.css"><script src="\assets\js\APlayer.min.js" class="aplayer-secondary-script-marker"></script><h1 id="目标"><a href="#目标" class="headerlink" title="目标"></a>目标</h1><p><img src="https://img.tjzzz.com/img/image-20220117143513546.png" alt="image-20220117143513546" loading="lazy"></p><h1 id="转换函数"><a href="#转换函数" class="headerlink" title="转换函数"></a>转换函数</h1><h2 id="定义"><a href="#定义" class="headerlink" title="定义"></a>定义</h2><p><img src="https://img.tjzzz.com/img/image-20220117144200362.png" alt="image-20220117144200362" loading="lazy"></p><p>黄色特性：fraction可以被转换为double，按照return返回</p><p>这种就是转换函数，没有函数类型</p><p>通常要加上const</p><p>注意：这里return double转换有问题，需要改成<code>return (double)f_up / (double)f_down;</code></p><p>只要认为合理，可以设置任何operator</p><h2 id="non-explicit-one-argument-ctor"><a href="#non-explicit-one-argument-ctor" class="headerlink" title="non-explicit-one-argument ctor"></a>non-explicit-one-argument ctor</h2><p><img src="https://img.tjzzz.com/img/image-20220118160821235.png" alt="image-20220118160821235" loading="lazy"></p><p>可以把别的东西转化为fraction</p><h2 id="转换函数与non-explicit-one-argument-ctor"><a href="#转换函数与non-explicit-one-argument-ctor" class="headerlink" title="转换函数与non-explicit-one-argument ctor"></a>转换函数与non-explicit-one-argument ctor</h2><p><img src="https://img.tjzzz.com/img/image-20220118161014414.png" alt="image-20220118161014414" loading="lazy"></p><p>编译器发现两条路可行，所以报错</p><h2 id="explicit-one-argument-ctor"><a href="#explicit-one-argument-ctor" class="headerlink" title="explicit-one-argument ctor"></a>explicit-one-argument ctor</h2><p><img src="https://img.tjzzz.com/img/image-20220118161349464.png" alt="image-20220118161349464" loading="lazy"></p><p>加上explict只有用在这里，在构造函数前面</p><p>告诉编译器不要自动转化为fraction</p><h2 id="转换函数的其他用途"><a href="#转换函数的其他用途" class="headerlink" title="转换函数的其他用途"></a>转换函数的其他用途</h2><p><img src="https://img.tjzzz.com/img/image-20220118161705257.png" alt="image-20220118161705257" loading="lazy"></p><h1 id="pointer-like-classes"><a href="#pointer-like-classes" class="headerlink" title="pointer-like classes"></a>pointer-like classes</h1><h2 id="关于智能指针"><a href="#关于智能指针" class="headerlink" title="关于智能指针"></a>关于智能指针</h2><p><img src="https://img.tjzzz.com/img/image-20220118162214588.png" alt="image-20220118162214588" loading="lazy"></p><p>指针所做的，智能指针应该都要做到</p><p>在这里关注* 和-&gt;</p><p>share在接受普通指针</p><p>右下角-&gt;在把sp转化为px已经消耗掉了啊？</p><p>箭头符号在作用一个以后，还能再作用下去</p><h2 id="关于迭代器"><a href="#关于迭代器" class="headerlink" title="关于迭代器"></a>关于迭代器</h2><p><img src="https://img.tjzzz.com/img/image-20220118162857699.png" alt="image-20220118162857699" loading="lazy"></p><p>主要遍历容器，所以要写++和–</p><p>链表：</p><p><img src="https://img.tjzzz.com/img/image-20220118163133904.png" alt="image-20220118163133904" loading="lazy"></p><p>链表迭代器node必然有一个指针</p><p>对迭代器解指针拿的是数据，所以直接return数据data</p><h1 id="function-like-classes-所谓仿函数"><a href="#function-like-classes-所谓仿函数" class="headerlink" title="function-like classes 所谓仿函数"></a>function-like classes 所谓仿函数</h1><p>为什么要让class像函数？</p><h2 id="定义-1"><a href="#定义-1" class="headerlink" title="定义"></a>定义</h2><p><img src="https://img.tjzzz.com/img/image-20220118192957126.png" alt="image-20220118192957126" loading="lazy"></p><p>函数是接受一个()符号，所以class可以通过重载()就可以作为函数</p><h2 id="奇特模样"><a href="#奇特模样" class="headerlink" title="奇特模样"></a>奇特模样</h2><p><img src="https://img.tjzzz.com/img/image-20220118193812537.png" alt="image-20220118193812537" loading="lazy"></p><p><img src="https://img.tjzzz.com/img/image-20220118193826727.png" alt="image-20220118193826727" loading="lazy"></p><p>上面都继承了如下：</p><p><img src="https://img.tjzzz.com/img/image-20220118193901727.png" alt="image-20220118193901727" loading="lazy"></p><p>仿函数都会继承一些奇特的base classes</p><p>标准库里都会有很多class使用仿函数</p><h1 id="namespace经验谈"><a href="#namespace经验谈" class="headerlink" title="namespace经验谈"></a>namespace经验谈</h1><p><img src="https://img.tjzzz.com/img/image-20220118194250852.png" alt="image-20220118194250852" loading="lazy"></p><p>可以把函数放在namespace里，这样就不用重复的取名字了</p><p>相当于分组一样</p><h1 id="模板"><a href="#模板" class="headerlink" title="模板"></a>模板</h1><h2 id="class-template"><a href="#class-template" class="headerlink" title="class template"></a>class template</h2><p><img src="https://img.tjzzz.com/img/image-20220118194643071.png" alt="image-20220118194643071" loading="lazy"></p><h2 id="function-template"><a href="#function-template" class="headerlink" title="function template"></a>function template</h2><p><img src="https://img.tjzzz.com/img/image-20220119151321045.png" alt="image-20220119151321045" loading="lazy"></p><p>函数模板在使用时自动推导类型</p><h2 id="member-template"><a href="#member-template" class="headerlink" title="member template"></a>member template</h2><p><img src="https://img.tjzzz.com/img/image-20220119162106328.png" alt="image-20220119162106328" loading="lazy"></p><p><img src="https://img.tjzzz.com/img/image-20220119162430881.png" alt="image-20220119162430881" loading="lazy"></p><p>当然可以，但是反之不可以</p><p><img src="https://img.tjzzz.com/img/image-20220120152847953.png" alt="image-20220120152847953" loading="lazy"></p><h2 id="specialization-模板特化"><a href="#specialization-模板特化" class="headerlink" title="specialization 模板特化"></a>specialization 模板特化</h2><p>作为一个设计者可能面对独特的类型</p><p><img src="https://img.tjzzz.com/img/image-20220121201154454.png" alt="image-20220121201154454" loading="lazy"></p><p>画两条线，在电脑上必然是实数</p><p>第一个框框是泛化</p><p>指定特别的类型，char或者int等等，编译器就会用特定的算法</p><p>浅绿色是临时对象，蓝色就是参数</p><h2 id="模板偏特化"><a href="#模板偏特化" class="headerlink" title="模板偏特化"></a>模板偏特化</h2><h3 id="个数上的偏"><a href="#个数上的偏" class="headerlink" title="个数上的偏"></a>个数上的偏</h3><p><img src="https://img.tjzzz.com/img/image-20220121201804069.png" alt="image-20220121201804069" loading="lazy"></p><h2 id="范围上的偏"><a href="#范围上的偏" class="headerlink" title="范围上的偏"></a>范围上的偏</h2><p><img src="https://img.tjzzz.com/img/image-20220121203838551.png" alt="image-20220121203838551" loading="lazy"></p><p>可以把范围限制在指针</p><h2 id="模板模板参数"><a href="#模板模板参数" class="headerlink" title="模板模板参数"></a>模板模板参数</h2><p>typename和class只有在模板这个位置共通</p><p><img src="https://img.tjzzz.com/img/image-20220121204318887.png" alt="image-20220121204318887" loading="lazy"></p><p>用在 传一个容器，容器的指定类型，就需要模板模板参数</p><p>为什么第一个错了，因为list不只有一个参数，所以不可以这么用，要引入第二个框的两个语法</p><h1 id="关于c-标准库"><a href="#关于c-标准库" class="headerlink" title="关于c++标准库"></a>关于c++标准库</h1><p><img src="https://img.tjzzz.com/img/image-20220123100333497.png" alt="image-20220123100333497" loading="lazy"></p><p>都用一遍</p><h1 id="三个主题"><a href="#三个主题" class="headerlink" title="三个主题"></a>三个主题</h1><h2 id="variadic-templates-c11-数量不定的模板参数"><a href="#variadic-templates-c11-数量不定的模板参数" class="headerlink" title="variadic templates(c11) 数量不定的模板参数"></a>variadic templates(c11) 数量不定的模板参数</h2><p><img src="https://img.tjzzz.com/img/image-20220123102551176.png" alt="image-20220123102551176" loading="lazy"></p><p>print(args…)一直在递归 </p><p>最后变成0个的时候调用上面的void print()</p><pre class=" language-cpp"><code class="language-cpp"><span class="token macro property">#<span class="token directive keyword">include</span> <span class="token string">&lt;iostream></span></span><span class="token macro property">#<span class="token directive keyword">include</span> <span class="token string">&lt;bitset></span></span><span class="token keyword">using</span> <span class="token keyword">namespace</span> std<span class="token punctuation">;</span><span class="token keyword">void</span> <span class="token function">print</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token keyword">template</span> <span class="token operator">&lt;</span><span class="token keyword">typename</span> T<span class="token punctuation">,</span><span class="token keyword">typename</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span> Types<span class="token operator">></span><span class="token keyword">void</span> <span class="token function">print</span><span class="token punctuation">(</span><span class="token keyword">const</span> T<span class="token operator">&amp;</span> firstArg<span class="token punctuation">,</span> <span class="token keyword">const</span> Types<span class="token operator">&amp;</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span> args<span class="token punctuation">)</span><span class="token punctuation">{</span>    cout <span class="token operator">&lt;&lt;</span> firstArg <span class="token operator">&lt;&lt;</span> endl<span class="token punctuation">;</span>    <span class="token function">print</span><span class="token punctuation">(</span>args<span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token punctuation">}</span><span class="token keyword">int</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>    <span class="token function">print</span><span class="token punctuation">(</span><span class="token number">7.5</span><span class="token punctuation">,</span> <span class="token string">"hello"</span><span class="token punctuation">,</span> <span class="token string">"word"</span><span class="token punctuation">,</span> bitset<span class="token operator">&lt;</span><span class="token number">16</span><span class="token operator">></span><span class="token punctuation">(</span><span class="token number">377</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token punctuation">}</span></code></pre><p><code>sizeof...(args)</code>可以知道args的大小</p><h2 id="auto-c11"><a href="#auto-c11" class="headerlink" title="auto (c11)"></a>auto (c11)</h2><p><img src="https://img.tjzzz.com/img/image-20220123104421938.png" alt="image-20220123104421938" loading="lazy"></p><p>编译器知道find的返回类型，就会自动补上</p><h2 id="ranged-base-for-c11"><a href="#ranged-base-for-c11" class="headerlink" title="ranged-base for (c11)"></a>ranged-base for (c11)</h2><p><img src="https://img.tjzzz.com/img/image-20220123105000775.png" alt="image-20220123105000775" loading="lazy"></p><h2 id="reference"><a href="#reference" class="headerlink" title="reference"></a>reference</h2><p><img src="https://img.tjzzz.com/img/image-20220124094849653.png" alt="image-20220124094849653" loading="lazy"></p><p>习惯*靠向int，point to int</p><p><img src="https://img.tjzzz.com/img/image-20220124095557893.png" alt="image-20220124095557893" loading="lazy"></p><p>常见用途：</p><p><img src="https://img.tjzzz.com/img/image-20220124095815686.png" alt="image-20220124095815686" loading="lazy"></p><p>声明：&lt;类型标志符&gt;函数名（参数表）const；</p><p>说明：</p><p>（1）const是函数类型的一部分，在实现部分也要带该关键字。</p><p>（2）const关键字可以用于对重载函数的区分。</p><p>（3）常成员函数不能更新类的成员变量，也不能调用该类中没有用const修饰的成员函数，只能调用常成员函数。</p><p>（4）非常量对象也可以调用常成员函数，但是如果有重载的非常成员函数则会调用非常成员函数。</p><h1 id="复合-amp-继承关系下的构造和析构"><a href="#复合-amp-继承关系下的构造和析构" class="headerlink" title="复合&amp;继承关系下的构造和析构"></a>复合&amp;继承关系下的构造和析构</h1><h2 id="继承关系下的构造和析构"><a href="#继承关系下的构造和析构" class="headerlink" title="继承关系下的构造和析构"></a>继承关系下的构造和析构</h2><p><img src="https://img.tjzzz.com/img/image-20220124101108226.png" alt="image-20220124101108226" loading="lazy"></p><p>哺乳动物-猪</p><p>先创建哺乳动物再创建猪，先删除猪再删除哺乳动物</p><h2 id="复合关系下的构造和析构"><a href="#复合关系下的构造和析构" class="headerlink" title="复合关系下的构造和析构"></a>复合关系下的构造和析构</h2><p><img src="https://img.tjzzz.com/img/image-20220124101048832.png" alt="image-20220124101048832" loading="lazy"></p><h2 id="继承和复合关系下的构造和析构"><a href="#继承和复合关系下的构造和析构" class="headerlink" title="继承和复合关系下的构造和析构"></a>继承和复合关系下的构造和析构</h2><p><img src="https://img.tjzzz.com/img/image-20220124101621169.png" alt="image-20220124101621169" loading="lazy"></p><h1 id="对象模型"><a href="#对象模型" class="headerlink" title="对象模型"></a>对象模型</h1><h2 id="关于vptr虚指针和vtbl虚表"><a href="#关于vptr虚指针和vtbl虚表" class="headerlink" title="关于vptr虚指针和vtbl虚表"></a>关于vptr虚指针和vtbl虚表</h2><p><strong>重要</strong></p><p><img src="https://img.tjzzz.com/img/image-20220124143019847.png" alt="image-20220124143019847" loading="lazy"></p><p>当一个类有一个虚函数的时候，虚函数是最重要的一部分，如果只谈继承不说虚函数用途不，只要类里面有一个虚函数，对象里面就会多一个指针(一万个虚函数也是一个指针)。</p><p>继承函数是继承调用权</p><p>B改写了一个虚函数，C又改写了B的虚函数</p><p>a、b和c里面的指针指向了一个虚表，虚表中包含了数个指向虚函数的指针</p><p>不再是单纯的静态调用，而是动态调用，面向对象很重要的环节！</p><p><img src="https://img.tjzzz.com/img/image-20220127090429443.png" alt="image-20220127090429443" loading="lazy"></p><p><img src="https://img.tjzzz.com/img/image-20220127090459935.png" alt="image-20220127090459935" loading="lazy"></p><p>为了让容器放各种的形状，就要指定容器里放各类的指针，draw函数要经常改写以适应各类形状</p><p>符合以下三个条件做动态绑定</p><p>1.通过指针绑定</p><p>2.指针向上转型，up-cast</p><p>3.调用虚函数</p><p>只要符合三个条件，编译器就编译成<img src="https://img.tjzzz.com/img/image-20220127090429443.png" alt="image-20220127090429443" loading="lazy"></p><p>右下角成为多态</p><h2 id="关于this"><a href="#关于this" class="headerlink" title="关于this"></a>关于this</h2><p><img src="https://img.tjzzz.com/img/image-20220127091650019.png" alt="image-20220127091650019" loading="lazy"></p><p>虚函数两个用法，一个是上一节的，一个是这节的 </p><h2 id="关于-Dynamic-Binding"><a href="#关于-Dynamic-Binding" class="headerlink" title="关于 Dynamic Binding"></a>关于 Dynamic Binding</h2><p><img src="https://img.tjzzz.com/img/image-20220127093014265.png" alt="image-20220127093014265" loading="lazy"></p><p><img src="https://img.tjzzz.com/img/image-20220127093219732.png" alt="image-20220127093219732" loading="lazy"></p><h1 id="补充"><a href="#补充" class="headerlink" title="补充"></a>补充</h1><h2 id="关于const"><a href="#关于const" class="headerlink" title="关于const"></a>关于const</h2><p>放在成员函数后面的const是很容易被忽略的，</p><p><img src="https://img.tjzzz.com/img/image-20220127093849043.png" alt="image-20220127093849043" loading="lazy"></p><p>意图是：修饰成员函数，加const至关重要</p><h2 id="关于new，delete"><a href="#关于new，delete" class="headerlink" title="关于new，delete"></a>关于new，delete</h2><p><img src="https://img.tjzzz.com/img/image-20220127141230112.png" alt="image-20220127141230112" loading="lazy"></p><p>class可以重载new和delete</p><h3 id="重载-operator-new，operator-delete，-operator-new-operator-delete"><a href="#重载-operator-new，operator-delete，-operator-new-operator-delete" class="headerlink" title="重载::operator new，operator delete，::operator new[],::operator delete[]"></a>重载::operator new，operator delete，::operator new[],::operator delete[]</h3><p><img src="https://img.tjzzz.com/img/image-20220127141456565.png" alt="image-20220127141456565" loading="lazy"></p><p>重载这些影响非常广</p><h3 id="member-operator-new-delete"><a href="#member-operator-new-delete" class="headerlink" title="member operator new/delete"></a>member operator new/delete</h3><p><img src="https://img.tjzzz.com/img/image-20220127141635126.png" alt="image-20220127141635126" loading="lazy"></p><p>通常接管做内存池</p><h3 id="重载-member-operator-new-delete"><a href="#重载-member-operator-new-delete" class="headerlink" title="重载 member operator new[]/delete[]"></a>重载 member operator new[]/delete[]</h3><p><img src="https://img.tjzzz.com/img/image-20220127141911896.png" alt="image-20220127141911896" loading="lazy"></p><h3 id="实例，接口"><a href="#实例，接口" class="headerlink" title="实例，接口"></a>实例，接口</h3><p><img src="https://img.tjzzz.com/img/image-20220127142023461.png" alt="image-20220127142023461" loading="lazy"></p><p>如果使用者想要绕过特性，使用::new</p><p><img src="https://img.tjzzz.com/img/image-20220127142203550.png" alt="image-20220127142203550" loading="lazy"></p><p>12×5是60，结果是64，多出来的4记录了数组大小(计数器)</p><p><img src="https://img.tjzzz.com/img/image-20220127142708033.png" alt="image-20220127142708033" loading="lazy"></p><h3 id="重载new-，delete"><a href="#重载new-，delete" class="headerlink" title="重载new()，delete()"></a>重载new()，delete()</h3><p><img src="https://img.tjzzz.com/img/image-20220127142834729.png" alt="image-20220127142834729" loading="lazy"></p><p><img src="https://img.tjzzz.com/img/image-20220127142932222.png" alt="image-20220127142932222" loading="lazy"></p><p><img src="https://img.tjzzz.com/img/image-20220127143306892.png" alt="image-20220127143306892" loading="lazy"></p><p>对象构造的时候要分配内存然后调用构造函数，构造函数发出异常没成功，就要把分配的内存释放掉，对应的delete就被调用起来</p><h3 id="basic-string-使用-new-extra-扩充申请量"><a href="#basic-string-使用-new-extra-扩充申请量" class="headerlink" title="basic_string 使用 new(extra) 扩充申请量"></a>basic_string 使用 new(extra) 扩充申请量</h3><p>标准库：</p><p><img src="https://img.tjzzz.com/img/image-20220127143909296.png" alt="image-20220127143909296" loading="lazy"></p><p>当create自己的时候，分配一个rep+extra内容空间，rep做的是计数器。</p><hr><p><img src="https://img.tjzzz.com/img/waixuan.png" alt="" loading="lazy"></p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;link rel=&quot;stylesheet&quot; class=&quot;aplayer-secondary-style-marker&quot; href=&quot;\assets\css\APlayer.min.css&quot;&gt;&lt;script src=&quot;\assets\js\APlayer.min.js&quot; cla
      
    
    </summary>
    
    
      <category term="学习历程" scheme="https://www.tjzzz.com/categories/LearningExperience/"/>
    
    
      <category term="cpp" scheme="https://www.tjzzz.com/tags/cpp/"/>
    
  </entry>
  
  <entry>
    <title>侯捷c++笔记：c++面向对象的指针类</title>
    <link href="https://www.tjzzz.com/posts/f6964998.html"/>
    <id>https://www.tjzzz.com/posts/f6964998.html</id>
    <published>2022-01-03T03:02:53.795Z</published>
    <updated>2022-01-03T03:04:10.313Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="\assets\css\APlayer.min.css"><script src="\assets\js\APlayer.min.js" class="aplayer-secondary-script-marker"></script><h1 id="1-三大函数：拷贝构造、赋值和析构"><a href="#1-三大函数：拷贝构造、赋值和析构" class="headerlink" title="1. 三大函数：拷贝构造、赋值和析构"></a>1. 三大函数：拷贝构造、赋值和析构</h1><p>标准库太过于复杂，所以写一个基本功能的string</p><p>实现如下功能：</p><pre class=" language-C++"><code class="language-C++">int main(){  String s1();   String s2("hello");  String s3(s1); //copy，构造 *重点  cout << s3 << endl; //重载  s3 = s2; //copy,赋值  cout << s3 << endl;       cout << s2 << endl;    cout << s1 << endl;      system("PAUSE");  return 0;}</code></pre><p>编译器会给一套构造，string用很不好，如果类带指针，就不能用默认版本，要自己写！</p><h2 id="Big-Three-三个特殊函数"><a href="#Big-Three-三个特殊函数" class="headerlink" title="Big Three,三个特殊函数"></a>Big Three,三个特殊函数</h2><p><img src="https://img.tjzzz.com/img/20220103110116.png" alt="image-20211229160837247" loading="lazy"></p><p>拷贝构造 </p><p>拷贝赋值</p><p>析构函数：当它死亡时就会被调用</p><p>这三个就是big three</p><h2 id="ctor和dtor-构造函数和析构函数"><a href="#ctor和dtor-构造函数和析构函数" class="headerlink" title="ctor和dtor(构造函数和析构函数)"></a>ctor和dtor(构造函数和析构函数)</h2><p><img src="https://img.tjzzz.com/img/20220103110113.png" alt="image-20211229162131490" loading="lazy"></p><p>new分配1个字符：new char[1]</p><p>如果没有把动态分配的内存及时清理，会内存溢出！</p><p>所以需要析构函数！</p><p>new和delete之后再讲！</p><h2 id="class-with-pointer-members-必须有拷贝构造和拷贝赋值"><a href="#class-with-pointer-members-必须有拷贝构造和拷贝赋值" class="headerlink" title="class with pointer members 必须有拷贝构造和拷贝赋值"></a>class with pointer members 必须有拷贝构造和拷贝赋值</h2><p><img src="https://img.tjzzz.com/img/20220103110110.png" alt="image-20211231143116586" loading="lazy"></p><p>使用默认的浅拷贝，很危险！</p><h2 id="拷贝构造函数"><a href="#拷贝构造函数" class="headerlink" title="拷贝构造函数"></a>拷贝构造函数</h2><p><img src="https://img.tjzzz.com/img/20220103110106.png" alt="image-20211231143336642" loading="lazy"></p><p>1.创建出一个足够的空间</p><p>2.把内容拷贝过去</p><p>如果不写这个函数只拷贝指针就是浅拷贝，要避免！</p><h2 id="拷贝赋值函数"><a href="#拷贝赋值函数" class="headerlink" title="拷贝赋值函数"></a>拷贝赋值函数</h2><p>把左边杀掉，再分配一块右边一样大的空间，再把右边的复制到左边。</p><p><img src="https://img.tjzzz.com/img/20220103110103.png" alt="image-20211231143732369" loading="lazy"></p><p>如果不写检测自我赋值，1杀掉以后，a和b都找不到唯一的那个指针了！</p><p>所以要写自我赋值检测！</p><h1 id="2-堆、栈与内存管理"><a href="#2-堆、栈与内存管理" class="headerlink" title="2.堆、栈与内存管理"></a>2.堆、栈与内存管理</h1><h2 id="output函数"><a href="#output函数" class="headerlink" title="output函数"></a>output函数</h2><p><img src="https://img.tjzzz.com/img/20220103110101.png" alt="image-20211231144455585" loading="lazy"></p><p>写成全局函数，因为写成成员函数cout会在右边！</p><h2 id="所谓栈-stack-，所谓堆-heap"><a href="#所谓栈-stack-，所谓堆-heap" class="headerlink" title="所谓栈(stack)，所谓堆(heap)"></a>所谓栈(stack)，所谓堆(heap)</h2><p><strong>stack</strong>，是存在于某作用域的一块内存空间，例如你调用函数，函数本身即会形成一个stack用来放置它所接收的参数，以及返回地址。</p><p>在函数本体内声明的任何变量，其所使用的内存块都取自上述stack。</p><p><strong>Heap</strong>,或system heap是指由操作系统提供的一块global内存空间，程序可动态分配从某个中获得的若干区块(blocks)。</p><pre class=" language-cpp"><code class="language-cpp"><span class="token keyword">class</span> <span class="token class-name">Complex</span> <span class="token punctuation">{</span> … <span class="token punctuation">}</span><span class="token punctuation">;</span> <span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span> <span class="token punctuation">{</span>    Complex <span class="token function">c1</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">,</span><span class="token number">2</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment" spellcheck="true">//栈</span>    Complex<span class="token operator">*</span> p <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token function">Complex</span><span class="token punctuation">(</span><span class="token number">3</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment" spellcheck="true">//堆</span><span class="token punctuation">}</span></code></pre><p>上述c1其生命在作用域结束之际就会结束，这种作用域的object，又称为auto object，因为他会被自动清理。</p><h2 id="stack-local-objects-的生命期"><a href="#stack-local-objects-的生命期" class="headerlink" title="stack local objects 的生命期"></a>stack local objects 的生命期</h2><pre class=" language-cpp"><code class="language-cpp"><span class="token keyword">class</span> <span class="token class-name">Complex</span> <span class="token punctuation">{</span> … <span class="token punctuation">}</span><span class="token punctuation">;</span> <span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span> <span class="token punctuation">{</span>    stack Complex <span class="token function">c1</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">,</span><span class="token number">2</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment" spellcheck="true">//</span><span class="token punctuation">}</span></code></pre><p>上述生命在程序结束后其生命才会结束！</p><h2 id="global-objects的生命期"><a href="#global-objects的生命期" class="headerlink" title="global objects的生命期"></a>global objects的生命期</h2><pre class=" language-cpp"><code class="language-cpp"><span class="token keyword">class</span> <span class="token class-name">Complex</span> <span class="token punctuation">{</span> … <span class="token punctuation">}</span><span class="token punctuation">;</span> <span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span> Complex <span class="token function">c3</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">,</span><span class="token number">2</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token keyword">int</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span><span class="token punctuation">}</span></code></pre><p>也可以视为stack，其作用域是整个程序！</p><pre class=" language-cpp"><code class="language-cpp"><span class="token keyword">class</span> <span class="token class-name">Complex</span> <span class="token punctuation">{</span> … <span class="token punctuation">}</span><span class="token punctuation">;</span> <span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span> <span class="token punctuation">{</span>    Complex<span class="token operator">*</span> p <span class="token operator">=</span> <span class="token keyword">new</span> Complex<span class="token punctuation">;</span>    <span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span>    <span class="token keyword">delete</span> p<span class="token punctuation">;</span><span class="token punctuation">}</span></code></pre><p>p所指的便是heap object，其生命在被deleted之际结束。</p><pre class=" language-cpp"><code class="language-cpp"><span class="token keyword">class</span> <span class="token class-name">Complex</span> <span class="token punctuation">{</span> … <span class="token punctuation">}</span><span class="token punctuation">;</span> <span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span> <span class="token punctuation">{</span>    Complex<span class="token operator">*</span> p <span class="token operator">=</span> <span class="token keyword">new</span> Complex<span class="token punctuation">;</span><span class="token punctuation">}</span></code></pre><p>以上出现内存泄漏，因为当作用域结束，p所指的heap仍然存在，但指针p的生命却结束了，作用域之外再也看不到p，heap就此遗失在内存海里。</p><h2 id="new：先分配memory，再调用ctor"><a href="#new：先分配memory，再调用ctor" class="headerlink" title="new：先分配memory，再调用ctor"></a>new：先分配memory，再调用ctor</h2><p><img src="https://img.tjzzz.com/img/20220103110045.png" alt="image-20211231151749501" loading="lazy"></p><h2 id="delete：先调用dtor，再释放memory"><a href="#delete：先调用dtor，再释放memory" class="headerlink" title="delete：先调用dtor，再释放memory"></a>delete：先调用dtor，再释放memory</h2><p><img src="https://img.tjzzz.com/img/20220103110043.png" alt="image-20211231151958581" loading="lazy"></p><h2 id="动态分配所得的内存块-in-VC"><a href="#动态分配所得的内存块-in-VC" class="headerlink" title="动态分配所得的内存块 in VC"></a>动态分配所得的内存块 in VC</h2><p><img src="https://img.tjzzz.com/img/20220103110048.png" alt="image-20211231152216611" loading="lazy"></p><p>必须是16的倍数，所以从52pad到64</p><p>在非调试下，得到的就是16</p><p>上下cookie要记录整个的大小！</p><p>64的16进制是40,41是因为最后一位是1的话为操作系统给出去的内存，0是操作系统拿到的内存，所以改成41.</p><p>16的倍倍数的16位进制最后的4位都是0所以可以借一个来用。</p><h2 id="动态分配的array"><a href="#动态分配的array" class="headerlink" title="动态分配的array"></a>动态分配的array</h2><p><img src="https://img.tjzzz.com/img/20220103110050.png" alt="image-20211231153313534" loading="lazy"></p><p>8*3的意思是3个数字，最后+4是因为vc中要在数组的前面声明数组长度！</p><h2 id="array-new-一定要搭配-array-delete"><a href="#array-new-一定要搭配-array-delete" class="headerlink" title="array new 一定要搭配 array delete"></a>array new 一定要搭配 array delete</h2><p><img src="https://img.tjzzz.com/img/20220103110053.png" alt="image-20211231154617958" loading="lazy"></p><p>内存泄漏的是只杀掉了第一个指针，剩下的两个都没有杀掉！</p><h1 id="指针class复习"><a href="#指针class复习" class="headerlink" title="指针class复习"></a>指针class复习</h1><p>string.h</p><pre class=" language-cpp"><code class="language-cpp"><span class="token macro property">#<span class="token directive keyword">ifndef</span> __String__</span><span class="token macro property">#<span class="token directive keyword">define</span> __String__</span><span class="token macro property">#<span class="token directive keyword">include</span><span class="token string">&lt;iostream></span></span><span class="token macro property">#<span class="token directive keyword">include</span><span class="token string">&lt;cstring></span></span><span class="token keyword">class</span> <span class="token class-name">String</span> <span class="token punctuation">{</span><span class="token keyword">public</span><span class="token operator">:</span>    <span class="token function">String</span><span class="token punctuation">(</span><span class="token keyword">const</span> <span class="token keyword">char</span><span class="token operator">*</span> cstr <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment" spellcheck="true">//拿来当初值</span>    <span class="token function">String</span><span class="token punctuation">(</span><span class="token keyword">const</span> String<span class="token operator">&amp;</span> str<span class="token punctuation">)</span><span class="token punctuation">;</span>    String<span class="token operator">&amp;</span> <span class="token keyword">operator</span><span class="token operator">=</span><span class="token punctuation">(</span><span class="token keyword">const</span> String<span class="token operator">&amp;</span> str<span class="token punctuation">)</span><span class="token punctuation">;</span>    <span class="token operator">~</span><span class="token function">String</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>    <span class="token keyword">char</span><span class="token operator">*</span> <span class="token function">get_c_str</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">const</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> m_data<span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token keyword">private</span><span class="token operator">:</span>    <span class="token keyword">char</span><span class="token operator">*</span> m_data<span class="token punctuation">;</span><span class="token punctuation">}</span><span class="token punctuation">;</span><span class="token keyword">inline</span> String<span class="token operator">::</span><span class="token function">String</span><span class="token punctuation">(</span><span class="token keyword">const</span> <span class="token keyword">char</span><span class="token operator">*</span> cstr<span class="token punctuation">)</span> <span class="token punctuation">{</span>    <span class="token keyword">if</span> <span class="token punctuation">(</span>cstr<span class="token punctuation">)</span> <span class="token punctuation">{</span>        m_data <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token keyword">char</span><span class="token punctuation">[</span>std<span class="token operator">::</span><span class="token function">strlen</span><span class="token punctuation">(</span>cstr<span class="token punctuation">)</span> <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">;</span>        <span class="token function">strcpy</span><span class="token punctuation">(</span>m_data<span class="token punctuation">,</span> cstr<span class="token punctuation">)</span><span class="token punctuation">;</span>    <span class="token punctuation">}</span>    <span class="token keyword">else</span> <span class="token punctuation">{</span>        m_data <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token keyword">char</span><span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">;</span>        <span class="token operator">*</span>m_data <span class="token operator">=</span> <span class="token string">'\0'</span><span class="token punctuation">;</span>    <span class="token punctuation">}</span><span class="token punctuation">}</span><span class="token keyword">inline</span>String<span class="token operator">::</span><span class="token operator">~</span><span class="token function">String</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span>    <span class="token keyword">delete</span><span class="token punctuation">[</span><span class="token punctuation">]</span> m_data<span class="token punctuation">;</span><span class="token comment" spellcheck="true">//array new</span><span class="token punctuation">}</span><span class="token keyword">inline</span>String<span class="token operator">::</span><span class="token function">String</span><span class="token punctuation">(</span><span class="token keyword">const</span> String<span class="token operator">&amp;</span> str<span class="token punctuation">)</span><span class="token punctuation">{</span>    m_data<span class="token operator">=</span> <span class="token keyword">new</span> <span class="token keyword">char</span><span class="token punctuation">[</span>std<span class="token operator">::</span><span class="token function">strlen</span><span class="token punctuation">(</span>str<span class="token punctuation">.</span>m_data<span class="token punctuation">)</span> <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">;</span>    <span class="token function">strcpy</span><span class="token punctuation">(</span>m_data<span class="token punctuation">,</span> str<span class="token punctuation">.</span>m_data<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token punctuation">}</span><span class="token keyword">inline</span>String<span class="token operator">&amp;</span> String<span class="token operator">::</span><span class="token keyword">operator</span><span class="token operator">=</span><span class="token punctuation">(</span><span class="token keyword">const</span> String<span class="token operator">&amp;</span> str<span class="token punctuation">)</span><span class="token comment" spellcheck="true">//&amp;引用</span><span class="token punctuation">{</span>    <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">&amp;</span>str <span class="token operator">==</span> <span class="token keyword">this</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><span class="token comment" spellcheck="true">//&amp;取地址</span>        <span class="token keyword">return</span> <span class="token operator">*</span><span class="token keyword">this</span><span class="token punctuation">;</span>    <span class="token punctuation">}</span>    <span class="token keyword">delete</span><span class="token punctuation">[</span><span class="token punctuation">]</span> m_data<span class="token punctuation">;</span>    m_data <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token keyword">char</span><span class="token punctuation">[</span><span class="token function">strlen</span><span class="token punctuation">(</span>str<span class="token punctuation">.</span>m_data<span class="token punctuation">)</span> <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">;</span>    <span class="token function">strcpy</span><span class="token punctuation">(</span>m_data<span class="token punctuation">,</span> str<span class="token punctuation">.</span>m_data<span class="token punctuation">)</span><span class="token punctuation">;</span>    <span class="token keyword">return</span> <span class="token operator">*</span><span class="token keyword">this</span><span class="token punctuation">;</span><span class="token punctuation">}</span>std<span class="token operator">::</span>ostream<span class="token operator">&amp;</span> <span class="token comment" spellcheck="true">//back add ostream</span><span class="token keyword">operator</span> <span class="token operator">&lt;&lt;</span> <span class="token punctuation">(</span>std<span class="token operator">::</span>ostream<span class="token operator">&amp;</span> os<span class="token punctuation">,</span> <span class="token keyword">const</span> String<span class="token operator">&amp;</span> str<span class="token punctuation">)</span> <span class="token comment" spellcheck="true">//cout will change</span><span class="token punctuation">{</span>    os <span class="token operator">&lt;&lt;</span> str<span class="token punctuation">.</span><span class="token function">get_c_str</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>    <span class="token keyword">return</span> os<span class="token punctuation">;</span><span class="token punctuation">}</span><span class="token macro property">#<span class="token directive keyword">endif</span></span></code></pre><p>string_test.cpp</p><pre class=" language-cpp"><code class="language-cpp"><span class="token macro property">#<span class="token directive keyword">include</span> <span class="token string">"String.h"</span></span><span class="token macro property">#<span class="token directive keyword">include</span> <span class="token string">&lt;iostream></span></span><span class="token keyword">using</span> <span class="token keyword">namespace</span> std<span class="token punctuation">;</span><span class="token keyword">int</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span>  String <span class="token function">s1</span><span class="token punctuation">(</span><span class="token string">"hello"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>   String <span class="token function">s2</span><span class="token punctuation">(</span><span class="token string">"world"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>  String <span class="token function">s3</span><span class="token punctuation">(</span>s2<span class="token punctuation">)</span><span class="token punctuation">;</span>  cout <span class="token operator">&lt;&lt;</span> s3 <span class="token operator">&lt;&lt;</span> endl<span class="token punctuation">;</span>  s3 <span class="token operator">=</span> s1<span class="token punctuation">;</span>  cout <span class="token operator">&lt;&lt;</span> s3 <span class="token operator">&lt;&lt;</span> endl<span class="token punctuation">;</span>       cout <span class="token operator">&lt;&lt;</span> s2 <span class="token operator">&lt;&lt;</span> endl<span class="token punctuation">;</span>    cout <span class="token operator">&lt;&lt;</span> s1 <span class="token operator">&lt;&lt;</span> endl<span class="token punctuation">;</span>      <span class="token function">system</span><span class="token punctuation">(</span><span class="token string">"PAUSE"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>  <span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span><span class="token punctuation">}</span></code></pre><hr><p><img src="https://img.tjzzz.com/img/waixuan.png" alt="" loading="lazy"></p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;link rel=&quot;stylesheet&quot; class=&quot;aplayer-secondary-style-marker&quot; href=&quot;\assets\css\APlayer.min.css&quot;&gt;&lt;script src=&quot;\assets\js\APlayer.min.js&quot; cla
      
    
    </summary>
    
    
      <category term="学习历程" scheme="https://www.tjzzz.com/categories/LearningExperience/"/>
    
    
      <category term="cpp" scheme="https://www.tjzzz.com/tags/cpp/"/>
    
  </entry>
  
  <entry>
    <title>侯捷c++笔记：c++面向对象的无指针类</title>
    <link href="https://www.tjzzz.com/posts/cfec85f.html"/>
    <id>https://www.tjzzz.com/posts/cfec85f.html</id>
    <published>2021-12-29T03:16:30.000Z</published>
    <updated>2021-12-29T08:02:25.602Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="\assets\css\APlayer.min.css"><script src="\assets\js\APlayer.min.js" class="aplayer-secondary-script-marker"></script><h1 id="1-头文件与类的声明"><a href="#1-头文件与类的声明" class="headerlink" title="1.头文件与类的声明"></a>1.头文件与类的声明</h1><h2 id="c-关于数据的函数"><a href="#c-关于数据的函数" class="headerlink" title="c++关于数据的函数"></a>c++关于数据的函数</h2><p>相较于c的特点：class和struct</p><p>以上两种形式创建了objects</p><p><img src="https://img.tjzzz.com/img/20211229111417.png" alt="c与c++形式上的对比" loading="lazy"></p><p>本课程以complex和string为例：</p><p><img src="https://img.tjzzz.com/img/20211229111422.png" alt="" loading="lazy"></p><h2 id="正式开始之前：代码基本形式"><a href="#正式开始之前：代码基本形式" class="headerlink" title="正式开始之前：代码基本形式"></a>正式开始之前：代码基本形式</h2><p>c++代码主要由以下三部分组成：</p><p><img src="https://img.tjzzz.com/img/20211229111424.png" alt="" loading="lazy"></p><h2 id="c和c-的输出的区别"><a href="#c和c-的输出的区别" class="headerlink" title="c和c++的输出的区别"></a>c和c++的输出的区别</h2><p><img src="https://img.tjzzz.com/img/20211229111426.png" alt="" loading="lazy"></p><p>c++的优势是cout啥都可以丢！</p><h2 id="头文件正规写法：防御声明"><a href="#头文件正规写法：防御声明" class="headerlink" title="头文件正规写法：防御声明"></a>头文件正规写法：防御声明</h2><p><img src="https://img.tjzzz.com/img/20211229111427.png" alt="" loading="lazy"></p><p>同一个程序第二次include就不会再次引入，否则会形成无限循环！</p><p><strong>很重要的防卫声明。</strong></p><h2 id="头文件正规写法：布局"><a href="#头文件正规写法：布局" class="headerlink" title="头文件正规写法：布局"></a>头文件正规写法：布局</h2><p><img src="https://img.tjzzz.com/img/20211229111429.png" alt="" loading="lazy"></p><p>最主要的是1和2，然后写完再检讨声明0；</p><h2 id="class的声明"><a href="#class的声明" class="headerlink" title="class的声明"></a>class的声明</h2><p><img src="https://img.tjzzz.com/img/20211229111431.png" alt="" loading="lazy"></p><p>每一个class都有一个head，再加上body！</p><p>实部虚部是一个double值，要设计另一个复数是整数或者float怎么办？</p><h2 id="class的模板：解决重复性"><a href="#class的模板：解决重复性" class="headerlink" title="class的模板：解决重复性"></a>class的模板：解决重复性</h2><p><img src="https://img.tjzzz.com/img/20211229111434.png" alt="" loading="lazy"></p><p>T可以随意替换，第一行告诉编译器啥是T，下面的为实例指定double或者int。</p><p>有很多函数，不过多着墨。可以<strong>自行了解</strong> 。</p><h1 id="2-构造函数"><a href="#2-构造函数" class="headerlink" title="2.构造函数"></a>2.构造函数</h1><h2 id="inline函数"><a href="#inline函数" class="headerlink" title="inline函数"></a>inline函数</h2><p><img src="https://img.tjzzz.com/img/20211229111436.png" alt="" loading="lazy"></p><p>inline拥有很大的优势，速度很快！但是是否inline由编译器决定！</p><p>不在本体内定义就可以加inline</p><h2 id="访问级别"><a href="#访问级别" class="headerlink" title="访问级别"></a>访问级别</h2><p><img src="https://img.tjzzz.com/img/20211229111438.png" alt="" loading="lazy"></p><p>public可以被外界看到，private就要封装起来！</p><p>不必非得集中为2段。</p><p>下面的两个就是调用函数。</p><p>重要数据要放在private！</p><h2 id="构造函数是什么？"><a href="#构造函数是什么？" class="headerlink" title="构造函数是什么？"></a>构造函数是什么？</h2><p><img src="https://img.tjzzz.com/img/20211229111440.png" alt="" loading="lazy"></p><p>构造函数写法很独特，函数名要和class名一样，然后括号里传入参数(默认实参)。</p><p>并且构造函数不需要有返回值，因为构造函数就是用来创建对象的。</p><p>有些人可能在大括号里赋值，但是要培养大气的写法：</p><pre class=" language-C++"><code class="language-C++">complex (double r = 0, double i = 0): re (r), im (i) </code></pre><p>这种写法只能在构造函数里写，原理和re=r一样，但是为什么要在这里做？</p><p>简单来说一个变量数值的设定有初始化和赋值，第一阶段是: re (r), im (i)，初始化就会效率高一些。</p><p>传进来的实参要赋值给别人，不然的话传进来的实参就会消失在构造函数里面！</p><h1 id="3-参数传递与返回值"><a href="#3-参数传递与返回值" class="headerlink" title="3.参数传递与返回值"></a>3.参数传递与返回值</h1><h2 id="构造函数可以有很多个-重载"><a href="#构造函数可以有很多个-重载" class="headerlink" title="构造函数可以有很多个-重载"></a>构造函数可以有很多个-重载</h2><p><img src="https://img.tjzzz.com/img/20211229111442.png" alt="" loading="lazy"></p><p>比如说设计一个类，有很多种想法，所以就可以重载。</p><p>为什么可以重载？</p><p>编译器会把函数编译成如右下角的东西，所以名称并不相同。</p><p>如果函数有默认函数，则和无参数同名参数重复了，如上1和上2，complex()不知道调用哪个。</p><h2 id="把构造函数放在private区"><a href="#把构造函数放在private区" class="headerlink" title="把构造函数放在private区"></a>把构造函数放在private区</h2><pre class=" language-C++"><code class="language-C++">class complex{public:complex& operator += (const complex&);double real () const { return re; }double imag () const { return im; }private:double re, im;complex (double r = 0, double i = 0): re (r), im (i) { }friend complex& __doapl (complex*, const complex&); };</code></pre><p>如上所示如果把构造函数放在private就不可以进行如下操作了：</p><pre class=" language-C++"><code class="language-C++">{complex c1(2,1);complex c2;...}</code></pre><p>什么情况可以放在private里？</p><p>在经典<strong>设计模式</strong> singleton中，把构造函数放在了private里：</p><pre class=" language-C++"><code class="language-C++">class A {public:static A& getInstance();setup() { ... }private:A();A(const A& rhs);...};A& A::getInstance(){static A a;return a;}</code></pre><p>外界可以通过<code>A::getInstance().setup();</code>来进行调用其中的getinstance函数。</p><h2 id="常量成员函数"><a href="#常量成员函数" class="headerlink" title="常量成员函数"></a>常量成员函数</h2><p>即再函数的后面加const：</p><pre class=" language-C++"><code class="language-C++">class complex{public:complex (double r = 0, double i = 0): re (r), im (i) { }complex& operator += (const complex&);double real () const { return re; } //在这里double imag () const { return im; }private:double re, im;friend complex& __doapl (complex*, const complex&); };</code></pre><p>real和imag不改变数据，则马上加上const。</p><p>如果不加的话，使用者如下这么使用的话：</p><pre class=" language-C++"><code class="language-C++">{const complex c1(2,1);cout << c1.real();cout << c1.imag();}</code></pre><p>使用者：不改data，函数：可以改data</p><p>这样的话使用者就会被禁止使用const，使得使用者很生气(？</p><h2 id="参数传递-by-value-or-by-reference"><a href="#参数传递-by-value-or-by-reference" class="headerlink" title="参数传递 by value or by reference"></a>参数传递 by value or by reference</h2><p>整包传过去，把整个值挪过去！</p><p>所以尽量reference。</p><p>之前c可以传指针，现在可以用引用！</p><p>如果传过去不希望对方改，加const。</p><h2 id="返回值传递：by-value-or-by-reference"><a href="#返回值传递：by-value-or-by-reference" class="headerlink" title="返回值传递：by value or by reference"></a>返回值传递：by value or by reference</h2><p>返回值也尽量传reference</p><p>什么时候不可以返回reference？</p><p><img src="https://img.tjzzz.com/img/20211229111447.png" alt="image-20211221203616723" loading="lazy"></p><p>两种情况，ths加上了传进来的r，ths这个空间本来就在的，如果说在函数里构造了变量，返回了reference，等执行完毕这个引用就被销毁了，白玩！</p><h2 id="友元"><a href="#友元" class="headerlink" title="友元"></a>友元</h2><p><img src="https://img.tjzzz.com/img/20211229111449.png" alt="image-20211221202913512" loading="lazy"></p><p>声明一个朋友，这个朋友可以自由取得friend的private成员！</p><blockquote><p>相同的class的各个objects互为friends(友元)</p></blockquote><h1 id="4-操作符重载与临时对象"><a href="#4-操作符重载与临时对象" class="headerlink" title="4.操作符重载与临时对象"></a>4.操作符重载与临时对象</h1><h2 id="操作符重载-1，成员函数this"><a href="#操作符重载-1，成员函数this" class="headerlink" title="操作符重载-1，成员函数this"></a>操作符重载-1，成员函数this</h2><p><img src="https://img.tjzzz.com/img/20211229111451.png" alt="" loading="lazy"></p><p>c2+=c1的理解，+=作用于c2</p><p>所有的成员函数一定带一个隐藏的参数this，谁调用函数谁就是this，此时this为c2的指针，不能在参数列写出来，但是在函数里可以用！</p><h2 id="return-by-reference-语法分析"><a href="#return-by-reference-语法分析" class="headerlink" title="return by reference 语法分析"></a>return by reference 语法分析</h2><p><img src="https://img.tjzzz.com/img/20211229111454.png" alt="" loading="lazy"></p><p>传进来的左操作数是一个指针，返回一个object，可是返回的声明是complex&amp;，是无所谓的，传递者无需知道接收者是以reference形式接收。</p><p>如果使用者这么用：c2+=c1，inline void是可以的，但是如果使用c3+=c2+=c1,就不可以返回void了。</p><h2 id="class-body之外的各种定义"><a href="#class-body之外的各种定义" class="headerlink" title="class body之外的各种定义"></a>class body之外的各种定义</h2><p><img src="https://img.tjzzz.com/img/20211229111456.png" alt="" loading="lazy"></p><h2 id="操作符重载-2，非成员函数"><a href="#操作符重载-2，非成员函数" class="headerlink" title="操作符重载-2，非成员函数"></a>操作符重载-2，非成员函数</h2><p><img src="https://img.tjzzz.com/img/20211229111458.png" alt="" loading="lazy"></p><h2 id="temp-object-临时对象-typename"><a href="#temp-object-临时对象-typename" class="headerlink" title="temp object(临时对象) typename()"></a>temp object(临时对象) typename()</h2><p>上图绝不可return by reference。因为他们的返回必定是个local object！</p><p>typename生命很短，无需命名。</p><h2 id="各种操作符重载，非成员函数"><a href="#各种操作符重载，非成员函数" class="headerlink" title="各种操作符重载，非成员函数"></a>各种操作符重载，非成员函数</h2><p><img src="https://img.tjzzz.com/img/20211229111500.png" alt="" loading="lazy"></p><p><img src="https://img.tjzzz.com/img/20211229111502.png" alt="" loading="lazy"></p><p>查手册发现cout为ostream参数，每一次输出都在改变，所以ostream不能加const。</p><p>因为可能涉及&lt;&lt;xx&lt;&lt;xx这么输出，所以返回类型应该设置为ostream</p><h1 id="复习"><a href="#复习" class="headerlink" title="复习"></a>复习</h1><pre class=" language-C++"><code class="language-C++">#ifndef _COMPLEX_#define _COMPLEX_class complex;class complex& __doapl(complex*, const complex&);class complex{public:  complex(double r = 0, double i = 0)    :re(r), im(i) //只需要经过一步编译就可返回，很好用！  {};  complex& operator += (const complex&);  double real() const { return re; }  double imag() const { return im; }private:  double re, im;  friend complex& __doapl(complex*, const complex&);};inline complex&__doapl(complex* ths, const complex& r){  ths->re += r.re;  ths->im += r.im;  return *ths;}//because right could be change and can abundant, so add const inline complex& complex::operator += (const complex& r) {  return __doapl(this, r);} //only write right inline doubleimag(const complex& x){  return x.imag();}inline doublereal(const complex& x){  return x.real();}inline complexoperator + (const complex& x, const complex& y){  return complex (real (x) + real (y), imag (x) + imag (y));}//why not design  member function,because complex + true numberinline complexoperator + (const complex& x, double  y){  return complex(real(x) + y, imag(x));}//why not design  member function,because complex + true numberinline complexoperator + (double x, const complex& y){  return complex(x + real(y), imag(y));}//why not design  member function,because complex + true number#include <iostream>std::ostream& //back add ostreamoperator << (std::ostream& os, const complex& x) //cout will change{  return os << '(' << real(x)  << ',' << imag(x) << ')';}#endif</code></pre><p>注意事项与整理：</p><ul><li>设计一个class构造函数：re(r)要用起来</li><li>函数加不加const一定要考虑</li><li>参数传递一定要考虑&amp;</li><li>return要不要&amp;</li><li>数据尽可能的放在private，函数放在public</li></ul><hr><p><img src="https://img.tjzzz.com/img/waixuan.png" alt="" loading="lazy"></p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;link rel=&quot;stylesheet&quot; class=&quot;aplayer-secondary-style-marker&quot; href=&quot;\assets\css\APlayer.min.css&quot;&gt;&lt;script src=&quot;\assets\js\APlayer.min.js&quot; cla
      
    
    </summary>
    
    
      <category term="学习历程" scheme="https://www.tjzzz.com/categories/LearningExperience/"/>
    
    
      <category term="cpp" scheme="https://www.tjzzz.com/tags/cpp/"/>
    
  </entry>
  
  <entry>
    <title>03《穷查理宝典》 查理·芒格丨读书笔记</title>
    <link href="https://www.tjzzz.com/posts/5a8a6c8d.html"/>
    <id>https://www.tjzzz.com/posts/5a8a6c8d.html</id>
    <published>2021-07-07T01:07:48.000Z</published>
    <updated>2021-07-07T01:13:24.022Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="\assets\css\APlayer.min.css"><script src="\assets\js\APlayer.min.js" class="aplayer-secondary-script-marker"></script><blockquote><p>你必须把经验悬挂在头脑中的一个由许多思维模型组成的框架上。<br>——查理·芒格</p></blockquote><h1 id="0-随笔"><a href="#0-随笔" class="headerlink" title="0 随笔"></a>0 随笔</h1><p>作为一本世界级的名书，说实话当我看到这个名字以及副标题“查理·芒格的智慧箴言录”的时候我真的认为它是一本满满当当的充满着心里鸡汤的书，要知道世界级的心灵鸡汤并不少。<br>可是当我继续了解了其中的内容的时候，我就被查理芒格其个人品质与对待投资的观念所打动，这本书不仅仅讲的是投资，更多的是对待人生的态度。<br>整本书包含的是他过去20年来的11场演讲以及发表过的各种文章，从中提炼一下就能分析出查理他整本书都在强调的三个部分。<br>在解读这三个部分的时候我们先来了解一下：<br>谁是查理·芒格？</p><blockquote><p>查理·芒格（Charlie Thomas Munger，1924年1月1日—）美国投资家，<a href="https://baike.baidu.com/item/%E6%B2%83%E4%BC%A6%C2%B7%E5%B7%B4%E8%8F%B2%E7%89%B9/472378" target="_blank" rel="noopener external nofollow noreferrer">沃伦·巴菲特</a>的黄金搭档，<a href="https://baike.baidu.com/item/%E4%BC%AF%E5%85%8B%E5%B8%8C%E5%B0%94%C2%B7%E5%93%88%E6%92%92%E9%9F%A6%E5%85%AC%E5%8F%B8/661768" target="_blank" rel="noopener external nofollow noreferrer">伯克希尔·哈撒韦公司</a>的副主席。<br>查理·芒格（Charlie Thomas Munger），出生于美国<a href="https://baike.baidu.com/item/%E5%86%85%E5%B8%83%E6%8B%89%E6%96%AF%E5%8A%A0%E5%B7%9E/2217761" target="_blank" rel="noopener external nofollow noreferrer">内布拉斯加州</a>的奥马哈。这位至今（2021年）已经97岁高寿的老人，在过去的46年里，他和巴菲特联手创造了有史以来最优秀的投资纪录——伯克希尔公司<a href="https://baike.baidu.com/item/%E8%82%A1%E7%A5%A8%E8%B4%A6%E9%9D%A2%E4%BB%B7%E5%80%BC/7143173" target="_blank" rel="noopener external nofollow noreferrer">股票账面价值</a>以年均20.3%的复合<a href="https://baike.baidu.com/item/%E6%94%B6%E7%9B%8A%E7%8E%87/4533890" target="_blank" rel="noopener external nofollow noreferrer">收益率</a>创造投资神话，每股股票价格从19美元升至84487美元。<br>——百度百科</p></blockquote><p>和芒格接触过的人，都会称赞他的思想以及他的那套方法论的作用与价值，其中就包括查理芒格最为人称道的“多元思维模型”。</p><h1 id="1-多元思维模型"><a href="#1-多元思维模型" class="headerlink" title="1 多元思维模型"></a>1 多元思维模型</h1><p>查理芒格的“多元思维模型”是每个了解这本书的人都会不约而同提到的一个模型，芒格提倡要集百家之所长，集合众多的知识概念去建立一个复式框架。芒格觉得，<strong>最重要的是要记住一系列原理，包括复利、排列组合、决策树、心理学等等一百多种模型，它们加在一起往往能带来很大的力量。</strong>这是很多力量共同作用于同一个方向，而得到的效果通常大于这些力量之和。<br>之所以构建这样一套体系，是因为<strong>芒格觉得如果对一件事不多元化的看待，那么你处理起来也是单一的偏执的。</strong>世界是一个复杂的整体，不像是学院时期1+1就是等于2，每道题都有标答。如果用单一的思维去看待身边的事物，那么就可能扭曲现实，直到其符合预期。<br>国外有一句谚语“<strong>当你拿起锤子的时候，你会觉得满世界都是钉子。</strong>”而中国也有<strong>乞丐许愿金碗去乞讨</strong>的笑话。这一定程度证明了思维的单一性。<br>其实“多元思维”不是方法论或者说不仅仅是方法论，从本质上来讲，其是一种认识世界的基本<strong>态度</strong>。<br>越是成熟的人就不会对一件事下定义去主张自己的观点，而是从不同的观点去解释为什么会发生；什么是擅作主张呢？就是去评价一个人是对是错、谁是好人谁是坏人……等一系列问题。成熟的人往往会去解释，面对一件事有没有不同的解释，能不能换一个角度看？<br>有人会认为这样做是“只空谈不实践”，其实恰恰相反，当我们关心别人的实践对其做出评价的时候，我们只是在干涉别人，对被人下定义而对我们自己毫无好处，仅仅是拿着自己过去受过的教育去<strong>乱砍一通</strong>，而不是去成长；当我们真正做到能够多方面多角度的分析对方究竟为何这么做时，我们才会将这种认知应用于自己的实践中。<br>还应该注意到，在主观世界里，我们受到的教育往往是一大堆原则，而客观世界里则只有“<strong>刚刚好</strong>”这么一说。<br>什么是刚刚好呢，在实践中，写字、绘画乃至创业来说，如果一味着遵循原则办事，往往就会成为一个死板的人没有长进的人；如同开车，在某一时某一刻是向左好还是向右好？都不对，开车讲究的是“刚刚好”，这就是客观世界的实践，客观的世界一切活动都是在“向左向右”的两个互相矛盾的原则中找到那个“刚刚好”的<strong>平衡点</strong>。<br>每一个受过教育的人都已经在主观世界里形成了一套规范的“原则手册”，而在社会中要做到的就是把客观世界发生的事与主观世界的认知原则找到平衡；比如说诚实，这是主观世界的金科铁律，可是在现实中我们有时候不得不去撒谎去隐瞒，好像这也没有什么道德瑕疵；比如说在法律实践中追求正义也会计算成本；认真努力的人在客观世界可能也会一事无成；“<strong>听了那么多道理，也过不好这一生。</strong>”讲的就是这个现象。<br>原则和“刚刚好”之间有一条很深的鸿沟，每时每刻我们都可能会跌落下去。当你弥合了这条沟，把客观世界的东西放到我们主观世界里揉碎并融入我们自身，那这便是<strong>成长。</strong>所以成长的越快，岁数越大，就越会包容很多事情。而查理芒格在书中不断强调的“多元思维模型”就是这一鸿沟的粘合剂。<br>作为一个局外人，挥舞着自己知道的原则去指导深陷泥潭里的人，讲他们的是非对错简直太容易了，但是对自己的成长没有任何好处。反而当自己陷入同样境地的人，自己掌握的那些原则完全就用不了了；如同现在很多人是<strong>别人世界里的“情圣”，自己世界里的“呆子”</strong>；<br>我们应该保持一个包容的、多元的视角，让更多的观念在自己的世界里共处，这样才会成长的更快。</p><h1 id="2-反向思维"><a href="#2-反向思维" class="headerlink" title="2 反向思维"></a>2 反向思维</h1><p>日常生活中，我们还需要构建自己的知识体系，查理芒格引入了另一个思维模型“反向思维”。<br>查理芒格有这样一个方法，在思考要去哪之前，要先想清楚不去哪。他把这叫做反向思维，很多人在做数学题或者考试的时候就能熟练的运用着类方法去排除错误选项，但在现实生活中很多人并没有这个意识运用这个方法。<br><strong>查理芒格非常推崇反向思维，他认为，对于复杂的系统和人类的大脑来说，采用反向思考，往往会使问题变得更容易解决。</strong><br>同样的，我们要建立好自己的知识体系，最好先想清楚坏的知识体系是什么然后避免它。<br>书中提到，坏的知识体系主要有三个特征，分别是<strong>缺乏纵深</strong>，<strong>单一化</strong>和<strong>松散无联系</strong>。<br>第一个缺乏纵深，比较好理解，一个人什么都知道，一细问又什么都不知道，这样的人就是知识面缺乏纵深的人。这样获取的知识很难打通之间的联系，这样在社会中竞争就会很弱。<br>第二个单一化，单一化的知识体系会造成狭隘的视野，比如一个公司研发部的人觉得是产品质量好才卖得好，而销售部的人会觉得是他们的口才好才卖得好，其实两方的视野都过于狭隘。于是有的公司会推行轮流换岗制度，每干一段时间就换一个不同的部门，这样下来员工们都互相理解对方，也成就了一个团结的员工体系。<br>第三个就是松散无联系，在生活中我们经常收集各种我们认为有用的知识，长此以往个人的知识库堆积如山，可是面对如山的知识，我们往往都会头痛，因为没有一个完整的体系去联系它们，它们只是一个个松散的点，就如同堆积在沙发上如山一般的衣服。不仅增加了你的知识负荷，也让你无从下手去面对它们。<br>以上就是差的知识体系了，知道了差的知识体系，我们就来了解一下好的知识体系，一个好的知识体系要符合一个特质：宏观上看像是一个T,微观上又像是一个Y。<br>为什么像T呢，其实就是一个好的知识体系，要在一方面深入扎根精通，并且能够有联系的广泛拓展知识面。<br>查理芒格在投资中就做到了这一点。查理芒格在投资一家公司时，不只是去看这个公司的财报，而是深入迁出的了解这个公司的整个生态系统。在这个过程中包括了历史学、心理学、数学、工程学、物理学、统计学、经济学等等。为什么需要这么多的学科呢？芒格回答：因为几乎每个系统都受多种因素的影响，所以要理解这样的系统必须熟练地掌握多元思维，这也就是所谓的T型架构。<br>接下来再说说为什么像Y？<br>比如说，你是一名厨师，也许你拥有精湛的厨艺，可以将菜做的色香味俱全，而Y型架构就是说，你不能用单一的一种知识，还要将其他领域的知识结合起来，比如你想做一道名菜，如果你美术知识精湛，你可以将菜雕的以假乱真，那么你的手艺绝对会更上一层楼。</p><h1 id="3-投资心法"><a href="#3-投资心法" class="headerlink" title="3 投资心法"></a>3 投资心法</h1><p>说了这么多做人做事，该聊聊怎样投资了，这一部分主要讲的就是芒格的投资心法。<br>在查理·芒格看来，投资可以分为三种，一种为可以投资，一种为不可以投资，一种为太难理解。而查理芒格只投自己认为可以投资的项目，其从不了解制药和高科技行业，所以他的投资也从不涉及。<br>那么怎么评判一个项目可否投资呢？<br>芒格有四个标准：<br>第一个标准，项目要好理解，有发展空间并且容易生存。<br>第二个标准，不能只看财务报表，财务报表只说明了公司现在的业绩，完全代表不了以后的价值，要多方面的考虑。<br>第三个标准，要看一家公司“护城河”够不够宽，什么是护城河？就是行业壁垒，如果一个行业门槛特低，那势必会引来很多竞争对手，那谁能笑到最后就不好说了。<br>第四个标准，就是投资股价公道的大企业，要比投资股价低的普通企业号，因为未来其他股东可能注资或者转让股权引起股权稀释，股利下降，大企业价值更高。<br><strong>查理芒格认为，所有聪明的投资都是价值投资。你必须先评估一个企业的价值，再评估股票的价值，还要根据公司的竞争优势，来判断是不是应该持有这家公司的股票。</strong><br>“想要得到某样东西最好的办法，就是让自己配得上它。”这是查理芒格的一句名言，单单看来这只是一句鸡汤，而关于鸡汤有一个定义：你端上来一碗热气腾腾的鸡汤，可是却没有勺子。言下之意就是<strong>道理是好道理，但是没给实现的方法。</strong><br>可是芒格的理论，真的是鸡汤吗？其实不是，比如这句话配合上他的投资心法，其实是一回事，我们可以认为这句话是心法，而上面的四个标准就是招式。能不能看到这两者的共通之处，就看个人的功力了。<br>​</p><p><strong>​</strong></p><hr><p><img src="https://img.tjzzz.com/img/waixuan.png" alt="" loading="lazy"></p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;link rel=&quot;stylesheet&quot; class=&quot;aplayer-secondary-style-marker&quot; href=&quot;\assets\css\APlayer.min.css&quot;&gt;&lt;script src=&quot;\assets\js\APlayer.min.js&quot; cla
      
    
    </summary>
    
    
      <category term="读书笔记" scheme="https://www.tjzzz.com/categories/readingNote/"/>
    
    
      <category term="提高财商" scheme="https://www.tjzzz.com/tags/improveFinancialQuotient/"/>
    
  </entry>
  
  <entry>
    <title>02《穷爸爸富爸爸》 罗伯特·清崎丨读书笔记</title>
    <link href="https://www.tjzzz.com/posts/3e43195a.html"/>
    <id>https://www.tjzzz.com/posts/3e43195a.html</id>
    <published>2021-07-01T00:16:09.000Z</published>
    <updated>2021-07-01T01:02:39.465Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="\assets\css\APlayer.min.css"><script src="\assets\js\APlayer.min.js" class="aplayer-secondary-script-marker"></script><h1 id="0-随想"><a href="#0-随想" class="headerlink" title="0.随想"></a>0.随想</h1><p>其实关于理财的书这并不是我阅读的第一本，我的第一本书是<strong>小狗钱钱</strong>，与这本书相比较，小狗钱钱更多的是教导一个人如何去理财，用什么方式去理财。我通过小狗钱钱这本书，了解了人生中的三笔钱，了解了如何去规划资产，攒下了不少的钱。不过人的提升欲望总是无穷的，于是我又通过聆听，浅尝了理财观念培养的一大神书-*<em>穷爸爸富爸爸</em>。</p><p>其实我发现，这类神书统一都有一些特点比如简单、善于理解、循循善诱以及通篇举例。小狗钱钱通过一个小女孩攒钱的故事教导人们，而穷爸爸富爸爸则是以作者的切身经历来说明一些问题。</p><p>什么是穷爸爸富爸爸？初看标题的时候，我以为是亲子书籍就没多感冒。</p><p>其实他讲的是作者的高学历的父亲与从小玩到大的好朋友的商人父亲的对比，通过对比我发现其实身边的穷爸爸类性格的人占了绝大多数。</p><p>下面我们来了解一下什么是穷爸爸什么又是富爸爸。</p><h1 id="1-价值观对比"><a href="#1-价值观对比" class="headerlink" title="1.价值观对比"></a>1.价值观对比</h1><blockquote><p>罗伯特的亲生父亲总是说：“贪婪是万恶之源，人就应该懂得节制，不要浑身都是铜臭味。”，而另一个企业家爸爸总是说：“贫穷才是万恶之源，贫穷会放大人向恶的一面。”</p><p>亲生父亲遇到想买的东西总会说：“这个我可买不起，以后可别提了。”而另一个企业家父亲却不准这么想，他会让罗伯特去思考：“如果想要买这个东西，要用什么方式赚钱才买得起。”</p></blockquote><p><strong>亲生父亲一句话就逃避了这个问题，一辈子都在为攒钱努力；而企业家父亲却在积极面对问题，一生都在为提升生活品质获得幸福而努力，两种思想带来的结局相比也是轻而易举就能料到的。</strong></p><blockquote><p>亲生父亲对于交税问题总是抱怨不止，认为政府太黑心部分工资都拿去交税；而企业家父亲却觉得交税是应该的，不交税怎么创造一个公平公正的市场环境。</p><p>亲生父亲总是劝罗伯特让他好好学习，以后出人头地找到好工作来养活自己；而企业家父亲却教导罗伯特要好好学习，以后就可以自己开公司，创造更多的就业机会。</p></blockquote><p><strong>两位父亲给孩子设立的目标虽然过程一样，可带来的影响却是不一样的，一个是不好好学习就不会有好工作，一个是好好学就会帮到更多的人。</strong></p><blockquote><p>亲生父亲在饭桌上一律禁止谈钱，而企业家父亲能聊到没完。</p><p>亲生父亲在花一笔钱的时候会小心翼翼如同割肉，而企业家爸爸告诉罗伯特，只要投资在风险控制之内，就大胆去花。</p></blockquote><p><strong>这里可能会有人持着反对意见，不过先按下不表。</strong></p><blockquote><p>亲生父亲总会把欠款拖到最后才偿还，而企业家父亲总要提前偿还，绝不会出现逾期，因为逾期的罚金就是对他理财能力最大的侮辱。</p><p>亲生父亲总是把希望寄托在政府身上，把自己的老年退休金全面押在了政府上，平时最关心的就是加薪、退休政策、医疗补贴、病假和津贴这些琐事；而企业家父亲就不吃这套，他觉得一个人有了依靠，就不知不觉变得软弱，变得有依赖性，变得不思进取，他认为<strong>持续的学习才是最好的保障**</strong>。**</p><p>亲生父亲整天教别人如何写一个印象深刻的简历，而企业家父亲每天都教他写自己的商业计划书和财务计划表。</p><p>两位父亲都经历过破产，亲生父亲会说“你看，我永远不会成为富人了。”而企业家父亲会说“破产嘛，就是暂时的，我有丰富的理财知识，我依然是个富人。”</p></blockquote><p>看到这里，读者似乎对于两位父亲的价值观已经有了很明晰的认识了，亲生父亲对于钱处于一种看不上又很需要的状态，看不上、不关心或者说看不起，到最后自然就得不到；而企业家父亲对待金钱始终处于一种关心，想要然后设立目标去达到的态度，长此以往，何愁不富甲天下？</p><p>似乎有很多人在身边都是如这位亲生父亲般的心态，拥有着杰出的学习能力，比别人高得多的学历，可正是因为如此他们自命清高，<strong>傲娇</strong>阻止了他们去发展；反而是学历不高，早早在社会中摸爬滚打的人，对于钱才有一种执着，不是为了挣钱去挣钱，而是为了让自己过得更好去挣钱；取之有道的财，何故鄙夷？</p><p>很多人在自己的领域深耕，世界上99.99%的人都没有其在这个领域认知的多，可是却不懂得推销自己，也不懂得赚钱，用互联网的话来说就是：<strong>只懂得做产品</strong>。</p><p>不管学历高与不高，财商在中国似乎并不是太过学校重视，人人都持有一种管理金钱似乎是金融系才去做的事这种心态。越早建立理财的意识，才会越早的实现财务自由。</p><h1 id="2-如何提高财商"><a href="#2-如何提高财商" class="headerlink" title="2.如何提高财商"></a>2.如何提高财商</h1><p>这本书似乎对于如何提高财商并不像&lt;小狗钱钱&gt;那般细列出一项项的具体措施，而是给了两个方针。</p><p><strong>第一条：富人是不会为了钱去工作的</strong></p><p>富人不会为了一点点的钱去出卖自己的时间与劳动力，富人只把精力放在自己的事业上。</p><blockquote><p>穷人刚毕业找到了工作，工资仅仅够支付房租和日常开销，随着努力升职加薪，但是生活中更多的开销扑面而来，只能更努力地工作，如此循环往复，哪怕年入百万，依旧是债台高筑。像一只老鼠在木头笼子里奔跑，老鼠跑的越快，笼子转的越快，其实只不过是原地打转。</p></blockquote><p>那要怎么摆脱这样的困境呢？</p><p>我认为应该<strong>直面自己的恐惧和欲望</strong>，很多人创造的价值都远远地高于自己所赚的工资，选择工作不能选择那些对自己毫无帮助的职业，如大学中很多人去<strong>兼职，家教、发传单或者去当售货员</strong>等，如是家境困难补贴学费无可厚非，可很多人只是抱着去所谓的“<strong>锻炼自己</strong>”的目的去工作，而获得的只不过是时薪10元20元的廉价劳动输出报酬而已。</p><p>在大学中自有许多人可以选择自己想要的生活方式，哪怕对自己的未来毫无帮助也是一种尝试；而在工作中就应该为了自己的未来负责，选择更能提升自己的工作。</p><p><strong>第二条：学会区分资产和负债的区别</strong></p><p>其实大多数人分不清何为<strong>资产</strong>又何为<strong>负债</strong>，在很多人看来买房和买车是同样的对于生活的花销，其实不然。买车数年要花费大量的金钱去保养与维修，用了几年后会面临淘汰和报废等状况，<strong>买车就是负债</strong>，它不会升值，不会使你赚到更多钱，它更多时间是在你有了钱生钱的能力时满足自己内心需求的一件物品。</p><p>也就是说，你要用资产赚来的钱去购买负债，而不是要用原本来购买资产的钱去购买负债；</p><p>而<strong>买房、股票</strong>或者<strong>基金</strong>等一系列投资就是资产，他可以帮助你的财富实现正增长。富人会把每一分钱当做自己的士卒，去攻城略地赢得每一分钱，穷人会克制不住自己的欲望“月光”有多少花多少，这就是根本区别。</p><p>所以说，区分资产和负债，克制自己的消费冲动，先把自己的钱堆积到可以钱生钱来，这才算正确的理财方法。</p><h1 id="3-总结"><a href="#3-总结" class="headerlink" title="3.总结"></a>3.总结</h1><p>以上就是本书最核心的两个部分，提炼再提炼即本书的精华所在，如果你一直不关心自己的财务情况，只一心赚钱而不管好后院，终其一生，留下的只能是银行账单和微薄的养老金。</p><hr><p><img src="https://img.tjzzz.com/img/waixuan.png" alt="" loading="lazy"></p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;link rel=&quot;stylesheet&quot; class=&quot;aplayer-secondary-style-marker&quot; href=&quot;\assets\css\APlayer.min.css&quot;&gt;&lt;script src=&quot;\assets\js\APlayer.min.js&quot; cla
      
    
    </summary>
    
    
      <category term="读书笔记" scheme="https://www.tjzzz.com/categories/readingNote/"/>
    
    
      <category term="提高财商" scheme="https://www.tjzzz.com/tags/improveFinancialQuotient/"/>
    
  </entry>
  
  <entry>
    <title>01《影响力》罗伯特・西奥迪尼丨读书笔记</title>
    <link href="https://www.tjzzz.com/posts/259c803.html"/>
    <id>https://www.tjzzz.com/posts/259c803.html</id>
    <published>2021-06-30T23:30:40.000Z</published>
    <updated>2021-07-01T00:33:52.552Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="\assets\css\APlayer.min.css"><script src="\assets\js\APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>说明：本笔记选于PDF全名：20210623影响力第五版教材版-美-罗伯特·西奥迪尼.pdf</p><blockquote><p>注：本笔记所有的时间戳均为本人所采用的万能双向连接，对于我而言，它实现了笔记和PDF之间的无缝跳转，但他并不影响你对于这篇文章的理解或者感受我对这本书的喜爱之情。</p></blockquote><blockquote><p>简介：自 1986 年出版以来，作为获得美国心理协会、美国心理学基金会年度大奖提名的西奥迪尼经典著作，本书已经成为史上最强大、最震摄人心、最诡谲的心理学畅销书。</p><p>24 年来，被翻译成 26 种文字广为传播，全球销量超过 300 万册。时至今日，本书仍位列亚马逊总排行榜 Top400 之中，并雄踞消费者行为学和应用心理学类畅销书榜首。</p><p>也正是在这个畅销版本的基础上，西奥迪尼才衍生出后来为斯坦福大学等多所名校所采用的教材版本。</p></blockquote><h1 id="非正文"><a href="#非正文" class="headerlink" title="非正文"></a>非正文</h1><p>这本书的作者一改常态，直接在开篇提出了影响力的六种特质：<strong>互惠、承诺和一致、权威、社会认同、喜好、稀缺</strong>，不过似乎各个国家对于影响力有着不同的认知，中国似乎更偏向于权威，至少中国香港是这样的</p><p>书签： 20210623193940</p><p>有时候换一个角度就能得到事物最本质的特征，就如同作者一样，他不像普通的工具书一样单独的去输出乏味的知识或者外行人教导外行人的不靠谱，作者亲自去参与这个世界上靠着情商活下去的组织，去汲取营养。这也就是<strong>参与式观察(participant observation)</strong></p><h1 id="第一章-影响力的武器-武装自己"><a href="#第一章-影响力的武器-武装自己" class="headerlink" title="第一章 影响力的武器 [武装自己]"></a>第一章 影响力的武器 [武装自己]</h1><p>与经典版不同的是，在题首导读给出了一个个案例供人分析，我还没有看到正文，我就能从上总结的六种特质中分析出这个案例是怎么回事了。</p><blockquote><p>第二次世界大战期间，小托马斯·沃森受命调查有高级将领遇难或受伤的飞机事故。有一起事故牵涉到著名的空军将领鸟扎尔・思特( Uzal Ent)。起飞之前，他的副驾驶员生病了。新分来的副驾驶员听说能和传奇将领一起飞行，感到很光荣。起飞时，思特轻声哼着歌，并随着脑海里的节奏点头打拍子。新的副驾驶员以为这是恩特要他把飞机的助跑轮收起来。尽管那时候他们的速度还非常缓慢，根本没法飞上天，副驾驶员还是把助跑轮给抬了起来。结果，飞机的腹部立刻贴在了地上。混乱中，螺旋桨叶片切入了恩特的背部，割断了他的脊椎，导致他下半身。接照沃森的描述，副驾驶员是这样解释自己的行动的副驾驶员作证的时候，</p><p>我问他：“既然你知道飞机不能起飞，为什么还要把助跑轮升起来？”</p><p>他说：“我以为是将军要我这么做的啊。”他真是个蠢货。“ 蠢吗？在这一起事件中，的确是够蠢的。但能不能理解呢？ 现代生活的迷宫需要捷径，从这个角度看，它也完全可以理解。</p></blockquote><p>书签：20210623195240</p><p>在这个案例中，小兵似乎完全听信了将军，因为将军是一个<strong>传奇飞行员</strong>，所以小兵因为将军的<strong>权威</strong>听信了将军。</p><p>随后，作者列出了绿宝石翻倍卖反而比原价卖的更火的例子，作者似乎想要通过这个例子来表达稀缺，权威对于买卖的重要性。</p><p>-书签：20210623195826</p><p>往后面的阅读中，似乎并不是我理解的那样，作者举例了雌火鸡的例子说明了一个道理，动物在自然环境中会因为某些特定的原因触发自身的“磁带”，也就是所谓的<strong>固定模式</strong>.</p><p>比如：雄性知更鸟只要看到一丛红色的知更鸟胸羽，就会做出有敌人侵犯自己领地的样子，凶猛地攻击它。可只要你取掉那从红色的羽毛，哪怕是摆上一只惟妙惟肖的雄知更鸟玩具，前者也对它不理不睬。研究人员在蓝喉鸟身上也观察到了类似的结果，只不过，触发它捍卫领地行为的是一种特殊的蓝色胸羽。</p><p>-书签：20210623201343</p><h2 id="1-1-按一下就播放"><a href="#1-1-按一下就播放" class="headerlink" title="1.1 按一下就播放"></a>1.1 按一下就播放</h2><p>而人类也难以逃脱这种规律，根据社会心理学家艾伦的实验证明：<strong>我们在需要别人帮忙的时候，要是能给出一个理由，成功的概率会更大。</strong> 因为人就是单纯的喜欢要一个理由，哪怕不合理不成立。</p><p>据另一项研究显示，人类的行为并不是固定的磁带行为，但是有时候没啥两样。就如作者举的例子那个绿宝石，人类一看到贵的东西自动的就等价了好的东西。</p><p>所谓<strong>好货不便宜，便宜没好货</strong>等俗语阐述了人类社会的普遍心理活动。</p><blockquote><p>真正想买好东西的人对价格低的东西是看不上眼的。</p></blockquote><p>书签：20210623204126</p><p>自此，第一章第一小节就结束了。</p><p>总结一下：</p><ul><li>在需要帮助的时候提出一个理由。</li><li>只要在大众普遍认为正确的或者理应发生的事情上做文章就有很大几率成功。</li></ul><h2 id="1-2-把赌注压在抄捷径上"><a href="#1-2-把赌注压在抄捷径上" class="headerlink" title="1.2 把赌注压在抄捷径上"></a>1.2 把赌注压在抄捷径上</h2><p>因为人们疲于学习更多的知识，对于未知商品的判断大多取决于对价格的判断(如有专业的知识就可以大概的估算出价值次次的赌注，上文的绿宝石既是此道理。</p><p>世界上的事务千千万，我们需要一条捷径来了解世界，而总结出一条条简约的范式才能有足够的把握面对这个复杂的世界。</p><p>我们容忍这个简约的范式出错，它可以是不完美的，但是它是必不可缺少的。在生活中使用这些捷径也有一个专属名词<strong>启发式判断(judgmental heuristics)</strong>。</p><p>在这本书的第六章，会出现一个捷径直接产生了影响力的一大关键因素<strong>权威</strong>，即“专家说的话肯定是对的。”，而利用这种反应(可控式反应)似乎可以轻而易举的说服别人。</p><h2 id="1-3-渔利的奸商"><a href="#1-3-渔利的奸商" class="headerlink" title="1.3 渔利的奸商"></a>1.3 渔利的奸商</h2><p>自然界就有许多利用这种捷径的动物-‘拟态体’，利用对方的错误行为，达到自己的目的。</p><p>书签：20210629194523</p><p>似乎自然生存斗争中，每一种生命形式都有着对应的拟态体。如细胞病毒等也不例外。</p><p>有许多人类也能自如的运用捷径这一特点，操控人心，无往不利。</p><p>就如同上面的例子：就利用了“价格贵=东西好”</p><h2 id="1-4-以柔克刚"><a href="#1-4-以柔克刚" class="headerlink" title="1.4 以柔克刚"></a>1.4 以柔克刚</h2><p>熟练的柔道选手可以运用杠杆重力等作用几近做到四两拨千斤的功效，为人处世更是如此。</p><p>举个例子：“对比原理”</p><p>两样东西要是第二样和第一样有着相当的不同，那么我们往往认为两者的差距比实际的更大。</p><p>如果先搬一种轻的东西，再拿一件重的东西，我们会觉得第二件东西比实际上更沉；而要是我们一开始直接就搬这件重东西，反倒不会觉得有这么沉。</p><p>书签：20210629195131</p><p>要是有一个人来到店里，应该先给他推销贵的东西，随后按照对比原则依次推销越来越便宜的东西，这样他们就会觉得超乎寻常的便宜，这样购买的东西就会越来越多了。</p><p>售楼员也会先带你去看不合适的房子，然后去到普通的房子就会大为欣赏了。</p><p>卖汽车也是同理，买完车以后一一报上备选配件，当顾客看到合同的时候就会发现已经花了比买车时预算多得多的钱。</p><h1 id="第二章-互惠"><a href="#第二章-互惠" class="headerlink" title="第二章 互惠"></a>第二章 互惠</h1><p><strong>互惠原理</strong>：要是人家给了我们什么好处，我们应当尽量回报。</p><p>这种你给我一点我给你一点的欠人情式“欠债网”是人类的独特适应机制，有了它，人类才得以实现劳动分工。</p><p>互惠原理向我们做了个保证，<strong>不管结局是好是坏，我们种下什么样的因，就得什么样的果。</strong></p><h2 id="2-1-原理怎样起作用"><a href="#2-1-原理怎样起作用" class="headerlink" title="2.1 原理怎样起作用"></a>2.1 原理怎样起作用</h2><p>作者举了个小故事：</p><blockquote><p>实验人员告诉受试者他参加的是所谓的“艺术鉴赏”实验，他要跟别人一起为几幅画作的质量打分。另一名打分的人，我们就叫他“乔”吧，他只是假装当成受试者的同伴，其实是里根教授的助手。为了达成实验目的，研究人员采用了两种不同的环境来进行。</p><p>有几回，乔主动帮了真正的受试者一个小忙。在短暂的休息时间，乔离开了房间几分钟，回来时带了两罐可口可乐，一罐给受试者，一罐给自己。</p><p>他说:“我问他（实验员）能不能弄瓶可乐喝喝，他说没问题，我就给你也带了一罐来。”</p><p>另外几回，乔没有帮受试者这个小忙，他只是到房间外休息了两分钟，然后就回来了。</p><p>除此以外的各个方面，乔的表现都是相同的。</p><p>稍后，等所有的画作都评分完毕，实验员暂时离开了房间，乔请受试者帮他一个忙。他表示，他正帮一款新车卖抽奖彩票，要是他卖掉的彩票最多，就能得到50美元的奖金。乔请受试者以每张25美分的价格买些彩票:“帮帮忙，买一张也行，可越多越好。”</p></blockquote><p>实验的主要目的之一，就是研究上述两种情况下受试者从乔手里买的彩票数量。</p><p>毫无疑问，先前接受了乔好意的受试者，买起彩票来更慷慨。显然，他们觉得自己欠了乔点儿人情，所买彩票的数量比另一种情况下多了一倍。</p><p>尽管里根的研究只对互惠原理的运作做了很筒单的阐释，但它勾勒出了该原理的若干重要特点。</p><p>这里，我们不妨来仔细地分析一-下，看看互惠原理是怎样被人当成牟利的手段的。</p><p>–20210629200552</p><hr><p><img src="https://img.tjzzz.com/img/waixuan.png" alt="" loading="lazy"></p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;link rel=&quot;stylesheet&quot; class=&quot;aplayer-secondary-style-marker&quot; href=&quot;\assets\css\APlayer.min.css&quot;&gt;&lt;script src=&quot;\assets\js\APlayer.min.js&quot; cla
      
    
    </summary>
    
    
      <category term="读书笔记" scheme="https://www.tjzzz.com/categories/readingNote/"/>
    
    
      <category term="提高情商" scheme="https://www.tjzzz.com/tags/improveEq/"/>
    
  </entry>
  
  <entry>
    <title>基于结构光投影三维重建：格雷码编码与解码</title>
    <link href="https://www.tjzzz.com/posts/1fdd361.html"/>
    <id>https://www.tjzzz.com/posts/1fdd361.html</id>
    <published>2021-04-06T13:28:22.000Z</published>
    <updated>2021-04-06T13:29:23.000Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="\assets\css\APlayer.min.css"><script src="\assets\js\APlayer.min.js" class="aplayer-secondary-script-marker"></script><h2 id="一-单目结构光编码目的"><a href="#一-单目结构光编码目的" class="headerlink" title="一 单目结构光编码目的"></a>一 单目结构光编码目的</h2><p>类似于双目，如果把投影仪看成一个逆相机，直到空间中的一点成像平面的位置，就可以知道空间中一点的坐标。</p><p><img src="https://img.tjzzz.com/img/20210406193854.png" alt="双目结构光原理图" loading="lazy"></p><p>编码的目的：知道打在物体物体表面的光是从投影仪的那个像素发出来的，就知道在投影仪的虚拟成像位置。</p><h2 id="二-格雷码的编码与解码"><a href="#二-格雷码的编码与解码" class="headerlink" title="二 格雷码的编码与解码"></a>二 格雷码的编码与解码</h2><h3 id="2-1-格雷码vs二进制码"><a href="#2-1-格雷码vs二进制码" class="headerlink" title="2.1 格雷码vs二进制码"></a>2.1 格雷码vs二进制码</h3><p><img src="https://img.tjzzz.com/img/20210406194200.png" alt="格雷码与二进制码区别" loading="lazy"></p><p>格雷码是一种二进制码，最大的特点是相邻格雷码编码只有一位不同。</p><p>所以格雷码解码更稳定，相对不容易出错。</p><p>体现在</p><ul><li>明暗交接处变换更少：</li></ul><p>对于格雷码来说，明暗交接处变换更少，如图所示二进制下部有7次变换，而格雷码只有4次。黑白交接的影响主要是在解码上，解码很重要的环节就是二值化，一般情况下全黑和全亮是不容易出错的，因为在实际应用中投影交界处是渐变的，阈值很难确定(还有物体边缘的影响)。</p><ul><li>最细的条纹宽度更宽</li></ul><p>在相机对焦外，可能投影会糊掉，所以条纹越宽越不容易糊掉。</p><p><img src="https://img.tjzzz.com/img/20210406194406.png" alt="二进制编码与格雷码编码不同" loading="lazy"></p><h3 id="2-2-编解格雷码"><a href="#2-2-编解格雷码" class="headerlink" title="2.2 编解格雷码"></a>2.2 编解格雷码</h3><p>如果单纯的编制一张图片的话很简单，如上一节图所示，最低一行(最后一位)变化为0110周期，第二行为0011100周期，第三行为0000111111110000周期(2的指数级增长)。</p><p><strong>二进制码-&gt;格雷码</strong></p><p>1.对n位二进制的码字，从右到左，以0到 n-1编号 </p><p>2.如果二进制码字的第i位和i+1位相同，则对应的格雷码的第i位为0，否则为1</p><p><strong>格雷码-&gt;二进制码</strong></p><p>从左边第二位起，将每位与左边一位解码后的值异或，作为该位解码后的值（最左边一位依然不变）。依次异或，直到最低位。依次异或转换后的值就是格雷码转换 后的二进制值。</p><p><img src="https://img.tjzzz.com/img/20210406200114.png" alt="格雷码转二进制码示范" loading="lazy"></p><p>以十进制数6为例，格雷码-&gt;二进制码 </p><p>第一位不变： 1 </p><p>第二位（0）与第一位解码后的值（1）异或：1 </p><p>第三位（1）与第二位解码后的值（1）异或：0</p><h2 id="三-图片二值化方法"><a href="#三-图片二值化方法" class="headerlink" title="三 图片二值化方法"></a>三 图片二值化方法</h2><p><img src="https://img.tjzzz.com/img/20210406204529.png" alt="原图、灰度图与二值化图" loading="lazy"></p><p><strong>前提条件</strong>：每个在投影仪照射范围的点都至少需要经历一次明暗变换，即总要能找到一张图该位置为 0，另一张图该位置是1</p><p><strong>实现方法</strong>： </p><p>方法一： 增加两张图， 一张全黑图，一张全亮图 </p><p>方法二： 去除全0和全1的编码 ，让每个编码至少含有一个0和一个1(不建议，可能会破坏格雷码稳定性)</p><p><strong>二值化方法</strong>：</p><p><img src="https://img.tjzzz.com/img/20210406205143.png" alt="二值化公式" loading="lazy"></p><p>对于每个像素，计算其在整个时间序列（一组）下的最大值和最小值，然后对当前图片像素二值化就 是计算出一个如上式所示的阈值，阈值大于0.5的时候则为1，小于0.5则为0。</p><h2 id="四-其他离散型编码"><a href="#四-其他离散型编码" class="headerlink" title="四 其他离散型编码"></a>四 其他离散型编码</h2><p>在某些场景下，由于物体材质的原因，格雷码效果不好；物体受到全局光照影响特别大；</p><blockquote><p>Global illumination 全局光照：</p><p>1 inter-reflection  内反射 – long range effect </p><p>2 diffusion 漫反射 – long range effect </p><p>3 sub-surface scatter 下表面散射 – short range effect</p></blockquote><p><img src="https://img.tjzzz.com/img/20210406210306.png" alt="全局光的影响" loading="lazy"></p><p>全局光照对解码影响：解码错误</p><p><strong>解决思路</strong>：</p><p>不同的全局光，对不同频率的编码光影响不同。</p><p>1 <strong>高频光适合</strong> （long range effect): 内反射， 漫反射 </p><p><img src="https://img.tjzzz.com/img/20210406210815.png" alt="格雷码" loading="lazy"></p><p>有可能第一行右边亮的地方点亮左边暗的地方，所以需要更密集的投射如下：</p><p><img src="https://img.tjzzz.com/img/20210406211031.png" alt="XOR-04" loading="lazy"></p><p>2 <strong>低频光适合</strong> （short range effect): 下表面反射(影响临近的点)</p><p>低频光因为影响临近，所以最好是越低频越好，如下：</p><p><img src="https://img.tjzzz.com/img/20210406211119.png" alt="min-SW" loading="lazy"></p><p>其实相对来说格雷码最稳定，而上面这种方法会生成过多的图片，会对点云帧率有所影响。</p><p><img src="https://img.tjzzz.com/img/20210406212320.png" alt="方法对比" loading="lazy"></p><p><strong>参考论文</strong>： Structured Light 3D Scanning in the Presence of Global Illumination</p><h2 id="五-总结"><a href="#五-总结" class="headerlink" title="五 总结"></a>五 总结</h2><p>格雷码编解码流程：</p><p><img src="https://img.tjzzz.com/img/20210406212428.png" alt="格雷码编解码流程" loading="lazy"></p><p>特殊应用场景：</p><p><img src="https://img.tjzzz.com/img/20210406212443.png" alt="特殊应用场景" loading="lazy"></p><hr><p><img src="https://img.tjzzz.com/img/waixuan.png" alt="" loading="lazy"></p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;link rel=&quot;stylesheet&quot; class=&quot;aplayer-secondary-style-marker&quot; href=&quot;\assets\css\APlayer.min.css&quot;&gt;&lt;script src=&quot;\assets\js\APlayer.min.js&quot; cla
      
    
    </summary>
    
    
      <category term="学习历程" scheme="https://www.tjzzz.com/categories/LearningExperience/"/>
    
    
      <category term="三维重建" scheme="https://www.tjzzz.com/tags/3DReconstruction/"/>
    
  </entry>
  
  <entry>
    <title>给CNN添加TVloss的随记</title>
    <link href="https://www.tjzzz.com/posts/7f652458.html"/>
    <id>https://www.tjzzz.com/posts/7f652458.html</id>
    <published>2021-03-31T12:26:02.000Z</published>
    <updated>2021-04-21T13:29:25.000Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="\assets\css\APlayer.min.css"><script src="\assets\js\APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>接了导师的活，要求把TVloss加入到已经写好的DnCNN里，下面是tvloss代码：</p><pre class=" language-python"><code class="language-python"><span class="token keyword">class</span> <span class="token class-name">TVLoss</span><span class="token punctuation">(</span>nn<span class="token punctuation">.</span>Module<span class="token punctuation">)</span><span class="token punctuation">:</span>    <span class="token keyword">def</span> <span class="token function">__init__</span><span class="token punctuation">(</span>self<span class="token punctuation">,</span> TVLoss_weight<span class="token operator">=</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">:</span>        super<span class="token punctuation">(</span>TVLoss<span class="token punctuation">,</span> self<span class="token punctuation">)</span><span class="token punctuation">.</span>__init__<span class="token punctuation">(</span><span class="token punctuation">)</span>        self<span class="token punctuation">.</span>TVLoss_weight <span class="token operator">=</span> TVLoss_weight    <span class="token keyword">def</span> <span class="token function">forward</span><span class="token punctuation">(</span>self<span class="token punctuation">,</span> x<span class="token punctuation">)</span><span class="token punctuation">:</span>        batch_size <span class="token operator">=</span> x<span class="token punctuation">.</span>size<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span>        h_x <span class="token operator">=</span> x<span class="token punctuation">.</span>size<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">]</span>        w_x <span class="token operator">=</span> x<span class="token punctuation">.</span>size<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">[</span><span class="token number">3</span><span class="token punctuation">]</span>        count_h <span class="token operator">=</span> self<span class="token punctuation">.</span>_tensor_size<span class="token punctuation">(</span>x<span class="token punctuation">[</span><span class="token punctuation">:</span><span class="token punctuation">,</span> <span class="token punctuation">:</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">:</span><span class="token punctuation">,</span> <span class="token punctuation">:</span><span class="token punctuation">]</span><span class="token punctuation">)</span>  <span class="token comment" spellcheck="true"># 算出总共求了多少次差</span>        count_w <span class="token operator">=</span> self<span class="token punctuation">.</span>_tensor_size<span class="token punctuation">(</span>x<span class="token punctuation">[</span><span class="token punctuation">:</span><span class="token punctuation">,</span> <span class="token punctuation">:</span><span class="token punctuation">,</span> <span class="token punctuation">:</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">:</span><span class="token punctuation">]</span><span class="token punctuation">)</span>        h_tv <span class="token operator">=</span> torch<span class="token punctuation">.</span>pow<span class="token punctuation">(</span><span class="token punctuation">(</span>x<span class="token punctuation">[</span><span class="token punctuation">:</span><span class="token punctuation">,</span> <span class="token punctuation">:</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">:</span><span class="token punctuation">,</span> <span class="token punctuation">:</span><span class="token punctuation">]</span> <span class="token operator">-</span> x<span class="token punctuation">[</span><span class="token punctuation">:</span><span class="token punctuation">,</span> <span class="token punctuation">:</span><span class="token punctuation">,</span> <span class="token punctuation">:</span>h_x <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token punctuation">:</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">)</span><span class="token punctuation">.</span>sum<span class="token punctuation">(</span><span class="token punctuation">)</span>        <span class="token comment" spellcheck="true"># x[:,:,1:,:]-x[:,:,:h_x-1,:]就是对原图进行错位，分成两张像素位置差1的图片，第一张图片</span>        <span class="token comment" spellcheck="true"># 从像素点1开始（原图从0开始），到最后一个像素点，第二张图片从像素点0开始，到倒数第二个</span>        <span class="token comment" spellcheck="true"># 像素点，这样就实现了对原图进行错位，分成两张图的操作，做差之后就是原图中每个像素点与相</span>        <span class="token comment" spellcheck="true"># 邻的下一个像素点的差。</span>        w_tv <span class="token operator">=</span> torch<span class="token punctuation">.</span>pow<span class="token punctuation">(</span><span class="token punctuation">(</span>x<span class="token punctuation">[</span><span class="token punctuation">:</span><span class="token punctuation">,</span> <span class="token punctuation">:</span><span class="token punctuation">,</span> <span class="token punctuation">:</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">:</span><span class="token punctuation">]</span> <span class="token operator">-</span> x<span class="token punctuation">[</span><span class="token punctuation">:</span><span class="token punctuation">,</span> <span class="token punctuation">:</span><span class="token punctuation">,</span> <span class="token punctuation">:</span><span class="token punctuation">,</span> <span class="token punctuation">:</span>w_x <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">)</span><span class="token punctuation">.</span>sum<span class="token punctuation">(</span><span class="token punctuation">)</span>        <span class="token keyword">return</span> self<span class="token punctuation">.</span>TVLoss_weight <span class="token operator">*</span> <span class="token number">2</span> <span class="token operator">*</span> <span class="token punctuation">(</span>h_tv <span class="token operator">/</span> count_h <span class="token operator">+</span> w_tv <span class="token operator">/</span> count_w<span class="token punctuation">)</span> <span class="token operator">/</span> batch_size    <span class="token keyword">def</span> <span class="token function">_tensor_size</span><span class="token punctuation">(</span>self<span class="token punctuation">,</span> t<span class="token punctuation">)</span><span class="token punctuation">:</span>        <span class="token keyword">return</span> t<span class="token punctuation">.</span>size<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span> <span class="token operator">*</span> t<span class="token punctuation">.</span>size<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">]</span> <span class="token operator">*</span> t<span class="token punctuation">.</span>size<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">[</span><span class="token number">3</span><span class="token punctuation">]</span></code></pre><p>可以看出返回的是一个数，使用方法为：</p><pre class=" language-python"><code class="language-python">addition <span class="token operator">=</span> TVLoss<span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token comment" spellcheck="true"># 初始化</span>loss <span class="token operator">=</span> addition<span class="token punctuation">(</span>model<span class="token punctuation">(</span>batch_y<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token comment" spellcheck="true"># 输入为经过模型得出的fakex</span>loss <span class="token operator">=</span> Variable<span class="token punctuation">(</span>loss<span class="token punctuation">,</span> requires_grad<span class="token operator">=</span><span class="token boolean">True</span><span class="token punctuation">)</span></code></pre><p>由<a href="https://blog.csdn.net/gwplovekimi/article/details/85337689" target="_blank" rel="noopener external nofollow noreferrer">实验——TV Loss解决over fitting的问题</a>，tvloss在深度学习里不可以单独的作为loss，需要配合其他loss使用，在这里我们引入sum_squared_error 误差平方和：</p><pre class=" language-python"><code class="language-python">criterion <span class="token operator">=</span> sum_squared_error<span class="token punctuation">(</span><span class="token punctuation">)</span>loss2 <span class="token operator">=</span> criterion<span class="token punctuation">(</span>model<span class="token punctuation">(</span>batch_y<span class="token punctuation">)</span><span class="token punctuation">,</span> batch_y <span class="token operator">-</span> batch_x<span class="token punctuation">)</span>loss <span class="token operator">=</span> <span class="token punctuation">(</span>loss <span class="token operator">*</span> args<span class="token punctuation">.</span>tvlosspr<span class="token punctuation">)</span> <span class="token operator">+</span> loss2 <span class="token comment" spellcheck="true"># args.tvlosspr为事先定义好的tvloss参数</span></code></pre><p>如上，就把TVloss嵌入进程序里了(<del>好不好用我也不知道</del>)</p><p>如果不好用的话我会回来改一下，如果过去一个月了这篇文章还没有改那就证明这个方法成功了(<del>至少没失败</del>)</p><hr><p>2021年4月21日更新</p><p>发现更为简便的加loss方法</p><pre class=" language-python"><code class="language-python">my <span class="token operator">=</span> model<span class="token punctuation">(</span>batch_y<span class="token punctuation">)</span>loss2 <span class="token operator">=</span> criterion<span class="token punctuation">(</span>my<span class="token punctuation">,</span> batch_y <span class="token operator">-</span> batch_x<span class="token punctuation">)</span>tvloss <span class="token operator">=</span> <span class="token number">1e</span><span class="token operator">-</span><span class="token number">6</span> <span class="token operator">*</span> <span class="token punctuation">(</span>torch<span class="token punctuation">.</span>sum<span class="token punctuation">(</span>torch<span class="token punctuation">.</span>abs<span class="token punctuation">(</span>my<span class="token punctuation">[</span><span class="token punctuation">:</span><span class="token punctuation">,</span> <span class="token punctuation">:</span><span class="token punctuation">,</span> <span class="token punctuation">:</span><span class="token punctuation">,</span> <span class="token punctuation">:</span><span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">]</span> <span class="token operator">-</span> my<span class="token punctuation">[</span><span class="token punctuation">:</span><span class="token punctuation">,</span> <span class="token punctuation">:</span><span class="token punctuation">,</span> <span class="token punctuation">:</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">:</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token operator">+</span> torch<span class="token punctuation">.</span>sum<span class="token punctuation">(</span>torch<span class="token punctuation">.</span>abs<span class="token punctuation">(</span>my<span class="token punctuation">[</span><span class="token punctuation">:</span><span class="token punctuation">,</span> <span class="token punctuation">:</span><span class="token punctuation">,</span> <span class="token punctuation">:</span><span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token punctuation">:</span><span class="token punctuation">]</span> <span class="token operator">-</span> my<span class="token punctuation">[</span><span class="token punctuation">:</span><span class="token punctuation">,</span> <span class="token punctuation">:</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">:</span><span class="token punctuation">,</span> <span class="token punctuation">:</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token comment" spellcheck="true">#1e-6为参数</span>loss <span class="token operator">=</span>   tvloss <span class="token operator">+</span> loss2 </code></pre><p><del>这个方法我也没试验过</del></p><p>等有时间再实验吧</p><p>EOF</p><hr><p><img src="https://img.tjzzz.com/img/waixuan.png" alt="" loading="lazy"></p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;link rel=&quot;stylesheet&quot; class=&quot;aplayer-secondary-style-marker&quot; href=&quot;\assets\css\APlayer.min.css&quot;&gt;&lt;script src=&quot;\assets\js\APlayer.min.js&quot; cla
      
    
    </summary>
    
    
      <category term="学习历程" scheme="https://www.tjzzz.com/categories/LearningExperience/"/>
    
    
      <category term="深度学习" scheme="https://www.tjzzz.com/tags/DeepLearning/"/>
    
      <category term="python" scheme="https://www.tjzzz.com/tags/python/"/>
    
      <category term="pytorch" scheme="https://www.tjzzz.com/tags/pytorch/"/>
    
  </entry>
  
  <entry>
    <title>三维重建论文笔记 DeMoN:Depth and Motion Network for Learning Monocular Stereo</title>
    <link href="https://www.tjzzz.com/posts/32412401.html"/>
    <id>https://www.tjzzz.com/posts/32412401.html</id>
    <published>2021-03-17T09:19:49.000Z</published>
    <updated>2021-07-07T01:15:21.488Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="\assets\css\APlayer.min.css"><script src="\assets\js\APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>本文是学习总结的笔记，仅供个人学习使用。</p><h2 id="1-introduction"><a href="#1-introduction" class="headerlink" title="1. introduction"></a>1. introduction</h2><p>在这篇文章中，作者训练了一个端到端的<strong>卷积网络</strong>，以从<strong>连续无约束的</strong>图像对中计算深度和摄像机运动。该体系结构由多个<strong>堆叠的编解码器网络</strong>组成，核心部分是<strong>一个能够改进自身预测的迭代网络</strong>。该网络不仅估计<strong>深度和运动</strong>，而且还估计<strong>表面法线、图像之间的光流和匹配的置信度</strong>。该方法的一个重要组成部分是<strong>基于空间相对差异的训练损失</strong>。与传统的基于运动方法的双框结构相比，<strong>结果更准确，鲁棒性更强</strong>。与流行的Depth-from-Single-Image网络不同的是，<strong>DEMON</strong>学习了匹配的概念，因此更好地概括了训练过程中看不到的结构。</p><h3 id="1-1-卷积网络与SfM的对比"><a href="#1-1-卷积网络与SfM的对比" class="headerlink" title="1.1 卷积网络与SfM的对比"></a>1.1 卷积网络与SfM的对比</h3><p>SfM是计算机视觉研究中的一个长期课题。大多数现有的系统都是经过精心设计，包括几个连续的处理步骤。目前这个步骤的实现有一些<strong>固有的限制</strong>。例如，在通过密集对应搜索推断场景的结构之前，通常从估计摄像机运动开始。因此，对相机运动的错误估计会导致错误的深度预测。此外，通过关键点检测和描述子匹配计算稀疏对应来估计摄像机运动。这种低层次的处理很容易出现异常值，并且不能在无纹理的区域工作。最后，所有现有的SfM方法在小型摄像机转换的情况下都失败了。这是因为在这些退化的情况下<strong>很难整合</strong>能够提供合理解决方案的先验。</p><p>在本文中，作者训练了一个<strong>卷积网络</strong>，从无约束的一对图像中联合估计深度和摄像机运动。该方法与典型的SfM有很大的不同，它同时解决了运动和密集深度估计的问题。从长远来看，学习方法有很大的潜力，因为它自然地整合了X方法的所有形状:多视图、轮廓、纹理、阴影、散焦、雾霾。此外，在退化情况下，可以有效地从数据中学习到对象和结构的强先验，并对问题进行规格化;</p><p>深度学习方法明显优于传统方法。</p><h3 id="1-2-传统卷积神经网络与本网络对比"><a href="#1-2-传统卷积神经网络与本网络对比" class="headerlink" title="1.2 传统卷积神经网络与本网络对比"></a>1.2 传统卷积神经网络与本网络对比</h3><p>最近，卷积网络在单个图像的深度预测方面表现出色通过学习对象及其形状的先验知识，这些网络在受限评价中，如室内或驾驶场景，达到了非常好的性能。</p><p>然而，单一图像方法在推广到以前未见过的图像类型方面存在更多问题。这是因为他们<strong>没有利用立体视觉</strong>。下图显示了一个示例，其中单个图像的深度失败，因为网络以前没有看到类似的结构。作者的网络，它学会了利用运动视差，没有这个限制，很好地概括了非常新的场景。</p><p><img src="https://img.tjzzz.com/img/20210314134010.png" alt="深度学习在三维中的对比" loading="lazy"></p><p>为了利用运动视差，网络必须将两个输入图像对应起来。作者发现一个简单的编码器-解码器网络<strong>不能使用立体图像</strong>:当训练它从两个图像计算深度时，它最终只使用其中一个。单幅图像的深度是满足训练目标的<strong>捷径</strong>，无需将两幅图像进行对应，并从对应中得到相机的运动和深度。在走捷径的同时网络忽略了三维空间对预测结果的影响。</p><p>本文解决了传统神经网络的问题，采用了<strong>一种光流估计与相机运动和深度估计交替进行的架构</strong>;为了求解光流，网络必须使用两个图像。</p><p>本文还提出了一个技术贡献是<strong>用特殊的梯度损失来处理由运动引起的结构尺度模糊</strong>。</p><h2 id="2-Methods"><a href="#2-Methods" class="headerlink" title="2. Methods"></a>2. Methods</h2><p>整体网络架构如图2所示。DeMoN是一个编码-解码网络链，解决不同的任务。该体系结构由三个主要部分组成:bootstrap网络、迭代网络和细化网络。前两个组件是一对编码器解码器网络，其中第一个计算光流，第二个计算深度和摄像机运动;参见下图。迭代网递归地应用于连续地改进前一次迭代的估计。最后一个组件是一个单独的编码器-解码器网络，生成最终的更新采样和细化的深度映射。</p><p><img src="https://img.tjzzz.com/img/20210314151013.png" alt="image-20210314151012965" loading="lazy"></p><h3 id="2-1-训练过程"><a href="#2-1-训练过程" class="headerlink" title="2.1 训练过程"></a>2.1 训练过程</h3><h4 id="2-1-1-损失函数"><a href="#2-1-1-损失函数" class="headerlink" title="2.1.1 损失函数"></a>2.1.1 损失函数</h4><p>该网络估计的输出性质非常不同:高维(每像素)深度地图和低维摄像机运动向量。损失必须平衡这两个目标，并在不过度适应特定场景的情况下促进这两个任务的协同作用。</p><ul><li>Point-wise losses.<ul><li>作者将点方向的损失应用到作者的输出上:反深度值ξ，表面法线n，光流w，光流置信值c。对于深度，作者直接在反深度值上使用L1损失:<img src="https://img.tjzzz.com/img/20210314151503.png" alt="image-20210314151503904" loading="lazy"></li><li>对于法线和光流的损失函数：<img src="https://img.tjzzz.com/img/20210314151559.png" alt="image-20210314151559340" loading="lazy"></li><li>作者训练网络通过预测每个光流分量的置信图来评估其自身流量预测的质量。x分量置信度：<img src="https://img.tjzzz.com/img/20210314151628.png" alt="image-20210314151628238" loading="lazy">)相应的损失函数是：<img src="https://img.tjzzz.com/img/20210314151703.png" alt="image-20210314151703898" loading="lazy"></li></ul></li><li>Motion losses.<ul><li>作者使用了摄像机运动的最小参数化，每个参数为旋转r和平移t。运动矢量的损失：<img src="https://img.tjzzz.com/img/20210314151727.png" alt="image-20210314151727810" loading="lazy"></li></ul></li><li>Scale invariant gradient loss.<ul><li>作者定义离散不变梯度g为<img src="https://img.tjzzz.com/img/20210314151747.png" alt="image-20210314151747894" loading="lazy"></li><li>基于这个梯度，作者定义了一个尺度不变的损失，它惩罚了相邻像素之间的相关性:<img src="https://img.tjzzz.com/img/20210314151848.png" alt="image-20210314151848269" loading="lazy"></li><li>作者对光流的每个分量应用相同的尺度不变梯度损失。这增强了估计流场的平滑度和运动不连续性的锐度</li></ul></li><li>Weighting<ul><li>作者分别权衡损失以平衡其重要性。权重因素是根据经验确定的，并在补充资料中列出。</li></ul></li></ul><h3 id="2-2-训练进度"><a href="#2-2-训练进度" class="headerlink" title="2.2 训练进度"></a>2.2 训练进度</h3><p>网络训练是基于Caffe框架的。作者用Adam从头开始训练模型，动量为0.9，重量衰减为0.0004。整个培训过程包括三个阶段。</p><p>首先，作者在引导网和迭代网中顺序训练四个编解码器组件，每个迭代250k次，批大小为32。在训练编解码器时，作者保持前面所有组件的权重不变。对于指定光流的编解码器，在10k次迭代后应用尺度不变损耗。</p><p>其次，作者只训练迭代网络的编解码器对。在此阶段，作者将前三次训练迭代的输出附加到小批量中。在此阶段，引导网络使用大小为8的批次。将前三次网络迭代的输出添加到批次中，从而产生迭代网络的总批次大小为32。作者运行160万次培训迭代。</p><p>最后，在其他权值固定的情况下，对精化网络进行600k次迭代训练。</p><h2 id="3-Results"><a href="#3-Results" class="headerlink" title="3. Results"></a>3. Results</h2><h3 id="3-1-数据集"><a href="#3-1-数据集" class="headerlink" title="3.1 数据集"></a>3.1 数据集</h3><p><strong>SUN3D</strong>：这个数据集提供了一组不同的室内图像以及深度和相机姿势。此数据集上的深度和相机姿势并不完美。因此，作者从数据集中采样图像对，并自动丢弃具有较高照相一致性误差的图像对。作者拆分数据集，以便相同的场景不会同时出现在训练和测试集中。</p><p><strong>MVS</strong>：包括几个室外数据集。作者使用来自的Citywall和Achteckturm数据集和Breisach数据集进行训练，并使用COLMAP提供的数据集进行测试。重建场景的深度图通常是稀疏的，并且可能包含重建误差。</p><p><strong>Scenes11</strong>：是一个合成数据集，包含随机几何形状的虚拟场景图像，提供完美的深度和运动场景真实，但缺乏真实感。</p><p>因此，作者引入了基于blendswap.com上150个场景的<strong>Blendswap</strong>数据集。该数据集提供了大量的场景，从类似卡通的场景到逼真的场景。该数据集主要包含室内场景。作者仅将此数据集用于训练。</p><p><strong>NYUv2</strong>：提供多种室内场景的深度地图，但缺乏相机姿态信息。作者没有在NYU上进行训练，而是使用了与Eigen等人相同的测试分割。与Eigen等人不同，作者还需要第二个输入图像，它不应该与前一个相同。因此，作者根据差分图像上的一个阈值，自动选择与第一幅图像足够不同的下一幅图像。</p><p>在所有没有表面法线的情况下，我们从深度图中生成它们。我们专门为SUN3D中使用的相机特性训练了DeMoN，并通过裁剪和缩放来适应所有其他数据集以匹配这些参数。</p><h3 id="3-2-误差指标"><a href="#3-2-误差指标" class="headerlink" title="3.2 误差指标"></a>3.2 误差指标</h3><p>单图像方法的目的是在实际物理尺度上预测深度，而双图像方法通常产生的尺度相对于相机平移向量的范数。比较这两组方法的结果需要一个尺度不变误差度量。我们采用的尺度不变误差，定义为：</p><p><img src="https://img.tjzzz.com/img/20210314152807.png" alt="image-20210314152807914" loading="lazy"></p><p>其中：<img src="https://img.tjzzz.com/img/20210314152828.png" alt="image-20210314152828183" loading="lazy"></p><p>为了与运动方法中的经典结构进行比较，我们采用了以下措施：</p><p><img src="https://img.tjzzz.com/img/20210314152844.png" alt="image-20210314152844235" loading="lazy"></p><h3 id="3-3-与经典结构的运动对比"><a href="#3-3-与经典结构的运动对比" class="headerlink" title="3.3 与经典结构的运动对比"></a>3.3 与经典结构的运动对比</h3><p><img src="https://img.tjzzz.com/img/20210314152940.png" alt="image-20210314152940439" loading="lazy"></p><p>两帧深度和运动估计方法的比较。对所有措施来说，越低越好。为了与基线方法进行公平比较，我们仅在两幅图像中可见的像素处评估深度。因为Base-Matlab的深度只能作为稀疏点云提供，因此不能与这里进行比较。我们没有报告NYUv2的错误，因为运动地面真相(因此深度刻度)是不可用的。右:与单帧深度估计的比较。由于尺度估计不具有可比性，我们仅报告尺度不变误差度量。</p><p><img src="https://img.tjzzz.com/img/20210314153037.png" alt="image-20210314153037594" loading="lazy"></p><p>通过增加DeMoN的两个输入图像之间的基线来提高质量性能。深度图由左上角的参考图像和下面的第二个图像生成。第一个输出包含两个相同的图像输入，这是传统结构运动的退化情况。</p><p>3.4 与单个图像的深度进行比较</p><p><img src="https://img.tjzzz.com/img/20210314153128.png" alt="image-20210314153127916" loading="lazy"></p><p>在各种数据集上进行定性深度预测比较，DeMoN的预测非常清晰和详尽，因为一些原因，缺少有关NYUv2的Base-Oracle预测。</p><h3 id="3-4-对新数据的归纳"><a href="#3-4-对新数据的归纳" class="headerlink" title="3.4 对新数据的归纳"></a>3.4 对新数据的归纳</h3><p>当面对与训练数据截然不同的场景时，在训练过程中学习的特定场景先验可能是无用的，甚至是有害的。相反，一对图像之间的几何关系是独立于场景内容的，应该概括为未知的场景。为了分析DeMoN的泛化特性，我们汇编了一个小数据集，其中包含一些不常见或复杂的场景，例如抽象雕塑、人物和物体的特写、旋转90度的图像。</p><p><img src="https://img.tjzzz.com/img/20210314153319.png" alt="image-20210314153319726" loading="lazy"></p><p>将DeMoN的泛化能力可视化到以前看不到的配置。在这种情况下，单帧方法有严重的问题，因为在最后一个示例的深度估计的点云可视化中最清晰可见。</p><h2 id="4-Discussion"><a href="#4-Discussion" class="headerlink" title="4. Discussion"></a>4. Discussion</h2><p>DeMoN是第一个学习从两个不受约束的图像中估计深度和摄像机运动的深度网络。与从单一图像估算深度的网络不同，DeMoN可以利用运动视差，这是一种强大的线索，可用于新类型的场景，并允许估算自我运动。该网络在两帧上优于传统的运动技术结构，因为与那些相比，它是端到端的训练，并学习从X线索整合其他形状。当涉及到处理相机与不同的内在参数，它还没有达到传统方法的灵活性。下一个挑战是解除这个限制，并将这项工作扩展到两个以上的图像。与传统技术一样，这有望显著提高鲁棒性和准确性。</p><h2 id="5-References"><a href="#5-References" class="headerlink" title="5. References"></a>5. References</h2><ul><li><p>C. Bailer, B. Taetz, and D. Stricker. Flow Fields: Dense Correspondence Fields for Highly Accurate Large Displacement Optical Flow Estimation. In IEEE International Conference on Computer Vision (ICCV), Dec. 2015.</p></li><li><p>P . Agrawal, J. Carreira, and J. Malik. Learning to see by moving. In IEEE International Conference on Computer Vision (ICCV), Dec. 2015.</p></li><li><p>D. Eigen and R. Fergus. Predicting Depth, Surface Normals and Semantic Labels With a Common Multi-Scale Convo- lutional Architecture. In IEEE International Conference on Computer Vision (ICCV), Dec. 2015</p></li><li><p>F. Liu, C. Shen, G. Lin, and I. Reid. Learning Depth from Single Monocular Images Using Deep Convolutional Neural Fields. In IEEE Transactions on Pattern Analysis and Machine Intelligence, 2015.</p></li></ul><hr><p><img src="https://img.tjzzz.com/img/waixuan.png" alt="" loading="lazy"></p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;link rel=&quot;stylesheet&quot; class=&quot;aplayer-secondary-style-marker&quot; href=&quot;\assets\css\APlayer.min.css&quot;&gt;&lt;script src=&quot;\assets\js\APlayer.min.js&quot; cla
      
    
    </summary>
    
    
      <category term="学习历程" scheme="https://www.tjzzz.com/categories/LearningExperience/"/>
    
    
      <category term="深度学习" scheme="https://www.tjzzz.com/tags/DeepLearning/"/>
    
      <category term="三维重建" scheme="https://www.tjzzz.com/tags/3DReconstruction/"/>
    
  </entry>
  
  <entry>
    <title>三维扫描系列 点云绪论</title>
    <link href="https://www.tjzzz.com/posts/98b3189b.html"/>
    <id>https://www.tjzzz.com/posts/98b3189b.html</id>
    <published>2021-03-14T03:22:21.000Z</published>
    <updated>2021-07-07T01:15:01.787Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="\assets\css\APlayer.min.css"><script src="\assets\js\APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>本文是学习肖勇大神的点云课程总结的笔记，仅供个人学习使用。</p><blockquote><p>肖勇</p><p>Mapping &amp; Localization Technical Specialist @ Lucid Motors，主要从事无人车地 图和定位算法研发。先后参与 Lyft、百度无人车 项目开发。密歇根大学土木工程博士，中科院遥 感与数字地球研究所地图学硕士，武汉大学测绘 工程学士。</p></blockquote><h2 id="点云数据及获取"><a href="#点云数据及获取" class="headerlink" title="点云数据及获取"></a>点云数据及获取</h2><ul><li>定义<ul><li>点云：三维点的数据集合</li></ul></li><li>属性<ul><li>三维坐标</li><li>强度</li><li>颜色</li><li>时间戳</li></ul></li></ul><p><img src="https://img.tjzzz.com/img/20210314100706.png" alt="image-20210314100659480" loading="lazy"></p><ul><li><p>分类</p><ul><li><p>点云组织形式：</p><ul><li>organized: the point cloud is laid out as a 2D array of points that resembles an image like structure - </li><li>unorganized: the point cloud is a list of points.</li></ul></li></ul></li></ul><ul><li>点云获取方式<ul><li>激光扫描仪<ul><li>星载</li><li>机载</li><li>地面</li><li>移动</li></ul></li><li>深度相机(depth Camera)</li><li>双目相机(stereo Camera)</li><li>光学相机多视角重建</li></ul></li></ul><p><img src="https://img.tjzzz.com/img/20210314100844.png" alt="image-20210314100844568" loading="lazy"></p><h3 id="激光扫描仪"><a href="#激光扫描仪" class="headerlink" title="激光扫描仪"></a>激光扫描仪</h3><ul><li><p>工作原理：time of flight</p></li><li><p><img src="https://img.tjzzz.com/img/20210314100935.png" alt="image-20210314100935007" loading="lazy"></p></li><li><p>分类</p><ul><li>星载：卫星</li><li>机载：飞机，无人机</li><li>地面：三脚架上固定 </li><li>移动：车辆，机器人等</li></ul></li></ul><h4 id="星载激光雷达"><a href="#星载激光雷达" class="headerlink" title="星载激光雷达"></a>星载激光雷达</h4><ul><li>常见系统 <ul><li>GLAS星载激光雷达 系统(Geoscience Laser Altimeter System) </li><li>CALIOP星载激光雷 达 </li><li>ALADIN星载多普勒 激光雷达</li></ul></li><li><img src="https://img.tjzzz.com/img/20210314101206.png" alt="image-20210314101202934" loading="lazy"></li></ul><h4 id="机载激光雷达"><a href="#机载激光雷达" class="headerlink" title="机载激光雷达"></a>机载激光雷达</h4><ul><li>机载激光雷达<ul><li>使用配有 GPS/IMU的飞机（无人机） 获取大范围的点云 </li></ul></li><li>特点 <ul><li>精度高：10cm </li><li>大尺度测绘 </li></ul></li><li>应用领域 <ul><li>大尺度（城市级别）测绘 </li><li>DEM </li><li>正射影像 （高精度相机）</li></ul></li></ul><p><img src="https://img.tjzzz.com/img/20210314101337.png" alt="image-20210314101337080" loading="lazy"></p><h4 id="地面激光雷达"><a href="#地面激光雷达" class="headerlink" title="地面激光雷达"></a>地面激光雷达</h4><ul><li>地面激光雷达 <ul><li>激光雷达通常固定在三角架上，进行 较大范围扫描获取点云。 </li></ul></li><li>特点 <ul><li>精度高： 可达到 mm </li><li>距离远：可达到400m </li><li>扫描速度快： Leica RTC360 1s 采集 ~200万点云 </li></ul></li><li>应用 <ul><li>文物三维扫描建模 </li><li>地形测量</li></ul></li></ul><p><img src="https://img.tjzzz.com/img/20210314101524.png" alt="image-20210314101524355" loading="lazy"></p><h4 id="移动激光雷达"><a href="#移动激光雷达" class="headerlink" title="移动激光雷达"></a>移动激光雷达</h4><ul><li><p>移动激光雷达 </p><ul><li>激光雷达通常跟着移动物体（ 机器人无人车），进行较大范 围扫描获取点云</li></ul></li><li><p>特点</p><ul><li>精度高： cm </li><li>距离远：~240m </li><li>扫描速度快： 10Hz, 200万点 云每秒 </li></ul></li><li><p>应用</p><ul><li><p>无人车，机器人</p></li><li><p>街景测量</p><p><img src="https://img.tjzzz.com/img/20210314101741.png" alt="image-20210314101740973" loading="lazy"></p></li></ul></li></ul><p>Point Cloud created by Velodyne Lidar’s <a href="https://velodynelidar.com/products/alpha-prime/" target="_blank" rel="noopener external nofollow noreferrer">Alpha Prime sensor</a></p><h3 id="深度相机"><a href="#深度相机" class="headerlink" title="深度相机"></a>深度相机</h3><ul><li>深度相机<ul><li>通过近红外激光器把具有结构特征 的光线投影到物体上，通过红外摄 像头采集得到深度信息。 </li></ul></li><li>特点 <ul><li>成本低，计算量小 </li><li>主动光源，夜晚也可用 </li><li>观测该范围和距离有限 </li></ul></li><li>应用 <ul><li>室内机器人</li><li>AR/VR</li></ul></li></ul><p><img src="https://img.tjzzz.com/img/20210314101942.png" alt="image-20210314101942307" loading="lazy"></p><h3 id="双目相机"><a href="#双目相机" class="headerlink" title="双目相机"></a>双目相机</h3><ul><li>使用两个相机从不同位置获取物体的 两幅图像，通过计算对应点的位置偏 差，使用三角原理（Triangulation） 计算点的三维坐标</li><li>特点<ul><li>成本低</li><li>室内室外都适用</li><li>对环境光敏感</li><li>基线限制了测量范围</li></ul></li></ul><p><img src="https://img.tjzzz.com/img/20210314102142.png" alt="image-20210314102142027" loading="lazy"></p><h3 id="光学相机多视角重建"><a href="#光学相机多视角重建" class="headerlink" title="光学相机多视角重建"></a>光学相机多视角重建</h3><ul><li><p>SFM 运动结构恢复(Structure from motion) </p><ul><li>给出多幅图像及其图像特征点的对应集合 ，估计3D点的位置和摄像机姿态（运动） </li></ul></li><li><p>特点</p><ul><li><p>成本低 </p></li><li><p>使用高精度相机和更稳定的平台（有 GPS/IMU）可以进行高精度测量 </p></li><li><p>计算量大</p></li></ul></li></ul><p><img src="https://img.tjzzz.com/img/20210314102255.png" alt="image-20210314102255238" loading="lazy"></p><p>Credit to <a href="http://gsp.humboldt.edu/OLM/Courses/GSP_216_Online/lesson8-2/SfM.html" target="_blank" rel="noopener external nofollow noreferrer">http://gsp.humboldt.edu/OLM/Courses/GSP_216_Online/lesson8-2/SfM.html</a></p><h2 id="点云数据处理"><a href="#点云数据处理" class="headerlink" title="点云数据处理"></a>点云数据处理</h2><h3 id="点云滤波-filtering"><a href="#点云滤波-filtering" class="headerlink" title="点云滤波(filtering)"></a>点云滤波(filtering)</h3><ul><li>检测和移除点云中的噪声或不感兴趣的点 </li><li>分类<ul><li>基于统计信息 (statiscal-based)</li><li>基于领域 (neighbor-based)  基于投影（projection-based) </li><li>基于信号处理(singal processing based)</li><li>基于偏微分方程(PDEs-based) </li><li>其他方法：voxel grid fitlering, quadtreebased, etc. </li></ul></li><li>常用方法</li><li>基于体素(voxel grid) </li><li>移动平均最小二乘(Moving Least Squares)</li></ul><p><img src="https://img.tjzzz.com/img/20210314102530.png" alt="image-20210314102530018" loading="lazy"></p><h3 id="点云匹配-point-cloud-registration"><a href="#点云匹配-point-cloud-registration" class="headerlink" title="点云匹配 (point cloud registration)"></a>点云匹配 (point cloud registration)</h3><ul><li>估计两帧或者多帧点云之间的 rigid body transformation 信息，将所有帧的点云配准在同 一个坐标系。</li><li>分类 <ul><li>初/粗匹配: 适用于初始位姿差别大的两帧点云 </li><li>精匹配：优化两帧点云之间的变换 </li><li>全局匹配：通常指优化序列点云匹配的误差， 如激光 SLAM，两帧之间匹配，全局匹配 </li></ul></li><li>常用方法 <ul><li>基于 Iterative Closest Point (ICP)的方法     </li><li>基于特征的匹配方法  </li><li><strong>深度学习匹配方法</strong></li></ul></li></ul><p><img src="https://img.tjzzz.com/img/20210314102732.png" alt="image-20210314102732861" loading="lazy"></p><p>Credit to <a href="http://geometryhub.net/en/notes/registration" target="_blank" rel="noopener external nofollow noreferrer">http://geometryhub.net/en/notes/registration</a></p><ul><li>Iterative Closest Point (ICP)Registration<ul><li>Given two scans 𝑃 and 𝑄, initial transformation between them 𝑅,𝑡</li><li>Iterate <ul><li>Find some pairs of closest points (𝑝𝑖,𝑞𝑖) </li><li>Optimize 𝑅,𝑡 to minimize <img src="https://img.tjzzz.com/img/20210314102901.png" alt="image-20210314102901910" loading="lazy"></li></ul></li></ul></li></ul><p><img src="https://img.tjzzz.com/img/20210314102856.png" alt="image-20210314102856024" loading="lazy"></p><h3 id="点云分割-segmentation"><a href="#点云分割-segmentation" class="headerlink" title="点云分割 (segmentation)"></a>点云分割 (segmentation)</h3><ul><li>根据空间、集合等特征将点划分为不同的集合。</li><li>常用方法 <ul><li>基于边缘的方法：变成图像，使用边缘信息</li><li>基于区域生长 </li><li>几何模型拟合：拟合平面，球形，圆柱等</li></ul></li></ul><p><img src="https://img.tjzzz.com/img/20210314103026.png" alt="几何模型拟合(Schnabel et al. 2007" loading="lazy"></p><p><img src="https://img.tjzzz.com/img/20210314103038.png" alt="区域生长(Vo et al. 2015)" loading="lazy"></p><ul><li>Segmentation using smoothness constraint<ul><li><img src="https://img.tjzzz.com/img/20210314103110.png" alt="image-20210314103110235" loading="lazy"></li></ul></li></ul><h3 id="点云目标检测-object-detection"><a href="#点云目标检测-object-detection" class="headerlink" title="点云目标检测 (object detection)"></a>点云目标检测 (object detection)</h3><ul><li><p>从点云中检测某类物体</p></li><li><p>方法：</p><ul><li>传统机器学习方法</li><li>深度学习方法</li></ul></li></ul><p><img src="https://img.tjzzz.com/img/20210314103222.png" alt="image-20210314103222607" loading="lazy"></p><p><img src="https://img.tjzzz.com/img/20210314103235.png" alt="Fernandes et al. 2021" loading="lazy"></p><h3 id="点云分类-classification-语义分割-Semantic-Segmentation"><a href="#点云分类-classification-语义分割-Semantic-Segmentation" class="headerlink" title="点云分类 (classification)/语义分割(Semantic Segmentation)"></a>点云分类 (classification)/语义分割(Semantic Segmentation)</h3><ul><li><p>为每个点云分配一个语义标签</p></li><li><p>方法：</p><ul><li>传统机器学习</li><li>深度学习</li></ul></li></ul><p><img src="https://img.tjzzz.com/img/20210314103529.png" alt="" loading="lazy"></p><p><img src="https://img.tjzzz.com/img/20210314103544.png" alt="image-20210314103544680" loading="lazy"></p><h3 id="模型重建-model-reconstruction"><a href="#模型重建-model-reconstruction" class="headerlink" title="模型重建 (model reconstruction"></a>模型重建 (model reconstruction</h3><ul><li><p>从点云中获取更精简更紧凑的模型，如获取 mesh 模型。</p></li><li><p>常见的 3D shape representation: 深度图，点云 ，体素，网格(mesh) </p></li><li><p>常用方法： </p><ul><li>Delaunay Mesh Generation </li><li>Finite Element Mesh Generation. </li><li>Marching cube</li></ul></li></ul><h2 id="常用软件及开源"><a href="#常用软件及开源" class="headerlink" title="常用软件及开源"></a>常用软件及开源</h2><h3 id="CloudCompare"><a href="#CloudCompare" class="headerlink" title="CloudCompare"></a>CloudCompare</h3><p>开源，且支持多平台(Windows, Mac, Linux) </p><ul><li>支持常见的点云数据格式，简单的 点云编辑 </li><li>支持用户自己添加插件和增加新功 能 (如 Ransac， Poisson Mesh Reconstruction, Classification with CANUPO) </li><li>适合于点云可视化，简单编辑或者处理</li></ul><p><img src="https://img.tjzzz.com/img/20210314103946.png" alt="image-20210314103946031" loading="lazy"></p><h3 id="Meshlab"><a href="#Meshlab" class="headerlink" title="Meshlab"></a>Meshlab</h3><ul><li>处理和编辑3D三角形网格的开源系 统 </li><li>主要是编辑，清理，修复，检查， 渲染，纹理和转换网格的工具</li><li>3D Acquisition: color mapping and texturing  Cleaning 3D models </li><li>支持多平台（Win，Linux, Mac)</li></ul><h3 id="部分商业软件"><a href="#部分商业软件" class="headerlink" title="部分商业软件"></a>部分商业软件</h3><ul><li>Microstation TerraSolid (Bentley):航测，主要适用于机载雷达，获取 DEM 和建筑建模等 </li><li>Global Mapper Lidar Moduel:主要处理机载激光雷达数据，分类，建模，生成 DEM等 </li><li>LiDAR 360 (数字绿土)：林业资源调查，地形测绘等 </li><li>点云魔方(中国科学院遥感与数字地球研究所)：植被应用，电力巡线等 </li><li>ENVI LiDAR; ArcGIS：含有部分点云处理模块，主要用于遥感和林业</li><li>Cyclone, Cloudworx, TruView: Leica徕卡开发，主要用于其地面激光雷达和移动（背包式）激光<br>雷达数据处理 </li><li>Riscan Pro：主要用于处理 Riegl 瑞格地面激光雷达数据 </li><li>RealWorks(Trimble)</li><li>Polyworks (Innovmetric); <strong>Geomagic</strong> (3D systems)：逆向工程，主要用于机械测量</li></ul><h3 id="开源库"><a href="#开源库" class="headerlink" title="开源库"></a>开源库</h3><ul><li>PCL (Point cloud library) <ul><li>Filter  </li><li>Segmentation  </li><li>Registration  </li><li>Keypoints  </li><li>Recognition </li></ul></li><li>特点  <ul><li>支持多平台（Win，Linux, Mac)  </li><li>功能齐全，可扩展性好  </li><li>广泛用于机器人，很多开源算法和 系统（ROS)</li></ul></li></ul><p><img src="https://img.tjzzz.com/img/20210314104342.png" alt="image-20210314104342836" loading="lazy"></p><ul><li><strong>Open3D</strong> <ul><li>Surface alignment </li><li>3D machine learning support with PyTorch and TensorFlow </li><li>GPU acceleration for core 3D operation </li></ul></li><li>特点 •<ul><li>支持多平台 </li><li>python集成成熟，可和 Pytorch, Tensorflow 集成</li></ul></li></ul><h2 id="参考文献"><a href="#参考文献" class="headerlink" title="参考文献"></a>参考文献</h2><ul><li>Fernandes, D., Silva, A., Névoa, R., Simões, C., Gonzalez, D., Guevara, M., Novais, P., Monteiro, J. and Melo-Pinto, P., 2021. Pointcloud based 3D object detection and classification methods for self-driving applications: A survey and taxonomy. Information Fusion,68, pp.161-191.</li><li>Florent Lafarge, Clément Mallet. Creating large-scale city models from 3D-point clouds: a robust approach with hybrid representation. International Journal of Computer Vision, Springer Verlag, 2012, 99 (1), pp.69-85. ffhal-00759265f </li><li>Han, X.F., Jin, J.S., Wang, M.J., Jiang, W., Gao, L. and Xiao, L., 2017. A review of algorithms for filtering the 3D point cloud. Signal Processing: Image Communication, 57, pp.103-112. </li><li>Landrieu, L., &amp; Simonovsky, M. (2018). Large-scale point cloud semantic segmentation with superpoint graphs. In Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition (pp. 4558-4567). </li><li>Lin, X. and Zhang, J., 2014. Segmentation-based filtering of airborne LiDAR point clouds by progressive densification of terrain segments. Remote Sensing,6(2), pp.1294-1326.</li><li>Rabbani, T., Van Den Heuvel, F. and Vosselmann, G., 2006. Segmentation of point clouds using smoothness constraint. International archives of photogrammetry, remote sensing and spatial information sciences,36(5), pp.248-253. </li><li>Schnabel, R., Wahl, R., &amp; Klein, R. (2007, June). Efficient RANSAC for point‐cloud shape detection. In Computer graphics forum </li><li>Seif, H.G. and Hu, X., 2016. Autonomous driving in the iCity—HD maps as a key challenge of the automotive industry. Engineering, 2(2), pp.159-162</li><li>Vo, A. V., Truong-Hong, L., Laefer, D. F., &amp; Bertolotto, M. (2015). Octree-based region growing for point cloud segmentation. ISPRS Journal of Photogrammetry and Remote Sensing,104, 88-100. </li><li>Yang, B., Luo, W. and Urtasun, R., 2018. Pixor: Real-time 3d object detection from point clouds. In Proceedings of the IEEE conference on Computer Vision and Pattern Recognition (pp. 7652-7660). </li><li>Wang, N., Zhang, Y., Li, Z., Fu, Y., Liu, W. and Jiang, Y.G., 2018. Pixel2mesh: Generating 3d mesh models from single rgb images. In Proceedings of the European Conference on Computer Vision (ECCV) (pp. 52-67).</li></ul><hr><p><img src="https://img.tjzzz.com/img/waixuan.png" alt="" loading="lazy"></p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;link rel=&quot;stylesheet&quot; class=&quot;aplayer-secondary-style-marker&quot; href=&quot;\assets\css\APlayer.min.css&quot;&gt;&lt;script src=&quot;\assets\js\APlayer.min.js&quot; cla
      
    
    </summary>
    
    
      <category term="学习历程" scheme="https://www.tjzzz.com/categories/LearningExperience/"/>
    
    
      <category term="三维重建" scheme="https://www.tjzzz.com/tags/3DReconstruction/"/>
    
  </entry>
  
  <entry>
    <title>修改DCNN使其输入从无监督变为有监督模型</title>
    <link href="https://www.tjzzz.com/posts/ebdd83bb.html"/>
    <id>https://www.tjzzz.com/posts/ebdd83bb.html</id>
    <published>2021-01-06T11:32:46.000Z</published>
    <updated>2021-03-14T03:33:18.000Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="\assets\css\APlayer.min.css"><script src="\assets\js\APlayer.min.js" class="aplayer-secondary-script-marker"></script><blockquote><p>本模型是基于<a href="https://github.com/husqin/DnCNN-keras" target="_blank" rel="noopener external nofollow noreferrer">DnCNN-keras</a>进行的微小调整，主要是将其模型单输入无监督学习(输入纯净图片进行噪声添加并学习去噪)，修改成输入纯净图片与真实的噪声图片进行监督学习，使其去噪能力更为专一与准确。</p></blockquote><h3 id="main-py"><a href="#main-py" class="headerlink" title="main.py"></a>main.py</h3><p>首先对迭代函数进行修改：</p><p>原代码：</p><pre class=" language-python"><code class="language-python"><span class="token keyword">def</span> <span class="token function">train_datagen</span><span class="token punctuation">(</span>y_<span class="token punctuation">,</span> batch_size<span class="token operator">=</span><span class="token number">8</span><span class="token punctuation">)</span><span class="token punctuation">:</span>    indices <span class="token operator">=</span> list<span class="token punctuation">(</span>range<span class="token punctuation">(</span>y_<span class="token punctuation">.</span>shape<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">)</span>    <span class="token keyword">while</span><span class="token punctuation">(</span><span class="token boolean">True</span><span class="token punctuation">)</span><span class="token punctuation">:</span>        np<span class="token punctuation">.</span>random<span class="token punctuation">.</span>shuffle<span class="token punctuation">(</span>indices<span class="token punctuation">)</span>            <span class="token keyword">for</span> i <span class="token keyword">in</span> range<span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span> len<span class="token punctuation">(</span>indices<span class="token punctuation">)</span><span class="token punctuation">,</span> batch_size<span class="token punctuation">)</span><span class="token punctuation">:</span>            ge_batch_y <span class="token operator">=</span> y_<span class="token punctuation">[</span>indices<span class="token punctuation">[</span>i<span class="token punctuation">:</span>i<span class="token operator">+</span>batch_size<span class="token punctuation">]</span><span class="token punctuation">]</span>            noise <span class="token operator">=</span>  np<span class="token punctuation">.</span>random<span class="token punctuation">.</span>normal<span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span> args<span class="token punctuation">.</span>sigma<span class="token operator">/</span><span class="token number">255.0</span><span class="token punctuation">,</span> ge_batch_y<span class="token punctuation">.</span>shape<span class="token punctuation">)</span>              ge_batch_x <span class="token operator">=</span> ge_batch_y <span class="token operator">+</span> noise             <span class="token keyword">yield</span> ge_batch_x<span class="token punctuation">,</span> ge_batch_y</code></pre><p>修改后：</p><pre class=" language-python"><code class="language-python"><span class="token keyword">def</span> <span class="token function">train_datagen</span><span class="token punctuation">(</span>x_<span class="token punctuation">,</span> y_<span class="token punctuation">,</span> batch_size<span class="token operator">=</span><span class="token number">8</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token comment" spellcheck="true">#添加x_形参</span>    indices <span class="token operator">=</span> list<span class="token punctuation">(</span>range<span class="token punctuation">(</span>y_<span class="token punctuation">.</span>shape<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">)</span>    <span class="token keyword">while</span> <span class="token punctuation">(</span><span class="token boolean">True</span><span class="token punctuation">)</span><span class="token punctuation">:</span>        np<span class="token punctuation">.</span>random<span class="token punctuation">.</span>shuffle<span class="token punctuation">(</span>indices<span class="token punctuation">)</span>        <span class="token keyword">for</span> i <span class="token keyword">in</span> range<span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span> len<span class="token punctuation">(</span>indices<span class="token punctuation">)</span><span class="token punctuation">,</span> batch_size<span class="token punctuation">)</span><span class="token punctuation">:</span>            ge_batch_x <span class="token operator">=</span> x_<span class="token punctuation">[</span>indices<span class="token punctuation">[</span>i<span class="token punctuation">:</span>i <span class="token operator">+</span> batch_size<span class="token punctuation">]</span><span class="token punctuation">]</span> <span class="token comment" spellcheck="true"># 添加对x的batch处理</span>            ge_batch_y <span class="token operator">=</span> y_<span class="token punctuation">[</span>indices<span class="token punctuation">[</span>i<span class="token punctuation">:</span>i <span class="token operator">+</span> batch_size<span class="token punctuation">]</span><span class="token punctuation">]</span>            <span class="token comment" spellcheck="true"># noise =  np.random.normal(0, args.sigma/255.0, ge_batch_y.shape)    # noise</span>            <span class="token comment" spellcheck="true"># #noise =  K.random_normal(ge_batch_y.shape, mean=0, stddev=args.sigma/255.0)</span>            <span class="token comment" spellcheck="true"># ge_batch_x = ge_batch_y + noise  # input image = clean image + noise</span>            <span class="token comment" spellcheck="true">#将加噪声部分部分注释掉</span>            <span class="token keyword">yield</span> ge_batch_x<span class="token punctuation">,</span> ge_batch_y </code></pre><p>对训练函数进行修改：</p><p>原函数：</p><pre class=" language-python"><code class="language-python">ef train<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span>    data <span class="token operator">=</span> load_train_data<span class="token punctuation">(</span><span class="token punctuation">)</span>    data <span class="token operator">=</span> data<span class="token punctuation">.</span>reshape<span class="token punctuation">(</span><span class="token punctuation">(</span>data<span class="token punctuation">.</span>shape<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">,</span>data<span class="token punctuation">.</span>shape<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">,</span>data<span class="token punctuation">.</span>shape<span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">]</span><span class="token punctuation">,</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">)</span>    data <span class="token operator">=</span> data<span class="token punctuation">.</span>astype<span class="token punctuation">(</span><span class="token string">'float32'</span><span class="token punctuation">)</span><span class="token operator">/</span><span class="token number">255.0</span>    <span class="token keyword">if</span> args<span class="token punctuation">.</span>pretrain<span class="token punctuation">:</span>   model <span class="token operator">=</span> load_model<span class="token punctuation">(</span>args<span class="token punctuation">.</span>pretrain<span class="token punctuation">,</span> compile<span class="token operator">=</span><span class="token boolean">False</span><span class="token punctuation">)</span>    <span class="token keyword">else</span><span class="token punctuation">:</span>           <span class="token keyword">if</span> args<span class="token punctuation">.</span>model <span class="token operator">==</span> <span class="token string">'DnCNN'</span><span class="token punctuation">:</span> model <span class="token operator">=</span> models<span class="token punctuation">.</span>DnCNN<span class="token punctuation">(</span><span class="token punctuation">)</span>    model<span class="token punctuation">.</span>compile<span class="token punctuation">(</span>optimizer<span class="token operator">=</span>Adam<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> loss<span class="token operator">=</span><span class="token punctuation">[</span><span class="token string">'mse'</span><span class="token punctuation">]</span><span class="token punctuation">)</span>    ckpt <span class="token operator">=</span> ModelCheckpoint<span class="token punctuation">(</span>save_dir<span class="token operator">+</span><span class="token string">'/model_{epoch:02d}.h5'</span><span class="token punctuation">,</span> monitor<span class="token operator">=</span><span class="token string">'val_loss'</span><span class="token punctuation">,</span>                     verbose<span class="token operator">=</span><span class="token number">0</span><span class="token punctuation">,</span> period<span class="token operator">=</span>args<span class="token punctuation">.</span>save_every<span class="token punctuation">)</span>    csv_logger <span class="token operator">=</span> CSVLogger<span class="token punctuation">(</span>save_dir<span class="token operator">+</span><span class="token string">'/log.csv'</span><span class="token punctuation">,</span> append<span class="token operator">=</span><span class="token boolean">True</span><span class="token punctuation">,</span> separator<span class="token operator">=</span><span class="token string">','</span><span class="token punctuation">)</span>    lr <span class="token operator">=</span> LearningRateScheduler<span class="token punctuation">(</span>step_decay<span class="token punctuation">)</span>    history <span class="token operator">=</span> model<span class="token punctuation">.</span>fit_generator<span class="token punctuation">(</span>train_datagen<span class="token punctuation">(</span>data<span class="token punctuation">,</span> batch_size<span class="token operator">=</span>args<span class="token punctuation">.</span>batch_size<span class="token punctuation">)</span><span class="token punctuation">,</span>                    steps_per_epoch<span class="token operator">=</span>len<span class="token punctuation">(</span>data<span class="token punctuation">)</span><span class="token operator">//</span>args<span class="token punctuation">.</span>batch_size<span class="token punctuation">,</span> epochs<span class="token operator">=</span>args<span class="token punctuation">.</span>epoch<span class="token punctuation">,</span> verbose<span class="token operator">=</span><span class="token number">1</span><span class="token punctuation">,</span>                     callbacks<span class="token operator">=</span><span class="token punctuation">[</span>ckpt<span class="token punctuation">,</span> csv_logger<span class="token punctuation">,</span> lr<span class="token punctuation">]</span><span class="token punctuation">)</span>    <span class="token keyword">return</span> model</code></pre><p>修改后：</p><pre class=" language-python"><code class="language-python"><span class="token keyword">def</span> <span class="token function">train</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span>    datax <span class="token operator">=</span> load_train_data<span class="token punctuation">(</span>args<span class="token punctuation">.</span>train_datax<span class="token punctuation">)</span>    datax <span class="token operator">=</span> datax<span class="token punctuation">.</span>reshape<span class="token punctuation">(</span><span class="token punctuation">(</span>datax<span class="token punctuation">.</span>shape<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">,</span> datax<span class="token punctuation">.</span>shape<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">,</span> datax<span class="token punctuation">.</span>shape<span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">)</span>    datax <span class="token operator">=</span> datax<span class="token punctuation">.</span>astype<span class="token punctuation">(</span><span class="token string">'float32'</span><span class="token punctuation">)</span> <span class="token operator">/</span> <span class="token number">255.0</span>    <span class="token comment" spellcheck="true"># 复制粘贴给标签腾地方</span>    datay <span class="token operator">=</span> load_train_data<span class="token punctuation">(</span>args<span class="token punctuation">.</span>train_datay<span class="token punctuation">)</span>    datay <span class="token operator">=</span> datay<span class="token punctuation">.</span>reshape<span class="token punctuation">(</span><span class="token punctuation">(</span>datay<span class="token punctuation">.</span>shape<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">,</span> datay<span class="token punctuation">.</span>shape<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">,</span> datay<span class="token punctuation">.</span>shape<span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">)</span>    datay <span class="token operator">=</span> datay<span class="token punctuation">.</span>astype<span class="token punctuation">(</span><span class="token string">'float32'</span><span class="token punctuation">)</span> <span class="token operator">/</span> <span class="token number">255.0</span>    <span class="token keyword">if</span> args<span class="token punctuation">.</span>pretrain<span class="token punctuation">:</span>        model <span class="token operator">=</span> load_model<span class="token punctuation">(</span>args<span class="token punctuation">.</span>pretrain<span class="token punctuation">,</span> compile<span class="token operator">=</span><span class="token boolean">False</span><span class="token punctuation">)</span>    <span class="token keyword">else</span><span class="token punctuation">:</span>        <span class="token keyword">if</span> args<span class="token punctuation">.</span>model <span class="token operator">==</span> <span class="token string">'DnCNN'</span><span class="token punctuation">:</span> model <span class="token operator">=</span> models<span class="token punctuation">.</span>DnCNN<span class="token punctuation">(</span><span class="token punctuation">)</span>    model<span class="token punctuation">.</span>compile<span class="token punctuation">(</span>optimizer<span class="token operator">=</span>Adam<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> loss<span class="token operator">=</span><span class="token punctuation">[</span><span class="token string">'mse'</span><span class="token punctuation">]</span><span class="token punctuation">)</span>    ckpt <span class="token operator">=</span> ModelCheckpoint<span class="token punctuation">(</span>save_dir <span class="token operator">+</span> <span class="token string">'/model_{epoch:02d}.h5'</span><span class="token punctuation">,</span> monitor<span class="token operator">=</span><span class="token string">'val_loss'</span><span class="token punctuation">,</span>                           verbose<span class="token operator">=</span><span class="token number">0</span><span class="token punctuation">,</span> period<span class="token operator">=</span>args<span class="token punctuation">.</span>save_every<span class="token punctuation">)</span>    csv_logger <span class="token operator">=</span> CSVLogger<span class="token punctuation">(</span>save_dir <span class="token operator">+</span> <span class="token string">'/log.csv'</span><span class="token punctuation">,</span> append<span class="token operator">=</span><span class="token boolean">True</span><span class="token punctuation">,</span> separator<span class="token operator">=</span><span class="token string">','</span><span class="token punctuation">)</span>    lr <span class="token operator">=</span> LearningRateScheduler<span class="token punctuation">(</span>step_decay<span class="token punctuation">)</span>    history <span class="token operator">=</span> model<span class="token punctuation">.</span>fit_generator<span class="token punctuation">(</span>train_datagen<span class="token punctuation">(</span>datax<span class="token punctuation">,</span> datay<span class="token punctuation">,</span> batch_size<span class="token operator">=</span>args<span class="token punctuation">.</span>batch_size<span class="token punctuation">)</span><span class="token punctuation">,</span>                                  steps_per_epoch<span class="token operator">=</span>len<span class="token punctuation">(</span>datax<span class="token punctuation">)</span> <span class="token operator">//</span> args<span class="token punctuation">.</span>batch_size<span class="token punctuation">,</span> epochs<span class="token operator">=</span>args<span class="token punctuation">.</span>epoch<span class="token punctuation">,</span> verbose<span class="token operator">=</span><span class="token number">1</span><span class="token punctuation">,</span>                                  callbacks<span class="token operator">=</span><span class="token punctuation">[</span>ckpt<span class="token punctuation">,</span> csv_logger<span class="token punctuation">,</span> lr<span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token comment" spellcheck="true"># 添加输入对应形参</span>    <span class="token keyword">return</span> model</code></pre><p>修改测试函数：</p><p>原函数：</p><pre class=" language-python"><code class="language-python"><span class="token keyword">def</span> <span class="token function">test</span><span class="token punctuation">(</span>model<span class="token punctuation">)</span><span class="token punctuation">:</span>  <span class="token comment" spellcheck="true"># 略</span>    file_list <span class="token operator">=</span> glob<span class="token punctuation">.</span>glob<span class="token punctuation">(</span><span class="token string">'{}/*.png'</span><span class="token punctuation">.</span>format<span class="token punctuation">(</span>args<span class="token punctuation">.</span>test_dir<span class="token punctuation">)</span><span class="token punctuation">)</span>    <span class="token keyword">for</span> file <span class="token keyword">in</span> file_list<span class="token punctuation">:</span>        <span class="token comment" spellcheck="true"># read image</span>        img_clean <span class="token operator">=</span> np<span class="token punctuation">.</span>array<span class="token punctuation">(</span>Image<span class="token punctuation">.</span>open<span class="token punctuation">(</span>file<span class="token punctuation">)</span><span class="token punctuation">,</span> dtype<span class="token operator">=</span><span class="token string">'float32'</span><span class="token punctuation">)</span> <span class="token operator">/</span> <span class="token number">255.0</span>        img_test <span class="token operator">=</span> img_clean <span class="token operator">+</span> np<span class="token punctuation">.</span>random<span class="token punctuation">.</span>normal<span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span> args<span class="token punctuation">.</span>sigma<span class="token operator">/</span><span class="token number">255.0</span><span class="token punctuation">,</span> img_clean<span class="token punctuation">.</span>shape<span class="token punctuation">)</span>        img_test <span class="token operator">=</span> img_test<span class="token punctuation">.</span>astype<span class="token punctuation">(</span><span class="token string">'float32'</span><span class="token punctuation">)</span>        <span class="token comment" spellcheck="true"># predict</span>  <span class="token comment" spellcheck="true"># 略</span>    pd<span class="token punctuation">.</span>DataFrame<span class="token punctuation">(</span><span class="token punctuation">{</span><span class="token string">'name'</span><span class="token punctuation">:</span>np<span class="token punctuation">.</span>array<span class="token punctuation">(</span>name<span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token string">'psnr'</span><span class="token punctuation">:</span>np<span class="token punctuation">.</span>array<span class="token punctuation">(</span>psnr<span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token string">'ssim'</span><span class="token punctuation">:</span>np<span class="token punctuation">.</span>array<span class="token punctuation">(</span>ssim<span class="token punctuation">)</span><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">.</span>to_csv<span class="token punctuation">(</span>out_dir<span class="token operator">+</span><span class="token string">'/metrics.csv'</span><span class="token punctuation">,</span> index<span class="token operator">=</span><span class="token boolean">True</span><span class="token punctuation">)</span></code></pre><p>修改后：</p><pre class=" language-python"><code class="language-python"><span class="token keyword">def</span> <span class="token function">test</span><span class="token punctuation">(</span>model<span class="token punctuation">)</span><span class="token punctuation">:</span>  <span class="token comment" spellcheck="true"># 略</span>    file_list <span class="token operator">=</span> glob<span class="token punctuation">.</span>glob<span class="token punctuation">(</span><span class="token string">'{}/*.png'</span><span class="token punctuation">.</span>format<span class="token punctuation">(</span>args<span class="token punctuation">.</span>test_dir<span class="token punctuation">)</span><span class="token punctuation">)</span>    <span class="token keyword">for</span> file <span class="token keyword">in</span> file_list<span class="token punctuation">:</span>        <span class="token comment" spellcheck="true"># read image</span>        img_clean <span class="token operator">=</span> np<span class="token punctuation">.</span>array<span class="token punctuation">(</span>Image<span class="token punctuation">.</span>open<span class="token punctuation">(</span>file<span class="token punctuation">)</span><span class="token punctuation">,</span> dtype<span class="token operator">=</span><span class="token string">'float32'</span><span class="token punctuation">)</span> <span class="token operator">/</span> <span class="token number">255.0</span>        <span class="token comment" spellcheck="true"># img_test = img_clean + np.random.normal(0, args.sigma / 255.0, img_clean.shape)</span>        <span class="token comment" spellcheck="true"># 将噪声注释掉</span>        img_test <span class="token operator">=</span> img_clean<span class="token punctuation">.</span>astype<span class="token punctuation">(</span><span class="token string">'float32'</span><span class="token punctuation">)</span>        <span class="token comment" spellcheck="true"># predict</span>  <span class="token comment" spellcheck="true"># 略</span>    pd<span class="token punctuation">.</span>DataFrame<span class="token punctuation">(</span><span class="token punctuation">{</span><span class="token string">'name'</span><span class="token punctuation">:</span>np<span class="token punctuation">.</span>array<span class="token punctuation">(</span>name<span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token string">'psnr'</span><span class="token punctuation">:</span>np<span class="token punctuation">.</span>array<span class="token punctuation">(</span>psnr<span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token string">'ssim'</span><span class="token punctuation">:</span>np<span class="token punctuation">.</span>array<span class="token punctuation">(</span>ssim<span class="token punctuation">)</span><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">.</span>to_csv<span class="token punctuation">(</span>out_dir<span class="token operator">+</span><span class="token string">'/metrics.csv'</span><span class="token punctuation">,</span> index<span class="token operator">=</span><span class="token boolean">True</span><span class="token punctuation">)</span></code></pre><p>对应train函数，添加预设dir：</p><pre class=" language-python"><code class="language-python">parser<span class="token punctuation">.</span>add_argument<span class="token punctuation">(</span><span class="token string">'--train_datax'</span><span class="token punctuation">,</span> default<span class="token operator">=</span><span class="token string">'./data/npy_data/x.npy'</span><span class="token punctuation">,</span> type<span class="token operator">=</span>str<span class="token punctuation">,</span> help<span class="token operator">=</span><span class="token string">'path of train data'</span><span class="token punctuation">)</span>parser<span class="token punctuation">.</span>add_argument<span class="token punctuation">(</span><span class="token string">'--train_datay'</span><span class="token punctuation">,</span> default<span class="token operator">=</span><span class="token string">'./data/npy_data/y.npy'</span><span class="token punctuation">,</span> type<span class="token operator">=</span>str<span class="token punctuation">,</span> help<span class="token operator">=</span><span class="token string">'path of train data'</span><span class="token punctuation">)</span></code></pre><h3 id="data-py"><a href="#data-py" class="headerlink" title="data.py"></a>data.py</h3><p>分别打包噪声图片和标签就好了。</p><p>还没有跑这个模型，如果失败了会过来继续修改文章。</p><p>如果成功了，那就当做一篇记录自己修改(学长帮助)模型的经验记录吧。</p><hr><p><img src="https://img.tjzzz.com/img/waixuan.png" alt="" loading="lazy"></p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;link rel=&quot;stylesheet&quot; class=&quot;aplayer-secondary-style-marker&quot; href=&quot;\assets\css\APlayer.min.css&quot;&gt;&lt;script src=&quot;\assets\js\APlayer.min.js&quot; cla
      
    
    </summary>
    
    
      <category term="学习历程" scheme="https://www.tjzzz.com/categories/LearningExperience/"/>
    
    
      <category term="深度学习" scheme="https://www.tjzzz.com/tags/DeepLearning/"/>
    
      <category term="python" scheme="https://www.tjzzz.com/tags/python/"/>
    
      <category term="pytorch" scheme="https://www.tjzzz.com/tags/pytorch/"/>
    
  </entry>
  
  <entry>
    <title>茫茫摄影路：好照片的基本三要素</title>
    <link href="https://www.tjzzz.com/posts/ea6625ec.html"/>
    <id>https://www.tjzzz.com/posts/ea6625ec.html</id>
    <published>2021-01-06T01:52:15.000Z</published>
    <updated>2021-01-06T02:06:30.000Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="\assets\css\APlayer.min.css"><script src="\assets\js\APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>一张好的照片明暗合适，画面清晰，色彩合理，下面就这三个点来分别讲解一张好的照片是如何创作出来的。</p><h1 id="明暗？曝光！"><a href="#明暗？曝光！" class="headerlink" title="明暗？曝光！"></a>明暗？曝光！</h1><h2 id="曝光及曝光三要素"><a href="#曝光及曝光三要素" class="headerlink" title="曝光及曝光三要素"></a>曝光及曝光三要素</h2><p>曝光：<strong>光线进入相机的过程</strong></p><p>控制照片明暗参数-曝光三要素：<strong>光圈，快门，感光度ISO</strong></p><h3 id="光圈"><a href="#光圈" class="headerlink" title="光圈"></a>光圈</h3><p>由一组叶片组成，叶片中间会形成通光孔。</p><p>可以想象光圈就是水龙头，光线就是水流。</p><p>光圈的表示形式为F*，F后面的数字越小，代表光圈越大。</p><p>对拍照的影响：</p><ul><li>光圈越大，虚化越好。</li></ul><h3 id="快门"><a href="#快门" class="headerlink" title="快门"></a>快门</h3><p>类似于卷帘门，通过控制叶片的打开时间来控制相机进光量。</p><p>长快门可以拉丝。如图：</p><p><img src="https://img.tjzzz.com/img/20210104101246.jpeg" alt="长快门拉丝效果图" loading="lazy"></p><h3 id="感光度"><a href="#感光度" class="headerlink" title="感光度"></a>感光度</h3><p>感光度，顾名思义，感光度越高对于光线越敏感。</p><p>光圈与快门一定的情况下，进入相机的光线总量是一样的，所以感光元件对于光线的敏感程度最后决定了照片的明暗程度也就是曝光度。</p><p>对照片影响：ISO越高，噪点越明显。</p><p><strong>ISO越低越好</strong></p><p>那么何时使用高ISO呢？</p><ul><li>夜间手持拍摄，因为长时快门对于相机抖动十分敏感，所以应该小快门，大ISO。</li><li>抓拍运动物体，因为长快门对于物体的瞬间姿态无法捕捉，所以拍摄运动物体应该短快门，如果此时光线不足并且光圈最大，应该最后调节ISO达到合适明暗程度。</li><li>使用长焦镜头拍摄的时候，相机的轻微抖动很容易模糊，所以应该调节ISO。</li></ul><h3 id="三者之间的关系"><a href="#三者之间的关系" class="headerlink" title="三者之间的关系"></a>三者之间的关系</h3><p>在ISO尽量小的情况下(100-200)，应该优先考虑快门和光圈的调节。</p><p>用水龙头表示就是：</p><ul><li>阀门打开的大小-光圈大小</li><li>水流的时间-快门时间</li><li>水流出的总量-进光量</li></ul><p>刚刚好接满一杯水，就是一张好的照片。</p><p>光圈和快门是此消彼长的。</p><ul><li><p>光圈越大，快门越短，背景虚化越好。</p></li><li><p>光圈越小，快门越大，背景越没有虚化。</p></li></ul><h3 id="曝光模式"><a href="#曝光模式" class="headerlink" title="曝光模式"></a>曝光模式</h3><p>日常常用的几种曝光模式：</p><ul><li>A+全自动模式：傻瓜模式，没有任何发挥的空间，与手机摄影无异。有时因为手机先进的软件功能，可能相机的自动模式不如手机。</li><li>P程序自动模式：加强版傻瓜模式，适合新手使用。可以适用于突发状况。</li><li>TV快门优先模式：抓拍或者长快门可使用此模式。</li><li><strong>Av光圈优先模式</strong>：可以手动设置光圈和ISO，相机会自动匹配快门时间。利用虚化效果的时候或者风景的时候应该采用此模式。</li><li>M全手动模式：相机中应该会有曝光指示表，一般是-2–2,0为曝光正确，需要拥有丰富的拍摄经验，新手基本上用不到，用到了也没A模式好……</li><li>SCN场景自动模式：相机自己设定的，比如人像，风景，运动模式，不太建议使用。</li></ul><h2 id="测光模式"><a href="#测光模式" class="headerlink" title="测光模式"></a>测光模式</h2><p>相机对于周围光线的侦测“</p><ul><li><strong>评价测光(矩阵测光，多重测光)</strong></li><li>局部测光</li><li><strong>点测光</strong></li><li>中央重点平均测光</li></ul><h3 id="评价测光"><a href="#评价测光" class="headerlink" title="评价测光"></a>评价测光</h3><p>相机会把整个取景画面分成若干个区域，分别测光，对各个区域的亮度值取平均数以此值为基准。</p><h3 id="点测光"><a href="#点测光" class="headerlink" title="点测光"></a>点测光</h3><p>对一个点进行测光，拍摄逆光环境，如果均衡测光会出现大黑脸状况，所以需要具体针对脸进行测光。</p><h2 id="曝光补偿"><a href="#曝光补偿" class="headerlink" title="曝光补偿"></a>曝光补偿</h2><p>对画面亮度进行补偿，在半自动模式下可以手动调节曝光补偿表。</p><p>应用场景：比如拍摄较黑的物体时，相机会自动调亮场景，此时曝光是不正确的，拍出来的物体是偏灰的，所以需要手动调节曝光补偿表。</p><p><strong>白加黑减</strong></p><ul><li><p>拍摄小清新的照片的时候可以适当增加曝光补偿。</p></li><li><p>拍摄剪影照片的时候可以适当减少曝光补偿。</p></li></ul><p><strong>灵活</strong></p><h1 id="清晰？对焦！"><a href="#清晰？对焦！" class="headerlink" title="清晰？对焦！"></a>清晰？对焦！</h1><p>手机对焦：点那儿对那儿</p><p>相机对焦：支持触屏，绝大多数情况是半按快门对焦</p><h2 id="对焦区域"><a href="#对焦区域" class="headerlink" title="对焦区域"></a>对焦区域</h2><ul><li>单点自动对焦：适合拍人，手动选择一个点对焦，精确度最高。</li><li>45点自动对焦：相机自动选择，对焦精确度会有所下降。</li><li>区域自动对焦/大区域自动对焦：将所有对焦点分成不同区域，相机会自动选择区域中的点自动对焦。精度介于上面两个之间，适合拍摄运动物体。</li></ul><h2 id="对焦模式"><a href="#对焦模式" class="headerlink" title="对焦模式"></a>对焦模式</h2><p>对焦模式分为自动对焦(AF)和手动对焦(MF)。</p><h3 id="自动对焦"><a href="#自动对焦" class="headerlink" title="自动对焦"></a>自动对焦</h3><p>半按快门自动拍摄。</p><p>对焦模式：</p><ul><li>单次自动对焦:拍人，只对焦一次</li><li>人工智能自动对焦(连续伺服AF)：拍运动物体，保持运动物体自动跟随对焦</li><li>人工智能伺服自动对焦(自动AF)：前两种的结合，拍摄小宝宝，物体运动不规则，此时应该选择这个模式，会在1,2模式无缝切换</li></ul><h3 id="手动对焦"><a href="#手动对焦" class="headerlink" title="手动对焦"></a>手动对焦</h3><p>镜头前端会有一个对焦环，缓慢的旋转使被摄物体最清晰，即可按下快门拍摄。</p><p>一般会按下放大镜进行放大拍摄对焦。</p><p>应用于：</p><ul><li>光线暗</li><li>大逆光</li><li>拍摄光斑</li></ul><h1 id="色彩？白平衡！"><a href="#色彩？白平衡！" class="headerlink" title="色彩？白平衡！"></a>色彩？白平衡！</h1><p>白平衡基本意义：不管在什么环境下，都能将白色还原成白色。</p><p>在自然光下，拍摄物体是原本的颜色，但在暖光下可能物体会发黄，所以需要调整白平衡。</p><p>在什么光源下选择什么白平衡即可。</p><p>大部分设置为自动白平衡即可，在特殊情况下，可以手动设置来调节相片的色调。</p><hr><p><img src="https://img.tjzzz.com/img/waixuan.png" alt="" loading="lazy"></p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;link rel=&quot;stylesheet&quot; class=&quot;aplayer-secondary-style-marker&quot; href=&quot;\assets\css\APlayer.min.css&quot;&gt;&lt;script src=&quot;\assets\js\APlayer.min.js&quot; cla
      
    
    </summary>
    
    
      <category term="摄影之路" scheme="https://www.tjzzz.com/categories/photography/"/>
    
    
      <category term="摄影技巧" scheme="https://www.tjzzz.com/tags/PhotoSkills/"/>
    
  </entry>
  
  <entry>
    <title>pytorch学习日记：创建Tensor</title>
    <link href="https://www.tjzzz.com/posts/1041bc79.html"/>
    <id>https://www.tjzzz.com/posts/1041bc79.html</id>
    <published>2021-01-06T01:49:33.000Z</published>
    <updated>2021-01-06T02:04:25.000Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="\assets\css\APlayer.min.css"><script src="\assets\js\APlayer.min.js" class="aplayer-secondary-script-marker"></script><h2 id="import-from-Numpy"><a href="#import-from-Numpy" class="headerlink" title="import from Numpy"></a>import from Numpy</h2><pre class=" language-python"><code class="language-python"><span class="token operator">>></span><span class="token operator">></span> a<span class="token operator">=</span>np<span class="token punctuation">.</span>array<span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">,</span><span class="token number">3.3</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token operator">>></span><span class="token operator">></span> torch<span class="token punctuation">.</span>from_numpy<span class="token punctuation">(</span>a<span class="token punctuation">)</span>tensor<span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token number">2.0000</span><span class="token punctuation">,</span> <span class="token number">3.3000</span><span class="token punctuation">]</span><span class="token punctuation">,</span> dtype<span class="token operator">=</span>torch<span class="token punctuation">.</span>float64<span class="token punctuation">)</span><span class="token operator">>></span><span class="token operator">></span> a<span class="token operator">=</span>np<span class="token punctuation">.</span>ones<span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">,</span><span class="token number">3</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token operator">>></span><span class="token operator">></span> torch<span class="token punctuation">.</span>from_numpy<span class="token punctuation">(</span>a<span class="token punctuation">)</span>tensor<span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">.</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">.</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">.</span><span class="token punctuation">]</span><span class="token punctuation">,</span>        <span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">.</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">.</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">.</span><span class="token punctuation">]</span><span class="token punctuation">]</span><span class="token punctuation">,</span> dtype<span class="token operator">=</span>torch<span class="token punctuation">.</span>float64<span class="token punctuation">)</span></code></pre><h2 id="import-from-List"><a href="#import-from-List" class="headerlink" title="import from List"></a>import from List</h2><pre class=" language-python"><code class="language-python"><span class="token operator">>></span><span class="token operator">></span> torch<span class="token punctuation">.</span>tensor<span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">,</span><span class="token number">3.2</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token comment" spellcheck="true">#torch.tensor接受现有数据，Tensor和FloatTensor接受一个shape(数据的维度)</span>tensor<span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token number">2.0000</span><span class="token punctuation">,</span> <span class="token number">3.2000</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token operator">>></span><span class="token operator">></span> torch<span class="token punctuation">.</span>FloatTensor<span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">.</span><span class="token punctuation">,</span><span class="token number">3.2</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token comment" spellcheck="true">#尽量不要使用</span>tensor<span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token number">2.0000</span><span class="token punctuation">,</span> <span class="token number">3.2000</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token operator">>></span><span class="token operator">></span> torch<span class="token punctuation">.</span>tensor<span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">,</span><span class="token number">3.2</span><span class="token punctuation">]</span><span class="token punctuation">)</span>tensor<span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token number">2.0000</span><span class="token punctuation">,</span> <span class="token number">3.2000</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token operator">>></span><span class="token operator">></span> torch<span class="token punctuation">.</span>tensor<span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">,</span><span class="token number">3.2</span><span class="token punctuation">]</span><span class="token punctuation">,</span><span class="token punctuation">[</span><span class="token number">3.2</span><span class="token punctuation">,</span><span class="token number">1</span><span class="token punctuation">.</span><span class="token punctuation">]</span><span class="token punctuation">]</span><span class="token punctuation">)</span>tensor<span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token punctuation">[</span><span class="token number">2.0000</span><span class="token punctuation">,</span> <span class="token number">3.2000</span><span class="token punctuation">]</span><span class="token punctuation">,</span>        <span class="token punctuation">[</span><span class="token number">3.2000</span><span class="token punctuation">,</span> <span class="token number">1.0000</span><span class="token punctuation">]</span><span class="token punctuation">]</span><span class="token punctuation">)</span></code></pre><h2 id="uninitialized"><a href="#uninitialized" class="headerlink" title="uninitialized"></a>uninitialized</h2><ul><li>Torch.empty()</li><li>Torch.FloatTensor(d1,d2,d3)<ul><li>Not torch.FloatTensor([1,2])=torch.tensor([1,2])</li></ul></li><li>Torch.IntTensor(d1,d2,d3)</li></ul><pre class=" language-python"><code class="language-python"><span class="token operator">>></span><span class="token operator">></span> torch<span class="token punctuation">.</span>empty<span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span>tensor<span class="token punctuation">(</span><span class="token punctuation">[</span>nan<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token operator">>></span><span class="token operator">></span> torch<span class="token punctuation">.</span>Tensor<span class="token punctuation">(</span><span class="token number">2</span><span class="token punctuation">,</span><span class="token number">3</span><span class="token punctuation">)</span>tensor<span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">.</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">.</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">.</span><span class="token punctuation">]</span><span class="token punctuation">,</span>        <span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">.</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">.</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">.</span><span class="token punctuation">]</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token operator">>></span><span class="token operator">></span> torch<span class="token punctuation">.</span>IntTensor<span class="token punctuation">(</span><span class="token number">2</span><span class="token punctuation">,</span><span class="token number">3</span><span class="token punctuation">)</span>tensor<span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token punctuation">[</span><span class="token number">1064135033</span><span class="token punctuation">,</span> <span class="token number">1056173720</span><span class="token punctuation">,</span> <span class="token number">1064928610</span><span class="token punctuation">]</span><span class="token punctuation">,</span>        <span class="token punctuation">[</span><span class="token number">1038606400</span><span class="token punctuation">,</span> <span class="token number">1060693140</span><span class="token punctuation">,</span> <span class="token number">1040603820</span><span class="token punctuation">]</span><span class="token punctuation">]</span><span class="token punctuation">,</span> dtype<span class="token operator">=</span>torch<span class="token punctuation">.</span>int32<span class="token punctuation">)</span><span class="token operator">>></span><span class="token operator">></span> torch<span class="token punctuation">.</span>FloatTensor<span class="token punctuation">(</span><span class="token number">2</span><span class="token punctuation">,</span><span class="token number">3</span><span class="token punctuation">)</span>tensor<span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">.</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">.</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">.</span><span class="token punctuation">]</span><span class="token punctuation">,</span>        <span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">.</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">.</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">.</span><span class="token punctuation">]</span><span class="token punctuation">]</span><span class="token punctuation">)</span></code></pre><ul><li>后续要使用其他数据覆盖掉未初始化数据</li></ul><h2 id="set-default-type"><a href="#set-default-type" class="headerlink" title="set default type"></a>set default type</h2><pre class=" language-python"><code class="language-python"><span class="token operator">>></span><span class="token operator">></span> torch<span class="token punctuation">.</span>tensor<span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token number">1.2</span><span class="token punctuation">,</span><span class="token number">3</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">.</span>type<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token string">'torch.FloatTensor'</span><span class="token operator">>></span><span class="token operator">></span> torch<span class="token punctuation">.</span>set_default_tensor_type<span class="token punctuation">(</span>torch<span class="token punctuation">.</span>DoubleTensor<span class="token punctuation">)</span><span class="token operator">>></span><span class="token operator">></span> torch<span class="token punctuation">.</span>tensor<span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token number">1.2</span><span class="token punctuation">,</span><span class="token number">3</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">.</span>type<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token string">'torch.DoubleTensor'</span></code></pre><h2 id="rand-rand-like-randint"><a href="#rand-rand-like-randint" class="headerlink" title="rand/rand_like,randint"></a>rand/rand_like,randint</h2><ul><li><p>rand产生不包括1</p><pre class=" language-python"><code class="language-python"><span class="token operator">>></span><span class="token operator">></span> a<span class="token operator">=</span>torch<span class="token punctuation">.</span>rand<span class="token punctuation">(</span><span class="token number">3</span><span class="token punctuation">,</span><span class="token number">3</span><span class="token punctuation">)</span><span class="token operator">>></span><span class="token operator">></span> atensor<span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token punctuation">[</span><span class="token number">0.4744</span><span class="token punctuation">,</span> <span class="token number">0.7030</span><span class="token punctuation">,</span> <span class="token number">0.8309</span><span class="token punctuation">]</span><span class="token punctuation">,</span>        <span class="token punctuation">[</span><span class="token number">0.7480</span><span class="token punctuation">,</span> <span class="token number">0.0447</span><span class="token punctuation">,</span> <span class="token number">0.8336</span><span class="token punctuation">]</span><span class="token punctuation">,</span>        <span class="token punctuation">[</span><span class="token number">0.7141</span><span class="token punctuation">,</span> <span class="token number">0.0262</span><span class="token punctuation">,</span> <span class="token number">0.5663</span><span class="token punctuation">]</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token operator">>></span><span class="token operator">></span> torch<span class="token punctuation">.</span>rand_like<span class="token punctuation">(</span>a<span class="token punctuation">)</span>tensor<span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token punctuation">[</span><span class="token number">0.4703</span><span class="token punctuation">,</span> <span class="token number">0.5290</span><span class="token punctuation">,</span> <span class="token number">0.2008</span><span class="token punctuation">]</span><span class="token punctuation">,</span>        <span class="token punctuation">[</span><span class="token number">0.7135</span><span class="token punctuation">,</span> <span class="token number">0.9063</span><span class="token punctuation">,</span> <span class="token number">0.4426</span><span class="token punctuation">]</span><span class="token punctuation">,</span>        <span class="token punctuation">[</span><span class="token number">0.0830</span><span class="token punctuation">,</span> <span class="token number">0.7966</span><span class="token punctuation">,</span> <span class="token number">0.8128</span><span class="token punctuation">]</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token operator">>></span><span class="token operator">></span> torch<span class="token punctuation">.</span>randint<span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">,</span><span class="token number">10</span><span class="token punctuation">,</span><span class="token punctuation">[</span><span class="token number">3</span><span class="token punctuation">,</span><span class="token number">3</span><span class="token punctuation">]</span><span class="token punctuation">)</span>tensor<span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token punctuation">[</span><span class="token number">8</span><span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">4</span><span class="token punctuation">]</span><span class="token punctuation">,</span>        <span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">5</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">,</span>        <span class="token punctuation">[</span><span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">5</span><span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">]</span><span class="token punctuation">]</span><span class="token punctuation">)</span></code></pre></li></ul><h2 id="randn"><a href="#randn" class="headerlink" title="randn"></a>randn</h2><pre class=" language-python"><code class="language-python"><span class="token operator">>></span><span class="token operator">></span> torch<span class="token punctuation">.</span>randn<span class="token punctuation">(</span><span class="token number">3</span><span class="token punctuation">,</span><span class="token number">3</span><span class="token punctuation">)</span><span class="token comment" spellcheck="true">#均值为0，方差为1</span>tensor<span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token punctuation">[</span> <span class="token number">0.4364</span><span class="token punctuation">,</span>  <span class="token number">0.0172</span><span class="token punctuation">,</span>  <span class="token number">1.0050</span><span class="token punctuation">]</span><span class="token punctuation">,</span>        <span class="token punctuation">[</span> <span class="token number">0.2373</span><span class="token punctuation">,</span> <span class="token operator">-</span><span class="token number">2.0858</span><span class="token punctuation">,</span> <span class="token operator">-</span><span class="token number">0.9249</span><span class="token punctuation">]</span><span class="token punctuation">,</span>        <span class="token punctuation">[</span> <span class="token number">0.8681</span><span class="token punctuation">,</span>  <span class="token number">1.2555</span><span class="token punctuation">,</span> <span class="token operator">-</span><span class="token number">1.0074</span><span class="token punctuation">]</span><span class="token punctuation">]</span><span class="token punctuation">)</span></code></pre><h2 id="full"><a href="#full" class="headerlink" title="full"></a>full</h2><pre class=" language-python"><code class="language-python"><span class="token operator">>></span><span class="token operator">></span> torch<span class="token punctuation">.</span>full<span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">,</span><span class="token number">3</span><span class="token punctuation">]</span><span class="token punctuation">,</span><span class="token number">7</span><span class="token punctuation">)</span>tensor<span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token punctuation">[</span><span class="token number">7</span><span class="token punctuation">,</span> <span class="token number">7</span><span class="token punctuation">,</span> <span class="token number">7</span><span class="token punctuation">]</span><span class="token punctuation">,</span>        <span class="token punctuation">[</span><span class="token number">7</span><span class="token punctuation">,</span> <span class="token number">7</span><span class="token punctuation">,</span> <span class="token number">7</span><span class="token punctuation">]</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token operator">>></span><span class="token operator">></span> torch<span class="token punctuation">.</span>full<span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">,</span><span class="token number">7</span><span class="token punctuation">)</span>tensor<span class="token punctuation">(</span><span class="token number">7</span><span class="token punctuation">)</span><span class="token operator">>></span><span class="token operator">></span> torch<span class="token punctuation">.</span>full<span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">,</span><span class="token number">7</span><span class="token punctuation">)</span>tensor<span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token number">7</span><span class="token punctuation">]</span><span class="token punctuation">)</span></code></pre><h2 id="arange-range"><a href="#arange-range" class="headerlink" title="arange/range"></a>arange/range</h2><pre class=" language-python"><code class="language-python"><span class="token operator">>></span><span class="token operator">></span> torch<span class="token punctuation">.</span>arange<span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span><span class="token number">10</span><span class="token punctuation">)</span>tensor<span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">4</span><span class="token punctuation">,</span> <span class="token number">5</span><span class="token punctuation">,</span> <span class="token number">6</span><span class="token punctuation">,</span> <span class="token number">7</span><span class="token punctuation">,</span> <span class="token number">8</span><span class="token punctuation">,</span> <span class="token number">9</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token operator">>></span><span class="token operator">></span> torch<span class="token punctuation">.</span>arange<span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span><span class="token number">10</span><span class="token punctuation">,</span><span class="token number">2</span><span class="token punctuation">)</span>tensor<span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">4</span><span class="token punctuation">,</span> <span class="token number">6</span><span class="token punctuation">,</span> <span class="token number">8</span><span class="token punctuation">]</span><span class="token punctuation">)</span></code></pre><h2 id="linspace-logspace"><a href="#linspace-logspace" class="headerlink" title="linspace/logspace"></a>linspace/logspace</h2><pre class=" language-python"><code class="language-python"><span class="token operator">>></span><span class="token operator">></span> torch<span class="token punctuation">.</span>linspace<span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span><span class="token number">10</span><span class="token punctuation">,</span>steps<span class="token operator">=</span><span class="token number">4</span><span class="token punctuation">)</span>tensor<span class="token punctuation">(</span><span class="token punctuation">[</span> <span class="token number">0.0000</span><span class="token punctuation">,</span>  <span class="token number">3.3333</span><span class="token punctuation">,</span>  <span class="token number">6.6667</span><span class="token punctuation">,</span> <span class="token number">10.0000</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token operator">>></span><span class="token operator">></span> torch<span class="token punctuation">.</span>linspace<span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span><span class="token number">10</span><span class="token punctuation">,</span>steps<span class="token operator">=</span><span class="token number">10</span><span class="token punctuation">)</span>tensor<span class="token punctuation">(</span><span class="token punctuation">[</span> <span class="token number">0.0000</span><span class="token punctuation">,</span>  <span class="token number">1.1111</span><span class="token punctuation">,</span>  <span class="token number">2.2222</span><span class="token punctuation">,</span>  <span class="token number">3.3333</span><span class="token punctuation">,</span>  <span class="token number">4.4444</span><span class="token punctuation">,</span>  <span class="token number">5.5556</span><span class="token punctuation">,</span>  <span class="token number">6.6667</span><span class="token punctuation">,</span>  <span class="token number">7.7778</span><span class="token punctuation">,</span>         <span class="token number">8.8889</span><span class="token punctuation">,</span> <span class="token number">10.0000</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token operator">>></span><span class="token operator">></span> torch<span class="token punctuation">.</span>linspace<span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span><span class="token number">10</span><span class="token punctuation">,</span>steps<span class="token operator">=</span><span class="token number">11</span><span class="token punctuation">)</span>tensor<span class="token punctuation">(</span><span class="token punctuation">[</span> <span class="token number">0</span><span class="token punctuation">.</span><span class="token punctuation">,</span>  <span class="token number">1</span><span class="token punctuation">.</span><span class="token punctuation">,</span>  <span class="token number">2</span><span class="token punctuation">.</span><span class="token punctuation">,</span>  <span class="token number">3</span><span class="token punctuation">.</span><span class="token punctuation">,</span>  <span class="token number">4</span><span class="token punctuation">.</span><span class="token punctuation">,</span>  <span class="token number">5</span><span class="token punctuation">.</span><span class="token punctuation">,</span>  <span class="token number">6</span><span class="token punctuation">.</span><span class="token punctuation">,</span>  <span class="token number">7</span><span class="token punctuation">.</span><span class="token punctuation">,</span>  <span class="token number">8</span><span class="token punctuation">.</span><span class="token punctuation">,</span>  <span class="token number">9</span><span class="token punctuation">.</span><span class="token punctuation">,</span> <span class="token number">10</span><span class="token punctuation">.</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token operator">>></span><span class="token operator">></span> torch<span class="token punctuation">.</span>linspace<span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span><span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">,</span>steps<span class="token operator">=</span><span class="token number">10</span><span class="token punctuation">)</span>tensor<span class="token punctuation">(</span><span class="token punctuation">[</span> <span class="token number">0.0000</span><span class="token punctuation">,</span> <span class="token operator">-</span><span class="token number">0.1111</span><span class="token punctuation">,</span> <span class="token operator">-</span><span class="token number">0.2222</span><span class="token punctuation">,</span> <span class="token operator">-</span><span class="token number">0.3333</span><span class="token punctuation">,</span> <span class="token operator">-</span><span class="token number">0.4444</span><span class="token punctuation">,</span> <span class="token operator">-</span><span class="token number">0.5556</span><span class="token punctuation">,</span> <span class="token operator">-</span><span class="token number">0.6667</span><span class="token punctuation">,</span> <span class="token operator">-</span><span class="token number">0.7778</span><span class="token punctuation">,</span>        <span class="token operator">-</span><span class="token number">0.8889</span><span class="token punctuation">,</span> <span class="token operator">-</span><span class="token number">1.0000</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token operator">>></span><span class="token operator">></span> <span class="token comment" spellcheck="true">#生成10的0次方为起始值，10的-1次方为终止值的8个数构成的等比数列</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span> c <span class="token operator">=</span> torch<span class="token punctuation">.</span>logspace<span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span><span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">,</span>steps<span class="token operator">=</span><span class="token number">8</span><span class="token punctuation">)</span><span class="token operator">>></span><span class="token operator">></span> <span class="token keyword">print</span><span class="token punctuation">(</span>c<span class="token punctuation">)</span>tensor<span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token number">1.0000</span><span class="token punctuation">,</span> <span class="token number">0.7197</span><span class="token punctuation">,</span> <span class="token number">0.5179</span><span class="token punctuation">,</span> <span class="token number">0.3728</span><span class="token punctuation">,</span> <span class="token number">0.2683</span><span class="token punctuation">,</span> <span class="token number">0.1931</span><span class="token punctuation">,</span> <span class="token number">0.1389</span><span class="token punctuation">,</span> <span class="token number">0.1000</span><span class="token punctuation">]</span><span class="token punctuation">)</span></code></pre><h2 id="Ones-zeros-eye"><a href="#Ones-zeros-eye" class="headerlink" title="Ones/zeros/eye"></a>Ones/zeros/eye</h2><pre class=" language-python"><code class="language-python"><span class="token operator">>></span><span class="token operator">></span> torch<span class="token punctuation">.</span>ones<span class="token punctuation">(</span><span class="token number">3</span><span class="token punctuation">,</span><span class="token number">3</span><span class="token punctuation">)</span>tensor<span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">.</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">.</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">.</span><span class="token punctuation">]</span><span class="token punctuation">,</span>        <span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">.</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">.</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">.</span><span class="token punctuation">]</span><span class="token punctuation">,</span>        <span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">.</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">.</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">.</span><span class="token punctuation">]</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token operator">>></span><span class="token operator">></span> torch<span class="token punctuation">.</span>zeros<span class="token punctuation">(</span><span class="token number">3</span><span class="token punctuation">,</span><span class="token number">3</span><span class="token punctuation">)</span>tensor<span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">.</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">.</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">.</span><span class="token punctuation">]</span><span class="token punctuation">,</span>        <span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">.</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">.</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">.</span><span class="token punctuation">]</span><span class="token punctuation">,</span>        <span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">.</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">.</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">.</span><span class="token punctuation">]</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token operator">>></span><span class="token operator">></span> torch<span class="token punctuation">.</span>eye<span class="token punctuation">(</span><span class="token number">3</span><span class="token punctuation">,</span><span class="token number">3</span><span class="token punctuation">)</span><span class="token comment" spellcheck="true">#对角矩阵</span>tensor<span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">.</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">.</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">.</span><span class="token punctuation">]</span><span class="token punctuation">,</span>        <span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">.</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">.</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">.</span><span class="token punctuation">]</span><span class="token punctuation">,</span>        <span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">.</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">.</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">.</span><span class="token punctuation">]</span><span class="token punctuation">]</span><span class="token punctuation">)</span></code></pre><h2 id="randperm"><a href="#randperm" class="headerlink" title="randperm"></a>randperm</h2><ul><li>random.shuffle nmpuy</li></ul><pre class=" language-python"><code class="language-python"><span class="token operator">>></span><span class="token operator">></span> a<span class="token operator">=</span>torch<span class="token punctuation">.</span>rand<span class="token punctuation">(</span><span class="token number">2</span><span class="token punctuation">,</span><span class="token number">3</span><span class="token punctuation">)</span><span class="token operator">>></span><span class="token operator">></span> b<span class="token operator">=</span>torch<span class="token punctuation">.</span>rand<span class="token punctuation">(</span><span class="token number">2</span><span class="token punctuation">,</span><span class="token number">2</span><span class="token punctuation">)</span><span class="token operator">>></span><span class="token operator">></span> idx<span class="token operator">=</span>torch<span class="token punctuation">.</span>randperm<span class="token punctuation">(</span><span class="token number">2</span><span class="token punctuation">)</span><span class="token operator">>></span><span class="token operator">></span> idxtensor<span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token operator">>></span><span class="token operator">></span> idxtensor<span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token operator">>></span><span class="token operator">></span> a<span class="token punctuation">[</span>idx<span class="token punctuation">]</span>tensor<span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token punctuation">[</span><span class="token number">0.9459</span><span class="token punctuation">,</span> <span class="token number">0.4927</span><span class="token punctuation">,</span> <span class="token number">0.4129</span><span class="token punctuation">]</span><span class="token punctuation">,</span>        <span class="token punctuation">[</span><span class="token number">0.3428</span><span class="token punctuation">,</span> <span class="token number">0.3058</span><span class="token punctuation">,</span> <span class="token number">0.5658</span><span class="token punctuation">]</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token operator">>></span><span class="token operator">></span> b<span class="token punctuation">[</span>idx<span class="token punctuation">]</span>tensor<span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token punctuation">[</span><span class="token number">0.1292</span><span class="token punctuation">,</span> <span class="token number">0.6434</span><span class="token punctuation">]</span><span class="token punctuation">,</span>        <span class="token punctuation">[</span><span class="token number">0.9975</span><span class="token punctuation">,</span> <span class="token number">0.4396</span><span class="token punctuation">]</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token operator">>></span><span class="token operator">></span> a<span class="token punctuation">,</span>b<span class="token punctuation">(</span>tensor<span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token punctuation">[</span><span class="token number">0.9459</span><span class="token punctuation">,</span> <span class="token number">0.4927</span><span class="token punctuation">,</span> <span class="token number">0.4129</span><span class="token punctuation">]</span><span class="token punctuation">,</span>        <span class="token punctuation">[</span><span class="token number">0.3428</span><span class="token punctuation">,</span> <span class="token number">0.3058</span><span class="token punctuation">,</span> <span class="token number">0.5658</span><span class="token punctuation">]</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">,</span> tensor<span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token punctuation">[</span><span class="token number">0.1292</span><span class="token punctuation">,</span> <span class="token number">0.6434</span><span class="token punctuation">]</span><span class="token punctuation">,</span>        <span class="token punctuation">[</span><span class="token number">0.9975</span><span class="token punctuation">,</span> <span class="token number">0.4396</span><span class="token punctuation">]</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">)</span></code></pre><hr><p><img src="https://img.tjzzz.com/img/waixuan.png" alt="" loading="lazy"></p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;link rel=&quot;stylesheet&quot; class=&quot;aplayer-secondary-style-marker&quot; href=&quot;\assets\css\APlayer.min.css&quot;&gt;&lt;script src=&quot;\assets\js\APlayer.min.js&quot; cla
      
    
    </summary>
    
    
      <category term="学习历程" scheme="https://www.tjzzz.com/categories/LearningExperience/"/>
    
    
      <category term="深度学习" scheme="https://www.tjzzz.com/tags/DeepLearning/"/>
    
      <category term="python" scheme="https://www.tjzzz.com/tags/python/"/>
    
      <category term="pytorch" scheme="https://www.tjzzz.com/tags/pytorch/"/>
    
  </entry>
  
  <entry>
    <title>pytorch学习日记：张量数据类型</title>
    <link href="https://www.tjzzz.com/posts/e3a13b03.html"/>
    <id>https://www.tjzzz.com/posts/e3a13b03.html</id>
    <published>2021-01-02T04:35:30.000Z</published>
    <updated>2021-01-02T04:38:24.000Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="\assets\css\APlayer.min.css"><script src="\assets\js\APlayer.min.js" class="aplayer-secondary-script-marker"></script><h2 id="python与pytorch对应转换"><a href="#python与pytorch对应转换" class="headerlink" title="python与pytorch对应转换"></a>python与pytorch对应转换</h2><table><thead><tr><th>python</th><th>PyTorch</th></tr></thead><tbody><tr><td>Int</td><td>IntTensor of size()</td></tr><tr><td>float</td><td>FloatTensor of size()</td></tr><tr><td>Int array</td><td>IntTensor of size [d1, d2 ,.….]</td></tr><tr><td>Float array</td><td>FloatTensor of size [d1, d2,…]</td></tr><tr><td>string</td><td>–</td></tr></tbody></table><h2 id="怎样表达string"><a href="#怎样表达string" class="headerlink" title="怎样表达string"></a>怎样表达string</h2><ul><li>One-hot<ul><li>[0,1,0,0，…]</li><li>缺点：单词之间的相关性并没有体现出来，并且是极度稀疏矩阵。</li></ul></li><li>Embedding：数字表达语言<ul><li>word2vec</li><li>glove</li></ul></li></ul><h2 id="数据类型"><a href="#数据类型" class="headerlink" title="数据类型"></a>数据类型</h2><table><thead><tr><th>Data type</th><th>dtype</th><th>CPU tensor</th><th>GPU tensor</th></tr></thead><tbody><tr><td><strong>32-bit floating point</strong></td><td><code>torch.float32</code> or <code>torch.float</code></td><td><code>torch.FloatTensor</code></td><td><code>torch.cuda.FloatTensor</code></td></tr><tr><td>64-bit floating point</td><td><code>torch.float64</code> or <code>torch.double</code></td><td><code>torch.DoubleTensor</code></td><td><code>torch.cuda.DoubleTensor</code></td></tr><tr><td>16-bit floating point</td><td><code>torch.float16</code> or <code>torch.half</code></td><td><code>torch.HalfTensor</code></td><td><code>torch.cuda.HalfTensor</code></td></tr><tr><td><strong>8-bit integer (unsigned)</strong></td><td><code>torch.uint8</code></td><td><a href="https://pytorch.org/docs/stable/tensors.html#torch.ByteTensor" target="_blank" rel="noopener external nofollow noreferrer"><code>torch.ByteTensor</code></a></td><td><code>torch.cuda.ByteTensor</code></td></tr><tr><td>8-bit integer (signed)</td><td><code>torch.int8</code></td><td><code>torch.CharTensor</code></td><td><code>torch.cuda.CharTensor</code></td></tr><tr><td>16-bit integer (signed)</td><td><code>torch.int16</code> or <code>torch.short</code></td><td><code>torch.ShortTensor</code></td><td><code>torch.cuda.ShortTensor</code></td></tr><tr><td><strong>32-bit integer (signed)</strong></td><td><code>torch.int32</code> or <code>torch.int</code></td><td><code>torch.IntTensor</code></td><td><code>torch.cuda.IntTensor</code></td></tr><tr><td>64-bit integer (signed)</td><td><code>torch.int64</code> or <code>torch.long</code></td><td><code>torch.LongTensor</code></td><td><code>torch.cuda.LongTensor</code></td></tr></tbody></table><h2 id="Type-check"><a href="#Type-check" class="headerlink" title="Type check"></a>Type check</h2><pre class=" language-python"><code class="language-python"><span class="token keyword">in</span><span class="token punctuation">:</span>a <span class="token operator">=</span> torch<span class="token punctuation">.</span>randn<span class="token punctuation">(</span><span class="token number">2</span><span class="token punctuation">,</span><span class="token number">3</span><span class="token punctuation">)</span><span class="token keyword">in</span><span class="token punctuation">:</span>a<span class="token punctuation">.</span>type<span class="token punctuation">(</span><span class="token punctuation">)</span>out<span class="token punctuation">:</span><span class="token string">'torch.floatTensor'</span><span class="token keyword">in</span><span class="token punctuation">:</span> type<span class="token punctuation">(</span>a<span class="token punctuation">)</span>out<span class="token punctuation">:</span>torch<span class="token punctuation">.</span>Tensor<span class="token keyword">in</span><span class="token punctuation">:</span>isinstance<span class="token punctuation">(</span>a<span class="token punctuation">,</span>torch<span class="token punctuation">.</span>FloatTensor<span class="token punctuation">)</span>out<span class="token punctuation">:</span><span class="token boolean">True</span></code></pre><pre class=" language-python"><code class="language-python">isinstance<span class="token punctuation">(</span>data<span class="token punctuation">,</span>torch<span class="token punctuation">.</span>cude<span class="token punctuation">,</span>DoubleTensor<span class="token punctuation">)</span><span class="token comment" spellcheck="true">#false</span>data<span class="token operator">=</span>data<span class="token punctuation">.</span>cude<span class="token punctuation">(</span><span class="token punctuation">)</span>isinstance<span class="token punctuation">(</span>data<span class="token punctuation">,</span>torch<span class="token punctuation">.</span>FloatTensor<span class="token punctuation">)</span><span class="token comment" spellcheck="true">#True</span></code></pre><h2 id="Dimension-0-rank-0"><a href="#Dimension-0-rank-0" class="headerlink" title="Dimension 0 /rank 0"></a>Dimension 0 /rank 0</h2><pre class=" language-python"><code class="language-python">torch<span class="token punctuation">.</span>tensor<span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">.</span><span class="token punctuation">)</span><span class="token comment" spellcheck="true">#tensor(1.)</span>torch<span class="token punctuation">.</span>tensor<span class="token punctuation">(</span><span class="token number">1.3</span><span class="token punctuation">)</span><span class="token comment" spellcheck="true">#tensor(1.300)</span></code></pre><h2 id="Dim-0"><a href="#Dim-0" class="headerlink" title="Dim 0"></a>Dim 0</h2><pre class=" language-python"><code class="language-python"><span class="token operator">>></span><span class="token operator">></span> a<span class="token operator">=</span>torch<span class="token punctuation">.</span>tensor<span class="token punctuation">(</span><span class="token number">2.2</span><span class="token punctuation">)</span><span class="token operator">>></span><span class="token operator">></span> a<span class="token punctuation">.</span>shapetorch<span class="token punctuation">.</span>Size<span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token operator">>></span><span class="token operator">></span> len<span class="token punctuation">(</span>a<span class="token punctuation">.</span>shape<span class="token punctuation">)</span><span class="token number">0</span><span class="token operator">>></span><span class="token operator">></span> a<span class="token punctuation">.</span>size<span class="token punctuation">(</span><span class="token punctuation">)</span>torch<span class="token punctuation">.</span>Size<span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">)</span></code></pre><ul><li>通常用在loss</li></ul><h2 id="dim-1-rank-1"><a href="#dim-1-rank-1" class="headerlink" title="dim 1 /rank 1"></a>dim 1 /rank 1</h2><pre class=" language-python"><code class="language-python"><span class="token operator">>></span><span class="token operator">></span> torch<span class="token punctuation">.</span>tensor<span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token number">1.1</span><span class="token punctuation">]</span><span class="token punctuation">)</span>tensor<span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token number">1.1000</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token operator">>></span><span class="token operator">></span> torch<span class="token punctuation">.</span>tensor<span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token number">1.1</span><span class="token punctuation">,</span><span class="token number">2.2</span><span class="token punctuation">]</span><span class="token punctuation">)</span>tensor<span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token number">1.1000</span><span class="token punctuation">,</span> <span class="token number">2.2000</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token operator">>></span><span class="token operator">></span> torch<span class="token punctuation">.</span>FloatTensor<span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span>tensor<span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token number">3.0100e+32</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token operator">>></span><span class="token operator">></span> torch<span class="token punctuation">.</span>FloatTensor<span class="token punctuation">(</span><span class="token number">2</span><span class="token punctuation">)</span>tensor<span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token number">0.0000</span><span class="token punctuation">,</span> <span class="token number">1.8750</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token operator">>></span><span class="token operator">></span> data <span class="token operator">=</span> np<span class="token punctuation">.</span>ones<span class="token punctuation">(</span><span class="token number">2</span><span class="token punctuation">)</span><span class="token operator">>></span><span class="token operator">></span> dataarray<span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">.</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">.</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token operator">>></span><span class="token operator">></span> torch<span class="token punctuation">.</span>from_numpy<span class="token punctuation">(</span>data<span class="token punctuation">)</span>tensor<span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">.</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">.</span><span class="token punctuation">]</span><span class="token punctuation">,</span> dtype<span class="token operator">=</span>torch<span class="token punctuation">.</span>float64<span class="token punctuation">)</span></code></pre><ul><li>通常用在Bias  </li><li>或者用在Linear Input</li></ul><pre class=" language-python"><code class="language-python"><span class="token operator">>></span><span class="token operator">></span> a <span class="token operator">=</span> torch<span class="token punctuation">.</span>ones<span class="token punctuation">(</span><span class="token number">2</span><span class="token punctuation">)</span><span class="token operator">>></span><span class="token operator">></span> a<span class="token punctuation">.</span>shapetorch<span class="token punctuation">.</span>Size<span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">]</span><span class="token punctuation">)</span></code></pre><h2 id="Dim-2"><a href="#Dim-2" class="headerlink" title="Dim 2"></a>Dim 2</h2><pre class=" language-python"><code class="language-python"><span class="token operator">>></span><span class="token operator">></span> a <span class="token operator">=</span> torch<span class="token punctuation">.</span>randn<span class="token punctuation">(</span><span class="token number">2</span><span class="token punctuation">,</span><span class="token number">3</span><span class="token punctuation">)</span><span class="token operator">>></span><span class="token operator">></span> atensor<span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token punctuation">[</span> <span class="token number">2.8500</span><span class="token punctuation">,</span> <span class="token operator">-</span><span class="token number">1.0306</span><span class="token punctuation">,</span>  <span class="token number">0.4257</span><span class="token punctuation">]</span><span class="token punctuation">,</span>        <span class="token punctuation">[</span><span class="token operator">-</span><span class="token number">0.9918</span><span class="token punctuation">,</span>  <span class="token number">0.3094</span><span class="token punctuation">,</span>  <span class="token number">0.3869</span><span class="token punctuation">]</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token operator">>></span><span class="token operator">></span> a<span class="token punctuation">.</span>shapetorch<span class="token punctuation">.</span>Size<span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token operator">>></span><span class="token operator">></span> a<span class="token punctuation">.</span>size<span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">)</span><span class="token number">2</span><span class="token operator">>></span><span class="token operator">></span> a<span class="token punctuation">.</span>size<span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token number">3</span><span class="token operator">>></span><span class="token operator">></span> a<span class="token punctuation">.</span>shape<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token number">3</span></code></pre><ul><li>通常用在带有batch的linear input</li></ul><pre class=" language-python"><code class="language-python"><span class="token operator">>></span><span class="token operator">></span> <span class="token keyword">import</span> torch<span class="token operator">>></span><span class="token operator">></span> a<span class="token operator">=</span>torch<span class="token punctuation">.</span>rand<span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">,</span><span class="token number">2</span><span class="token punctuation">,</span><span class="token number">3</span><span class="token punctuation">)</span><span class="token operator">>></span><span class="token operator">></span> atensor<span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token punctuation">[</span><span class="token punctuation">[</span><span class="token number">0.2698</span><span class="token punctuation">,</span> <span class="token number">0.2206</span><span class="token punctuation">,</span> <span class="token number">0.2297</span><span class="token punctuation">]</span><span class="token punctuation">,</span>         <span class="token punctuation">[</span><span class="token number">0.6471</span><span class="token punctuation">,</span> <span class="token number">0.9053</span><span class="token punctuation">,</span> <span class="token number">0.2742</span><span class="token punctuation">]</span><span class="token punctuation">]</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token operator">>></span><span class="token operator">></span> a<span class="token punctuation">.</span>shapetorch<span class="token punctuation">.</span>Size<span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token operator">>></span><span class="token operator">></span> a<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span>tensor<span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token punctuation">[</span><span class="token number">0.2698</span><span class="token punctuation">,</span> <span class="token number">0.2206</span><span class="token punctuation">,</span> <span class="token number">0.2297</span><span class="token punctuation">]</span><span class="token punctuation">,</span>        <span class="token punctuation">[</span><span class="token number">0.6471</span><span class="token punctuation">,</span> <span class="token number">0.9053</span><span class="token punctuation">,</span> <span class="token number">0.2742</span><span class="token punctuation">]</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token operator">>></span><span class="token operator">></span> list<span class="token punctuation">(</span>a<span class="token punctuation">.</span>shape<span class="token punctuation">)</span><span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">]</span></code></pre><ul><li>RNN input Batch<ul><li>[10个单词，20句话，100维表示]</li></ul></li></ul><h2 id="Dim4"><a href="#Dim4" class="headerlink" title="Dim4"></a>Dim4</h2><pre class=" language-python"><code class="language-python"><span class="token operator">>></span><span class="token operator">></span> a<span class="token operator">=</span>torch<span class="token punctuation">.</span>rand<span class="token punctuation">(</span><span class="token number">2</span><span class="token punctuation">,</span><span class="token number">3</span><span class="token punctuation">,</span><span class="token number">28</span><span class="token punctuation">,</span><span class="token number">28</span><span class="token punctuation">)</span><span class="token comment" spellcheck="true">#张数，通道数，28*28尺寸</span><span class="token operator">>></span><span class="token operator">></span> atensor<span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token punctuation">[</span><span class="token punctuation">[</span><span class="token punctuation">[</span><span class="token number">0.6408</span><span class="token punctuation">,</span> <span class="token number">0.0313</span><span class="token punctuation">,</span> <span class="token number">0.0700</span><span class="token punctuation">,</span>  <span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">,</span> <span class="token number">0.1324</span><span class="token punctuation">,</span> <span class="token number">0.7475</span><span class="token punctuation">,</span> <span class="token number">0.1444</span><span class="token punctuation">]</span><span class="token punctuation">,</span>          <span class="token punctuation">[</span><span class="token number">0.8315</span><span class="token punctuation">,</span> <span class="token number">0.7339</span><span class="token punctuation">,</span> <span class="token number">0.0126</span><span class="token punctuation">,</span>  <span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">,</span> <span class="token number">0.5260</span><span class="token punctuation">,</span> <span class="token number">0.4896</span><span class="token punctuation">,</span> <span class="token number">0.7950</span><span class="token punctuation">]</span><span class="token punctuation">,</span>          <span class="token punctuation">[</span><span class="token number">0.5399</span><span class="token punctuation">,</span> <span class="token number">0.6679</span><span class="token punctuation">,</span> <span class="token number">0.6118</span><span class="token punctuation">,</span>  <span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">,</span> <span class="token number">0.1571</span><span class="token punctuation">,</span> <span class="token number">0.0436</span><span class="token punctuation">,</span> <span class="token number">0.6759</span><span class="token punctuation">]</span><span class="token punctuation">,</span>         <span class="token punctuation">[</span><span class="token punctuation">[</span><span class="token number">0.6578</span><span class="token punctuation">,</span> <span class="token number">0.7380</span><span class="token punctuation">,</span> <span class="token number">0.5285</span><span class="token punctuation">,</span>  <span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">,</span> <span class="token number">0.0970</span><span class="token punctuation">,</span> <span class="token number">0.8109</span><span class="token punctuation">,</span> <span class="token number">0.2364</span><span class="token punctuation">]</span><span class="token punctuation">,</span>          <span class="token punctuation">[</span><span class="token number">0.4398</span><span class="token punctuation">,</span> <span class="token number">0.4145</span><span class="token punctuation">,</span> <span class="token number">0.6420</span><span class="token punctuation">,</span>  <span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">,</span> <span class="token number">0.7736</span><span class="token punctuation">,</span> <span class="token number">0.1780</span><span class="token punctuation">,</span> <span class="token number">0.4816</span><span class="token punctuation">]</span><span class="token punctuation">,</span>          <span class="token punctuation">[</span><span class="token number">0.5297</span><span class="token punctuation">,</span> <span class="token number">0.0386</span><span class="token punctuation">,</span> <span class="token number">0.2156</span><span class="token punctuation">,</span>  <span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">,</span> <span class="token number">0.3286</span><span class="token punctuation">,</span> <span class="token number">0.7100</span><span class="token punctuation">,</span> <span class="token number">0.1554</span><span class="token punctuation">]</span><span class="token punctuation">,</span>          <span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">,</span>          <span class="token punctuation">[</span><span class="token number">0.4681</span><span class="token punctuation">,</span> <span class="token number">0.1787</span><span class="token punctuation">,</span> <span class="token number">0.7982</span><span class="token punctuation">,</span>  <span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">,</span> <span class="token number">0.5238</span><span class="token punctuation">,</span> <span class="token number">0.5333</span><span class="token punctuation">,</span> <span class="token number">0.7992</span><span class="token punctuation">]</span><span class="token punctuation">,</span>          <span class="token punctuation">[</span><span class="token number">0.5267</span><span class="token punctuation">,</span> <span class="token number">0.1461</span><span class="token punctuation">,</span> <span class="token number">0.7075</span><span class="token punctuation">,</span>  <span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">,</span> <span class="token number">0.0974</span><span class="token punctuation">,</span> <span class="token number">0.9872</span><span class="token punctuation">,</span> <span class="token number">0.8482</span><span class="token punctuation">]</span><span class="token punctuation">,</span>          <span class="token punctuation">[</span><span class="token number">0.9274</span><span class="token punctuation">,</span> <span class="token number">0.4764</span><span class="token punctuation">,</span> <span class="token number">0.9747</span><span class="token punctuation">,</span>  <span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">,</span> <span class="token number">0.1132</span><span class="token punctuation">,</span> <span class="token number">0.7222</span><span class="token punctuation">,</span> <span class="token number">0.1312</span><span class="token punctuation">]</span><span class="token punctuation">]</span><span class="token punctuation">]</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token operator">>></span><span class="token operator">></span> a<span class="token punctuation">.</span>shapetorch<span class="token punctuation">.</span>Size<span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">28</span><span class="token punctuation">,</span> <span class="token number">28</span><span class="token punctuation">]</span><span class="token punctuation">)</span></code></pre><h2 id="Mixd"><a href="#Mixd" class="headerlink" title="Mixd"></a>Mixd</h2><pre class=" language-python"><code class="language-python"><span class="token operator">>></span><span class="token operator">></span> a<span class="token punctuation">.</span>shapetorch<span class="token punctuation">.</span>Size<span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">28</span><span class="token punctuation">,</span> <span class="token number">28</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token operator">>></span><span class="token operator">></span> a<span class="token punctuation">.</span>numel<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token number">4704</span><span class="token operator">>></span><span class="token operator">></span> a<span class="token punctuation">.</span>dim<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token number">4</span><span class="token operator">>></span><span class="token operator">></span> a<span class="token operator">=</span>torch<span class="token punctuation">.</span>tensor<span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token operator">>></span><span class="token operator">></span> a<span class="token punctuation">.</span>dim<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token number">0</span></code></pre><hr><p><img src="https://img.tjzzz.com/img/waixuan.png" alt="" loading="lazy"></p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;link rel=&quot;stylesheet&quot; class=&quot;aplayer-secondary-style-marker&quot; href=&quot;\assets\css\APlayer.min.css&quot;&gt;&lt;script src=&quot;\assets\js\APlayer.min.js&quot; cla
      
    
    </summary>
    
    
      <category term="学习历程" scheme="https://www.tjzzz.com/categories/LearningExperience/"/>
    
    
      <category term="深度学习" scheme="https://www.tjzzz.com/tags/DeepLearning/"/>
    
      <category term="python" scheme="https://www.tjzzz.com/tags/python/"/>
    
      <category term="pytorch" scheme="https://www.tjzzz.com/tags/pytorch/"/>
    
  </entry>
  
  <entry>
    <title>研究生涯005 利用蒙特卡洛方法实现21点问题的最优解</title>
    <link href="https://www.tjzzz.com/posts/4c5e754e.html"/>
    <id>https://www.tjzzz.com/posts/4c5e754e.html</id>
    <published>2020-12-19T01:40:22.000Z</published>
    <updated>2020-12-19T04:50:33.000Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="\assets\css\APlayer.min.css"><script src="\assets\js\APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>想要获取完整代码，<a href="https://mianbaoduo.com/o/bread/mbd-YZWYmpZs" target="_blank" rel="noopener external nofollow noreferrer">请访问面包多</a>进行支持哦，仅需一口奶茶的钱！</p><h2 id="一、实验目的"><a href="#一、实验目的" class="headerlink" title="一、实验目的"></a>一、实验目的</h2><p>实现基于蒙特卡洛法的21点问题的最优解，了解强化学习的基本原理，理解蒙特卡洛法并编写相应的代码。</p><h2 id="二、实验内容"><a href="#二、实验内容" class="headerlink" title="二、实验内容"></a>二、实验内容</h2><p>赌场上流行的21点纸牌游戏的目的是获得其数值之和尽可能大而不超过21的牌。所有的人形牌面都算作10，而A可以算作1或11。我们的实验仅考虑每个玩家独立与庄家竞争的版本。游戏开始时，庄家和玩家都有两张牌。庄家的一张牌面朝上，另一张牌面朝下。如果玩家有21张牌（一张A和一张10牌），则称为自然牌。他就赢了，除非庄家也有自然牌，在这种情况下，游戏是平局。如果玩家没有自然牌，那么他可以要求额外的牌，单张发牌(hits)，直到他停止（<strong>sticks</strong>）或超过21（goes bust）。如果他破产，那么他输了，如果他坚持，那么就轮到庄家的回合。庄家hits或sticks或者goes bust；在牌数字和为17或更多的时候，庄家就停止发牌。赢、输、或平局由谁的最终和值更接近21决定。</p><h2 id="三、实验过程"><a href="#三、实验过程" class="headerlink" title="三、实验过程"></a>三、实验过程</h2><p>本次实验需要导入如下包：</p><pre class=" language-python"><code class="language-python"><span class="token keyword">import</span> gym<span class="token keyword">import</span> numpy <span class="token keyword">as</span> np<span class="token keyword">from</span> collections <span class="token keyword">import</span> defaultdict<span class="token keyword">import</span> matplotlib<span class="token keyword">import</span> matplotlib<span class="token punctuation">.</span>pyplot <span class="token keyword">as</span> plt</code></pre><p>运用gym自带的21点游戏进行接下来的编程：</p><pre class=" language-python"><code class="language-python">env <span class="token operator">=</span> gym<span class="token punctuation">.</span>make<span class="token punctuation">(</span><span class="token string">'Blackjack-v0'</span><span class="token punctuation">)</span>observation <span class="token operator">=</span> env<span class="token punctuation">.</span>reset<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token keyword">print</span><span class="token punctuation">(</span>env<span class="token punctuation">.</span>action_space<span class="token punctuation">,</span> env<span class="token punctuation">.</span>observation_space<span class="token punctuation">,</span> sep<span class="token operator">=</span><span class="token string">'\n'</span><span class="token punctuation">)</span></code></pre><p>这段代码返回了玩家的当前点数之和 ∈{0,1,…,31} ，庄家朝上的牌点数之和 ∈{1,…,10} ，及玩家是否有能使用的ace（no =0 、yes =1 ），和智能体可以执行两个潜在动作：STICK = 0，HIT = 1。</p><p>本次实验采用On-policy first-visit MC control，On-policy方法在一定程度上解决了exploring starts这个假设，让策略既greedy又exploratory，最后得到的策略也一定程度上达到最优。如下图所示：</p><p><img src="https://img.tjzzz.com/img/20201219094300.jpg" alt="图 1 On-policy first-visit MC control" loading="lazy"></p><p><img src="https://img.tjzzz.com/img/20201219094318.jpg" alt="图 2 树" loading="lazy"></p><p>我们定义一个嵌套函数：</p><pre class=" language-python"><code class="language-python"><span class="token keyword">def</span> <span class="token function">make_epsilon_greedy_policy</span><span class="token punctuation">(</span>Q_table<span class="token punctuation">,</span> nA<span class="token punctuation">,</span> epsilon<span class="token punctuation">)</span><span class="token punctuation">:</span>    <span class="token keyword">def</span> <span class="token function">generate_policy</span><span class="token punctuation">(</span>observation<span class="token punctuation">)</span><span class="token punctuation">:</span>        prob_A <span class="token operator">=</span> np<span class="token punctuation">.</span>ones<span class="token punctuation">(</span>nA<span class="token punctuation">)</span> <span class="token operator">*</span> epsilon <span class="token operator">/</span> nA        optimal_a <span class="token operator">=</span> np<span class="token punctuation">.</span>argmax<span class="token punctuation">(</span>Q_table<span class="token punctuation">[</span>observation<span class="token punctuation">]</span><span class="token punctuation">)</span>        prob_A<span class="token punctuation">[</span>optimal_a<span class="token punctuation">]</span> <span class="token operator">+=</span> <span class="token punctuation">(</span><span class="token number">1.0</span> <span class="token operator">-</span> epsilon<span class="token punctuation">)</span>        <span class="token keyword">return</span> prob_A    <span class="token keyword">return</span> generate_policy</code></pre><p>MC算法是逐幕进行的，所以我们要根据策略来生成一幕数据。</p><p>这里要注意：generate_policy是一个函数即make_epsilon_greedy_policy的返回值。generate_policy的返回值是 π \piπ 。这里循环了1000次只是为了确保能获得完整的一幕。</p><p>接下来是MC控制的主体部分，我们要循环足够多的次数使得价值函数收敛，每次循环都首先根据策略生成一幕样本序列，然后遍历每个“状态—价值”二元组，并用所有首次访问的回报的平均值作为估计.</p><p>这里要注意：Return和Count是字典，每个“状态—价值”二元组是一个key，该二元组每一幕的回报是它的value，随着越来越多的迭代，根据大数定律，它的平均值会收敛到它的期望值。并且在下一轮迭代生成另外一幕样本序列的时候，generate_policy函数会根据Q_table更新。</p><pre class=" language-python"><code class="language-python"><span class="token keyword">def</span> <span class="token function">MC_control</span><span class="token punctuation">(</span>env<span class="token punctuation">,</span> iteration_times<span class="token operator">=</span><span class="token number">500000</span><span class="token punctuation">,</span> epsilon<span class="token operator">=</span><span class="token number">0.1</span><span class="token punctuation">,</span> discount_factor<span class="token operator">=</span><span class="token number">1.0</span><span class="token punctuation">)</span><span class="token punctuation">:</span>    Return<span class="token punctuation">,</span> Count<span class="token punctuation">,</span> Q_table <span class="token operator">=</span> defaultdict<span class="token punctuation">(</span>float<span class="token punctuation">)</span><span class="token punctuation">,</span> defaultdict<span class="token punctuation">(</span>float<span class="token punctuation">)</span><span class="token punctuation">,</span> defaultdict<span class="token punctuation">(</span><span class="token keyword">lambda</span><span class="token punctuation">:</span> np<span class="token punctuation">.</span>zeros<span class="token punctuation">(</span>env<span class="token punctuation">.</span>action_space<span class="token punctuation">.</span>n<span class="token punctuation">)</span><span class="token punctuation">)</span>    policy <span class="token operator">=</span> make_epsilon_greedy_policy<span class="token punctuation">(</span>Q_table<span class="token punctuation">,</span> env<span class="token punctuation">.</span>action_space<span class="token punctuation">.</span>n<span class="token punctuation">,</span> epsilon<span class="token punctuation">)</span>    <span class="token keyword">for</span> i <span class="token keyword">in</span> range<span class="token punctuation">(</span>iteration_times<span class="token punctuation">)</span><span class="token punctuation">:</span>        <span class="token keyword">if</span> i <span class="token operator">%</span> <span class="token number">1000</span> <span class="token operator">==</span> <span class="token number">0</span><span class="token punctuation">:</span>            <span class="token keyword">print</span><span class="token punctuation">(</span>str<span class="token punctuation">(</span>i<span class="token punctuation">)</span> <span class="token operator">+</span> <span class="token string">"次"</span><span class="token punctuation">)</span>        trajectory <span class="token operator">=</span> generate_one_episode<span class="token punctuation">(</span>env<span class="token punctuation">,</span> policy<span class="token punctuation">)</span>        s_a_pairs <span class="token operator">=</span> set<span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token punctuation">(</span>x<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">,</span> x<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token keyword">for</span> x <span class="token keyword">in</span> trajectory<span class="token punctuation">]</span><span class="token punctuation">)</span>        <span class="token keyword">for</span> state<span class="token punctuation">,</span> action <span class="token keyword">in</span> s_a_pairs<span class="token punctuation">:</span>            s_a <span class="token operator">=</span> <span class="token punctuation">(</span>state<span class="token punctuation">,</span> action<span class="token punctuation">)</span>            first_visit_id <span class="token operator">=</span> next<span class="token punctuation">(</span>i <span class="token keyword">for</span> i<span class="token punctuation">,</span> x <span class="token keyword">in</span> enumerate<span class="token punctuation">(</span>trajectory<span class="token punctuation">)</span> <span class="token keyword">if</span> x<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span> <span class="token operator">==</span> state <span class="token operator">and</span> x<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span> <span class="token operator">==</span> action<span class="token punctuation">)</span>            G <span class="token operator">=</span> sum<span class="token punctuation">(</span><span class="token punctuation">[</span>x<span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">]</span> <span class="token operator">*</span> <span class="token punctuation">(</span>discount_factor <span class="token operator">**</span> i<span class="token punctuation">)</span> <span class="token keyword">for</span> i<span class="token punctuation">,</span> x <span class="token keyword">in</span> enumerate<span class="token punctuation">(</span>trajectory<span class="token punctuation">[</span>first_visit_id<span class="token punctuation">:</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">]</span><span class="token punctuation">)</span>            Return<span class="token punctuation">[</span>s_a<span class="token punctuation">]</span> <span class="token operator">+=</span> G            Count<span class="token punctuation">[</span>s_a<span class="token punctuation">]</span> <span class="token operator">+=</span> <span class="token number">1</span><span class="token punctuation">.</span>            Q_table<span class="token punctuation">[</span>state<span class="token punctuation">]</span><span class="token punctuation">[</span>action<span class="token punctuation">]</span> <span class="token operator">=</span> Return<span class="token punctuation">[</span>s_a<span class="token punctuation">]</span> <span class="token operator">/</span> Count<span class="token punctuation">[</span>s_a<span class="token punctuation">]</span>    <span class="token keyword">return</span> policy<span class="token punctuation">,</span> Q_table</code></pre><p>接下来是将价值函数可视化：</p><pre class=" language-python"><code class="language-python"><span class="token keyword">def</span> <span class="token function">plot_value_function</span><span class="token punctuation">(</span>Q_table<span class="token punctuation">)</span><span class="token punctuation">:</span>    x <span class="token operator">=</span> np<span class="token punctuation">.</span>arange<span class="token punctuation">(</span><span class="token number">12</span><span class="token punctuation">,</span> <span class="token number">21</span><span class="token punctuation">)</span>    y <span class="token operator">=</span> np<span class="token punctuation">.</span>arange<span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">10</span><span class="token punctuation">)</span>    X<span class="token punctuation">,</span> Y <span class="token operator">=</span> np<span class="token punctuation">.</span>meshgrid<span class="token punctuation">(</span>x<span class="token punctuation">,</span> y<span class="token punctuation">)</span>    Z_noace <span class="token operator">=</span> np<span class="token punctuation">.</span>apply_along_axis<span class="token punctuation">(</span><span class="token keyword">lambda</span> x<span class="token punctuation">:</span> Q_table<span class="token punctuation">[</span><span class="token punctuation">(</span>x<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">,</span> x<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token boolean">False</span><span class="token punctuation">)</span><span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">,</span> np<span class="token punctuation">.</span>dstack<span class="token punctuation">(</span><span class="token punctuation">[</span>X<span class="token punctuation">,</span> Y<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">)</span>    Z_ace <span class="token operator">=</span> np<span class="token punctuation">.</span>apply_along_axis<span class="token punctuation">(</span><span class="token keyword">lambda</span> x<span class="token punctuation">:</span> Q_table<span class="token punctuation">[</span><span class="token punctuation">(</span>x<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">,</span> x<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token boolean">True</span><span class="token punctuation">)</span><span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">,</span> np<span class="token punctuation">.</span>dstack<span class="token punctuation">(</span><span class="token punctuation">[</span>X<span class="token punctuation">,</span> Y<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">)</span>        <span class="token keyword">def</span> <span class="token function">plot_surface</span><span class="token punctuation">(</span>X<span class="token punctuation">,</span> Y<span class="token punctuation">,</span> Z<span class="token punctuation">,</span> title<span class="token punctuation">)</span><span class="token punctuation">:</span>            代码过长略</code></pre><p>实验结束。想要获取完整代码，<a href="https://mianbaoduo.com/o/bread/mbd-YZWYmpZs" target="_blank" rel="noopener external nofollow noreferrer">请访问面包多</a>进行购买</p><h2 id="四、实验结果"><a href="#四、实验结果" class="headerlink" title="四、实验结果"></a>四、实验结果</h2><p>运行如上代码，在代码文件RL中，输出图所示：</p><p><img src="https://img.tjzzz.com/img/20201219094807.jpg" alt="图 3 not use Ace" loading="lazy"></p><p><img src="https://img.tjzzz.com/img/20201219094820.png" alt="图 4 use ace" loading="lazy"></p><hr><p><img src="https://img.tjzzz.com/img/waixuan.png" alt="" loading="lazy"></p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;link rel=&quot;stylesheet&quot; class=&quot;aplayer-secondary-style-marker&quot; href=&quot;\assets\css\APlayer.min.css&quot;&gt;&lt;script src=&quot;\assets\js\APlayer.min.js&quot; cla
      
    
    </summary>
    
    
      <category term="学习历程" scheme="https://www.tjzzz.com/categories/LearningExperience/"/>
    
    
      <category term="深度学习" scheme="https://www.tjzzz.com/tags/DeepLearning/"/>
    
      <category term="python" scheme="https://www.tjzzz.com/tags/python/"/>
    
  </entry>
  
  <entry>
    <title>研究生涯004 基于深度学习的水质图像分类</title>
    <link href="https://www.tjzzz.com/posts/2bcefabf.html"/>
    <id>https://www.tjzzz.com/posts/2bcefabf.html</id>
    <published>2020-12-09T03:15:54.000Z</published>
    <updated>2020-12-09T03:38:29.000Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="\assets\css\APlayer.min.css"><script src="\assets\js\APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>本实验全部源码以及数据集以上架面包多(超便宜)，<a href="https://mianbaoduo.com/o/bread/YZWXk59y" target="_blank" rel="noopener external nofollow noreferrer">点击购买</a>，关注公众号[全都是码农]免费获得更多超值内容！</p><hr><h2 id="实验内容"><a href="#实验内容" class="headerlink" title="实验内容"></a>实验内容</h2><p>某地区的多个罗非鱼池塘水样数据，包含水产专家按水色判断水质分类的数据，以及用数码相机按照标准进行水色采集的数据，如表1和图1所示。每个水质图片命名规则是“类别-编号.jpg”，如“1_1.jpg”是第一类样本的图片。请根据这些样本，利用数字图像处理技术，通过水色图像实现水质的自动评价。</p><table><thead><tr><th>水色</th><th>浅绿色（清水或浊水）</th><th>灰蓝色</th><th>黄褐色</th><th>茶褐色  （姜黄、茶褐、红褐、褐中带绿等）</th><th>绿色  （黄绿、油绿、蓝绿、墨绿、绿中带褐等）</th></tr></thead><tbody><tr><td>水质类别</td><td>1</td><td>2</td><td>3</td><td>4</td><td>5</td></tr></tbody></table><p><img src="https://img.tjzzz.com/img/20201209112025.jpg" alt="图1 水样图像" loading="lazy"></p><h2 id="实验过程"><a href="#实验过程" class="headerlink" title="实验过程"></a>实验过程</h2><p>观察样本图片，发现其几乎每张图片都有背景噪声，所以需要先对图像进行预处理，如下代码：</p><p><img src="https://img.tjzzz.com/img/20201209112111.png" alt="image-20201209112109499" loading="lazy"></p><p>输入fromdir为图片文件夹，todir为输出文件夹。</p><p>对处理过的图片进行HSV颜色矩提取并打上标签：</p><p><img src="https://img.tjzzz.com/img/20201209112135.png" alt="image-20201209112134955" loading="lazy"></p><p><img src="https://img.tjzzz.com/img/20201209112150.png" alt="image-20201209112149285" loading="lazy"></p><p>接下来编写神经网络相关代码：</p><p>分析csv数据：</p><p><img src="https://img.tjzzz.com/img/20201209112312.png" alt="image-20201209112310084" loading="lazy"></p><p>读取颜色矩：</p><p><img src="https://img.tjzzz.com/img/20201209112332.png" alt="image-20201209112329927" loading="lazy"></p><p>定义网络变量：</p><pre class=" language-python"><code class="language-python"><span class="token keyword">class</span> <span class="token class-name">NNetConfig</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span>    num_classes <span class="token operator">=</span> <span class="token number">5</span>  <span class="token comment" spellcheck="true"># 多分类的种类</span>    num_epochs <span class="token operator">=</span> <span class="token number">500</span>  <span class="token comment" spellcheck="true"># 训练总批次</span>    print_per_epoch <span class="token operator">=</span> <span class="token number">100</span>  <span class="token comment" spellcheck="true"># 每训练多少批次时打印训练损失函数值和预测准确率值</span>    <span class="token comment" spellcheck="true"># layersls = [9, 20, 30,60,120,60,30, 20, 5]  # 极其不稳定</span>    <span class="token comment" spellcheck="true"># layersls = [9, 20, 30, 60, 120, 60, 30, 20, 5]  # 【输入，隐藏各层节点数，输出】 500轮90%一般,2000轮100%完全拟合</span>    layersls <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token number">9</span><span class="token punctuation">,</span> <span class="token number">20</span><span class="token punctuation">,</span> <span class="token number">60</span><span class="token punctuation">,</span> <span class="token number">20</span><span class="token punctuation">,</span> <span class="token number">5</span><span class="token punctuation">]</span>  <span class="token comment" spellcheck="true"># 【输入，隐藏各层节点数，输出】 500轮 90%稳定 2000轮过拟合</span>    learning_rate <span class="token operator">=</span> <span class="token number">0.01</span>  <span class="token comment" spellcheck="true"># 网络学习率</span>    train_filename <span class="token operator">=</span> <span class="token string">'./clour/xunshu.csv'</span>  <span class="token comment" spellcheck="true"># 训练数据</span>    test_filename <span class="token operator">=</span> <span class="token string">'./clour/ceshu.csv'</span>  <span class="token comment" spellcheck="true"># 测试数据</span>    best_model_savepath <span class="token operator">=</span> <span class="token string">"./dnn/"</span>  <span class="token comment" spellcheck="true"># 最好模型的存放文件夹</span></code></pre><p>编写网络：</p><pre class=" language-python"><code class="language-python"><span class="token keyword">class</span> <span class="token class-name">NNet</span><span class="token punctuation">(</span>object<span class="token punctuation">)</span><span class="token punctuation">:</span>    <span class="token keyword">def</span> <span class="token function">__init__</span><span class="token punctuation">(</span>self<span class="token punctuation">,</span> config<span class="token punctuation">)</span><span class="token punctuation">:</span>        self<span class="token punctuation">.</span>config <span class="token operator">=</span> config        self<span class="token punctuation">.</span>layersls <span class="token operator">=</span> config<span class="token punctuation">.</span>layersls        self<span class="token punctuation">.</span>NNet<span class="token punctuation">(</span><span class="token punctuation">)</span>    <span class="token keyword">def</span> <span class="token function">NNet</span><span class="token punctuation">(</span>self<span class="token punctuation">)</span><span class="token punctuation">:</span>  <span class="token comment" spellcheck="true"># 根据给出的输入输出及每层网络的节点数搭建深度学习网络</span>        <span class="token triple-quoted-string string">"""        根据给出的输入输出及每层网络的节点数搭建深度学习网络        :param layersls: 【输入，隐藏各层节点数，输出】        :return:        """</span>        model <span class="token operator">=</span> tf<span class="token punctuation">.</span>keras<span class="token punctuation">.</span>Sequential<span class="token punctuation">(</span><span class="token punctuation">)</span>        <span class="token keyword">for</span> i <span class="token keyword">in</span> range<span class="token punctuation">(</span>len<span class="token punctuation">(</span>config<span class="token punctuation">.</span>layersls<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">:</span>            <span class="token keyword">if</span> <span class="token punctuation">(</span>i <span class="token operator">==</span> <span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">:</span>  <span class="token comment" spellcheck="true"># 确定网络的输入和网络的第一层节点数</span>                model<span class="token punctuation">.</span>add<span class="token punctuation">(</span>tf<span class="token punctuation">.</span>keras<span class="token punctuation">.</span>layers<span class="token punctuation">.</span>Dense<span class="token punctuation">(</span>config<span class="token punctuation">.</span>layersls<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">,</span>                                                activation<span class="token operator">=</span><span class="token string">"relu"</span><span class="token punctuation">,</span>                                                input_shape<span class="token operator">=</span><span class="token punctuation">(</span>config<span class="token punctuation">.</span>layersls<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">,</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span>                i <span class="token operator">+=</span> <span class="token number">1</span>            <span class="token keyword">elif</span> <span class="token punctuation">(</span>i <span class="token operator">==</span> len<span class="token punctuation">(</span>config<span class="token punctuation">.</span>layersls<span class="token punctuation">)</span> <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">:</span>  <span class="token comment" spellcheck="true"># 确定网络的输出</span>                model<span class="token punctuation">.</span>add<span class="token punctuation">(</span>tf<span class="token punctuation">.</span>keras<span class="token punctuation">.</span>layers<span class="token punctuation">.</span>Dense<span class="token punctuation">(</span>config<span class="token punctuation">.</span>layersls<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">)</span>            <span class="token keyword">else</span><span class="token punctuation">:</span>  <span class="token comment" spellcheck="true"># 网络的各隐藏层节点数</span>                model<span class="token punctuation">.</span>add<span class="token punctuation">(</span>tf<span class="token punctuation">.</span>keras<span class="token punctuation">.</span>layers<span class="token punctuation">.</span>Dense<span class="token punctuation">(</span>config<span class="token punctuation">.</span>layersls<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">,</span>                                                activation<span class="token operator">=</span><span class="token string">"relu"</span><span class="token punctuation">)</span><span class="token punctuation">)</span>        <span class="token keyword">return</span> model</code></pre><p><strong>剩下详细代码自行下载阅读</strong></p><hr><h2 id="实验结果"><a href="#实验结果" class="headerlink" title="实验结果"></a>实验结果</h2><p>运行zero_slip.py输出如下：</p><pre class=" language-python"><code class="language-python">\<span class="token number">1</span><span class="token punctuation">.</span>  filename <span class="token operator">**</span><span class="token keyword">is</span><span class="token operator">**</span> <span class="token punctuation">:</span>2_6<span class="token punctuation">.</span>jpg \<span class="token number">2</span><span class="token punctuation">.</span>  the fulll name of the file <span class="token operator">**</span><span class="token keyword">is</span><span class="token operator">**</span> <span class="token punctuation">:</span><span class="token punctuation">.</span>\xun\2_6<span class="token punctuation">.</span>jpg \<span class="token number">3</span><span class="token punctuation">.</span>  parent <span class="token operator">**</span><span class="token keyword">is</span><span class="token operator">**</span> <span class="token punctuation">:</span><span class="token punctuation">.</span>\xun \<span class="token number">4</span><span class="token punctuation">.</span>  filename <span class="token operator">**</span><span class="token keyword">is</span><span class="token operator">**</span> <span class="token punctuation">:</span>2_7<span class="token punctuation">.</span>jpg \<span class="token number">5</span><span class="token punctuation">.</span>  the fulll name of the file <span class="token operator">**</span><span class="token keyword">is</span><span class="token operator">**</span> <span class="token punctuation">:</span><span class="token punctuation">.</span>\xun\2_7<span class="token punctuation">.</span>jpg \<span class="token number">6</span><span class="token punctuation">.</span>  parent <span class="token operator">**</span><span class="token keyword">is</span><span class="token operator">**</span> <span class="token punctuation">:</span><span class="token punctuation">.</span>\xun \<span class="token number">7</span><span class="token punctuation">.</span>  <span class="token operator">&lt;</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token operator">></span> \<span class="token number">8</span><span class="token punctuation">.</span>  the fulll name of the file <span class="token operator">**</span><span class="token keyword">is</span><span class="token operator">**</span> <span class="token punctuation">:</span><span class="token punctuation">.</span>\xun\5_5<span class="token punctuation">.</span>jpg \<span class="token number">9</span><span class="token punctuation">.</span>  parent <span class="token operator">**</span><span class="token keyword">is</span><span class="token operator">**</span> <span class="token punctuation">:</span><span class="token punctuation">.</span>\xun \<span class="token number">10</span><span class="token punctuation">.</span> filename <span class="token operator">**</span><span class="token keyword">is</span><span class="token operator">**</span> <span class="token punctuation">:</span>5_6<span class="token punctuation">.</span>jpg \<span class="token number">11</span><span class="token punctuation">.</span> the fulll name of the file <span class="token operator">**</span><span class="token keyword">is</span><span class="token operator">**</span> <span class="token punctuation">:</span><span class="token punctuation">.</span>\xun\5_6<span class="token punctuation">.</span>jpg \<span class="token number">12</span><span class="token punctuation">.</span> 训练集集切割完毕 </code></pre><p>切割图像部分如下：</p><p><img src="https://img.tjzzz.com/img/20201209112710.png" alt="img" loading="lazy"></p><p>如图所示切割完整，效果良好。</p><p>运行first_feature.py进行特征提取：</p><pre class=" language-python"><code class="language-python"><span class="token number">1</span><span class="token punctuation">.</span>    以输出颜色矩到<span class="token punctuation">.</span><span class="token operator">/</span>clour<span class="token operator">/</span>ceshu<span class="token punctuation">.</span>csv  <span class="token number">2</span><span class="token punctuation">.</span>    以输出颜色矩到<span class="token punctuation">.</span><span class="token operator">/</span>clour<span class="token operator">/</span>xunshu<span class="token punctuation">.</span>csv  </code></pre><p>输出完整。</p><p>运行second_train.py：</p><p>输出loss值和准确率值：</p><p><img src="https://img.tjzzz.com/img/20201209112746.png" alt="img" loading="lazy"></p><pre class=" language-python"><code class="language-python">\<span class="token number">1</span><span class="token punctuation">.</span>  <span class="token operator">&lt;</span>DatasetV1Adapter shapes<span class="token punctuation">:</span> <span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> types<span class="token punctuation">:</span> tf<span class="token punctuation">.</span>string<span class="token operator">></span> \<span class="token number">2</span><span class="token punctuation">.</span>  当前最高准确率：<span class="token number">0.455</span><span class="token punctuation">:</span> \<span class="token number">3</span><span class="token punctuation">.</span>  Epoch <span class="token number">000</span><span class="token punctuation">:</span> Loss<span class="token punctuation">:</span> <span class="token number">6.768</span><span class="token punctuation">,</span> Accuracy<span class="token punctuation">:</span> <span class="token number">45.455</span><span class="token operator">%</span>， isBest<span class="token punctuation">:</span><span class="token operator">*</span> \<span class="token number">4</span><span class="token punctuation">.</span>  当前最高准确率：<span class="token number">0.591</span><span class="token punctuation">:</span> \<span class="token number">5</span><span class="token punctuation">.</span>  Epoch <span class="token number">100</span><span class="token punctuation">:</span> Loss<span class="token punctuation">:</span> <span class="token number">1.072</span><span class="token punctuation">,</span> Accuracy<span class="token punctuation">:</span> <span class="token number">59.091</span><span class="token operator">%</span>， isBest<span class="token punctuation">:</span><span class="token operator">*</span> \<span class="token number">6</span><span class="token punctuation">.</span>  当前最高准确率：<span class="token number">0.636</span><span class="token punctuation">:</span> \<span class="token number">7</span><span class="token punctuation">.</span>  Epoch <span class="token number">200</span><span class="token punctuation">:</span> Loss<span class="token punctuation">:</span> <span class="token number">0.787</span><span class="token punctuation">,</span> Accuracy<span class="token punctuation">:</span> <span class="token number">63.636</span><span class="token operator">%</span>， isBest<span class="token punctuation">:</span><span class="token operator">*</span> \<span class="token number">8</span><span class="token punctuation">.</span>  当前最高准确率：<span class="token number">0.727</span><span class="token punctuation">:</span> \<span class="token number">9</span><span class="token punctuation">.</span>  Epoch <span class="token number">300</span><span class="token punctuation">:</span> Loss<span class="token punctuation">:</span> <span class="token number">0.613</span><span class="token punctuation">,</span> Accuracy<span class="token punctuation">:</span> <span class="token number">72.727</span><span class="token operator">%</span>， isBest<span class="token punctuation">:</span><span class="token operator">*</span> \<span class="token number">10</span><span class="token punctuation">.</span> Epoch <span class="token number">400</span><span class="token punctuation">:</span> Loss<span class="token punctuation">:</span> <span class="token number">0.723</span><span class="token punctuation">,</span> Accuracy<span class="token punctuation">:</span> <span class="token number">68.182</span><span class="token operator">%</span>， isBest<span class="token punctuation">:</span> \<span class="token number">11</span><span class="token punctuation">.</span> 开始对已训练网络进行测试： \<span class="token number">12</span><span class="token punctuation">.</span> <span class="token operator">&lt;</span>DatasetV1Adapter shapes<span class="token punctuation">:</span> <span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> types<span class="token punctuation">:</span> tf<span class="token punctuation">.</span>string<span class="token operator">></span> \<span class="token number">13</span><span class="token punctuation">.</span> 测试数据的测试结果为<span class="token punctuation">:</span> <span class="token number">72.727</span><span class="token operator">%</span> \<span class="token number">14</span><span class="token punctuation">.</span> tf<span class="token punctuation">.</span>Tensor<span class="token punctuation">(</span><span class="token number">0.7272727272727273</span><span class="token punctuation">,</span> shape<span class="token operator">=</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> dtype<span class="token operator">=</span>float64<span class="token punctuation">)</span> \<span class="token number">15</span><span class="token punctuation">.</span> 预测下面<span class="token number">1</span>个水质颜色矩的类别<span class="token punctuation">(</span>正确答案为：三<span class="token punctuation">)</span>： \<span class="token number">16</span><span class="token punctuation">.</span> <span class="token punctuation">[</span><span class="token punctuation">[</span><span class="token number">29.5469</span><span class="token punctuation">,</span> <span class="token number">146.3947</span><span class="token punctuation">,</span> <span class="token number">123.1732</span><span class="token punctuation">,</span> <span class="token number">0.864407537</span><span class="token punctuation">,</span> <span class="token number">5.590716583</span><span class="token punctuation">,</span> <span class="token number">1.752484454</span><span class="token punctuation">,</span> <span class="token number">1.029934609</span><span class="token punctuation">,</span> <span class="token number">6.391303213</span><span class="token punctuation">,</span> <span class="token number">2.040322913</span><span class="token punctuation">]</span><span class="token punctuation">]</span> \<span class="token number">17</span><span class="token punctuation">.</span> <span class="token punctuation">[</span><span class="token string">'三'</span><span class="token punctuation">]</span> </code></pre><p>最后输出正确的验证结果。</p><p>运行th_app.py并输入图片地址 ./cep/1_50.jpg ：</p><pre><code>1.    输入图片地址:./cep/1_50.jpg  2.    此图片为：[&#39;一&#39;]  </code></pre><p>结果正确。</p><hr><p>本实验全部源码以及数据集以上架面包多(超便宜)，<a href="https://mianbaoduo.com/o/bread/YZWXk59y" target="_blank" rel="noopener external nofollow noreferrer">点击购买</a>，关注公众号[全都是码农]免费获得更多超值内容！</p><hr><p><img src="https://img.tjzzz.com/img/waixuan.png" alt="" loading="lazy"></p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;link rel=&quot;stylesheet&quot; class=&quot;aplayer-secondary-style-marker&quot; href=&quot;\assets\css\APlayer.min.css&quot;&gt;&lt;script src=&quot;\assets\js\APlayer.min.js&quot; cla
      
    
    </summary>
    
    
      <category term="学习历程" scheme="https://www.tjzzz.com/categories/LearningExperience/"/>
    
    
      <category term="深度学习" scheme="https://www.tjzzz.com/tags/DeepLearning/"/>
    
      <category term="python" scheme="https://www.tjzzz.com/tags/python/"/>
    
  </entry>
  
  <entry>
    <title>研究生涯003 基于最近邻法手写数字识别设计</title>
    <link href="https://www.tjzzz.com/posts/8fafb905.html"/>
    <id>https://www.tjzzz.com/posts/8fafb905.html</id>
    <published>2020-11-28T12:17:12.000Z</published>
    <updated>2020-11-28T12:55:45.000Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="\assets\css\APlayer.min.css"><script src="\assets\js\APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>本实验代码已上传<a href="https://mianbaoduo.com/o/bread/mbd-YZWVlJ1q" target="_blank" rel="noopener external nofollow noreferrer">面包多，请点击购买</a>，或者关注[全都是码农]公众号，回复[最近邻]，限时免费获取！</p><h2 id="实验概述"><a href="#实验概述" class="headerlink" title="实验概述"></a>实验概述</h2><p>本实验皆在运用OpenCV、Python等工具采用适当的算法对手写体数字进行识别与检测，可以提供训练集与测试集进行训练，并可以输入手写字体进行测试检验。</p><p>通过独立的完成本实验，可以极大地提高本人对于Python、OpenCV的理解，掌握手写数字的特征提取技术和最近邻模板匹配法。</p><h2 id="环境说明"><a href="#环境说明" class="headerlink" title="环境说明"></a>环境说明</h2><p>系统：window 10</p><p>软件：PyCharm Community Edition 2020.2.2 x64</p><p>语言：python 3.6</p><p>环境：cv2，numpy，matplotlib.pyplot，time</p><h2 id="数据集"><a href="#数据集" class="headerlink" title="数据集"></a>数据集</h2><p>本数据集为100张图片，分别为数字0-9，每个数字10张图片，8张训练集，2张测试集。如下：</p><table><thead><tr><th><img src="https://img.tjzzz.com/img/20201128201944.jpg" alt="0-1" loading="lazy">  图 1 数字零</th><th><img src="https://img.tjzzz.com/img/20201128201947.jpg" alt="1-1" loading="lazy">  图 2 数字一</th></tr></thead><tbody><tr><td><img src="https://img.tjzzz.com/img/20201128201951.jpg" alt="2-1" loading="lazy">  图 3 数字二</td><td><img src="https://img.tjzzz.com/img/20201128201954.jpg" alt="3-1" loading="lazy">  图 4 数字三</td></tr></tbody></table><h2 id="术语定义"><a href="#术语定义" class="headerlink" title="术语定义"></a>术语定义</h2><p>训练集：可以训练模型参数，使模型拟合于正确的预测函数。</p><p>测试集：通过训练过的模型进行检验，评估最终模型泛化能力。</p><p>验证集：用于调超参数，监控模型是否发生过拟合。</p><h2 id="需求说明"><a href="#需求说明" class="headerlink" title="需求说明"></a>需求说明</h2><h3 id="实验内容"><a href="#实验内容" class="headerlink" title="实验内容"></a>实验内容</h3><p>\1.    学习利用行列扫描的方法获取手写数字的上、下、左、右位置的子程序。</p><p>\2.    设计手写数字的特征提取算法，并编写对应特征提取程序。</p><p>\3.    编写基于最近邻模板匹配的手写数字识别程序。</p><h3 id="实验结果与分析"><a href="#实验结果与分析" class="headerlink" title="实验结果与分析"></a>实验结果与分析</h3><p>记录输入数字0-9各10个，程序运行后相应的识别结果，并对结果进行深入分析。</p><p>\1.    记录每个样品的特征提取效果图。</p><p>\2.    记录该样品对应的归一化后的特征值。</p><p>\3.    统计每个数字正确识别率。并对错误识别的情况进行深入分析。</p><h1 id="软件设计"><a href="#软件设计" class="headerlink" title="软件设计"></a>软件设计</h1><h2 id="一、体系设计图"><a href="#一、体系设计图" class="headerlink" title="一、体系设计图"></a>一、体系设计图</h2><p> <img src="https://img.tjzzz.com/img/20201128201939.jpg" alt="img" loading="lazy"></p><h2 id="函数清单"><a href="#函数清单" class="headerlink" title="函数清单"></a>函数清单</h2><table><thead><tr><th>函数名</th><th>函数功能简述</th><th>函数接口简述</th></tr></thead><tbody><tr><td>ImgToNp()</td><td>将图片的路径导入到矩阵中。</td><td>输入：无  输出：图片路径矩阵</td></tr><tr><td>outFeature()</td><td>处理特征函数并贴标签。</td><td>输入：图片路径矩阵  输出：训练图片矩阵集与标签集</td></tr><tr><td>star()</td><td>程序按照预设好的结构进行循环测试与输出。</td><td>输入：训练图片矩阵集与标签集  输出：训练结果</td></tr><tr><td>TestImgToNp()</td><td>输入测试图片，并转化为矩阵。</td><td>输入：测试图片地址。  输出：测试图片矩阵。</td></tr><tr><td>outfeatureImg()</td><td>输出特征图与特征值。</td><td>输入：训练图片矩阵集  输出：保存特征图与特征值为文件。\</td></tr></tbody></table><h2 id="代码介绍"><a href="#代码介绍" class="headerlink" title="代码介绍"></a>代码介绍</h2><h3 id="（一）Mainapp-py代码"><a href="#（一）Mainapp-py代码" class="headerlink" title="（一）Mainapp.py代码"></a>（一）Mainapp.py代码</h3><p>mainapp.py为主程序，表1函数清单中的函数均包含于其中。</p><p>运行程序后，程序先行运用ImgToNp()函数将img文件夹中0-9文件夹里的80个样本图片转化为矩阵保存于变量中并将其返回。</p><p><img src="https://img.tjzzz.com/img/20201128202628.png" alt="image-20201128202625504" loading="lazy"></p><p><img src="https://img.tjzzz.com/img/20201128202652.png" alt="image-20201128202640461" loading="lazy"></p><p><img src="https://img.tjzzz.com/img/20201128202721.png" alt="image-20201128202720385" loading="lazy"></p><p><img src="https://img.tjzzz.com/img/20201128202733.png" alt="image-20201128202731144" loading="lazy"></p><p>四、实验结果</p><p>运行mainapp.py后，输出框如下所示：</p><pre class=" language-python"><code class="language-python">\<span class="token number">1</span><span class="token punctuation">.</span>   图片地址以导入矩阵<span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span> \<span class="token number">2</span><span class="token punctuation">.</span>   准备提取特征<span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span> \<span class="token number">3</span><span class="token punctuation">.</span>   特征以存储于feature矩阵<span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span> \<span class="token number">4</span><span class="token punctuation">.</span>   准备贴标签<span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span> \<span class="token number">5</span><span class="token punctuation">.</span>   标签以贴完<span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span> \<span class="token number">6</span><span class="token punctuation">.</span>   是否输出特征图与特征值？y<span class="token operator">/</span>n<span class="token punctuation">:</span> </code></pre><p>输入y时，程序将输出80张样本的特征值与特征图，分别存储于”./fandimg/{0-9}”，以及”./fandimg/featureArray/{0-9}”中。如下图：</p><p><img src="https://img.tjzzz.com/img/20201128202818.jpg" alt="4img" loading="lazy">)<img src="https://img.tjzzz.com/img/20201128202825.jpg" alt="img" loading="lazy"></p><pre><code>程序继续运行，输出框输出：1.    3-9.bmp 这张图判断错误了，系统判断为：1 最接近的三个结果为：[[3. 7. 1.]]但是正确结果为：3  2.    4-9.bmp 这张图判断错误了，系统判断为：1 最接近的三个结果为：[[1. 1. 1.]]但是正确结果为：4  3.    5-10.bmp 这张图判断错误了，系统判断为：1 最接近的三个结果为：[[5. 1. 1.]]但是正确结果为：5  4.    6-10.bmp 这张图判断错误了，系统判断为：1 最接近的三个结果为：[[1. 1. 1.]]但是正确结果为：6  5.    7-9.bmp 这张图判断错误了，系统判断为：1 最接近的三个结果为：[[1. 1. 1.]]但是正确结果为：7  6.    8-9.bmp 这张图判断错误了，系统判断为：3 最接近的三个结果为：[[8. 9. 3.]]但是正确结果为：8  7.    8-10.bmp 这张图判断错误了，系统判断为：9 最接近的三个结果为：[[8. 9. 9.]]但是正确结果为：8  8.    9-9.bmp 这张图判断错误了，系统判断为：1 最接近的三个结果为：[[9. 7. 1.]]但是正确结果为：9  </code></pre><hr><p><img src="https://img.tjzzz.com/img/waixuan.png" alt="" loading="lazy">f</p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;link rel=&quot;stylesheet&quot; class=&quot;aplayer-secondary-style-marker&quot; href=&quot;\assets\css\APlayer.min.css&quot;&gt;&lt;script src=&quot;\assets\js\APlayer.min.js&quot; cla
      
    
    </summary>
    
    
      <category term="学习历程" scheme="https://www.tjzzz.com/categories/LearningExperience/"/>
    
    
      <category term="python" scheme="https://www.tjzzz.com/tags/python/"/>
    
  </entry>
  
  <entry>
    <title>研究生涯002 汽车模糊推理系统实验</title>
    <link href="https://www.tjzzz.com/posts/6815b258.html"/>
    <id>https://www.tjzzz.com/posts/6815b258.html</id>
    <published>2020-11-23T07:33:48.000Z</published>
    <updated>2020-11-28T12:36:29.000Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="\assets\css\APlayer.min.css"><script src="\assets\js\APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>本实验代码可以通过<a href="https://mianbaoduo.com/o/bread/mbd-YZWUkpZy" target="_blank" rel="noopener external nofollow noreferrer">面包多购买</a>或者关注公众号免费获取。扫码关注回复“模糊汽车”即可获取全部内容！</p><h1 id="一、实验目的"><a href="#一、实验目的" class="headerlink" title="一、实验目的"></a>一、实验目的</h1><p>理解模糊逻辑推理的原理及特点，熟练应用模糊推理，了解可能性理论。</p><p>模糊推理所处理的事物自身是模糊的，概念本身没有明确的外延，一个对象是否符合这个概念难以明确地确定，模糊推理是对这种不确定性,即模糊性的表示与处理。模糊逻辑推理是基于模糊性知识(模糊规则的一种近似推理，一般采用Zadeh 提出的语言变量、语言值、模糊集和模糊关系合成的方法进行推理。</p><h1 id="二、实验内容"><a href="#二、实验内容" class="headerlink" title="二、实验内容"></a>二、实验内容</h1><p>假设两汽车均为理想状态，即<img src="https://img.tjzzz.com/img/clip_image002.png" alt="img" loading="lazy">，Y为速度，U为油门控制输入。</p><p>（1）设计模糊控制器控制汽车由静止启动，追赶200m外时速90km的汽车并与其保持30m的距离。</p><p>（2）在25时刻前车速度改为时速110km时，仍与其保持30m距离。</p><p>（3）在35时刻前车速度改为时速70km时，仍与其保持30m距离。</p><p>要求：</p><p>（1）设计两输入一输出的模糊控制器，给出输入、输出语言变量的隶属函数图，模糊控制规则表，推论结果立体图。</p><p>（2）用SIMULINK仿真两车追赶的模糊控制系统，给出目标车的速度曲线图、油门踩放图、追赶车速度图、与前车相对距离图。</p><h1 id="三、实验结果"><a href="#三、实验结果" class="headerlink" title="三、实验结果"></a>三、实验结果</h1><p>以误差量(两车距离〉及误差对时间的变化量作为输入进行模糊规则设计。本例采用位置型模糊控制器，即控制规则的条件为: </p><p>if v为A and th为B then y为C</p><p>按一般方法，可得一套控制规律[]如表1所示。</p><p><img src="https://img.tjzzz.com/img/clip_image003.png" alt="img" loading="lazy"></p><div align = "center">表 1 控制规律</div><p>所示规则库有空缺，为了防止失控，可以将(e,△e)按如下公式转换为极坐标(r,θ)</p><p><img src="https://img.tjzzz.com/img/clip_image004.png" alt="img" loading="lazy"></p><p>将规则库填满，从而得到表2所示极坐标形式的模糊控制规则：</p><p><img src="https://img.tjzzz.com/img/clip_image005.png" alt="img" loading="lazy"></p><div align = "center">表 2 极坐标形式的模糊控制规则</div><p>   由上表可知，将θ分为PB PM ZE NM NB,将r分为NB ZE PB，y分为PB PM ZE NM NB。</p><p>因此可以根据此表一一写出对应规则如：</p><p><img src="https://img.tjzzz.com/img/clip_image007.jpg" alt="img" loading="lazy"></p><p>等15条规则。</p><p>由MATLAB命令行输入fuzzy，配置模糊系统，设置输入r、th(θ)、输出y的论域分别为[0,1]、[-3,3]和[-1,1]，并设置隶属函数(均取三角形)如下：</p><p><img src="https://img.tjzzz.com/img/clip_image009.jpg" alt="img" loading="lazy"></p><p><img src="https://img.tjzzz.com/img/clip_image011.jpg" alt="img" loading="lazy"></p><p><img src="https://img.tjzzz.com/img/clip_image013.jpg" alt="img" loading="lazy"></p><p><img src="https://img.tjzzz.com/img/clip_image015.jpg" alt="img" loading="lazy"></p><p><img src="https://img.tjzzz.com/img/clip_image017.jpg" alt="img" loading="lazy"></p><p> 将建立好的FLS模糊推理系统car5.fis放入工作区，并导入设计好的SIMULINK仿真追赶模型如下：</p><p><img src="https://img.tjzzz.com/img/clip_image019.jpg" alt="img" loading="lazy"></p><p>运行程序输出如下：</p><p><img src="https://img.tjzzz.com/img/clip_image021.jpg" alt="img" loading="lazy"></p><p><img src="https://img.tjzzz.com/img/clip_image023.jpg" alt="img" loading="lazy"></p><p><img src="https://img.tjzzz.com/img/clip_image025.jpg" alt="img" loading="lazy"></p><p><img src="https://img.tjzzz.com/img/clip_image027.jpg" alt="img" loading="lazy"></p><h1 id="四、实验总结"><a href="#四、实验总结" class="headerlink" title="四、实验总结"></a>四、实验总结</h1><p>由本次实验可知，隶属度，模糊关系，模糊规则的关系如下：</p><p>模糊规则，本质是定义在X x Y的二元模糊关系R。模糊规则的形式为：if x is A then y is B。</p><p>模糊关系R是X×Y中的模糊子集。若用μR(u，v)表示其隶属函数，则μR(u，v)反映了u与v有关系R的程度。</p><p>本实验达成了要求，并使我学到了很多知识，包括FIS模糊程序的建立，SIMULINK模型的搭建。更主要的是通过这次实验使我更加深刻地理解了这门课程的重要性。</p><p> 使我学到了很多知识，包括FIS模糊程序的建立，SIMULINK模型的搭建。更主要的是通过这次实验使我更加深刻地理解了这门课程的重要性。</p><hr><p>本实验代码可以通过<a href="https://mianbaoduo.com/o/bread/mbd-YZWUkpZy" target="_blank" rel="noopener external nofollow noreferrer">面包多购买</a>或者关注公众号免费获取。扫码关注回复“模糊汽车”即可获取全部内容！</p><hr><p><img src="https://img.tjzzz.com/img/waixuan.png" alt="" loading="lazy"></p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;link rel=&quot;stylesheet&quot; class=&quot;aplayer-secondary-style-marker&quot; href=&quot;\assets\css\APlayer.min.css&quot;&gt;&lt;script src=&quot;\assets\js\APlayer.min.js&quot; cla
      
    
    </summary>
    
    
      <category term="学习历程" scheme="https://www.tjzzz.com/categories/LearningExperience/"/>
    
    
      <category term="MATLAB" scheme="https://www.tjzzz.com/tags/matlab/"/>
    
  </entry>
  
  <entry>
    <title>研究生涯001 浅析机器视觉在医疗影像处理中的应用</title>
    <link href="https://www.tjzzz.com/posts/9f1d034.html"/>
    <id>https://www.tjzzz.com/posts/9f1d034.html</id>
    <published>2020-11-23T07:14:52.000Z</published>
    <updated>2020-11-23T08:09:48.000Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="\assets\css\APlayer.min.css"><script src="\assets\js\APlayer.min.js" class="aplayer-secondary-script-marker"></script><h1 id="浅析机器视觉在医疗影像处理中的应用"><a href="#浅析机器视觉在医疗影像处理中的应用" class="headerlink" title="浅析机器视觉在医疗影像处理中的应用"></a>浅析机器视觉在医疗影像处理中的应用</h1><p>以人工智能，大数据和云计算为代表的新型电子信息产业的快速发展，极大地改善了人们的生活，促进了技术的不断进步。技术创新和智能产品以井喷的形式呈现。在人工智能风潮的影响下，现有的电子信息产业链条正逐步转变为网络信息产业智能网，电子信息产业的新增长点和边界也越来越大。</p><p>随着科学技术的飞速发展，单一目标的低精度识别已不能满足社会生产的需求，基于人工智能的图像识别技术已经成为时代的要求。识别图片的目的是将存储的信息与实际信息（当时的感官输入信息）进行比较，以实现图片识别。图像描述是使用字符表现图像中每个特征，甚至对象之间的关联。最后，获得了目标特征及其关系的抽象表达。可以在图像识别过程中使用匹配的模板。在某些特定应用中，图形识别不仅需要识别目标，还需要目标的位置和姿态以指导初始计算。</p><h2 id="（一）深度学习在医学图像研究现状"><a href="#（一）深度学习在医学图像研究现状" class="headerlink" title="（一）深度学习在医学图像研究现状"></a>（一）深度学习在医学图像研究现状</h2><p>在医学中，医生通常会对感染细胞进行人工诊断，了解患者的细胞感染情况以及病理研究，通过人眼进行判断，十分的耗费人工。当前医学中十分普及的方式就是通过仪器采集部分细胞样本，转化成图片，运用人工进行识别。这种仪器减轻了研究人员的精力消耗，促进了治疗水平的提升，但是依旧存在一些准确率低下的问题。</p><p>针对这些不足，决策树算法、Mean-Shift 聚类、FCM 聚类算法、朴素贝叶斯分类器等传统方法在早些年大放异彩，虽然在对医学影像处理的过程中存在着速度快，容易部署等特点，但总体来说传统的方法对于图像的细节辨析存在不足的现象。所以业界逐渐将深度学习引用到了医学领域的图像处理上。</p><p>目前，深度学习在医学分类学习和表征学习方面取得了显著进展，有不少研究人员</p><p>获得了不错的成果。</p><p>2013年，Plis采用DBN来识别脑成像Huntington病变。实验结果表明，深度学习能够学习重要的生理表征，在神经影像学应用中具有很大的潜力[<a href="#_edn1">[1]</a>]。同年，Chakdar和Potetz[<a href="#_edn2">[2]</a>]使用DBN来提取低级别麟状上皮内病变（Low Grade Squamous Intraepithelial Lesion，LGSIL）的特征，并将这些特征输入SVM进行分类，其分类准确率达到100%。Cruz-Roa等人通过自编码神经网络从常规组织病理学图像中自动识别基底细胞癌，相比传统方法，识别精度提高了7%[<a href="#_edn3">[3]</a>]。2014年，Roth[<a href="#_edn4">[4]</a>]等人采用卷积神经网络方法用于临床淋巴结病变识别，证明CNN可以推广到二维、三维医学图像分析任务，且对数据集进行随机旋转采样可以提高 CNN的分类性能。</p><p>2015年，在CNN基础之上，Ypsilantis[<a href="#_edn5">[5]</a>]提出3S-CNN模型对107例食道癌患者的PET图像进行检测，在该数据集上敏感性和特异性分别达到80.7%、81.6%，识别效果远超其它模型。Gao[<a href="#_edn6">[6]</a>]为了对核性白内障的严重程度进行分级评估，先将图片输入卷积神经网络，再利用递归神经网络进一步提取特征，最后使用SVM进行分类，结果验证了该模型优于临床白内障分级方面的最新进展。Li等人[20在对阿尔茨海默病进行研究时，将RBM作为基本单元并利用 Dropout技术构建深度学习模型。与经典深度学习方法相比，平均精度提高了5.9%。</p><p>2017年初，斯坦福大学研究人员Esteva等人在《Nature》上发表了一篇关于皮肤癌检测的论文[<a href="#_edn7">[7]</a>]，其模型的检测正确率及敏感度均超过了专业医师。随着计算机技术的快速发展，利用深度学习技术进行医学图像辅助诊断将会越来越成熟。</p><h2 id="（二）医学图像识别的挑战"><a href="#（二）医学图像识别的挑战" class="headerlink" title="（二）医学图像识别的挑战"></a>（二）医学图像识别的挑战</h2><h3 id="1-数据集获取困难"><a href="#1-数据集获取困难" class="headerlink" title="1.    数据集获取困难"></a>1.    数据集获取困难</h3><p>深度学习有如此强大的识别能力基于它庞大的数据集，而在医学领域，病例相同的数据集获取难度颇高，因为CNN的参数多，必须依靠大规模的训练数据才能防止过度拟合。在数据量少的情况下，有两种解决方案：一个叫Data Augmentation。就是依赖现有的图像，通过旋转，平移，变形等变化，产生更多的图像。二是使用转移学习。其思想是通过在另一种大规模的数据集上面训练，得到CNN的参数作为初始值，再在目标数据集上训练对参数进行调优。</p><h3 id="2-医学影像清晰度"><a href="#2-医学影像清晰度" class="headerlink" title="2.    医学影像清晰度"></a>2.    医学影像清晰度</h3><p>医学影像对于不同患者以及不同仪器来说都有显著的差异，包括灰度的变化以及模糊情况。而图像增强作为图像处理中十分重要的一个环节,决定着处理后图像的整体视觉效果与目标图像是否清晰,因此,对医学图像增强算法的研究显得十分重要。</p><h3 id="3-医学影像的维度"><a href="#3-医学影像的维度" class="headerlink" title="3.    医学影像的维度"></a>3.    医学影像的维度</h3><p> 随着医学的发展，二维图像已经无法满足医生的要求，例如在肺部高分辨率CT影像的研究中，真正得到的模型其实大多是三维模型，而深度学习主要是基于二维模型的训练，这也是研究人员面临的巨大挑战。</p><h2 id="（三）总结与展望"><a href="#（三）总结与展望" class="headerlink" title="（三）总结与展望"></a>（三）总结与展望</h2><p>在近几年，逐渐的很多科学家将人工智能思想应用到了医学辅助诊断中，提出了很多将人工智能的思想应用到了医学辅助诊断当中的方法，并开发了许多基于较小样本量的数据集训练出的准确率很理想的模型。</p><p>将人工智能识别与人工识别相对比发现，人工智能的效率与准确率要显著高于人类，例如深度学习对于脑肿瘤细胞的检测与识别对于人工的辅助有着很强的实际应用作用，此外，人工智能技术还可以广泛用于设计自动化系统，该系统可以直接检测病人的肿瘤细胞，这将大大降低人的操作难度，节省了医疗人员宝贵的时间。所以人工智能对于医学的发展的帮助是可观的也是乐观的。</p><p>从众多的医学影像处理的应用来看,处理方法的来源除了依赖于常见的其它图像处理理论之外,还必须或者最好是从医学影像本身的成像原理出发，设计出适当的医学影像处理法,从而在很大程度上满足实际工作的需要,所以医疗器材的发展也刻不容缓。</p><h2 id="参考文献"><a href="#参考文献" class="headerlink" title="参考文献"></a>参考文献</h2><hr><p>[[1]] Plis S M, Hjelm D R, Salakhutdinov R, et al. Deep learning for neuroimaging: a validation study[J]. Frontiers in neuroscience, 2014, 8: 229.</p><p>[[2]] Chakdar K, Potetz B. Deep learning for the semiautomated analysis of Pap smears[J]. Medical Applications of Artificial Intelligence, 2013: 193-214.</p><p>[[3]] Cruz-Roa A A, Ovalle J E A, Madabhushi A, et al. A deep learning architecture for image representation, visual interpretability and automated basal-cell carcinoma cancer detection[C]//International Conference on Medical Image Computing and Computer-Assisted Intervention. Springer, Berlin, Heidelberg, 2013: 403-410.</p><p>[[4]] Roth H R, Lu L, Seff A, et al. A new 2.5 D representation for lymph node detection using random sets of deep convolutional neural network observations[C]//International conference on medical image computing and computer-assisted intervention. Springer, Cham, 2014: 520-527.</p><p>[[5]] Ypsilantis P P, Siddique M, Sohn H M, et al. Predicting response to neoadjuvant chemotherapy with PET imaging using convolutional neural networks[J]. PloS one, 2015, 10(9): e0137036.</p><p>[[6]] Gao X, Lin S, Wong T Y. Automatic feature learning to grade nuclear cataracts based on deep learning[J]. IEEE Transactions on Biomedical Engineering, 2015, 62(11): 2693-2701.</p><p>[[7]] Esteva A, Kuprel B, Novoa R A, et al. Dermatologist-level classification of skin cancer with deep neural networks[J]. nature, 2017, 542(7639): 115-118.</p><hr><p><img src="https://img.tjzzz.com/img/waixuan.png" alt="" loading="lazy"></p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;link rel=&quot;stylesheet&quot; class=&quot;aplayer-secondary-style-marker&quot; href=&quot;\assets\css\APlayer.min.css&quot;&gt;&lt;script src=&quot;\assets\js\APlayer.min.js&quot; cla
      
    
    </summary>
    
    
      <category term="学习历程" scheme="https://www.tjzzz.com/categories/LearningExperience/"/>
    
    
      <category term="机器视觉" scheme="https://www.tjzzz.com/tags/CV/"/>
    
  </entry>
  
  <entry>
    <title>人工智能问答NO.8 决策树与随机森林</title>
    <link href="https://www.tjzzz.com/posts/becca920.html"/>
    <id>https://www.tjzzz.com/posts/becca920.html</id>
    <published>2020-07-05T00:57:10.000Z</published>
    <updated>2021-05-07T10:39:50.000Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="\assets\css\APlayer.min.css"><script src="\assets\js\APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>已知输入变量与输出变量均为连续变量的预测问题被称为<strong>回归问题</strong>；</p><p>输出变量为有限个离散变量的预测问题称为<strong>分类问题</strong>。</p><p><strong>决策树</strong>是一种常见的分类与回归方法，因其呈树状结构而得名。决策树算法的思路简单易懂，但也包含丰富的内容：<strong>随机森林、GBDT、Xgboost</strong>等流行算法都是在其模型上的延伸。</p><h3 id="Q1-简要介绍决策树是什么"><a href="#Q1-简要介绍决策树是什么" class="headerlink" title="Q1 简要介绍决策树是什么"></a>Q1 简要介绍决策树是什么</h3><p>决策树是一种描述对实例进行<strong>分类</strong>的结构。</p><p>严格来说，决策树由结点与有向边共同构成树形结构；其中结点又分为内部结点、叶节点，他们分别表示特征、类别。决策树要解决的问题本质上就是从训练数据找到一组“最佳“的分类规则，这个树可能有多个，也可能没有。<strong>“最佳”则用损失函数来靠近</strong>。</p><p>决策树的核心思想就是，找到一个最优特征，对该特征进行最好的划分，并且重复上述步骤，不断丰富内部节点，直到满足指定条件。</p><p><strong>决策树的实施包括什么？</strong></p><p>决策树的实施包括特征选择，决策树的生成与树的修剪。</p><p><strong>1. 特征选择</strong></p><p>由于通常实际项目中的特征变量数都会远远大于两个。此时对多个特征进行先后顺序不同的决策时会有不同的结果与准确率，所以就需要“特征选择”来决定当前应选用哪个特征来划分。</p><p>直观来讲，当下特征中对分类“最有效”的特征应该优化选择；比如判断是否爱吃<strong>四川火锅</strong>，“<strong>是否爱吃辣</strong>”比“<strong>是否有洁癖</strong>”更有代表性，所以应当排在前面。</p><p>从定量的角度，信息增益与信息增益比就是可以表示特征“<strong>有效性</strong>”的指标。</p><p>(1)<strong>熵</strong></p><p><strong>香农</strong>曾说过，信息是用来消除随机不确定性的东西。回到分类问题本身，对于用决策树分类前的数据，因为没有其类别的任何信息，此时数据的不确定性是最大的，<strong>熵也是最大的</strong>；对于决策树分类后的数据，理论上，特征信息被最有效地利用了，数据的随机不确定性也得到<strong>最大程度</strong>的消除，数据最后被安排在几种类别中，此时数据的<strong>不确定性</strong>是最小的，即熵是<strong>最小</strong>的；而过程中每用一个特征进行一次<strong>决策</strong>，就能<strong>降低</strong>一次数据的熵。自然地，当下最优的特征就是使熵降低最多的特征。这就是<strong>信息增益</strong>的主要思想。</p><p>(2)<strong>信息增益</strong></p><p>那么如何理解<strong>信息增益</strong>呢？根据定义，信息增益可以视作某一特征对数据集混乱程度降低的<strong>贡献程度</strong>:即当某个<strong>特征</strong>确定下来后，数据集熵的降低得越明显，说明该特征对数据集提供了更多的信息，贡献度越大。</p><p>一般地，这个差值也称为<strong>互信息</strong>。</p><p>2.那么如何理解信息增益呢？根据定义，信息增益可以视作某一特征对数据集<strong>混乱</strong>程度降低的<strong>贡献</strong>程度:即当某个特征确定下来后，数据集熵的降低得越明显，说明该特征对数据集提供了更多的信息，贡献度越大。<br>一般地，这个差值也称为互信息。</p><p><strong>2.决策树的生成</strong></p><p>在确定了特征选择的方法后，树就可以一层一层生成了。本节介绍的ID3算法与C4.5算法是由<strong>Quinlan</strong>分别在1986年与1993年提出的。</p><p>(1)<strong>ID3 算法</strong></p><p>ID3算法在特征选择的过程，用上文所述的信息增益原则进行；在树的生成过程，对所选取的特征的不同取值进行划分；最后建立一棵决策树。值得注意的是在决策树生成前要先设定好一个<strong>阈值</strong>，当余下所有特征的信息增益小于这个阈值时，树的生长就完成了。</p><p>(2)<strong>C4.5 算法</strong></p><p>C4.5算法是ID3算法的延伸，在特征选择的过程中，用信息增益比的原则进行，这是与ID3算法不同的地方；在树的生成过程，对所选的特征的不同取值进行划分；最后建立一颗决策树。</p><p><strong>3.决策树的修剪</strong><br>    根据上述算法生成的决策树，由于考虑到每个特征的每种可能取值，容易出现过拟合，即对训练数据的分类准确率很高，对测试数据分类的准确率比较低。这是决策树的算法特征所决定的，所以对决策树的修剪就显得非常重要。<br>本文介绍的是用极小化损失函数进行剪枝的方法。损失函数如下所示：</p><p><img src="https://sabai.oss-cn-beijing.aliyuncs.com/img/20200419102827.png?x-oss-process=image/auto-orient,1/interlace,1" alt="" loading="lazy"></p><p>其中T表示确定的一棵决策树，该数共有｜<em>T</em>｜个叶子结点，每个结点下包含训练样本N<sub>t</sub>个，H<sub>t</sub>（T)表示训练样本N<sub>t</sub>的经验熵。</p><p>可以看到损失函数包括两部分:决策树分类结果的熵与决策树的叶子结点数量。</p><p>极小化损失函数时，既需要使得决策树分类后的数据熵很小，同时也需要满足决策树的叶子结点不能太多，即决策树不能太大。其中系数α表示对两者的平衡，α越大，就越倾向于牺牲一定的模型准确率以减少树的叶子结点数量；反之相反。</p><p><strong>剪枝的具体步骤如下</strong>:</p><p>1)计算每个结点的经验熵。</p><p>2)计算损失函数：记当前树的某个叶子结点剪掉前后的树的损失函数，记为C<sub>α</sub>（T<sub>前</sub>)与C<sub>α</sub>（T<sub>后</sub>)，若C<sub>α</sub>（T<sub>前</sub>)≥C<sub>α</sub>（T<sub>前</sub>)，则剪掉该叶子结点，其父结点成为新的叶子结点，得到一颗新的决策树。</p><p>3)对决策树的叶子结点重复2)的过程，直至不能再剪裁为止。</p><h3 id="Q2-决策树算法的优点和缺点是什么？"><a href="#Q2-决策树算法的优点和缺点是什么？" class="headerlink" title="Q2 决策树算法的优点和缺点是什么？"></a>Q2 决策树算法的优点和缺点是什么？</h3><p><strong>优点</strong>：</p><p>1)<strong>思路简明</strong>，计算速度快。</p><p>2)决策树的分类<strong>规则非常清晰</strong>，能够看到那些特征比较重要，具有较强的可解释性。能够同时处理数据型和常规型属性。很多算法要求数据属性是统一的。</p><p>3)<strong>对缺失值不敏感</strong>，可以处理不相关特征数据。</p><p>4)<strong>不需要</strong>任何<strong>参数假设</strong>。</p><p><strong>缺点</strong>：</p><p>1)对连续的特征变量处理效果不好，因为算法模型中主要都是对分类变量的特征讨论的，例如树的生成时将某一特征的所有属性都生成子叶。</p><p>2)在树的生成过程中，对某一特征进行划分时会将该特征每一可能的取值分为一类，就会使得树对取值较多的连续变量过于敏感；例如，如果某特征的每一取值的样本都是唯一的，即是同一类的，用该特征进行划分就会有明显的信息增益。但实际中这并不是最有意义的特征。</p><p>3)非常容易过拟合。</p><h3 id="Q3-试着简要介绍随机森林"><a href="#Q3-试着简要介绍随机森林" class="headerlink" title="Q3 试着简要介绍随机森林"></a>Q3 试着简要介绍随机森林</h3><p>由于决策树分类器的缺点和分类方法自身较为<strong>单薄</strong>， Leo Breiman和 Adele Cutler于2001年提出了随机森林算法，<strong>随机森林</strong>，顾名思义，就是指利用多棵决策树对样本进行训练并预测的一种方法。</p><p>随机森林的思想可以用一个简单例子来解释。</p><p>假设多位评委为饭店评定星级，每位评委都应独立地对餐品做出“五级”或“四级”的评价，最终该饭店的星级，则由所有评委的评价结果决定，最多评委评价的级别就是该饭店的星级。</p><p>这里，整个评委团队就像是随机森林的算法模型，饭店则是待测对象，饭店的最终星级由评委团队中每一位评委的投票结果决定。</p><p>随森林包含多个<strong>决策树</strong>，就算每棵树的分类能力比较弱，或者存在误差，但依靠<strong>大量</strong>决策树的投票结果，误差会相对抵消，从而使得效果较好的“决策树”的分类结果表现出来。这就是随机森林算法的思想。</p><p>同样是决策树，随机森林模型既可以处理回归问题，也可以处理分类问题。原因是在随机森林的实施过程中，使用的是不同于上述简单分类决策树的CART决策树。</p><p><strong>简要介绍随机森林实施步骤与特点</strong>。</p><p><strong>1.CART决策树</strong></p><p>在介绍随机森林的实验步骤之前，需要先简要介绍一下CART决策树。CART模型的全称是分类与回归树模型，是在1984年由Breiman由出。不同于简单分类决策树，CART决策树是二叉树，即要求对每次某个特征划分时只能分为两类，但会对该特征的不同取值进行多次划分，以保证信息得到充分使用。</p><p>下面分别介绍回归树与分类树是如何进行特征选择与树的生成的。</p><p>(1)<strong>回归树</strong></p><p>已知决策树本质上是建立一种划分特征空间的规则，一个特征空间对应着一个输出值。</p><p>则回归树模型可写为:</p><p><img src="https://img.tjzzz.com/img/20200422100421.png?x-oss-process=image/auto-orient,1/interlace,1/quality,q_60" alt="" loading="lazy"></p><p>其中R<sub>k</sub>表示一划分好的特征空间域，一共有K个这样的划分，每一个划分的特征空间的输出值为c<sub>k</sub>，c<sub>k</sub>的取值为属于特征空间R<sub>k</sub>的样本点的输出值的平均水平，I<sub>(x∈R<sub>k</sub>)</sub>则为<strong>示性函数</strong>。<br>特征选择和树的生成其实就是对特征空间建立划分规则的过程。不同于简单分类决策树，回归树始终满足如下损失函数，并以此为原则进行特征空间的划分:</p><p><img src="https://img.tjzzz.com/img/20200422100225.png" alt="" loading="lazy"></p><p>那怎么认识这个损失函数呢？</p><p>首先，由于CART决策树是二叉树，所以每次划分会把特征空间划分为两部分，损失函数就是两部分数据的误差的和，这两部分特征空间分别记为R<sub>1</sub>（j，s)与R<sub>2</sub>（j，s)。为什么划分好的特征空间会与（j，s)有关呢？假设在一结点选择特征x以及其某一取值s，划分时则将特征空间分为｛x≥s｝与｛x＜s｝两部分。所以特征空间是由（j，s)共同确定的。最小化损失函数是要使得两部分的误差都很小。</p><p>然后以第一个部分的误差为例，来看怎么定义一个特征空间内的样本点的误差。根据回归决策树的性质，一个特征范围内的取值是一样的，所以误差才有：</p><p><img src="https://img.tjzzz.com/img/20200422100700.png?x-oss-process=image/auto-orient,1/interlace,1/quality,q_60" alt="" loading="lazy"></p><p>而最合理的c<sub>1</sub>取值应该是使得改组内方差最小的值(均值)。这也和回归树模型中C<sub>k</sub>的取值方法是统一的。</p><p>(2)<strong>分类树</strong></p><p><strong>分类树</strong>（classification tree)简单地说，就是根据训练数据集构造一个类似树形的分类决策模型，然后用这个模型来辅助决策。</p><p> 例如下图是一个简单的是否举行某个活动的决策树(分类树)：</p><p>　　  　　　　　　　　</p><p>　<img src="https://img.tjzzz.com/img/20200422114431.png?x-oss-process=image/auto-orient,1/interlace,1/quality,q_60" alt="" loading="lazy"></p><p>我们可以通过上面的决策树进行预测，当天气晴朗，交通畅通时，我们预测该活动很可能要举办；当天下小雨交通拥挤时，我们预测活动很可能被取消。</p><p>这只是一个简单的小例子，真实中的决策树方法包括以下几个步骤：</p><p>(1)<strong>收集数据</strong>：可以使用任何方法。</p><p>(2)<strong>准备数据</strong>：树构造算法只适用于标称型数据，因此数值型数据必须离散化。</p><p>(3)<strong>选取划分算法</strong>：根据数据的特点，选取合适的划分算法</p><p>(4)<strong>构造决策树</strong>：使用选取的划分算法构造树形的决策模型</p><p>(5)<strong>测试算法</strong>：使用经验树计算错误率</p><p>(6)<strong>使用算法</strong>：使用决策树模型预测决策</p><p><strong>2.随机森林的实施步骤</strong></p><p>1）随机有放回地从N个训练样本中抽取N个样本，作为生成树的训练集。</p><p>2）对K个特征随机选k个作为特征子集在对树做特征选择时，从特征子集中选择最优的特征。</p><p>3）让树做最大程度的生长，不做树的修剪。</p><p>4）重复1）～3）的步骤T次，建立T棵决策树；若是分类问题，则某样本T棵决策树的投票结果即为最终类别；若是回归问题，则T棵决策树的回归结果的算术平均值即为最终结果。</p><p><strong>3.随机森林的几个特点</strong></p><p>1）采用Bootstrap抽样法。原因在于:若不如此，会使得每棵树的分类结果一样；这样失去了树之间的独立性，随机森林的“投票”思想也就失去了意义。</p><p>2）每次随机从特征中选取k≤K个作为特征子集建立决策树。一方面，可以降低复杂度，加快算法的实施过程；另一方面，可以保证树与树之间有更好的独立性。实际上当k-K时，这里的决策树就等价于普通的CART决策树；k≤K亦可增强模型的泛化能力。</p><p>3）不需要对树进行剪裁。已知剪裁是为了避免决策树的过拟合；但由于随机森林的实施过程对样本和特征都进行了随机选择，再加上最终投票的形式，不剪枝也不会出现过拟合，所以就不必剪裁了。</p><h3 id="Q4如何做随机森林参数的选择"><a href="#Q4如何做随机森林参数的选择" class="headerlink" title="Q4如何做随机森林参数的选择"></a>Q4如何做随机森林参数的选择</h3><p>在实施步骤中包含两个参数:特征子集的数量和需建立的决策树数量T</p><p>对于后者，由投票的思想，理论上T应该越大越好；但由于会影响算法的复杂度，应选择适当的T使得准确率与复杂度达到平衡。</p><p>对于前者，已知当k较大时，树与树相关性比较强，会影响模型的准确率；k较小时，单棵树的分类能力太差，也会影响模型的准确率。经验上一般把特征数量的对数作为特征子集的数量。</p><p>为了更好地取得合适的k，通常会用袋外错误率最低的方法。</p><p>实际上，使用 Bootstrap法确定每棵树的训练集时，对于第i棵树，约有三分之一的样本没有参与树的生成；这些样本被称为这棵树的袋外样本(oob样本)由此，袋外错误率(out-of–bag error)的定义如下:</p><p><img src="https://img.tjzzz.com/img/20200424153706.png" alt="" loading="lazy"></p><p>其中N1表示对于某个样本，它作为oob样本的树它的分类错误的棵数，N表示对于某个样本，计算它作为oob样本的树的数量。可证明 oob error是随机森林泛化误差的一个无偏估计。</p><h3 id="Q5试简要介绍随机森林的优缺点"><a href="#Q5试简要介绍随机森林的优缺点" class="headerlink" title="Q5试简要介绍随机森林的优缺点"></a>Q5试简要介绍随机森林的优缺点</h3><p>优点:</p><p>1）在当前所有算法中，有较好的准确率。</p><p>2）可高度并行化，对于大数据大样本很有优势。</p><p>3）实现过程相对简单。</p><p>4）模型较稳健，对部分的特征缺失不敏感。</p><p>5）随机森林算法能够降低方差。为什么能降低方差呢？因为随机森林的预测输出值是多课决策树的均值，如果有n个独立同分布的随机变量x<sub>i</sub>,它们的方差都为γ<sup>2</sup>，则它们的均值的方差为：</p><p><img src="https://img.tjzzz.com/img/20200424153904.png" alt="" loading="lazy"></p><p>缺点：</p><p>1）对于噪音比较大的样本集，容易过拟合。</p><p>2）取值划分较多的特征容易对模型产生更大的影响，从而影响模型的效果</p><p><strong>常见面试笔试题:随机森林的“随机性”表现在哪里？比决策树好在哪里？</strong></p><p>分析:“随机性”表现在两方面:一方面，每棵决策树的样本是经过 Bootstrap随机选取的；另一方，每棵决策树生成所用到的特征是从所有特征集中随机选取的。</p><p>相较于决策树，正因为随机森林的“随机性”，其在过拟合问题上有所改善，极大地提高了分类模型的准确率。</p><h3 id="Q6决策树中C4-5算法优化了ID3算法的什么缺点"><a href="#Q6决策树中C4-5算法优化了ID3算法的什么缺点" class="headerlink" title="Q6决策树中C4.5算法优化了ID3算法的什么缺点"></a>Q6决策树中C4.5算法优化了ID3算法的什么缺点</h3><p>ID3算法使用信息增益来选择用于分组的变量，但是这样可能会出现偏向于取值比较多的变量的情况，并使得模型预测的准确率下降。而C4.5利用信息增益率能够有效地解决上述ID3使用信息增益时出现的问题。</p><p>C4.5算法在构造决策树的过程中可以进行相应的剪枝，但是ID3算法没有。并且C4.5算法在对数据预处理的时候还会对连续型的变量进行离散化处理。</p><hr><p><img src="https://img.tjzzz.com/img/waixuan.png" alt="" loading="lazy"></p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;link rel=&quot;stylesheet&quot; class=&quot;aplayer-secondary-style-marker&quot; href=&quot;\assets\css\APlayer.min.css&quot;&gt;&lt;script src=&quot;\assets\js\APlayer.min.js&quot; cla
      
    
    </summary>
    
    
      <category term="思考问答" scheme="https://www.tjzzz.com/categories/thinkQA/"/>
    
    
      <category term="机器学习" scheme="https://www.tjzzz.com/tags/MachineLearning/"/>
    
      <category term="人工智能面试" scheme="https://www.tjzzz.com/tags/aiInterview/"/>
    
  </entry>
  
</feed>
