<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:media="http://search.yahoo.com/mrss/"><channel><title><![CDATA[Deserts]]></title><description><![CDATA[从此 现在 今天]]></description><link>https://deserts.io/</link><image><url>https://deserts.io/favicon.png</url><title>Deserts</title><link>https://deserts.io/</link></image><generator>Ghost 5.16</generator><lastBuildDate>Mon, 13 Apr 2026 19:55:20 GMT</lastBuildDate><atom:link href="https://deserts.io/rss/" rel="self" type="application/rss+xml"/><ttl>60</ttl><item><title><![CDATA[半监督分割：从数据增强到学习范式]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>&#x56FE;&#x50CF;&#x5206;&#x5272;&#x5E94;&#x7528;&#x7684;&#x6700;&#x5927;&#x963B;&#x788D;&#x662F;&#x7F3A;&#x4E4F;&#x9AD8;&#x8D28;&#x91CF;&#x6807;&#x6CE8;&#x7684;&#x8BAD;&#x7EC3;&#x6570;&#x636E;&#x3002;&#x6DF1;&#x5EA6;&#x5206;&#x5272;&#x6A21;&#x578B;&#x7684;&#x6CDB;&#x5316;&#x80FD;&#x529B;&#x4F9D;&#x8D56;&#x5927;&#x89C4;&#x6A21;&#x548C;&#x9AD8;&#x8D28;&#x91CF;&#x7684;&#x50CF;&#x7D20;&#x7EA7;&#x6807;</p>]]></description><link>https://deserts.io/semi-supervised-segmenation-a-survey/</link><guid isPermaLink="false">62949703f96acd00347df98b</guid><dc:creator><![CDATA[Junwen]]></dc:creator><pubDate>Sat, 30 Apr 2022 13:13:00 GMT</pubDate><media:content url="https://deserts.io/content/images/2022/05/image-17-1.png" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><img src="https://deserts.io/content/images/2022/05/image-17-1.png" alt="&#x534A;&#x76D1;&#x7763;&#x5206;&#x5272;&#xFF1A;&#x4ECE;&#x6570;&#x636E;&#x589E;&#x5F3A;&#x5230;&#x5B66;&#x4E60;&#x8303;&#x5F0F;"><p>&#x56FE;&#x50CF;&#x5206;&#x5272;&#x5E94;&#x7528;&#x7684;&#x6700;&#x5927;&#x963B;&#x788D;&#x662F;&#x7F3A;&#x4E4F;&#x9AD8;&#x8D28;&#x91CF;&#x6807;&#x6CE8;&#x7684;&#x8BAD;&#x7EC3;&#x6570;&#x636E;&#x3002;&#x6DF1;&#x5EA6;&#x5206;&#x5272;&#x6A21;&#x578B;&#x7684;&#x6CDB;&#x5316;&#x80FD;&#x529B;&#x4F9D;&#x8D56;&#x5927;&#x89C4;&#x6A21;&#x548C;&#x9AD8;&#x8D28;&#x91CF;&#x7684;&#x50CF;&#x7D20;&#x7EA7;&#x6807;&#x6CE8;&#x6570;&#x636E;&#x3002; &#x4E8B;&#x5B9E;&#x4E0A;&#xFF0C;&#x56FE;&#x50CF;&#x5206;&#x5272;&#x6807;&#x6CE8;&#x662F;&#x4E00;&#x4E2A;&#x6602;&#x8D35;&#x4E14;&#x8017;&#x65F6;&#x7684;&#x8FC7;&#x7A0B;&#x3002;&#x5BF9;&#x4E8E;&#x65B0;&#x7684;&#x4EFB;&#x52A1;&#x6216;&#x662F;&#x9700;&#x8981;&#x5FEB;&#x901F;&#x5E94;&#x7528;&#x7684;&#x573A;&#x666F;&#xFF0C;&#x6570;&#x636E;&#x7A00;&#x7F3A;&#x95EE;&#x9898;&#x66F4;&#x4E3A;&#x4E25;&#x91CD;&#x3002;&#x56E0;&#x6B64;&#xFF0C;&#x6570;&#x636E;&#x6807;&#x6CE8;&#x7684;&#x9AD8;&#x6210;&#x672C;&#x964D;&#x4F4E;&#x4E86;&#x6A21;&#x578B;&#x5728;&#x65B0;&#x4EFB;&#x52A1;&#x548C;&#x6269;&#x5C55;&#x6027;&#xFF0C;&#x4ECE;&#x800C;&#x963B;&#x788D;&#x4E86;&#x6DF1;&#x5EA6;&#x5206;&#x5272;&#x6A21;&#x578B;&#x5728;&#x73B0;&#x5B9E;&#x4E2D;&#x7684;&#x5E94;&#x7528;&#x3002;<br>
&#x4E3A;&#x4E86;&#x7F13;&#x89E3;&#x6570;&#x636E;&#x6807;&#x6CE8;&#x538B;&#x529B;&#xFF0C;&#x5F53;&#x524D;&#x5DF2;&#x6709;&#x5927;&#x91CF;&#x7684;&#x5DE5;&#x4F5C;&#x6765;&#x8FDB;&#x884C;&#x534A;&#x76D1;&#x7763;&#x548C;&#x5F31;&#x76D1;&#x7763;&#x7684;&#x56FE;&#x50CF;&#x5206;&#x5272;&#x3002;&#x4F8B;&#x5982;&#xFF0C;&#x5229;&#x7528;&#x5C11;&#x91CF;&#x7CBE;&#x786E;&#x6807;&#x6CE8;&#x7684;&#x6570;&#x636E;&#x3001;&#x7A00;&#x758F;&#x7684;&#x6807;&#x6CE8;&#x3001;&#x5E26;&#x566A;&#x58F0;&#x7684;&#x6807;&#x6CE8;&#x3001;&#x5206;&#x7C7B;&#x6807;&#x6CE8;&#x6216;&#x8005;&#x4EE5;&#x4E0A;&#x51E0;&#x79CD;&#x7EC4;&#x5408;&#x5B9E;&#x73B0;&#x534A;&#x76D1;&#x7763;&#x56FE;&#x50CF;&#x5206;&#x5272;&#x6A21;&#x578B;&#x3002; &#x7136;&#x800C;&#xFF0C;&#x534A;&#x76D1;&#x7763;&#x56FE;&#x50CF;&#x5206;&#x5272;&#x5177;&#x6709;&#x5176;&#x5929;&#x7136;&#x7684;&#x96BE;&#x5EA6;&#x548C;&#x6311;&#x6218;&#x6027;&#xFF0C;&#x9700;&#x8981;&#x7279;&#x5B9A;&#x7684;&#x6A21;&#x578B;&#x8BBE;&#x8BA1;&#x4EE5;&#x53CA;&#x5B66;&#x4E60;&#x7B56;&#x7565;&#x3002;</p>
<!--kg-card-end: markdown--><!--kg-card-begin: markdown--><h2 id="%E4%BB%BB%E5%8A%A1">&#x4EFB;&#x52A1;</h2>
<p><strong>&#x4EFB;&#x52A1;&#xFF1A;</strong> &#x8BAD;&#x7EC3;&#x96C6;&#x4E2D;&#x53EA;&#x6709;&#x4E00;&#x4E2A;&#x5B50;&#x96C6;&#x6709;&#x5B8C;&#x5168;&#x7684;&#x6807;&#x6CE8;&#x3002;<br>
&#x534A;&#x76D1;&#x7763;&#x5B66;&#x4E60;&#x7684;&#x51E0;&#x4E2A;&#x5047;&#x8BBE;&#xFF1A;</p>
<ul>
<li>&#x5E73;&#x6ED1;&#x6027;&#x5047;&#x8BBE;&#xFF1A;&#x76F8;&#x8FD1;&#x7684;&#x56FE;&#x7247;&#x5E94;&#x8BE5;&#x5177;&#x5907;&#x76F8;&#x540C;&#x7684;&#x6807;&#x6CE8;&#xFF1B;</li>
<li>&#x4F4E;&#x5BC6;&#x5EA6;&#x5206;&#x79BB;&#x5047;&#x8BBE;&#xFF08;&#x805A;&#x7C7B;&#x5047;&#x8BBE;&#xFF09;&#xFF1A;&#x51B3;&#x7B56;&#x8FB9;&#x754C;&#x5E94;&#x8BE5;&#x4F4D;&#x4E8E;&#x6570;&#x636E;&#x5206;&#x5E03;&#x5BC6;&#x5EA6;&#x76F8;&#x5BF9;&#x8F83;&#x4F4E;&#x7684;&#x533A;&#x57DF;&#xFF08;&#x89C1;&#x4E0B;&#x56FE;&#xFF09;&#xFF1B;</li>
<li>&#x6D41;&#x5F62;&#x5047;&#x8BBE;&#xFF1A;&#x8F93;&#x5165;&#x7A7A;&#x95F4;&#x7531;&#x591A;&#x4E2A;&#x4F4E;&#x7EF4;&#x6D41;&#x5F62;&#x7EC4;&#x6210;&#xFF0C;&#x6240;&#x6709;&#x6570;&#x636E;&#x70B9;&#x5747;&#x4F4D;&#x4E8E;&#x5176;&#x4E0A;&#xFF1B;&#x4F4D;&#x4E8E;&#x540C;&#x4E00;&#x6D41;&#x5F62;&#x4E0A;&#x7684;&#x6570;&#x636E;&#x70B9;&#x5177;&#x6709;&#x76F8;&#x540C;&#x6807;&#x7B7E;&#x3002;</li>
</ul>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://deserts.io/content/images/2022/05/image-16.png" class="kg-image" alt="&#x534A;&#x76D1;&#x7763;&#x5206;&#x5272;&#xFF1A;&#x4ECE;&#x6570;&#x636E;&#x589E;&#x5F3A;&#x5230;&#x5B66;&#x4E60;&#x8303;&#x5F0F;" loading="lazy" width="939" height="394" srcset="https://deserts.io/content/images/size/w600/2022/05/image-16.png 600w, https://deserts.io/content/images/2022/05/image-16.png 939w" sizes="(min-width: 720px) 720px"><figcaption>&#x4F4E;&#x5BC6;&#x5EA6;&#x5206;&#x79BB;&#x5047;&#x8BBE;&#xFF08;&#x805A;&#x7C7B;&#x5047;&#x8BBE;&#xFF09;</figcaption></figure><!--kg-card-begin: markdown--><p>&#x6311;&#x6218;&#xFF1A;&#x534A;&#x76D1;&#x7763;&#x5B66;&#x4E60;&#x573A;&#x666F;&#x7684;&#x4E3B;&#x8981;&#x6311;&#x6218;&#x5728;&#x4E8E;&#x5982;&#x4F55;&#x9AD8;&#x6548;&#x3001;&#x5F7B;&#x5E95;&#x5730;&#x5229;&#x7528;&#x5927;&#x91CF;&#x672A;&#x6807;&#x8BB0;&#x7684;&#x6570;&#x636E;&#x3002;</p>
<ol>
<li>&#x4ECE;&#x5C11;&#x91CF;&#x6570;&#x636E;&#x4E2D;&#x5B66;&#x4E60;&#x5E76;&#x9632;&#x6B62;&#x8FC7;&#x62DF;&#x5408;</li>
<li>&#x5145;&#x5206;&#x5229;&#x7528;&#x65E0;&#x6807;&#x8BB0;&#x6570;&#x636E;</li>
<li>&#x5229;&#x7528;&#x5148;&#x9A8C;&#x77E5;&#x8BC6;&#x83B7;&#x5F97;&#x6CDB;&#x5316;&#x6027;&#x80FD;&#x66F4;&#x597D;&#x7684;&#x6A21;&#x578B;</li>
</ol>
<!--kg-card-end: markdown--><!--kg-card-begin: markdown--><h2 id="%E5%8D%8A%E7%9B%91%E7%9D%A3%E5%88%86%E5%89%B2%E7%9B%B8%E5%85%B3%E6%96%B9%E6%B3%95">&#x534A;&#x76D1;&#x7763;&#x5206;&#x5272;&#x76F8;&#x5173;&#x65B9;&#x6CD5;</h2>
<p>&#x534A;&#x76D1;&#x7763;&#x5206;&#x5272;&#x7684;&#x6700;&#x5E38;&#x89C1;&#x65B9;&#x6CD5;&#x5305;&#x62EC;&#xFF1A;</p>
<ul>
<li>&#x901A;&#x7528;&#x7B56;&#x7565;&#xFF1A;&#x6570;&#x636E;&#x589E;&#x5F3A;&#x3001;&#x8FC1;&#x79FB;&#x5B66;&#x4E60;&#x3001;&#x5148;&#x9A8C;&#x77E5;&#x8BC6;&#x5B66;&#x4E60;&#x3001;&#x8BFE;&#x7A0B;&#x5B66;&#x4E60;&#x548C;&#x5C0F;&#x6837;&#x672C;&#x5B66;&#x4E60;&#xFF1B;</li>
<li>&#x5229;&#x7528;&#x672A;&#x6807;&#x8BB0;&#x6570;&#x636E;&#xFF1A;&#x81EA;&#x8BAD;&#x7EC3;&#x3001;&#x4E00;&#x81F4;&#x6027;&#x6B63;&#x5219;&#x3001;&#x534F;&#x540C;&#x8BAD;&#x7EC3;&#x3001;&#x81EA;&#x76D1;&#x7763;&#x5B66;&#x4E60;&#x548C;&#x5BF9;&#x6297;&#x5B66;&#x4E60;&#x3002;</li>
</ul>
<!--kg-card-end: markdown--><!--kg-card-begin: markdown--><h3 id="%E6%95%B0%E6%8D%AE%E5%A2%9E%E5%BC%BA">&#x6570;&#x636E;&#x589E;&#x5F3A;</h3>
<p>&#x6570;&#x636E;&#x589E;&#x5F3A;&#x80FD;&#x591F;&#x964D;&#x4F4E;&#x8FC7;&#x62DF;&#x5408;&#x5230;&#x5C11;&#x91CF;&#x6807;&#x6CE8;&#x6570;&#x636E;&#x7684;&#x98CE;&#x9669;&#x3002;<br>
<strong>&#x7ECF;&#x5178;&#x7684;&#x6570;&#x636E;&#x589E;&#x5F3A;&#x65B9;&#x6CD5;&#xFF1A;</strong> &#x6570;&#x636E;&#x51E0;&#x4F55;&#x53D8;&#x6362;&#xFF0C;&#x4F8B;&#x5982;&#x968F;&#x673A;&#x4EFF;&#x5C04;&#x53D8;&#x6362;&#x3001;&#x968F;&#x673A;&#x88C1;&#x526A;&#x3001;&#x968F;&#x673A;&#x64E6;&#x9664;&#x3001;&#x989C;&#x8272;&#x5F3A;&#x5EA6;&#x53D8;&#x6362;&#x7B49;&#xFF1B;<br>
<strong>&#x5408;&#x6210;&#x66F4;&#x591A;&#x6837;&#x5316;&#x548C;&#x66F4;&#x771F;&#x5B9E;&#x7684;&#x6807;&#x8BB0;&#x6570;&#x636E;&#x7684;&#x65B9;&#x6CD5;&#xFF1A;</strong> &#x6DF7;&#x5408;&#x56FE;&#x50CF;&#x3001;&#x7279;&#x5F81;&#x7A7A;&#x95F4;&#x589E;&#x5F3A;&#x548C;&#x751F;&#x6210;&#x5BF9;&#x6297;&#x7F51;&#x7EDC; &#x3002;</p>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://deserts.io/content/images/2022/05/image-17.png" class="kg-image" alt="&#x534A;&#x76D1;&#x7763;&#x5206;&#x5272;&#xFF1A;&#x4ECE;&#x6570;&#x636E;&#x589E;&#x5F3A;&#x5230;&#x5B66;&#x4E60;&#x8303;&#x5F0F;" loading="lazy" width="1280" height="564" srcset="https://deserts.io/content/images/size/w600/2022/05/image-17.png 600w, https://deserts.io/content/images/size/w1000/2022/05/image-17.png 1000w, https://deserts.io/content/images/2022/05/image-17.png 1280w" sizes="(min-width: 720px) 720px"><figcaption>&#x51E0;&#x79CD;&#x7ECF;&#x5178;&#x7684;&#x6570;&#x636E;&#x589E;&#x5F3A;&#x65B9;&#x5F0F;&#xFF08;&#x6765;&#x81EA;SimCLR&#xFF09;</figcaption></figure><!--kg-card-begin: markdown--><p><strong>Mixing and Cutting:</strong> Mixup&#x7EBF;&#x6027;&#x63D2;&#x503C;&#x4E00;&#x5BF9;&#x968F;&#x673A;&#x7684;&#x8BAD;&#x7EC3;&#x56FE;&#x50CF;&#x548C;&#x76F8;&#x5E94;&#x7684;&#x6807;&#x7B7E;&#x3002;Cutout&#x5728;&#x8BAD;&#x7EC3;&#x6570;&#x636E;&#x4E0A;&#x91C7;&#x7528;&#x533A;&#x57DF; dropout &#x7B56;&#x7565;&#x7684;&#x601D;&#x60F3;&#xFF0C;&#x5373;&#x906E;&#x6321;&#x56FE;&#x50CF;&#x7684;&#x4E00;&#x90E8;&#x5206;&#x3002;CutMix&#x662F; Mixup &#x548C; Cutout &#x7ED3;&#x5408;&#xFF0C;&#x901A;&#x8FC7;&#x7528;&#x4E0D;&#x540C;&#x56FE;&#x50CF;&#x7684;&#x4E00;&#x90E8;&#x5206;&#x66FF;&#x6362;&#x56FE;&#x50CF;&#x7684;&#x4E00;&#x90E8;&#x5206;[1]&#x3002;</p>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://deserts.io/content/images/2022/05/image-18.png" class="kg-image" alt="&#x534A;&#x76D1;&#x7763;&#x5206;&#x5272;&#xFF1A;&#x4ECE;&#x6570;&#x636E;&#x589E;&#x5F3A;&#x5230;&#x5B66;&#x4E60;&#x8303;&#x5F0F;" loading="lazy" width="746" height="506" srcset="https://deserts.io/content/images/size/w600/2022/05/image-18.png 600w, https://deserts.io/content/images/2022/05/image-18.png 746w" sizes="(min-width: 720px) 720px"><figcaption>CutMix&#x793A;&#x610F;&#x3002;&#x7B2C;&#x4E00;&#x884C;&#xFF1A;&#x8F93;&#x5165;&#x4E00;&#x5BF9;&#x539F;&#x56FE;&#xFF1B;&#x7B2C;&#x4E8C;&#x884C;&#xFF1A;MixUp&#xFF0C;CutOut&#xFF0C;CutMix</figcaption></figure><!--kg-card-begin: markdown--><p><strong>Auto Augment:</strong> &#x57FA;&#x4E8E;&#x5F3A;&#x5316;&#x5B66;&#x4E60;&#x7684;&#x641C;&#x7D22;&#x7B97;&#x6CD5;&#x4E3A;&#x76EE;&#x6807;&#x6570;&#x636E;&#x96C6;&#x5BFB;&#x627E;&#x6700;&#x6709;&#x6548;&#x7684;&#x6570;&#x636E;&#x589E;&#x5F3A;&#x7B56;&#x7565;[2]&#xFF0C;&#x6765;&#x6700;&#x5C0F;&#x5316;&#x9A8C;&#x8BC1;&#x96C6;&#x4E0A;&#x7684;&#x8BEF;&#x5DEE;&#x3002;&#x8FD9;&#x91CC;&#x9009;&#x62E9;16&#x79CD;&#x56FE;&#x50CF;&#x53D8;&#x6362;&#x6765;&#x9650;&#x5236;&#x7B56;&#x7565;&#x641C;&#x7D22;&#x7A7A;&#x95F4;&#x3002;&#x4E00;&#x4E2A;&#x7B56;&#x7565;&#x7531;5&#x4E2A;&#x5B50;&#x7B56;&#x7565;&#x7EC4;&#x6210;&#xFF0C;&#x6BCF;&#x4E2A;&#x5B50;&#x7B56;&#x7565;&#x4F9D;&#x6B21;&#x5E94;&#x7528;&#x4E24;&#x4E2A;&#x56FE;&#x50CF;&#x53D8;&#x6362;&#x3002;&#x6BCF;&#x4E2A;&#x53D8;&#x6362;&#x5305;&#x542B;&#x4E24;&#x4E2A;&#x53C2;&#x6570;&#xFF1A;&#x4F7F;&#x7528;&#x7684;&#x6982;&#x7387;&#x548C;&#x5F3A;&#x5EA6;&#xFF08;&#x4F8B;&#x5982;&#xFF0C;&#x5728;70%&#x6982;&#x7387;&#x4E0B;&#x65CB;&#x8F6C;30&#x5EA6;&#xFF09;&#x3002;&#x4E3A;&#x4E86;&#x4F7F;&#x7528;&#x79BB;&#x6563;&#x641C;&#x7D22;&#x7B97;&#x6CD5;&#xFF0C;&#x4F5C;&#x8005;&#x5C06;&#x5F3A;&#x5EA6;&#x8303;&#x56F4;&#x79BB;&#x6563;&#x4E3A;10&#x4E2A;&#x503C;&#xFF08;&#x5747;&#x5300;&#x95F4;&#x8DDD;&#xFF09;&#xFF0C;&#x540C;&#x65F6;&#x5C06;&#x6982;&#x7387;&#x79BB;&#x6563;&#x5316;&#x4E3A;11&#x4E2A;&#x503C;&#xFF08;&#x5747;&#x5300;&#x95F4;&#x8DDD;&#xFF09;&#x3002;&#x6A21;&#x578B;&#x4F7F;&#x7528;&#x63A7;&#x5236;&#x5668;&#x51B3;&#x5B9A;&#x54EA;&#x79CD;&#x6570;&#x636E;&#x589E;&#x5F3A;&#x7B56;&#x7565;&#xFF0C;&#x5E76;&#x901A;&#x8FC7;&#x5728;&#x9A8C;&#x8BC1;&#x96C6;&#x4E0A;&#x8FD0;&#x884C;&#x4E00;&#x4E2A;&#x5B50;&#x6A21;&#x578B;&#x5B9E;&#x9A8C;&#x6765;&#x6D4B;&#x8BD5;&#x8BE5;&#x7B56;&#x7565;&#x7684;&#x6CDB;&#x5316;&#x80FD;&#x529B;&#x3002;&#x63A7;&#x5236;&#x5668;&#x4EE5;&#x9A8C;&#x8BC1;&#x7684;&#x51C6;&#x786E;&#x6027;&#x4F5C;&#x4E3A;&#x5956;&#x52B1;&#x4FE1;&#x53F7;&#x8FDB;&#x884C;&#x66F4;&#x65B0;&#xFF0C;&#x4F7F;&#x7528;&#x8FD1;&#x4F3C;&#x7B56;&#x7565;&#x4F18;&#x5316;&#x7B97;&#x6CD5;&#x66F4;&#x65B0;&#x63A7;&#x5236;&#x5668;&#x53C2;&#x6570;&#x3002;&#x6700;&#x540E;&#x603B;&#x4F53;&#x4E0A;&#x6700;&#x597D;&#x7684;5&#x4E2A;&#x7B56;&#x7565;&#xFF08;&#x6BCF;&#x4E2A;&#x5305;&#x542B;5&#x4E2A;&#x5B50;&#x7B56;&#x7565;&#xFF09;&#x88AB;&#x9009;&#x62E9;&#x4F5C;&#x4E3A;&#x8BE5;&#x6570;&#x636E;&#x96C6;&#x4E0A;&#x7684;&#x6700;&#x4F73;&#x7B56;&#x7565;&#x3002;</p>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://deserts.io/content/images/2022/05/image-19.png" class="kg-image" alt="&#x534A;&#x76D1;&#x7763;&#x5206;&#x5272;&#xFF1A;&#x4ECE;&#x6570;&#x636E;&#x589E;&#x5F3A;&#x5230;&#x5B66;&#x4E60;&#x8303;&#x5F0F;" loading="lazy" width="1022" height="568" srcset="https://deserts.io/content/images/size/w600/2022/05/image-19.png 600w, https://deserts.io/content/images/size/w1000/2022/05/image-19.png 1000w, https://deserts.io/content/images/2022/05/image-19.png 1022w" sizes="(min-width: 720px) 720px"><figcaption>AutoAugment&#x4F7F;&#x7528;&#x5F3A;&#x5316;&#x5B66;&#x4E60;&#x6765;&#x641C;&#x7D22;&#x66F4;&#x597D;&#x7684;&#x6570;&#x636E;&#x589E;&#x5F3A;&#x7B56;&#x7565;&#x3002;&#x63A7;&#x5236;&#x5668;RNN&#x4ECE;&#x641C;&#x7D22;&#x7A7A;&#x95F4;&#x4E2D;&#x9884;&#x6D4B;&#x4E00;&#x4E2A;&#x589E;&#x5E7F;&#x7B56;&#x7565;S&#x3002;&#x4E00;&#x4E2A;&#x5177;&#x6709;&#x56FA;&#x5B9A;&#x7ED3;&#x6784;&#x7684;&#x5B50;&#x7F51;&#x7EDC;&#x6839;&#x636E;S&#x8BAD;&#x7EC3;&#x5230;&#x6536;&#x655B;&#xFF0C;&#x5F97;&#x5230;&#x7CBE;&#x5EA6;R&#x3002;&#x518D;&#x5229;&#x7528;Policy gradient&#x65B9;&#x6CD5;&#xFF0C;&#x5C06;&#x7CBE;&#x5EA6;R&#x4F5C;&#x4E3A;&#x5956;&#x52B1;&#x4FE1;&#x53F7;&#x6765;&#x66F4;&#x65B0;&#x63A7;&#x5236;&#x5668;&#x53C2;&#x6570;&#x3002;</figcaption></figure><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://deserts.io/content/images/2022/05/image-20.png" class="kg-image" alt="&#x534A;&#x76D1;&#x7763;&#x5206;&#x5272;&#xFF1A;&#x4ECE;&#x6570;&#x636E;&#x589E;&#x5F3A;&#x5230;&#x5B66;&#x4E60;&#x8303;&#x5F0F;" loading="lazy" width="1280" height="500" srcset="https://deserts.io/content/images/size/w600/2022/05/image-20.png 600w, https://deserts.io/content/images/size/w1000/2022/05/image-20.png 1000w, https://deserts.io/content/images/2022/05/image-20.png 1280w" sizes="(min-width: 720px) 720px"><figcaption>AutoAugment&#x5728;ImageNet&#x4E0A;&#x5B66;&#x5230;&#x7684;&#x4E00;&#x4E2A;&#x6700;&#x4F73;&#x589E;&#x5F3A;&#x7B56;&#x7565;&#xFF0C;&#x5BF9;&#x4E8E;&#x8BE5;&#x6570;&#x636E;&#x96C6;&#x66F4;&#x503E;&#x5411;&#x4E8E;&#x4F7F;&#x7528;&#x989C;&#x8272;&#x53D8;&#x6362;&#x800C;&#x4E0D;&#x662F;&#x7A7A;&#x95F4;&#x53D8;&#x6362;&#x3002;&#xFF08;&#x6A2A;&#x5411;&#xFF09;&#x540C;&#x4E00;&#x4E2A;&#x7B56;&#x7565;&#x4E2D;&#x5305;&#x542B;&#x4E94;&#x4E2A;&#x5B50;&#x7B56;&#x7565;&#xFF0C;&#x5BF9;&#x4E8E;&#x4E00;&#x4E2A;batch&#x4E2D;&#x7684;&#x6BCF;&#x4E00;&#x5F20;&#x56FE;&#xFF0C;&#x90FD;&#x968F;&#x673A;&#x5730;&#x4ECE;&#x4E94;&#x4E2A;&#x5B50;&#x7B56;&#x7565;&#x4E2D;&#x9009;&#x53D6;&#x4E00;&#x4E2A;&#x3002;&#xFF08;&#x7EB5;&#x5411;&#xFF09;&#x4E3A;&#x4E86;&#x5F3A;&#x8C03;&#x5B50;&#x7B56;&#x7565;&#x5E94;&#x7528;&#x7684;&#x968F;&#x673A;&#x6027;&#xFF0C;&#x5373;&#x4F7F;&#x5E94;&#x7528;&#x540C;&#x4E00;&#x4E2A;&#x5B50;&#x7B56;&#x7565;&#xFF0C;&#x540C;&#x4E00;&#x56FE;&#x50CF;&#x5728;&#x4E0D;&#x540C;&#x7684;batch&#x4E2D;&#x5F97;&#x5230;&#x7684;&#x7ED3;&#x679C;&#x662F;&#x4E0D;&#x540C;&#x7684;&#x3002;</figcaption></figure><!--kg-card-begin: markdown--><p><strong>Adversarial data augmentation:</strong> &#x5229;&#x7528;&#x5BF9;&#x6297;&#x6837;&#x672C;&#xFF08;adversarial example[3,5]&#xFF0C;&#x89C1;&#x4E0B;&#x56FE;&#xFF09;&#x6765;&#x8BAD;&#x7EC3;&#x9C81;&#x68D2;&#x7684;&#x6A21;&#x578B;&#x3002;&#x5982;&#x4F55;&#x8BBE;&#x8BA1;&#x548C;&#x6784;&#x9020;&#x66F4;&#x903C;&#x771F;&#x7684;&#x5BF9;&#x6297;&#x6270;&#x52A8;&#x662F;&#x6838;&#x5FC3;&#x95EE;&#x9898;&#x3002;</p>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://deserts.io/content/images/2022/05/image-21.png" class="kg-image" alt="&#x534A;&#x76D1;&#x7763;&#x5206;&#x5272;&#xFF1A;&#x4ECE;&#x6570;&#x636E;&#x589E;&#x5F3A;&#x5230;&#x5B66;&#x4E60;&#x8303;&#x5F0F;" loading="lazy" width="1280" height="508" srcset="https://deserts.io/content/images/size/w600/2022/05/image-21.png 600w, https://deserts.io/content/images/size/w1000/2022/05/image-21.png 1000w, https://deserts.io/content/images/2022/05/image-21.png 1280w" sizes="(min-width: 720px) 720px"><figcaption>&#x5BF9;&#x6297;&#x6270;&#x52A8;&#x793A;&#x610F;&#x56FE;[3]. x&#xFF1A;&#x539F;&#x59CB;&#x8F93;&#x5165;&#x56FE;&#x50CF;&#xFF0C;y&#xFF1A;&#x6807;&#x7B7E;&#xFF08;panda&#xFF09;&#xFF0C;&#x3B8;&#xFF1A;&#x6A21;&#x578B;&#x53C2;&#x6570;&#xFF0C;J(&#x3B8;,x,y)&#xFF1A;&#x76EE;&#x6807;&#x51FD;&#x6570;&#x3002;&#x653B;&#x51FB;&#x5C06;&#x68AF;&#x5EA6;&#x56DE;&#x4F20;&#x5230;&#x8F93;&#x5165;&#x6570;&#x636E;&#xFF0C;&#x8BA1;&#x7B97;&#x51FA;J&#x5BF9;x&#x7684;&#x68AF;&#x5EA6;&#x3002;&#x7136;&#x540E;&#xFF0C;&#x5728;&#x68AF;&#x5EA6;&#x7684;&#x65B9;&#x5411;&#x4E0A;&#x5BF9;&#x8F93;&#x5165;&#x6570;&#x636E;&#x6DFB;&#x52A0;&#x5C0F;&#x7684;&#x6270;&#x52A8;&#xFF08;&#x3F5;=0.007&#xFF09;&#x4F7F;&#x635F;&#x5931;&#x6700;&#x5927;&#x5316;&#x3002;&#x7531;&#x6B64;&#x4EA7;&#x751F;&#x7684;&#x6270;&#x52A8;&#x56FE;&#x50CF;x&#x2019;&#xFF0C;&#x88AB;&#x7F51;&#x7EDC;&#x9519;&#x8BEF;&#x5730;&#x5F52;&#x7C7B;&#x4E3A; &quot;gibbon&quot;&#xFF0C;&#x800C;&#x5B83;&#x663E;&#x7136;&#x662F;&#x4E00;&#x53EA; &quot;&#x718A;&#x732B;&quot;&#x3002;</figcaption></figure><!--kg-card-begin: markdown--><p>&#x57FA;&#x4E8E;&#x68AF;&#x5EA6;&#x7684;&#x5BF9;&#x6297;&#x6837;&#x672C;&#x751F;&#x6210;&#x65B9;&#x6CD5;&#x76F4;&#x89C2;&#x4E14;&#x5F3A;&#x5927;&#x3002;&#x5B83;&#x65E8;&#x5728;&#x901A;&#x8FC7;&#x5229;&#x7528;&#x795E;&#x7ECF;&#x7F51;&#x7EDC;&#x7684;&#x5B66;&#x4E60;&#x65B9;&#x5F0F;&#xFF0C;&#x5373;&#x68AF;&#x5EA6;&#x6765;&#x653B;&#x51FB;&#x795E;&#x7ECF;&#x7F51;&#x7EDC;&#x3002;&#x653B;&#x51FB;&#x4F7F;&#x7528;&#x635F;&#x5931;&#x51FD;&#x6570;&#x5BF9;&#x8F93;&#x5165;&#x6570;&#x636E;&#x7684;&#x68AF;&#x5EA6;&#xFF0C;&#x8C03;&#x6574;&#x8F93;&#x5165;&#x6570;&#x636E;&#x4EE5;&#x6700;&#x5927;&#x5316;&#x635F;&#x5931;&#x3002;Fast Gradient Sign Method (FGSM)[3]&#x5F62;&#x5F0F;&#x5316;&#x8868;&#x8FF0;&#x4E3A;:<br>
$$<br>
x^{\prime}=x+\epsilon \cdot \operatorname{sign}\left(\vec{\nabla}_{x} J(\Theta, x, y)\right) .<br>
$$</p>
<!--kg-card-end: markdown--><!--kg-card-begin: markdown--><pre><code class="language-python"># FGSM attack code from https://pytorch.org/tutorials/beginner/fgsm_tutorial.html
def fgsm_attack(image, epsilon, data_grad):
    # Collect the element-wise sign of the data gradient
    sign_data_grad = data_grad.sign()
    # Create the perturbed image by adjusting each pixel of the input image
    perturbed_image = image + epsilon*sign_data_grad
    # Adding clipping to maintain [0,1] range
    perturbed_image = torch.clamp(perturbed_image, 0, 1)
    # Return the perturbed image
    return perturbed_image


# input image
data.requires_grad = True
# Forward pass the data through the model
output = model(data)
# Calculate the loss
loss = F.nll_loss(output, target)
# Zero all existing gradients
model.zero_grad()
# Calculate gradients of model in backward pass
loss.backward()
# Collect datagrad
data_grad = data.grad.data
# Call FGSM Attack
perturbed_data = fgsm_attack(data, epsilon, data_grad)
</code></pre>
<!--kg-card-end: markdown--><!--kg-card-begin: markdown--><p><strong>Generative adversarial networks:</strong> &#x76F4;&#x63A5;&#x5408;&#x6210;&#x65B0;&#x7684;&#x5E26;&#x6807;&#x7B7E;&#x7684;&#x6570;&#x636E;&#x6765;&#x505A;&#x6570;&#x636E;&#x589E;&#x5F3A;&#x3002;&#x4F8B;&#x5982;&#x8DE8;&#x6A21;&#x6001;&#x6570;&#x636E;&#x5408;&#x6210;&#x7B49;&#x3002;</p>
<p><strong>&#x53C2;&#x8003;&#x6587;&#x732E;&#xFF1A;</strong><br>
[1] CutMix: Regularization Strategy to Train Strong Classifiers with Localizable Features. (ICCV 19)<br>
[2] AutoAugment: Learning Augmentation Policies from Data. (CVPR 19)<br>
[3] Explaining and Harnessing Adversarial Examples. (ICLR 15)<br>
[4] AutoAugment - Learning Augmentation Policies from Data. (CVPR 19)<br>
[5] DeepFool: a simple and accurate method to fool deep neural networks. (CVPR 16)</p>
<!--kg-card-end: markdown--><!--kg-card-begin: markdown--><h3 id="%E8%87%AA%E7%9B%91%E7%9D%A3%E5%AD%A6%E4%B9%A0">&#x81EA;&#x76D1;&#x7763;&#x5B66;&#x4E60;</h3>
<p>&#x81EA;&#x76D1;&#x7763;&#x5B66;&#x4E60;&#x4E3B;&#x8981;&#x662F;&#x5229;&#x7528;&#x8F85;&#x52A9;&#x4EFB;&#x52A1;&#xFF08;pretext&#xFF09;&#x4ECE;&#x5927;&#x89C4;&#x6A21;&#x7684;&#x65E0;&#x76D1;&#x7763;&#x6570;&#x636E;&#x4E2D;&#x6316;&#x6398;&#x81EA;&#x8EAB;&#x7684;&#x76D1;&#x7763;&#x4FE1;&#x606F;&#xFF0C;&#x901A;&#x8FC7;&#x8FD9;&#x79CD;&#x6784;&#x9020;&#x7684;&#x76D1;&#x7763;&#x4FE1;&#x606F;&#x5BF9;&#x7F51;&#x7EDC;&#x8FDB;&#x884C;&#x8BAD;&#x7EC3;&#xFF0C;&#x4ECE;&#x800C;&#x53EF;&#x4EE5;&#x5B66;&#x4E60;&#x5230;&#x5BF9;&#x4E0B;&#x6E38;&#x4EFB;&#x52A1;&#x6709;&#x4EF7;&#x503C;&#x7684;&#x8868;&#x5F81;&#x3002;&#x5BF9;&#x6BD4;&#x5B66;&#x4E60;&#x662F;&#x4E00;&#x79CD;&#x6BD4;&#x8F83;&#x6D41;&#x884C;&#x7684;&#x81EA;&#x76D1;&#x7763;&#x8F85;&#x52A9;&#x4EFB;&#x52A1;&#x3002;<br>
&#x5C11;&#x91CF;&#x8BBA;&#x6587;&#x7814;&#x7A76;&#x4E86;&#x5982;&#x4F55;&#x6784;&#x5EFA;&#x50CF;&#x7D20;&#x7EA7;&#x7684;&#x81EA;&#x76D1;&#x7763;&#x8F85;&#x52A9;&#x4EFB;&#x52A1;&#xFF0C;&#x5982;[1]&#x4E2D;&#x6839;&#x636E;&#x50CF;&#x7D20;&#x7A7A;&#x95F4;&#x8DDD;&#x79BB;&#x6784;&#x5EFA;&#x50CF;&#x7D20;&#x7EA7;&#x7684;&#x6B63;&#x8D1F;&#x6837;&#x672C;&#x5BF9;&#x6765;&#x8FDB;&#x884C;&#x50CF;&#x7D20;&#x7EA7;&#x7684;&#x81EA;&#x76D1;&#x7763;&#x5B66;&#x4E60;&#x3002;</p>
<p><strong>&#x53C2;&#x8003;&#x6587;&#x732E;&#xFF1A;</strong><br>
[1] Propagate Yourself: Exploring Pixel-Level Consistency for Unsupervised Visual Representation Learning. (CVPR 21)<br>
[2] Contrastive Semi-Supervised Learning for 2D Medical Image Segmentation. (MICCAI 21)</p>
<!--kg-card-end: markdown--><!--kg-card-begin: markdown--><h3 id="%E8%BF%81%E7%A7%BB%E5%AD%A6%E4%B9%A0">&#x8FC1;&#x79FB;&#x5B66;&#x4E60;</h3>
<p>&#x5728;&#x8BB8;&#x591A;&#x6DF1;&#x5EA6;&#x5B66;&#x4E60;&#x7814;&#x7A76;&#x4E2D;&#xFF0C;&#x8FC1;&#x79FB;&#x5B66;&#x4E60;&#x4E5F;&#x72ED;&#x4E49;&#x5730;&#x6307;&#x201C;&#x9884;&#x8BAD;&#x7EC3;&#x518D;&#x5FAE;&#x8C03;&#x201D;&#x7B56;&#x7565;&#xFF0C;&#x5982;backbone&#x8BAD;&#x7EC3;&#x548C;&#x6570;&#x636E;&#x96C6;&#x8FC1;&#x79FB;&#x3002;&#x4F8B;&#x5982;&#xFF0C;SimCLRv2&#x81EA;&#x76D1;&#x7763;&#x5B66;&#x4E60;&#x901A;&#x7528;&#x8868;&#x5F81;&#xFF0C;&#x901A;&#x8FC7;fine-tune&#x548C;&#x77E5;&#x8BC6;&#x84B8;&#x998F;&#x5B9E;&#x73B0;&#x534A;&#x76D1;&#x7763;&#x5206;&#x7C7B;&#x3002;</p>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://deserts.io/content/images/2022/05/image-22.png" class="kg-image" alt="&#x534A;&#x76D1;&#x7763;&#x5206;&#x5272;&#xFF1A;&#x4ECE;&#x6570;&#x636E;&#x589E;&#x5F3A;&#x5230;&#x5B66;&#x4E60;&#x8303;&#x5F0F;" loading="lazy" width="904" height="488" srcset="https://deserts.io/content/images/size/w600/2022/05/image-22.png 600w, https://deserts.io/content/images/2022/05/image-22.png 904w" sizes="(min-width: 720px) 720px"><figcaption>SimCLRv2&#x8FC1;&#x79FB;&#x5B66;&#x4E60;&#x7684;&#x534A;&#x76D1;&#x7763;&#x6846;&#x67B6;&#xFF1A;(&#x5DE6;)&#x81EA;&#x76D1;&#x7763;&#x9884;&#x8BAD;&#x7EC3; (&#x4E2D;)&#x5728;&#x5C0F;&#x6570;&#x636E;&#x96C6;&#x4E0A;fine-tune (&#x53F3;)&#x5728;&#x65E0;&#x6807;&#x8BB0;&#x6570;&#x636E;&#x96C6;&#x4E0A;&#x505A;&#x77E5;&#x8BC6;&#x84B8;&#x998F;/&#x81EA;&#x8BAD;&#x7EC3;</figcaption></figure><!--kg-card-begin: markdown--><h3 id="%E8%AF%BE%E7%A8%8B%E5%AD%A6%E4%B9%A0">&#x8BFE;&#x7A0B;&#x5B66;&#x4E60;</h3>
<p>&#x8BFE;&#x7A0B;&#x5B66;&#x4E60;&#x9996;&#x5148;&#x4ECE;&#x4EFB;&#x52A1;&#x7684;&#x66F4;&#x7B80;&#x5355;&#x7684;&#x65B9;&#x9762;&#x6216;&#x66F4;&#x7B80;&#x5355;&#x7684;&#x5B50;&#x4EFB;&#x52A1;&#x5F00;&#x59CB;&#xFF0C;&#x7136;&#x540E;&#x9010;&#x6E10;&#x589E;&#x52A0;&#x96BE;&#x5EA6;&#x7EA7;&#x522B;&#x3002;</p>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://deserts.io/content/images/2022/05/image-23.png" class="kg-image" alt="&#x534A;&#x76D1;&#x7763;&#x5206;&#x5272;&#xFF1A;&#x4ECE;&#x6570;&#x636E;&#x589E;&#x5F3A;&#x5230;&#x5B66;&#x4E60;&#x8303;&#x5F0F;" loading="lazy" width="901" height="395" srcset="https://deserts.io/content/images/size/w600/2022/05/image-23.png 600w, https://deserts.io/content/images/2022/05/image-23.png 901w" sizes="(min-width: 720px) 720px"><figcaption><em>&#x81EA;&#x6B65;&#x5B66;&#x4E60;&#xFF08;self-paced learning&#xFF09;&#x793A;&#x610F;&#x56FE;&#xFF0C;&#x6839;&#x636E;&#x6A21;&#x578B;&#x7684;&#x53CD;&#x9988;&#xFF08;&#x5982;loss&#xFF09;&#x52A8;&#x6001;&#x5730;&#x51B3;&#x5B9A;&#x5B66;&#x4E60;&#x7684;&#x987A;&#x5E8F;&#x3002;</em></figcaption></figure><!--kg-card-begin: markdown--><ul>
<li>&#x6570;&#x636E;(data)&#x8BFE;&#x7A0B;&#x5B66;&#x4E60;&#xFF1A;&#x91CD;&#x52A0;&#x6743;&#xFF08;reweighting&#xFF09;&#x76EE;&#x6807;&#x8BAD;&#x7EC3;&#x5206;&#x5E03;&#x7684;&#x6570;&#x636E;&#xFF0C;&#x5373;&#x5BF9;&#x8BAD;&#x7EC3;&#x6570;&#x636E;&#x8FDB;&#x884C;&#x975E;&#x5747;&#x5300;&#x91C7;&#x6837;&#x3002;&#x6838;&#x5FC3;&#x5728;&#x4E8E;&#x5982;&#x4F55;&#x786E;&#x5B9A;&#x6837;&#x672C;&#x7684;&#x91CD;&#x8981;&#x6027;&#xFF0C;&#x5E76;&#x57FA;&#x4E8E;&#x91CD;&#x8981;&#x6027;&#x51B3;&#x5B9A;&#x6837;&#x672C;&#x5448;&#x73B0;&#x7684;&#x987A;&#x5E8F;&#x3002;&#x56E0;&#x6B64;&#x5B83;&#x80FD;&#x591F;&#x5F88;&#x597D;&#x7684;&#x548C;&#x5148;&#x9A8C;&#x77E5;&#x8BC6;&#x7ED3;&#x5408;&#x3002;&#x5B9E;&#x9A8C;&#x8868;&#x660E;&#x8FD9;&#x79CD;&#x65B9;&#x5F0F;&#x80FD;&#x907F;&#x514D;&#x7CDF;&#x7CD5;&#x7684;&#x5C40;&#x90E8;&#x6700;&#x4F18;&#x5E76;&#x53D6;&#x5F97;&#x826F;&#x597D;&#x7684;&#x6CDB;&#x5316;&#x80FD;&#x529B;[1]&#x3002;&#x4F8B;&#x5982;&#xFF0C;&#x6839;&#x636E;&#x75C5;&#x4F8B;&#x7684;&#x4E25;&#x91CD;&#x7A0B;&#x5EA6;&#x51B3;&#x5B9A;&#x8BAD;&#x7EC3;&#x987A;&#x5E8F;&#xFF0C;&#x6216;&#x662F;multiple experts&#x7684;&#x4E0D;&#x786E;&#x5B9A;&#x6027;&#x4F5C;&#x4E3A;&#x56F0;&#x96BE;&#x7A0B;&#x5EA6;&#x3002;<br>
&#x81EA;&#x6B65;(self-paced) &#x5B66;&#x4E60;&#x662F;&#x4E00;&#x79CD;&#x7279;&#x6B8A;&#x7684;&#x6570;&#x636E;&#x8BFE;&#x7A0B;&#x5B66;&#x4E60;&#xFF1A;&#x5B83;&#x6839;&#x636E;&#x6A21;&#x578B;&#x7684;&#x53CD;&#x9988;&#xFF08;&#x5982;loss&#xFF09;&#xFF0C;&#x52A8;&#x6001;&#x5730;&#x51B3;&#x5B9A;&#x6570;&#x636E;&#x5B66;&#x4E60;&#x987A;&#x5E8F;[2]&#x3002;</li>
<li>&#x4EFB;&#x52A1;(task)&#x8BFE;&#x7A0B;&#x5B66;&#x4E60;&#xFF1A;&#x9996;&#x5148;&#x89E3;&#x51B3;&#x7B80;&#x5355;&#x4F46;&#x76F8;&#x5173;&#x7684;&#x4EFB;&#x52A1;&#xFF0C;&#x4E3A;&#x4EE5;&#x540E;&#x89E3;&#x51B3;&#x66F4;&#x590D;&#x6742;&#x7684;&#x4EFB;&#x52A1;&#x63D0;&#x4F9B;&#x8F85;&#x52A9;&#x4FE1;&#x606F;&#x3002;&#x7C7B;&#x4F3C;&#x4E8E;&#x5206;&#x5272;&#x7684;&#x591A;&#x9636;&#x6BB5;&#x8BAD;&#x7EC3;&#x3002;&#x4F8B;&#x5982;&#xFF0C;&#x5BF9;&#x4E8E;&#x5DE6;&#x5FC3;&#x5BA4;&#x7684;&#x5206;&#x5272;&#xFF0C;&#x5148;&#x5B66;&#x4E60;&#x76EE;&#x6807;&#x533A;&#x57DF;&#x7684;&#x5927;&#x5C0F;&#xFF0C;&#x518D;&#x5B66;&#x4E60;&#x5206;&#x5272;&#x4EFB;&#x52A1;[3]&#x3002;</li>
</ul>
<p><strong>&#x53C2;&#x8003;&#x6587;&#x732E;&#xFF1A;</strong><br>
[1] Deep active self-paced learning for accurate pulmonary nodule segmentation. (MICCAI 18)<br>
[2] Selfpaced curriculum learning. (AAAI 15)<br>
[3] Curriculum semi-supervised segmentation. (MICCAI 19)</p>
<!--kg-card-end: markdown--><!--kg-card-begin: markdown--><h3 id="%E5%B0%8F%E6%A0%B7%E6%9C%AC%E5%AD%A6%E4%B9%A0">&#x5C0F;&#x6837;&#x672C;&#x5B66;&#x4E60;</h3>
<p>&#x5C0F;&#x6837;&#x672C;&#x5206;&#x5272;&#xFF08;Few-shot Segmentation&#xFF0C;FSS&#xFF09;&#x7684;&#x76EE;&#x7684;&#x662F;&#x5728;&#x57FA;&#x7840;&#xFF08;base&#xFF09;&#x8BED;&#x4E49;&#x7C7B;&#x522B;&#x4E0A;&#x5B66;&#x4E60;&#x4E00;&#x4E2A;&#x6A21;&#x578B;&#xFF0C;&#x4F46;&#x5728;&#x672A;&#x89C1;&#x8FC7;&#xFF08;unseen&#xFF09;&#x7684;&#x7C7B;&#x522B;&#x4E0A;&#xFF0C;&#x53EA;&#x7528;k&#x4E2A;&#x5E26;&#x6807;&#x6CE8;&#x7684;&#x6837;&#x672C;&#x5B9E;&#x73B0;&#x8BED;&#x4E49;&#x5206;&#x5272;&#xFF0C;&#x800C;&#x65E0;&#x9700;&#x91CD;&#x65B0;&#x8BAD;&#x7EC3;&#x6A21;&#x578B;&#x3002;&#x65B0;&#x7C7B;&#x522B;&#x7684;k&#x4E2A;&#x5E26;&#x6807;&#x6CE8;&#x7684;&#x6837;&#x672C;&#x901A;&#x5E38;&#x88AB;&#x79F0;&#x4E3A;&#x652F;&#x6301;&#x96C6;&#xFF08;support set&#xFF09;&#x3002;FSS&#x6839;&#x636E;support set&#x9884;&#x6D4B;&#x6BCF;&#x4E2A;&#x67E5;&#x8BE2;&#x56FE;&#x50CF;&#xFF08;query set&#xFF09;&#x7684;&#x5206;&#x5272;&#x3002;</p>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://deserts.io/content/images/2022/05/image-24.png" class="kg-image" alt="&#x534A;&#x76D1;&#x7763;&#x5206;&#x5272;&#xFF1A;&#x4ECE;&#x6570;&#x636E;&#x589E;&#x5F3A;&#x5230;&#x5B66;&#x4E60;&#x8303;&#x5F0F;" loading="lazy" width="814" height="608" srcset="https://deserts.io/content/images/size/w600/2022/05/image-24.png 600w, https://deserts.io/content/images/2022/05/image-24.png 814w" sizes="(min-width: 720px) 720px"><figcaption>(1)&#x8BED;&#x4E49;&#x5206;&#x5272; (2) &#x5C0F;&#x6837;&#x672C;Few-shot&#x5206;&#x5272; (3) Generalized Few-shot&#x5206;&#x5272;&#x3002;&#x7ED9;&#x5B9A;&#x5927;&#x91CF;&#x57FA;&#x7840;&#x7C7B;(base classes)&#x7684;&#x8BAD;&#x7EC3;&#x56FE;&#x50CF;&#xFF08;&#x5982;&#x56FE;&#x4E2D;&#x72D7;&#x548C;&#x732B;&#xFF09;&#xFF0C;&#x4E0A;&#x56FE;&#x5C55;&#x793A;&#x4E86;&#x8BED;&#x4E49;&#x5206;&#x5272;&#x3001;few-shot&#x5206;&#x5272;&#x548C;Generalized Few-shot&#x5206;&#x5272;&#x5728;<strong>&#x6D4B;&#x8BD5;&#x65F6;</strong>&#x7684;&#x533A;&#x522B;&#x3002;&#x8BED;&#x4E49;&#x5206;&#x5272;&#x662F;&#x5BF9;&#x5DF2;&#x5B66;&#x8FC7;&#x7684;&#x57FA;&#x7840;&#x7C7B;&#x7684;&#x56FE;&#x50CF;&#x533A;&#x57DF;&#x8FDB;&#x884C;&#x5206;&#x5272;&#x3002;Few-shot&#x8BED;&#x4E49;&#x5206;&#x5272;&#x7684;&#x76EE;&#x7684;&#x662F;&#x5BF9;&#x5C11;&#x6570;&#x6D4B;&#x8BD5;&#x7684;support set&#x6240;&#x63D0;&#x4F9B;&#x7684;&#x65B0;&#x7C7B;&#xFF08;&#x4F8B;&#x5982;&#x56FE;&#x4E2D;&#x7684;&#x6C99;&#x53D1;&#xFF09;&#x8FDB;&#x884C;&#x5206;&#x5272;&#x3002;Generalized Few-shot&#x76EE;&#x6807;&#x662F;&#x540C;&#x65F6;&#x5BF9;&#x57FA;&#x7840;&#x7C7B;&#x548C;&#x65B0;&#x7C7B;&#x7684;&#x8FDB;&#x884C;&#x5206;&#x5272;&#x3002;</figcaption></figure><!--kg-card-begin: markdown--><p>&#x73B0;&#x6709;&#x7684;&#x5C0F;&#x6837;&#x672C;&#x5206;&#x5272;&#x65B9;&#x6CD5;&#x5206;&#x7C7B;&#xFF1A;</p>
<ul>
<li>&#x57FA;&#x4E8E;&#x5206;&#x7C7B;&#x7684;&#x539F;&#x578B;&#x7F51;&#x7EDC;&#xFF08;Prototypical Networks&#xFF09;[1]&#xFF0C;&#x4F7F;&#x7528;&#x540E;&#x5904;&#x7406;&#x6765;&#x83B7;&#x5F97;&#x5206;&#x5272;&#x7ED3;&#x679C;[2]&#xFF08;&#x4E0E;&#x5F31;&#x76D1;&#x7763;&#x8BED;&#x4E49;&#x5206;&#x5272;&#x7C7B;&#x4F3C;&#xFF09;&#xFF1B;</li>
<li>&#x76F4;&#x63A5;&#x5229;&#x7528;propotypes&#x505A;&#x50CF;&#x7D20;&#x7EA7;&#x7684;&#x5EA6;&#x91CF;&#x800C;&#x4E0D;&#x7528;&#x540E;&#x5904;&#x7406;[3]&#xFF0C;&#x4E5F;&#x5C31;&#x662F;&#x628A;&#x5206;&#x5272;&#x4F5C;&#x4E3A;&#x9010;&#x50CF;&#x7D20;&#x7684;&#x5206;&#x7C7B;&#x3002;</li>
</ul>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://deserts.io/content/images/2022/05/image-25.png" class="kg-image" alt="&#x534A;&#x76D1;&#x7763;&#x5206;&#x5272;&#xFF1A;&#x4ECE;&#x6570;&#x636E;&#x589E;&#x5F3A;&#x5230;&#x5B66;&#x4E60;&#x8303;&#x5F0F;" loading="lazy" width="798" height="530" srcset="https://deserts.io/content/images/size/w600/2022/05/image-25.png 600w, https://deserts.io/content/images/2022/05/image-25.png 798w" sizes="(min-width: 720px) 720px"><figcaption>&#x539F;&#x578B;&#xFF08;prototypes&#xFF09;&#x662F;&#x6307;&#x6BCF;&#x4E2A;&#x7C7B;&#x522B;&#x7684;support set&#x6837;&#x672C;&#x7684;embedding&#x7684;&#x5747;&#x503C;</figcaption></figure><!--kg-card-begin: markdown--><p><strong>&#x539F;&#x578B;&#x7F51;&#x7EDC;&#xFF1A;</strong> &#x662F;&#x4E00;&#x79CD;&#x57FA;&#x4E8E;&#x5EA6;&#x91CF;&#x5B66;&#x4E60;&#x7684;&#x5143;&#x5B66;&#x4E60;&#x65B9;&#x6CD5;&#xFF0C;&#x5B83;&#x5C06;&#x6837;&#x672C;&#x6295;&#x5F71;&#x5230;&#x4E00;&#x4E2A;&#x5EA6;&#x91CF;&#x7A7A;&#x95F4;&#xFF0C;&#x4E14;&#x5728;&#x8FD9;&#x4E2A;&#x7A7A;&#x95F4;&#x4E2D;&#x540C;&#x7C7B;&#x6837;&#x672C;&#x8DDD;&#x79BB;&#x8F83;&#x8FD1;&#xFF0C;&#x5F02;&#x7C7B;&#x6837;&#x672C;&#x7684;&#x8DDD;&#x79BB;&#x8F83;&#x8FDC;&#x3002;&#xFF08;&#x4E0A;&#x56FE;&#xFF09;&#x539F;&#x578B;&#xFF08;prototypes&#xFF09;&#x662F;&#x6307;&#x6BCF;&#x4E2A;&#x7C7B;&#x522B;&#x7684;support set&#x6837;&#x672C;&#x7684;embedding&#x7684;&#x5747;&#x503C;&#xFF0C;query&#x6837;&#x672C;&#x901A;&#x8FC7;&#x8BA1;&#x7B97;&#x4E0E;prototypes&#x7684;&#x8DDD;&#x79BB;&#x8FDB;&#x884C;&#x5206;&#x7C7B;&#x3002;</p>
<!--kg-card-end: markdown--><div class="kg-card kg-callout-card kg-callout-card-blue"><div class="kg-callout-emoji">&#x1F4A1;</div><div class="kg-callout-text">&#x5982;&#x4F55;&#x5C06;&#x56FE;&#x50CF;&#x6620;&#x5C04;&#x5230;&#x4E00;&#x4E2A;&#x826F;&#x597D;&#x7684;&#x5EA6;&#x91CF;&#x7A7A;&#x95F4;&#xFF1F;&#x8FD9;&#x91CC;&#x4F7F;&#x7528;&#x4E00;&#x4E2A;&#x795E;&#x7ECF;&#x7F51;&#x7EDC;$f_\Phi$&#x4F5C;&#x4E3A;&#x6620;&#x5C04;&#xFF08;Embedding&#xFF09;&#x51FD;&#x6570;&#xFF0C;&#x4E0B;&#x9762;&#x7684;&#x8BAD;&#x7EC3;&#x6D41;&#x7A0B;&#x5C31;&#x662F;&#x5728;&#x5B66;&#x4E60;&#x8BE5;&#x7F51;&#x7EDC;&#x7684;&#x53C2;&#x6570;$\Phi$. <br>&#x8BAD;&#x7EC3;&#x601D;&#x60F3;&#xFF1A;&#x8FD9;&#x4E2A;&#x8BAD;&#x7EC3;&#x7B56;&#x7565;&#x662F;&#x5728;&#x8BAD;&#x7EC3;&#x65F6;<strong>&#x6784;&#x9020;</strong>&#x6D4B;&#x8BD5;&#x65F6;&#x7684;few-shot&#x573A;&#x666F;(episode)&#xFF0C;&#x4E5F;&#x5C31;&#x662F;&#x6A21;&#x578B;&#x8BD5;&#x56FE;&#x5B66;&#x4F1A;&#x89E3;&#x51B3;&#x4E00;&#x7C7B;&#x95EE;&#x9898;&#xFF0C;&#x800C;&#x4E0D;&#x662F;&#x89E3;&#x51B3;&#x95EE;&#x9898;&#x3002;</div></div><figure class="kg-card kg-image-card"><img src="https://deserts.io/content/images/2022/05/image-26.png" class="kg-image" alt="&#x534A;&#x76D1;&#x7763;&#x5206;&#x5272;&#xFF1A;&#x4ECE;&#x6570;&#x636E;&#x589E;&#x5F3A;&#x5230;&#x5B66;&#x4E60;&#x8303;&#x5F0F;" loading="lazy" width="1280" height="845" srcset="https://deserts.io/content/images/size/w600/2022/05/image-26.png 600w, https://deserts.io/content/images/size/w1000/2022/05/image-26.png 1000w, https://deserts.io/content/images/2022/05/image-26.png 1280w" sizes="(min-width: 720px) 720px"></figure><!--kg-card-begin: markdown--><p>$N_C$ way $N_S$ shot learning&#x7684;&#x542B;&#x4E49;&#xFF1A;$N_C$&#x662F;Support set&#x4E2D;&#x7684;&#x7C7B;&#x522B;&#x6570;&#x91CF;&#xFF0C;$N_S$&#x662F;support set&#x4E2D;&#x6BCF;&#x4E2A;&#x7C7B;&#x522B;&#x5305;&#x542B;&#x7684;&#x6837;&#x672C;&#x6570;&#x91CF;&#x3002;<a href="https://www.zhihu.com/question/363200569">&#x5982;&#x4F55;&#x7406;&#x89E3;few-shot learning&#x4E2D;&#x7684;n-way k-shot? - &#x77E5;&#x4E4E;</a><br>
&#x57FA;&#x4E8E;Prototypical Networks&#x5B9E;&#x73B0;&#x7684;few-shot&#x8BAD;&#x7EC3;&#x6D41;&#x7A0B;&#xFF1A;</p>
<ol>
<li>&#x4ECE;&#x6240;&#x6709;&#x7C7B;&#x522B;&#x4E2D;&#x968F;&#x673A;&#x91C7;&#x6837;$N_C$&#x4E2A;&#x7C7B;&#x522B;&#xFF0C;&#x7C7B;&#x522B;&#x5B50;&#x96C6;&#x8BB0;&#x4E3A;$V$&#xFF1B;</li>
<li>&#x5BF9;&#x6BCF;&#x4E2A;&#x7C7B;&#x522B;&#xFF0C;&#x9009;&#x62E9;$N_S$&#x4E2A;&#x6837;&#x672C;&#x6784;&#x5EFA;support set $S_k$&#xFF1B;</li>
<li>&#x9009;&#x62E9;$N_Q$&#x4E2A;&#x6837;&#x672C;&#x4F5C;&#x4E3A;query set&#xFF1B;</li>
<li>&#x5229;&#x7528;support set&#x7684;embedding&#x8BA1;&#x7B97;prototypes $c_k$&#xFF1B;</li>
<li>&#x8BA1;&#x7B97;loss $J$&#xFF0C;&#x4E5F;&#x5C31;&#x662F;&#x6700;&#x5C0F;&#x5316;&#x6BCF;&#x4E00;&#x4E2A;query &#x6837;&#x672C;&#x548C;&#x5BF9;&#x5E94;&#x7684;prototype&#x4E4B;&#x95F4;&#x7684;&#x8DDD;&#x79BB;&#x3002;</li>
</ol>
<p><strong>&#x53C2;&#x8003;&#x6587;&#x732E;&#xFF1A;</strong><br>
[1] Prototypical Networks for Few-shot Learning. (NeurIPS 17)<br>
[2] CANet: Class-Agnostic Segmentation Networks with Iterative Refinement and Attentive Few-Shot Learning. (CVPR 19)<br>
[3] PANet: Few-Shot Image Semantic Segmentation with Prototype Alignment. (ICCV 19)</p>
<!--kg-card-end: markdown--><!--kg-card-begin: markdown--><h3 id="%E8%87%AA%E8%AE%AD%E7%BB%83">&#x81EA;&#x8BAD;&#x7EC3;</h3>
<p>&#x81EA;&#x8BAD;&#x7EC3;&#x662F;&#x6307;&#x6A21;&#x578B;&#x6700;&#x521D;&#x53EA;&#x5728;&#x5C0F;&#x89C4;&#x6A21;&#x7684;&#x6807;&#x8BB0;&#x6570;&#x636E;&#x4E0A;&#x8FDB;&#x884C;&#x8BAD;&#x7EC3;&#xFF0C;&#x7136;&#x540E;&#x540C;&#x65F6;&#x7528;&#x5E26;&#x6807;&#x8BB0;&#x6570;&#x636E;&#x548C;&#x4F2A;&#x6807;&#x8BB0;&#x6570;&#x636E;&#x8FDB;&#x884C;&#x8BAD;&#x7EC3;&#x3002;</p>
<p><strong>&#x81EA;&#x8BAD;&#x7EC3;&#x7684;&#x6311;&#x6218;&#x4E3B;&#x8981;&#x662F;&#xFF1A;</strong> 1)&#x63D0;&#x9AD8;&#x4F2A;&#x6807;&#x7B7E;&#x8D28;&#x91CF;&#x548C;2)&#x51CF;&#x5C11;&#x566A;&#x58F0;&#x4F2A;&#x6807;&#x7B7E;&#x7684;&#x8D1F;&#x9762;&#x5F71;&#x54CD;&#x3002;</p>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://deserts.io/content/images/2022/05/image-27.png" class="kg-image" alt="&#x534A;&#x76D1;&#x7763;&#x5206;&#x5272;&#xFF1A;&#x4ECE;&#x6570;&#x636E;&#x589E;&#x5F3A;&#x5230;&#x5B66;&#x4E60;&#x8303;&#x5F0F;" loading="lazy" width="577" height="308"><figcaption>&#x81EA;&#x8BAD;&#x7EC3;&#x6D41;&#x7A0B;</figcaption></figure><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://deserts.io/content/images/2022/05/image-28.png" class="kg-image" alt="&#x534A;&#x76D1;&#x7763;&#x5206;&#x5272;&#xFF1A;&#x4ECE;&#x6570;&#x636E;&#x589E;&#x5F3A;&#x5230;&#x5B66;&#x4E60;&#x8303;&#x5F0F;" loading="lazy" width="454" height="235"><figcaption>Teacher-student&#x81EA;&#x8BAD;&#x7EC3;&#x793A;&#x610F;&#x56FE;</figcaption></figure><!--kg-card-begin: markdown--><p>&#x4E3A;&#x4E86;&#x964D;&#x4F4E;&#x566A;&#x58F0;&#x4F2A;&#x6807;&#x7B7E;&#x7684;&#x8D1F;&#x9762;&#x5F71;&#x54CD;&#xFF0C;&#x4F7F;&#x7528;&#x591A;&#x79CD;&#x4E0D;&#x786E;&#x5B9A;&#x6027;&#x6216;&#x7F6E;&#x4FE1;&#x5EA6;&#x4F30;&#x8BA1;&#x65B9;&#x6CD5;&#xFF0C;&#x6574;&#x4F53;&#x4E0A;&#x4E0D;&#x786E;&#x5B9A;&#x6027;&#x4F30;&#x8BA1;&#x53EF;&#x4EE5;&#x5206;&#x4E3A;&#xFF1A;</p>
<ul>
<li>&#x6570;&#x636E;&#x4E0D;&#x786E;&#x5B9A;&#x6027;&#xFF08;aleatoric uncertainty&#xFF09;</li>
<li>&#x6A21;&#x578B;&#x4E0D;&#x786E;&#x5B9A;&#x6027;&#xFF08;epistemic uncertainty&#xFF09;</li>
</ul>
<p>&#x5728;&#x6DF1;&#x5EA6;&#x7F51;&#x7EDC;&#x4E2D;&#x751F;&#x6210;&#x4F2A;&#x6807;&#x7B7E;&#x548C;&#x91CF;&#x5316;&#x4E0D;&#x786E;&#x5B9A;&#x6027;&#x7684;&#x6D41;&#x884C;&#x65B9;&#x6CD5;&#x5305;&#x62EC;&#x8D1D;&#x53F6;&#x65AF;&#x795E;&#x7ECF;&#x7F51;&#x7EDC;&#x3001;Monte Carlo Dropout&#x3001;Monte Carlo  BatchNorm&#xFF0C;&#x4EE5;&#x53CA;&#x6DF1;&#x5EA6;&#x96C6;&#x6210;&#xFF08;Deep ensemble&#xFF09;&#x3002;&#x8D1D;&#x53F6;&#x65AF;&#x795E;&#x7ECF;&#x7F51;&#x7EDC;&#x901A;&#x8FC7;&#x5B66;&#x4E60;&#x53C2;&#x6570;&#x7684;&#x540E;&#x9A8C;&#x5206;&#x5E03;&#x6765;&#x6355;&#x6349;&#x6A21;&#x578B;&#x7684;&#x4E0D;&#x786E;&#x5B9A;&#x6027;&#xFF0C;&#x901A;&#x5E38;&#x96BE;&#x4EE5;&#x5B9E;&#x73B0;&#x4E14;&#x8BAD;&#x7EC3;&#x8BA1;&#x7B97;&#x901F;&#x5EA6;&#x7F13;&#x6162; &#x3002;</p>
<p>&#x975E;&#x8D1D;&#x53F6;&#x65AF;&#x7B56;&#x7565;&#xFF0C;&#x5305;&#x62EC; Monte Carlo Dropout &#x548C;&#x6DF1;&#x5EA6;&#x96C6;&#x6210;&#x66F4;&#x6709;&#x5438;&#x5F15;&#x529B;&#xFF1A;</p>
<ul>
<li>Monte Carlo Dropout&#xFF1A;&#x968F;&#x673A;Dropout&#x7684;&#x60C5;&#x51B5;&#x4E0B;&#xFF0C;&#x5229;&#x7528;&#x6DF1;&#x5EA6;&#x7F51;&#x7EDC;&#x7684;&#x591A;&#x4E2A;&#x524D;&#x5411;&#x7684;&#x7ED3;&#x679C;&#x6765;&#x4F30;&#x8BA1;&#x4E0D;&#x786E;&#x5B9A;&#x6027;&#x3002;</li>
<li>Deep Ensemble&#xFF1A;&#x5206;&#x522B;&#x8BAD;&#x7EC3;&#x4E0D;&#x540C;&#x8BAD;&#x7EC3;&#x5B50;&#x96C6; &#x6216;&#x4E0D;&#x540C;&#x521D;&#x59CB;&#x5316;&#x7684;&#x591A;&#x4E2A;&#x7F51;&#x7EDC;&#xFF0C;&#x7136;&#x540E;&#x5C06;&#x9884;&#x6D4B;&#x7ED3;&#x5408;&#x8D77;&#x6765;&#x8FDB;&#x884C;&#x4E0D;&#x786E;&#x5B9A;&#x6027;&#x4F30;&#x8BA1;&#x3002;</li>
</ul>
<p>&#x533B;&#x7597;&#x5F71;&#x50CF;&#x5206;&#x5272;&#x4E2D;&#xFF0C;[1,2,3]&#x4F7F;&#x7528;Monte Carlo Dropout&#x4F5C;&#x4E3A;Uncertainty&#x6765;&#x6307;&#x5BFC;&#x672A;&#x6807;&#x6CE8;/&#x5F31;&#x6807;&#x6CE8;&#x6570;&#x636E;&#x7684;&#x81EA;&#x8BAD;&#x7EC3;&#x3002;[4] &#x4F7F;&#x7528;&#x591A;&#x6A21;&#x578B;Ensemble&#x4F30;&#x8BA1;&#x7F6E;&#x4FE1;&#x5EA6;&#xFF0C;&#x4F7F;&#x7528;&#x4E0D;&#x540C;&#x7684;&#x521D;&#x59CB;&#x5316;&#x548C;&#x8BAD;&#x7EC3;&#x987A;&#x5E8F;&#x3002;</p>
<p><strong>&#x53C2;&#x8003;&#x6587;&#x732E;&#xFF1A;</strong><br>
[1] A Macro-Micro Weakly-supervised Framework for AS-OCT Tissue Segmentation. (MICCAI 20)<br>
[2] Uncertainty guided semi-supervised segmentation of retinal layers in OCT images. (MICCAI 19)<br>
[3] Uncertainty-aware self-ensembling model for semi-supervised 3d left atrium segmentation. (MICCAI 19)<br>
[4] Confidence Calibration and Predictive Uncertainty Estimation for Deep Medical Image Segmentation. (TMI 20)</p>
<!--kg-card-end: markdown--><!--kg-card-begin: markdown--><h3 id="%E5%8D%8F%E5%90%8C%E8%AE%AD%E7%BB%83">&#x534F;&#x540C;&#x8BAD;&#x7EC3;</h3>
<p>&#x534F;&#x540C;&#x8BAD;&#x7EC3; Co-training[1]&#x53EF;&#x4EE5;&#x89C6;&#x4F5C;&#x81EA;&#x8BAD;&#x7EC3;/&#x4F2A;&#x6807;&#x7B7E;&#x8BAD;&#x7EC3;&#x7684;&#x4E00;&#x4E2A;&#x6269;&#x5C55;&#xFF1A;&#x5C06;&#x5355;&#x7F51;&#x7EDC;&#x81EA;&#x8BAD;&#x7EC3;&#x6269;&#x5C55;&#x81F3;&#x591A;&#x4E2A;&#x6A21;&#x578B;&#x3002;&#x5728;&#x534A;&#x76D1;&#x7763;&#x5206;&#x5272;&#x4E2D;&#xFF0C;&#x901A;&#x5E38;&#x4F7F;&#x7528;&#x4E0D;&#x540C;&#x8BAD;&#x7EC3;&#x5B50;&#x96C6; &#x6216;&#x4E0D;&#x540C;&#x521D;&#x59CB;&#x5316;&#x7684;&#x591A;&#x4E2A;&#x7F51;&#x7EDC;&#xFF0C;&#x5F7C;&#x6B64;&#x4E92;&#x76F8;&#x63D0;&#x4F9B;&#x4F2A;&#x6807;&#x7B7E;&#xFF08;&#x6216;&#x662F;&#x4F30;&#x8BA1;&#x4E0D;&#x786E;&#x5B9A;&#x6027;&#xFF09;&#x6765;&#x5B9E;&#x73B0;&#x534F;&#x540C;&#x8BAD;&#x7EC3;&#x3002;</p>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://deserts.io/content/images/2022/05/image-29.png" class="kg-image" alt="&#x534A;&#x76D1;&#x7763;&#x5206;&#x5272;&#xFF1A;&#x4ECE;&#x6570;&#x636E;&#x589E;&#x5F3A;&#x5230;&#x5B66;&#x4E60;&#x8303;&#x5F0F;" loading="lazy" width="980" height="860" srcset="https://deserts.io/content/images/size/w600/2022/05/image-29.png 600w, https://deserts.io/content/images/2022/05/image-29.png 980w" sizes="(min-width: 720px) 720px"><figcaption>Co-Training Segmentation&#x6846;&#x67B6;&#xFF1A;&#x4E24;&#x4E2A;&#x6A21;&#x578B;&#x7528;&#x4E24;&#x4E2A;&#x6807;&#x6CE8;&#x96C6;&#x7684;&#x5B50;&#x96C6;&#x8BAD;&#x7EC3;&#x4FDD;&#x8BC1;&#x5DEE;&#x5F02;&#x6027;&#xFF1B;&#x672A;&#x6807;&#x8BB0;&#x6570;&#x636E;&#x4F5C;&#x4E3A;&#x516C;&#x5171;&#x6570;&#x636E;&#xFF1B;&#x4E09;&#x4E2A;loss&#x5206;&#x522B;&#x7EA6;&#x675F;&#x6807;&#x6CE8;&#x6837;&#x672C;&#x7684;&#x9884;&#x6D4B;&#x4E0E;groud-truth&#x7684;&#x4E00;&#x81F4;&#xFF0C;&#x7EA6;&#x675F;&#x672A;&#x6807;&#x6CE8;&#x6837;&#x672C;&#x5728;&#x4E24;&#x4E2A;&#x7F51;&#x7EDC;&#x95F4;&#x7684;&#x4E00;&#x81F4;&#xFF0C;&#x4EE5;&#x53CA;&#x7EA6;&#x675F;&#x4E24;&#x4E2A;&#x7F51;&#x7EDC;&#x9884;&#x6D4B;&#x7684;&#x5BF9;&#x6297;&#x6837;&#x672C;&#x4E00;&#x81F4;&#x3002;[2]</figcaption></figure><!--kg-card-begin: markdown--><p><strong>&#x53C2;&#x8003;&#x6587;&#x732E;&#xFF1A;</strong><br>
[1] Deep Co-Training for Semi-Supervised Image Recognition. (ECCV 18)<br>
[2] Deep Co-Training for Semi-Supervised Image Segmentation. (PR 20)</p>
<!--kg-card-end: markdown--><!--kg-card-begin: markdown--><h3 id="%E4%B8%80%E8%87%B4%E6%80%A7%E6%AD%A3%E5%88%99">&#x4E00;&#x81F4;&#x6027;&#x6B63;&#x5219;</h3>
<p>&#x4E00;&#x81F4;&#x6027;&#x6B63;&#x5219;&#x57FA;&#x4E8E;&#x6A21;&#x578B;&#x5E94;&#x8BE5;&#x5BF9;&#x7C7B;&#x4F3C;&#x7684;&#x8F93;&#x5165;&#x4EA7;&#x751F;&#x4E00;&#x81F4;&#x7684;&#x9884;&#x6D4B;&#x7684;&#x5047;&#x8BBE;&#xFF1A;&#x6A21;&#x578B;&#x5BF9;&#x540C;&#x4E00;&#x4E2A;&#x6837;&#x672C;&#x4E0D;&#x540C;&#x6270;&#x52A8;&#x6216;&#x53D8;&#x6362;&#x7684;&#x7248;&#x672C;&#xFF0C;&#x5E94;&#x8F93;&#x51FA;&#x76F8;&#x540C;&#x7684;&#x9884;&#x6D4B;&#x3002;&#x4E5F;&#x5C31;&#x662F;&#x6700;&#x5C0F;&#x5316;&#x4E0D;&#x540C;&#x7248;&#x672C;&#x7684;&#x9884;&#x6D4B;&#x4E4B;&#x95F4;&#x7684;&#x5DEE;&#x5F02;&#xFF0C;&#x4EE5;&#x83B7;&#x5F97;&#x4E00;&#x4E2A;&#x5177;&#x6709;&#x66F4;&#x597D;&#x6CDB;&#x5316;&#x80FD;&#x529B;&#x7684;&#x6A21;&#x578B;&#x3002;&#x4E00;&#x81F4;&#x6027;&#x6B63;&#x5219;&#x662F;&#x534A;&#x76D1;&#x7763;&#xFF0C;&#x5F31;&#x76D1;&#x7763;&#x4EE5;&#x53CA;&#x566A;&#x58F0;&#x6807;&#x7B7E;&#x5B66;&#x4E60;&#x4E2D;&#x4F7F;&#x7528;&#x6700;&#x5E7F;&#x6CDB;&#x7684;&#x6B63;&#x5219;&#x65B9;&#x6CD5;&#x3002;</p>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card"><img src="https://deserts.io/content/images/2022/05/image-30.png" class="kg-image" alt="&#x534A;&#x76D1;&#x7763;&#x5206;&#x5272;&#xFF1A;&#x4ECE;&#x6570;&#x636E;&#x589E;&#x5F3A;&#x5230;&#x5B66;&#x4E60;&#x8303;&#x5F0F;" loading="lazy" width="843" height="253" srcset="https://deserts.io/content/images/size/w600/2022/05/image-30.png 600w, https://deserts.io/content/images/2022/05/image-30.png 843w" sizes="(min-width: 720px) 720px"></figure><!--kg-card-begin: markdown--><p><strong>&#x5206;&#x5272;&#x4EFB;&#x52A1;&#x4E2D;&#x5E38;&#x89C1;&#x7684;&#x6270;&#x52A8;/&#x53D8;&#x6362;&#xFF1A;</strong></p>
<ul>
<li>&#x8F93;&#x5165;&#x56FE;&#x50CF;&#x989C;&#x8272;&#x53D8;&#x6362;[1]</li>
<li>&#x56FE;&#x50CF;&#x51E0;&#x4F55;&#x53D8;&#x6362;&#xFF08;&#x5BF9;&#x4E8E;&#x51E0;&#x4F55;/&#x7A7A;&#x95F4;&#x53D8;&#x6362;&#xFF0C;&#x5206;&#x5272;&#x5F3A;&#x8C03;&#x7B49;&#x53D8;&#x6027;&#xFF0C;&#x800C;&#x5206;&#x7C7B;&#x8981;&#x6C42;&#x4E0D;&#x53D8;&#x6027;&#xFF09;</li>
<li>&#x4E2D;&#x95F4;&#x7279;&#x5F81;&#x6270;&#x52A8;&#xFF08;&#x5982;Dropout&#xFF09;[2]</li>
<li>&#x7F51;&#x7EDC;&#x53C2;&#x6570;&#x6270;&#x52A8;&#xFF08;&#x4E24;&#x4E2A;&#x7F51;&#x7EDC;&#x4E0D;&#x540C;&#x7684;&#x521D;&#x59CB;&#x5316;&#xFF09;&#xFF0C;&#x7C7B;&#x4F3C;&#x4E8E;co-training</li>
</ul>
<p><strong>&#x8F93;&#x51FA;&#x4E00;&#x81F4;&#x6027;&#x635F;&#x5931;&#x5F62;&#x5F0F;&#xFF1A;</strong></p>
<ul>
<li>&#x6700;&#x5C0F;&#x5316;&#x9884;&#x6D4B;&#x6982;&#x7387;/&#x4E2D;&#x95F4;&#x7279;&#x5F81;&#x7684;&#x8DDD;&#x79BB;(MSE&#xFF0C;JS&#xFF0C;KL divergence)[2]</li>
<li>&#x751F;&#x6210;&#x4F2A;&#x6807;&#x7B7E;&#x76D1;&#x7763;&#xFF08;Cross Entropy&#xFF09;[1,3]</li>
</ul>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://deserts.io/content/images/2022/05/image-31.png" class="kg-image" alt="&#x534A;&#x76D1;&#x7763;&#x5206;&#x5272;&#xFF1A;&#x4ECE;&#x6570;&#x636E;&#x589E;&#x5F3A;&#x5230;&#x5B66;&#x4E60;&#x8303;&#x5F0F;" loading="lazy" width="1280" height="888" srcset="https://deserts.io/content/images/size/w600/2022/05/image-31.png 600w, https://deserts.io/content/images/size/w1000/2022/05/image-31.png 1000w, https://deserts.io/content/images/2022/05/image-31.png 1280w" sizes="(min-width: 720px) 720px"><figcaption>CCT: Cross-Consistency Training[2] &#x57FA;&#x4E8E;&#x4E2D;&#x95F4;&#x7279;&#x5F81;&#x6270;&#x52A8;&#x7684;&#x4E00;&#x81F4;&#x6027;&#x6B63;&#x5219;&#x3002;&#x5BF9;&#x672A;&#x6807;&#x6CE8;&#x6807;&#x7684;&#x6837;&#x672C;&#x7684;&#x4E2D;&#x95F4;&#x7279;&#x5F81;&#x52A0;&#x6270;&#x52A8;&#xFF0C;&#x7EA6;&#x675F;&#x4E0D;&#x540C;&#x8F93;&#x51FA;&#x95F4;&#x7684;&#x4E00;&#x81F4;&#x6027;&#x3002;&#x5176;&#x4E2D;&#xFF0C;&#x6270;&#x52A8;&#x5305;&#x62EC;&#x968F;&#x673A;&#x566A;&#x58F0;&#xFF0C;&#x968F;&#x673A;Dropout&#xFF0C;cutout&#x7B49;&#x3002;</figcaption></figure><!--kg-card-begin: markdown--><p><strong>&#x53C2;&#x8003;&#x6587;&#x732E;&#xFF1A;</strong><br>
[1] PseudoSeg: Designing Pseudo Labels for Semantic Segmentation. (ICLR 21)<br>
[2] Semi-Supervised Semantic Segmentation with Cross-Consistency Training. (CVPR 20)</p>
<!--kg-card-end: markdown--><!--kg-card-begin: markdown--><h3 id="%E5%AF%B9%E6%8A%97%E8%AE%AD%E7%BB%83">&#x5BF9;&#x6297;&#x8BAD;&#x7EC3;</h3>
<p>&#x751F;&#x6210;&#x5BF9;&#x6297;&#x7F51;&#x7EDC;&#xFF08;GAN&#xFF09;&#x8BAD;&#x7EC3;&#x4E24;&#x4E2A;&#x5B50;&#x7F51;&#x7EDC;&#xFF0C;&#x4E00;&#x4E2A;&#x4F5C;&#x4E3A;&#x9274;&#x522B;&#x5668;&#xFF0C;&#x65E8;&#x5728;&#x8BC6;&#x522B;&#x6837;&#x672C;&#x662F;&#x6765;&#x81EA;&#x771F;&#x5B9E;&#x6570;&#x636E;&#x8FD8;&#x662F;&#x7531;&#x751F;&#x6210;&#x5668;&#x751F;&#x6210;&#xFF0C;&#x53E6;&#x4E00;&#x4E2A;&#x4F5C;&#x4E3A;&#x751F;&#x6210;&#x5668;&#xFF0C;&#x65E8;&#x5728;&#x751F;&#x6210;&#x9274;&#x522B;&#x5668;&#x65E0;&#x6CD5;&#x533A;&#x5206;&#x7684;&#x6837;&#x672C;&#x3002;GAN&#x5DF2;&#x7ECF;&#x88AB;&#x5E7F;&#x6CDB;&#x7528;&#x4E8E;&#x534A;&#x76D1;&#x7763;&#x5206;&#x5272;[1,2]&#x548C;&#x57DF;&#x9002;&#x5E94;&#x5206;&#x5272;&#x4E2D;&#x3002;&#x4F8B;&#x5982;&#xFF0C;&#x4E00;&#x79CD;&#x76F4;&#x63A5;&#x7684;&#x60F3;&#x6CD5;&#x662F;&#xFF1A;&#x9274;&#x522B;&#x5668;&#x8F93;&#x51FA;&#x7684;&#x7F6E;&#x4FE1;&#x5EA6;&#x53EF;&#x4EE5;&#x88AB;&#x5F53;&#x4F5C;&#x8D28;&#x91CF;&#x8BC4;&#x4F30;&#xFF0C;&#x7528;&#x4E8E;&#x9009;&#x62E9;&#x6700;&#x597D;&#x7684;&#x9884;&#x6D4B;&#x7ED3;&#x679C;&#x7528;&#x4E8E;&#x540E;&#x7EED;&#x7684;self-training[1]&#x3002;</p>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://deserts.io/content/images/2022/05/image-32.png" class="kg-image" alt="&#x534A;&#x76D1;&#x7763;&#x5206;&#x5272;&#xFF1A;&#x4ECE;&#x6570;&#x636E;&#x589E;&#x5F3A;&#x5230;&#x5B66;&#x4E60;&#x8303;&#x5F0F;" loading="lazy" width="1280" height="652" srcset="https://deserts.io/content/images/size/w600/2022/05/image-32.png 600w, https://deserts.io/content/images/size/w1000/2022/05/image-32.png 1000w, https://deserts.io/content/images/2022/05/image-32.png 1280w" sizes="(min-width: 720px) 720px"><figcaption>s4GAN[2] &#x7684;&#x6838;&#x5FC3;&#x662F;&#x4E00;&#x4E2A;&#x6807;&#x51C6;&#x7684;&#x5206;&#x5272;&#x7F51;&#x7EDC;&#xFF0C;&#x7528;&#x4E8E;&#x751F;&#x6210;&#x8F93;&#x5165;&#x56FE;&#x50CF;&#x7684;&#x6BCF;&#x4E2A;&#x50CF;&#x7D20;&#x7684;&#x7C7B;&#x6807;&#x7B7E;&#x3002;&#x540C;&#x65F6;&#x5C06;&#x5C06;&#x4F20;&#x7EDF;&#x7684;&#x76D1;&#x7763;&#x8BAD;&#x7EC3;&#x4E0E;&#x5BF9;&#x6297;&#x8BAD;&#x7EC3;&#x76F8;&#x7ED3;&#x5408;&#xFF0C;&#x5229;&#x7528;&#x672A;&#x6807;&#x8BB0;&#x7684;&#x6570;&#x636E;&#x6765;&#x63D0;&#x9AD8;&#x9884;&#x6D4B;&#x8D28;&#x91CF;&#x3002;&#x5176;&#x4E2D;&#xFF0C;&#x5206;&#x5272;&#x7F51;&#x7EDC;&#x4F5C;&#x4E3A;&#x751F;&#x6210;&#x5668;&#xFF0C;&#x5E76;&#x4E0E;&#x4E00;&#x4E2A;&#x5224;&#x522B;&#x5668;&#x4E00;&#x8D77;&#x8BAD;&#x7EC3;&#xFF0C;&#x5224;&#x522B;&#x5668;&#x8D1F;&#x8D23;&#x5C06;ground truth&#x4E0E;&#x9884;&#x6D4B;&#x7684;&#x5206;&#x5272;&#x56FE;&#x8FDB;&#x884C;&#x533A;&#x5206;&#x3002;&#x6B64;&#x5916;&#xFF0C;&#x6587;&#x4E2D;&#x5C06;&#x5224;&#x522B;&#x5668;&#x7684;&#x8F93;&#x51FA;&#x4F5C;&#x4E3A;&#x8D28;&#x91CF;&#x5EA6;&#x91CF;&#x6765;&#x786E;&#x5B9A;&#x9884;&#x6D4B;&#x7684;&#x8D28;&#x91CF;&#xFF0C;&#x4ECE;&#x800C;&#x8FDB;&#x4E00;&#x6B65;&#x7528;&#x4E8E;&#x81EA;&#x8BAD;&#x7EC3;&#x3002;</figcaption></figure><!--kg-card-begin: markdown--><p><strong>&#x53C2;&#x8003;&#x6587;&#x732E;&#xFF1A;</strong><br>
[1]Semi-Supervised Semantic Segmentation with High- and Low-level Consistency. (TPAMI 21)<br>
[2]Semi Supervised Semantic Segmentation Using Generative Adversarial Network. (ICCV 17)</p>
<h2 id="%E6%80%BB%E7%BB%93">&#x603B;&#x7ED3;</h2>
<p>&#x4E0A;&#x6587;&#x603B;&#x7ED3;&#x4E86;&#x6DF1;&#x5EA6;&#x534A;&#x76D1;&#x7763;&#x8BED;&#x4E49;&#x5206;&#x5272;&#x7684;&#x4EFB;&#x52A1;&#x8BBE;&#x5B9A;&#x3001;&#x4E3B;&#x8981;&#x6311;&#x6218;&#x548C;&#x4E3B;&#x6D41;&#x7684;&#x6280;&#x672F;&#x624B;&#x6BB5;&#x3002;&#x603B;&#x7ED3;&#x8D77;&#x6765;&#xFF0C;&#x6570;&#x636E;&#x589E;&#x5F3A;&#x3001;&#x8FC1;&#x79FB;&#x5B66;&#x4E60;&#x548C;&#x8BFE;&#x7A0B;&#x5B66;&#x4E60;&#x7B49;&#x65B9;&#x6CD5;&#x80FD;&#x591F;&#x7F13;&#x89E3;&#x8FC7;&#x62DF;&#x5408;&#x5230;&#x5C11;&#x91CF;&#x5E26;&#x6807;&#x6CE8;&#x6837;&#x672C;&#x7684;&#x95EE;&#x9898;&#xFF0C;&#x81EA;&#x76D1;&#x7763;&#x5B66;&#x4E60;&#x3001;&#x81EA;&#x8BAD;&#x7EC3;&#x3001;&#x4E00;&#x81F4;&#x6027;&#x6B63;&#x5219;&#x3001;&#x534F;&#x540C;&#x8BAD;&#x7EC3;&#x548C;&#x5BF9;&#x6297;&#x8BAD;&#x7EC3;&#x5219;&#x63D0;&#x4F9B;&#x4E86;&#x5229;&#x7528;&#x65E0;&#x76D1;&#x7763;&#x6837;&#x672C;&#x7684;&#x65B9;&#x6CD5;&#x3002;</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Valine Admin 配置手册]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>Valine Admin &#x662F; <a href="https://deserts.io/diy-a-comment-system/">Valine &#x8BC4;&#x8BBA;&#x7CFB;&#x7EDF;</a>&#x7684;&#x540E;&#x7AEF;&#x529F;&#x80FD;&#x8865;&#x5145;&#x548C;&#x589E;&#x5F3A;&#xFF0C;&#x4E3B;&#x8981;&#x5B9E;&#x73B0;&#x8BC4;&#x8BBA;&#x90AE;&#x4EF6;&#x901A;&#x77E5;&#x3001;&#x8BC4;&#x8BBA;&#x7BA1;&#x7406;&#x3001;&#x5783;&#x573E;&#x8BC4;&#x8BBA;&#x8FC7;&#x6EE4;&#x7B49;&#x529F;&#x80FD;&#x3002;&#x652F;&#x6301;&#x5B8C;&#x5168;&#x81EA;</p>]]></description><link>https://deserts.io/valine-admin-document/</link><guid isPermaLink="false">62938184d119ff1b94794cf4</guid><category><![CDATA[Blog]]></category><category><![CDATA[折腾]]></category><dc:creator><![CDATA[Junwen]]></dc:creator><pubDate>Tue, 06 Oct 2020 21:19:16 GMT</pubDate><media:content url="https://cloud.panjunwen.com/2018/09/wei-ming-ming.png" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><img src="https://cloud.panjunwen.com/2018/09/wei-ming-ming.png" alt="Valine Admin &#x914D;&#x7F6E;&#x624B;&#x518C;"><p>Valine Admin &#x662F; <a href="https://deserts.io/diy-a-comment-system/">Valine &#x8BC4;&#x8BBA;&#x7CFB;&#x7EDF;</a>&#x7684;&#x540E;&#x7AEF;&#x529F;&#x80FD;&#x8865;&#x5145;&#x548C;&#x589E;&#x5F3A;&#xFF0C;&#x4E3B;&#x8981;&#x5B9E;&#x73B0;&#x8BC4;&#x8BBA;&#x90AE;&#x4EF6;&#x901A;&#x77E5;&#x3001;&#x8BC4;&#x8BBA;&#x7BA1;&#x7406;&#x3001;&#x5783;&#x573E;&#x8BC4;&#x8BBA;&#x8FC7;&#x6EE4;&#x7B49;&#x529F;&#x80FD;&#x3002;&#x652F;&#x6301;&#x5B8C;&#x5168;&#x81EA;&#x5B9A;&#x4E49;&#x7684;&#x90AE;&#x4EF6;&#x901A;&#x77E5;&#x6A21;&#x677F;&#xFF0C;&#x57FA;&#x4E8E;Akismet API&#x5B9E;&#x73B0;&#x51C6;&#x786E;&#x7684;&#x5783;&#x573E;&#x8BC4;&#x8BBA;&#x8FC7;&#x6EE4;&#x3002;</p>
<blockquote>
<p>&#x6559;&#x7A0B;&#x4F7F;&#x7528;<a href="https://leancloud.app/">LeanCloud&#x56FD;&#x9645;&#x7248;</a>&#x505A;&#x6F14;&#x793A;&#x3002;</p>
</blockquote>
<style type="text/css">
    .table-wrap {
        overflow: auto !important;
    }
    table {
        min-width:640px;
        overflow-x:scroll;
    }
</style>
<div>
<a class="github-button" href="https://github.com/DesertsP/Valine-Admin" data-icon="octicon-star" data-size="large" aria-label="Star panjunwen/Valine-Admin on GitHub">Star</a>
<a class="github-button" href="https://github.com/DesertsP/Valine-Admin/issues" data-icon="octicon-issue-opened" data-size="large" aria-label="Issue panjunwen/Valine-Admin on GitHub">Issue</a>
<a class="github-button" href="https://github.com/DesertsP/" data-size="large" aria-label="Follow @panjunwen on GitHub">Follow @DesertsP</a>
<script async defer src="https://cloud.panjunwen.com/buttons.js"></script>
</div>
<h3 id>&#x4E91;&#x5F15;&#x64CE;&#x4E00;&#x952E;&#x90E8;&#x7F72;</h3>
<p>&#x8FDB;&#x5165;&#x8BC4;&#x8BBA;&#x7CFB;&#x7EDF;&#x6570;&#x636E;&#x5E93;&#x6240;&#x5728;&#x7684;LeanCloud&#x5E94;&#x7528;&#x3002;&#x8FDB;&#x5165;&#x300C;&#x4E91;&#x5F15;&#x64CE;-&#x8BBE;&#x7F6E;&#x300D;&#xFF0C;&#x8BBE;&#x7F6E;&#x73AF;&#x5883;&#x53D8;&#x91CF;&#x4EE5;&#x53CA;&#x4E91;&#x5F15;&#x64CE;&#x57DF;&#x540D;&#x3002;**&#x4EE5;&#x4E0B;&#x53C2;&#x6570;&#x9700;&#x8981;&#x6B63;&#x786E;&#x8BBE;&#x7F6E;&#x3002;&#x4E91;&#x5F15;&#x64CE;&#x57DF;&#x540D;&#xFF08;ADMIN_URL&#x53C2;&#x6570;&#xFF09;&#x7528;&#x4E8E;&#x8BC4;&#x8BBA;&#x540E;&#x53F0;&#x7BA1;&#x7406;&#xFF0C;&#x5982;<a href="https://deserts-io.avosapps.us/"></a> &#x3002;</p>
<table>
<thead>
<tr>
<th>&#x53D8;&#x91CF;</th>
<th>&#x793A;&#x4F8B;</th>
<th>&#x8BF4;&#x660E;</th>
</tr>
</thead>
<tbody>
<tr>
<td>SITE_NAME</td>
<td>Deserts</td>
<td>[&#x5FC5;&#x586B;]&#x535A;&#x5BA2;&#x540D;&#x79F0;</td>
</tr>
<tr>
<td>SITE_URL</td>
<td><a href="https://panjunwen.com">https://panjunwen.com</a></td>
<td>[&#x5FC5;&#x586B;]&#x9996;&#x9875;&#x5730;&#x5740;</td>
</tr>
<tr>
<td><strong>SMTP_SERVICE</strong></td>
<td>QQ</td>
<td>[&#x65B0;&#x7248;&#x652F;&#x6301;]&#x90AE;&#x4EF6;&#x670D;&#x52A1;&#x63D0;&#x4F9B;&#x5546;&#xFF0C;&#x652F;&#x6301; QQ&#x3001;163&#x3001;126&#x3001;Gmail &#x4EE5;&#x53CA; <a href="https://nodemailer.com/smtp/well-known/#supported-services">&#x66F4;&#x591A;</a></td>
</tr>
<tr>
<td>SMTP_USER</td>
<td><a href="mailto:xxxxxx@qq.com">xxxxxx@qq.com</a></td>
<td>[&#x5FC5;&#x586B;]SMTP&#x767B;&#x5F55;&#x7528;&#x6237;</td>
</tr>
<tr>
<td>SMTP_PASS</td>
<td>ccxxxxxxxxch</td>
<td>[&#x5FC5;&#x586B;]SMTP&#x767B;&#x5F55;&#x5BC6;&#x7801;&#xFF08;QQ&#x90AE;&#x7BB1;&#x9700;&#x8981;&#x83B7;&#x53D6;&#x72EC;&#x7ACB;&#x5BC6;&#x7801;&#xFF09;</td>
</tr>
<tr>
<td>SENDER_NAME</td>
<td>Deserts</td>
<td>[&#x5FC5;&#x586B;]&#x53D1;&#x4EF6;&#x4EBA;</td>
</tr>
<tr>
<td>SENDER_EMAIL</td>
<td><a href="mailto:xxxxxx@qq.com">xxxxxx@qq.com</a></td>
<td>[&#x5FC5;&#x586B;]&#x53D1;&#x4EF6;&#x90AE;&#x7BB1;</td>
</tr>
<tr>
<td>ADMIN_URL</td>
<td><a href="https://xxx.leanapp.cn/">https://xxx.leanapp.cn/</a></td>
<td>[&#x5EFA;&#x8BAE;]Web&#x4E3B;&#x673A;&#x4E8C;&#x7EA7;&#x57DF;&#x540D;&#xFF08;&#x4E91;&#x5F15;&#x64CE;&#x57DF;&#x540D;&#xFF09;&#xFF0C;&#x7528;&#x4E8E;&#x81EA;&#x52A8;&#x5524;&#x9192;</td>
</tr>
<tr>
<td>BLOGGER_EMAIL</td>
<td><a href="mailto:xxxxx@gmail.com">xxxxx@gmail.com</a></td>
<td>[&#x53EF;&#x9009;]&#x535A;&#x4E3B;&#x901A;&#x77E5;&#x6536;&#x4EF6;&#x5730;&#x5740;&#xFF0C;&#x9ED8;&#x8BA4;&#x4F7F;&#x7528;SENDER_EMAIL</td>
</tr>
<tr>
<td>AKISMET_KEY</td>
<td>xxxxxxxx</td>
<td>[&#x53EF;&#x9009;]Akismet Key &#x7528;&#x4E8E;&#x5783;&#x573E;&#x8BC4;&#x8BBA;&#x68C0;&#x6D4B;&#xFF0C;&#x8BBE;&#x4E3A;MANUAL_REVIEW&#x5F00;&#x542F;&#x4EBA;&#x5DE5;&#x5BA1;&#x6838;&#xFF0C;&#x7559;&#x7A7A;&#x4E0D;&#x4F7F;&#x7528;&#x53CD;&#x5783;&#x573E;</td>
</tr>
</tbody>
</table>
<p><img src="https://cloud.panjunwen.com/2020/10/envs.png" alt="Valine Admin &#x914D;&#x7F6E;&#x624B;&#x518C;" loading="lazy"></p>
<p>&#x5207;&#x6362;&#x5230;&#x300C;&#x4E91;&#x5F15;&#x64CE;-&#x90E8;&#x7F72;&#x300D;&#xFF0C;&#x90E8;&#x7F72;&#x6A21;&#x5F0F;&#x9009;&#x62E9;&#x300C;&#x90E8;&#x7F72;&#x9879;&#x76EE;-Git&#x90E8;&#x7F72;&#x300D;&#xFF0C;&#x5206;&#x652F;&#x300C;master&#x300D;&#xFF0C;&#x624B;&#x52A8;&#x90E8;&#x7F72;&#x76EE;&#x6807;&#x73AF;&#x5883;&#x4E3A;&#x300C;&#x751F;&#x4EA7;&#x73AF;&#x5883;&#x300D;&#x5728;<a href="https://leancloud.cn/dashboard/#/apps">Leancloud</a>&#x4E91;&#x5F15;&#x64CE;&#x8BBE;&#x7F6E;&#x754C;&#x9762;&#xFF0C;&#x586B;&#x5199;&#x4EE3;&#x7801;&#x5E93;&#x5E76;&#x4FDD;&#x5B58;&#xFF1A;<a href="https://github.com/DesertsP/Valine-Admin.git%EF%BC%8C%E5%8D%B3%E5%8F%AF%E4%B8%80%E9%94%AE%E9%83%A8%E7%BD%B2%E3%80%82">https://github.com/DesertsP/Valine-Admin.git&#xFF0C;&#x5373;&#x53EF;&#x4E00;&#x952E;&#x90E8;&#x7F72;&#x3002;</a></p>
<p><img src="https://cloud.panjunwen.com/2020/10/deploy4.png" alt="Valine Admin &#x914D;&#x7F6E;&#x624B;&#x518C;" loading="lazy"></p>
<h3 id>&#x8BC4;&#x8BBA;&#x7BA1;&#x7406;</h3>
<p>&#x9996;&#x5148;&#x9700;&#x8981;&#x8BBE;&#x7F6E;&#x7BA1;&#x7406;&#x5458;&#x4FE1;&#x606F;&#x3002;&#x8BBF;&#x95EE;&#x7BA1;&#x7406;&#x5458;&#x6CE8;&#x518C;&#x9875;&#x9762;<code>https://&#x4E91;&#x5F15;&#x64CE;&#x57DF;&#x540D;/sign-up</code>&#xFF0C;&#x6CE8;&#x518C;&#x7BA1;&#x7406;&#x5458;&#x767B;&#x5F55;&#x4FE1;&#x606F;&#xFF0C;&#x5982;&#xFF1A;<a href="https://deserts-io.avosapps.us/sign-up">https://deserts-io.avosapps.us/sign-up</a></p>
<p><img src="https://cloud.panjunwen.com/2020/10/signup2.png" alt="Valine Admin &#x914D;&#x7F6E;&#x624B;&#x518C;" loading="lazy"></p>
<ul>
<li>&#x6CE8;&#xFF1A;&#x4F7F;&#x7528;&#x539F;&#x7248;Valine&#x5982;&#x679C;&#x9047;&#x5230;&#x6CE8;&#x518C;&#x9875;&#x9762;&#x4E0D;&#x663E;&#x793A;&#x76F4;&#x63A5;&#x8DF3;&#x8F6C;&#x81F3;&#x767B;&#x5F55;&#x9875;&#x7684;&#x60C5;&#x51B5;&#xFF0C;&#x8BF7;&#x624B;&#x52A8;&#x5220;&#x9664;_User&#x8868;&#x4E2D;&#x7684;&#x5168;&#x90E8;&#x6570;&#x636E;&#x3002;</li>
</ul>
<h3 id>&#x5B9A;&#x65F6;&#x4EFB;&#x52A1;&#x8BBE;&#x7F6E;</h3>
<p>&#x5173;&#x4E8E;&#x81EA;&#x52A8;&#x4F11;&#x7720;&#x7684;&#x5B98;&#x65B9;&#x8BF4;&#x6CD5;&#xFF1A;<a href="https://leancloud.cn/docs/leanengine_plan.html#hash633315134">&#x70B9;&#x51FB;&#x67E5;&#x770B;</a>&#x3002;&#x76EE;&#x524D;&#x5B9E;&#x73B0;&#x4E86;&#x4E24;&#x79CD;&#x4E91;&#x51FD;&#x6570;&#x5B9A;&#x65F6;&#x4EFB;&#x52A1;&#x6765;&#x89E3;&#x51B3;&#x4E91;&#x5F15;&#x64CE;&#x4F11;&#x7720;&#x7684;&#x95EE;&#x9898;&#xFF1A;</p>
<ul>
<li>&#x81EA;&#x52A8;&#x5524;&#x9192;&#xFF0C;&#x5B9A;&#x65F6;&#x8BBF;&#x95EE;Web APP&#x4E8C;&#x7EA7;&#x57DF;&#x540D;&#x9632;&#x6B62;&#x4E91;&#x5F15;&#x64CE;&#x4F11;&#x7720;&#xFF1B;</li>
<li>&#x6BCF;&#x5929;&#x5B9A;&#x65F6;&#x68C0;&#x67E5;&#x8FC7;&#x53BB;24&#x5C0F;&#x65F6;&#x5185;&#x6F0F;&#x53D1;&#x7684;&#x90AE;&#x4EF6;&#x901A;&#x77E5;&#x3002;</li>
</ul>
<p>&#x8FDB;&#x5165;&#x300C;&#x4E91;&#x5F15;&#x64CE;-&#x5B9A;&#x65F6;&#x4EFB;&#x52A1;&#x300D;&#xFF0C;&#x521B;&#x5EFA;&#x4E24;&#x4E2A;&#x5B9A;&#x65F6;&#x4EFB;&#x52A1;&#x3002;</p>
<p><img src="https://cloud.panjunwen.com/2020/10/cron4.png" alt="Valine Admin &#x914D;&#x7F6E;&#x624B;&#x518C;" loading="lazy"></p>
<p>&#x9009;&#x62E9;self-wake&#x4E91;&#x51FD;&#x6570;&#xFF0C;Cron&#x8868;&#x8FBE;&#x5F0F;&#x4E3A;<code>0 */30 0-16 * * ?</code>&#xFF0C;&#x8868;&#x793A;&#x6BCF;&#x5929;&#x65E9;0&#x70B9;&#x5230;&#x665A;16&#x70B9;&#x6BCF;&#x9694;30&#x5206;&#x949F;&#x8BBF;&#x95EE;&#x4E91;&#x5F15;&#x64CE;&#x3002;</p>
<p>&#x9009;&#x62E9;resend-mails&#x4E91;&#x51FD;&#x6570;&#xFF0C;Cron&#x8868;&#x8FBE;&#x5F0F;&#x4E3A;<code>0 0 0 * * ?</code>&#xFF0C;&#x8868;&#x793A;&#x6BCF;&#x5929;0&#x70B9;&#x68C0;&#x67E5;&#x8FC7;&#x53BB;24&#x5C0F;&#x65F6;&#x5185;&#x6F0F;&#x53D1;&#x7684;&#x901A;&#x77E5;&#x90AE;&#x4EF6;&#x5E76;&#x8865;&#x53D1;&#x3002;</p>
<ul>
<li><a href="https://github.com/DesertsP/Valine-Admin/issues/63#issuecomment-533784574">&#x5173;&#x4E8E;&#x56FD;&#x9645;&#x7248;&#x65F6;&#x533A;&#x7684;&#x95EE;&#x9898;</a>&#xFF1A;&#x56FD;&#x9645;&#x7248;&#x4F7F;&#x7528;UTC-0&#x65F6;&#x95F4;&#xFF0C;&#x6CE8;&#x610F;&#x4E0E;&#x56FD;&#x5185;&#x65F6;&#x95F4;&#x5BF9;&#x5E94;&#x3002;</li>
</ul>
<p><strong>&#x81F3;&#x6B64;&#xFF0C;Valine Admin &#x5DF2;&#x7ECF;&#x53EF;&#x4EE5;&#x6B63;&#x5E38;&#x5DE5;&#x4F5C;&#xFF0C;&#x4EE5;&#x4E0B;&#x662F;&#x53EF;&#x9009;&#x914D;&#x7F6E;&#x3002;</strong></p>
<hr>
<h3 id>&#x66F4;&#x591A;&#x8BBE;&#x7F6E;</h3>
<h4 id>&#x90AE;&#x4EF6;&#x901A;&#x77E5;&#x6A21;&#x677F;</h4>
<p>&#x90AE;&#x4EF6;&#x901A;&#x77E5;&#x6A21;&#x677F;&#x5728;&#x4E91;&#x5F15;&#x64CE;&#x73AF;&#x5883;&#x53D8;&#x91CF;&#x4E2D;&#x8BBE;&#x5B9A;&#xFF0C;&#x53EF;&#x81EA;&#x5B9A;&#x4E49;&#x901A;&#x77E5;&#x90AE;&#x4EF6;&#x6807;&#x9898;&#x53CA;&#x5185;&#x5BB9;&#x6A21;&#x677F;&#x3002;</p>
<table>
<thead>
<tr>
<th>&#x73AF;&#x5883;&#x53D8;&#x91CF;</th>
<th>&#x793A;&#x4F8B;</th>
<th>&#x8BF4;&#x660E;</th>
</tr>
</thead>
<tbody>
<tr>
<td>MAIL_SUBJECT</td>
<td>${PARENT_NICK}&#xFF0C;&#x60A8;&#x5728;${SITE_NAME}&#x4E0A;&#x7684;&#x8BC4;&#x8BBA;&#x6536;&#x5230;&#x4E86;&#x56DE;&#x590D;</td>
<td>[&#x53EF;&#x9009;]@&#x901A;&#x77E5;&#x90AE;&#x4EF6;&#x4E3B;&#x9898;&#xFF08;&#x6807;&#x9898;&#xFF09;&#x6A21;&#x677F;</td>
</tr>
<tr>
<td>MAIL_TEMPLATE</td>
<td>&#x89C1;&#x4E0B;&#x6587;</td>
<td>[&#x53EF;&#x9009;]@&#x901A;&#x77E5;&#x90AE;&#x4EF6;&#x5185;&#x5BB9;&#x6A21;&#x677F;</td>
</tr>
<tr>
<td>MAIL_SUBJECT_ADMIN</td>
<td>${SITE_NAME}&#x4E0A;&#x6709;&#x65B0;&#x8BC4;&#x8BBA;&#x4E86;</td>
<td>[&#x53EF;&#x9009;]&#x535A;&#x4E3B;&#x90AE;&#x4EF6;&#x901A;&#x77E5;&#x4E3B;&#x9898;&#x6A21;&#x677F;</td>
</tr>
<tr>
<td>MAIL_TEMPLATE_ADMIN</td>
<td>&#x89C1;&#x4E0B;&#x6587;</td>
<td>[&#x53EF;&#x9009;]&#x535A;&#x4E3B;&#x90AE;&#x4EF6;&#x901A;&#x77E5;&#x5185;&#x5BB9;&#x6A21;&#x677F;</td>
</tr>
</tbody>
</table>
<p>&#x90AE;&#x4EF6;&#x901A;&#x77E5;&#x5305;&#x542B;&#x4E24;&#x79CD;&#xFF0C;&#x5206;&#x522B;&#x662F;&#x88AB;@&#x901A;&#x77E5;&#x548C;&#x535A;&#x4E3B;&#x901A;&#x77E5;&#xFF0C;&#x8FD9;&#x4E24;&#x79CD;&#x6A21;&#x677F;&#x90FD;&#x53EF;&#x4EE5;&#x5B8C;&#x5168;&#x81EA;&#x5B9A;&#x4E49;&#x3002;&#x9ED8;&#x8BA4;&#x4F7F;&#x7528;&#x7ECF;&#x5178;&#x7684;&#x84DD;&#x8272;&#x98CE;&#x683C;&#x6A21;&#x677F;&#xFF08;&#x6837;&#x5F0F;&#x6765;&#x6E90;&#x672A;&#x77E5;&#xFF09;&#x3002;</p>
<p>&#x9ED8;&#x8BA4;&#x88AB;@&#x901A;&#x77E5;&#x90AE;&#x4EF6;&#x5185;&#x5BB9;&#x6A21;&#x677F;&#x5982;&#x4E0B;&#xFF1A;</p>
<pre><code class="language-html">&lt;div style=&quot;border-top:2px solid #12ADDB;box-shadow:0 1px 3px #AAAAAA;line-height:180%;padding:0 15px 12px;margin:50px auto;font-size:12px;&quot;&gt;&lt;h2 style=&quot;border-bottom:1px solid #DDD;font-size:14px;font-weight:normal;padding:13px 0 10px 8px;&quot;&gt;&#x60A8;&#x5728;&lt;a style=&quot;text-decoration:none;color: #12ADDB;&quot; href=&quot;${SITE_URL}&quot; target=&quot;_blank&quot;&gt;            ${SITE_NAME}&lt;/a&gt;&#x4E0A;&#x7684;&#x8BC4;&#x8BBA;&#x6709;&#x4E86;&#x65B0;&#x7684;&#x56DE;&#x590D;&lt;/h2&gt; ${PARENT_NICK} &#x540C;&#x5B66;&#xFF0C;&#x60A8;&#x66FE;&#x53D1;&#x8868;&#x8BC4;&#x8BBA;&#xFF1A;&lt;div style=&quot;padding:0 12px 0 12px;margin-top:18px&quot;&gt;&lt;div style=&quot;background-color: #f5f5f5;padding: 10px 15px;margin:18px 0;word-wrap:break-word;&quot;&gt;            ${PARENT_COMMENT}&lt;/div&gt;&lt;p&gt;&lt;strong&gt;${NICK}&lt;/strong&gt;&#x56DE;&#x590D;&#x8BF4;&#xFF1A;&lt;/p&gt;&lt;div style=&quot;background-color: #f5f5f5;padding: 10px 15px;margin:18px 0;word-wrap:break-word;&quot;&gt; ${COMMENT}&lt;/div&gt;&lt;p&gt;&#x60A8;&#x53EF;&#x4EE5;&#x70B9;&#x51FB;&lt;a style=&quot;text-decoration:none; color:#12addb&quot; href=&quot;${POST_URL}&quot; target=&quot;_blank&quot;&gt;&#x67E5;&#x770B;&#x56DE;&#x590D;&#x7684;&#x5B8C;&#x6574;&#x5167;&#x5BB9;&lt;/a&gt;&#xFF0C;&#x6B22;&#x8FCE;&#x518D;&#x6B21;&#x5149;&#x4E34;&lt;a style=&quot;text-decoration:none; color:#12addb&quot; href=&quot;${SITE_URL}&quot; target=&quot;_blank&quot;&gt;${SITE_NAME}&lt;/a&gt;&#x3002;&lt;br&gt;&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
</code></pre>
<p>&#x6548;&#x679C;&#x5982;&#x4E0B;&#x56FE;&#xFF1A;</p>
<p><img src="https://cloud.panjunwen.com/2018/09/wei-ming-ming.png" alt="Valine Admin &#x914D;&#x7F6E;&#x624B;&#x518C;" loading="lazy"></p>
<p>@&#x901A;&#x77E5;&#x6A21;&#x677F;&#x4E2D;&#x7684;&#x53EF;&#x7528;&#x53D8;&#x91CF;&#x5982;&#x4E0B;&#xFF08;&#x6CE8;&#xFF0C;&#x8FD9;&#x662F;&#x90AE;&#x4EF6;&#x6A21;&#x677F;&#x53D8;&#x91CF;&#xFF0C;&#x662F;&#x6307;&#x5D4C;&#x5165;&#x5230;HTML&#x90AE;&#x4EF6;&#x6A21;&#x677F;&#x4E2D;&#x7684;&#x53D8;&#x91CF;&#xFF0C;&#x8BF7;&#x52FF;&#x4E0E;&#x4E91;&#x5F15;&#x64CE;&#x73AF;&#x5883;&#x53D8;&#x91CF;&#x6DF7;&#x6DC6;&#xFF09;&#xFF1A;</p>
<table>
<thead>
<tr>
<th>&#x6A21;&#x677F;&#x53D8;&#x91CF;</th>
<th>&#x8BF4;&#x660E;</th>
</tr>
</thead>
<tbody>
<tr>
<td>SITE_NAME</td>
<td>&#x535A;&#x5BA2;&#x540D;&#x79F0;</td>
</tr>
<tr>
<td>SITE_URL</td>
<td>&#x535A;&#x5BA2;&#x9996;&#x9875;&#x5730;&#x5740;</td>
</tr>
<tr>
<td>POST_URL</td>
<td>&#x6587;&#x7AE0;&#x5730;&#x5740;&#xFF08;&#x5B8C;&#x6574;&#x8DEF;&#x5F84;&#xFF09;</td>
</tr>
<tr>
<td>PARENT_NICK</td>
<td>&#x6536;&#x4EF6;&#x4EBA;&#x6635;&#x79F0;&#xFF08;&#x88AB;@&#x8005;&#xFF0C;&#x7236;&#x7EA7;&#x8BC4;&#x8BBA;&#x4EBA;&#xFF09;</td>
</tr>
<tr>
<td>PARENT_COMMENT</td>
<td>&#x7236;&#x7EA7;&#x8BC4;&#x8BBA;&#x5185;&#x5BB9;</td>
</tr>
<tr>
<td>NICK</td>
<td>&#x65B0;&#x8BC4;&#x8BBA;&#x8005;&#x6635;&#x79F0;</td>
</tr>
<tr>
<td>COMMENT</td>
<td>&#x65B0;&#x8BC4;&#x8BBA;&#x5185;&#x5BB9;</td>
</tr>
</tbody>
</table>
<p>&#x9ED8;&#x8BA4;&#x535A;&#x4E3B;&#x901A;&#x77E5;&#x90AE;&#x4EF6;&#x5185;&#x5BB9;&#x6A21;&#x677F;&#x5982;&#x4E0B;&#xFF1A;</p>
<pre><code class="language-html">&lt;div style=&quot;border-top:2px solid #12ADDB;box-shadow:0 1px 3px #AAAAAA;line-height:180%;padding:0 15px 12px;margin:50px auto;font-size:12px;&quot;&gt;&lt;h2 style=&quot;border-bottom:1px solid #DDD;font-size:14px;font-weight:normal;padding:13px 0 10px 8px;&quot;&gt;&#x60A8;&#x5728;&lt;a style=&quot;text-decoration:none;color: #12ADDB;&quot; href=&quot;${SITE_URL}&quot; target=&quot;_blank&quot;&gt;${SITE_NAME}&lt;/a&gt;&#x4E0A;&#x7684;&#x6587;&#x7AE0;&#x6709;&#x4E86;&#x65B0;&#x7684;&#x8BC4;&#x8BBA;&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;${NICK}&lt;/strong&gt;&#x56DE;&#x590D;&#x8BF4;&#xFF1A;&lt;/p&gt;&lt;div style=&quot;background-color: #f5f5f5;padding: 10px 15px;margin:18px 0;word-wrap:break-word;&quot;&gt; ${COMMENT}&lt;/div&gt;&lt;p&gt;&#x60A8;&#x53EF;&#x4EE5;&#x70B9;&#x51FB;&lt;a style=&quot;text-decoration:none; color:#12addb&quot; href=&quot;${POST_URL}&quot; target=&quot;_blank&quot;&gt;&#x67E5;&#x770B;&#x56DE;&#x590D;&#x7684;&#x5B8C;&#x6574;&#x5167;&#x5BB9;&lt;/a&gt;&lt;br&gt;&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
</code></pre>
<p>&#x535A;&#x4E3B;&#x901A;&#x77E5;&#x90AE;&#x4EF6;&#x6A21;&#x677F;&#x4E2D;&#x7684;&#x53EF;&#x7528;&#x53D8;&#x91CF;&#x4E0E;@&#x901A;&#x77E5;&#x4E2D;&#x7684;&#x57FA;&#x672C;&#x4E00;&#x81F4;&#xFF0C;<strong><code>PARENT_NICK</code> &#x548C; <code>PARENT_COMMENT</code> &#x53D8;&#x91CF;&#x4E0D;&#x518D;&#x53EF;&#x7528;&#x3002;</strong></p>
<p>&#x8FD9;&#x91CC;&#x8FD8;&#x63D0;&#x4F9B;&#x4E00;&#x4E2A;&#x5F69;&#x8679;&#x98CE;&#x683C;&#x7684;@&#x901A;&#x77E5;&#x90AE;&#x4EF6;&#x6A21;&#x677F;&#x4EE3;&#x7801;&#xFF1A;</p>
<pre><code class="language-html">&lt;div style=&quot;border-radius: 10px 10px 10px 10px;font-size:13px;    color: #555555;width: 666px;font-family:&apos;Century Gothic&apos;,&apos;Trebuchet MS&apos;,&apos;Hiragino Sans GB&apos;,&#x5FAE;&#x8F6F;&#x96C5;&#x9ED1;,&apos;Microsoft Yahei&apos;,Tahoma,Helvetica,Arial,&apos;SimSun&apos;,sans-serif;margin:50px auto;border:1px solid #eee;max-width:100%;background: #ffffff repeating-linear-gradient(-45deg,#fff,#fff 1.125rem,transparent 1.125rem,transparent 2.25rem);box-shadow: 0 1px 5px rgba(0, 0, 0, 0.15);&quot;&gt;&lt;div style=&quot;width:100%;background:#49BDAD;color:#ffffff;border-radius: 10px 10px 0 0;background-image: -moz-linear-gradient(0deg, rgb(67, 198, 184), rgb(255, 209, 244));background-image: -webkit-linear-gradient(0deg, rgb(67, 198, 184), rgb(255, 209, 244));height: 66px;&quot;&gt;&lt;p style=&quot;font-size:15px;word-break:break-all;padding: 23px 32px;margin:0;background-color: hsla(0,0%,100%,.4);border-radius: 10px 10px 0 0;&quot;&gt;&#x60A8;&#x5728;&lt;a style=&quot;text-decoration:none;color: #ffffff;&quot; href=&quot;${SITE_URL}&quot;&gt; ${SITE_NAME}&lt;/a&gt;&#x4E0A;&#x7684;&#x7559;&#x8A00;&#x6709;&#x65B0;&#x56DE;&#x590D;&#x5566;&#xFF01;&lt;/p&gt;&lt;/div&gt;&lt;div style=&quot;margin:40px auto;width:90%&quot;&gt;&lt;p&gt;${PARENT_NICK} &#x540C;&#x5B66;&#xFF0C;&#x60A8;&#x66FE;&#x5728;&#x6587;&#x7AE0;&#x4E0A;&#x53D1;&#x8868;&#x8BC4;&#x8BBA;&#xFF1A;&lt;/p&gt;&lt;div style=&quot;background: #fafafa repeating-linear-gradient(-45deg,#fff,#fff 1.125rem,transparent 1.125rem,transparent 2.25rem);box-shadow: 0 2px 5px rgba(0, 0, 0, 0.15);margin:20px 0px;padding:15px;border-radius:5px;font-size:14px;color:#555555;&quot;&gt;${PARENT_COMMENT}&lt;/div&gt;&lt;p&gt;${NICK} &#x7ED9;&#x60A8;&#x7684;&#x56DE;&#x590D;&#x5982;&#x4E0B;&#xFF1A;&lt;/p&gt;&lt;div style=&quot;background: #fafafa repeating-linear-gradient(-45deg,#fff,#fff 1.125rem,transparent 1.125rem,transparent 2.25rem);box-shadow: 0 2px 5px rgba(0, 0, 0, 0.15);margin:20px 0px;padding:15px;border-radius:5px;font-size:14px;color:#555555;&quot;&gt;${COMMENT}&lt;/div&gt;&lt;p&gt;&#x60A8;&#x53EF;&#x4EE5;&#x70B9;&#x51FB;&lt;a style=&quot;text-decoration:none; color:#12addb&quot; href=&quot;${POST_URL}#comments&quot;&gt;&#x67E5;&#x770B;&#x56DE;&#x590D;&#x7684;&#x5B8C;&#x6574;&#x5167;&#x5BB9;&lt;/a&gt;&#xFF0C;&#x6B22;&#x8FCE;&#x518D;&#x6B21;&#x5149;&#x4E34;&lt;a style=&quot;text-decoration:none; color:#12addb&quot;                href=&quot;${SITE_URL}&quot;&gt; ${SITE_NAME}&lt;/a&gt;&#x3002;&lt;/p&gt;&lt;style type=&quot;text/css&quot;&gt;a:link{text-decoration:none}a:visited{text-decoration:none}a:hover{text-decoration:none}a:active{text-decoration:none}&lt;/style&gt;&lt;/div&gt;&lt;/div&gt;
</code></pre>
<p>&#x6548;&#x679C;&#x5982;&#x56FE;&#xFF1A;</p>
<p><img src="https://cloud.panjunwen.com/2018/09/ping-mu-kuai-zhao-2018-09-15-xia-wu-5-17-21.png" alt="Valine Admin &#x914D;&#x7F6E;&#x624B;&#x518C;" loading="lazy"></p>
<h4 id>&#x5783;&#x573E;&#x8BC4;&#x8BBA;&#x68C0;&#x6D4B;</h4>
<blockquote>
<p>Akismet (Automattic Kismet)&#x662F;&#x5E94;&#x7528;&#x5E7F;&#x6CDB;&#x7684;&#x4E00;&#x4E2A;&#x5783;&#x573E;&#x7559;&#x8A00;&#x8FC7;&#x6EE4;&#x7CFB;&#x7EDF;&#xFF0C;&#x5176;&#x4F5C;&#x8005;&#x662F;&#x5927;&#x540D;&#x9F0E;&#x9F0E;&#x7684;WordPress &#x521B;&#x59CB;&#x4EBA; Matt Mullenweg&#xFF0C;Akismet&#x4E5F;&#x662F;WordPress&#x9ED8;&#x8BA4;&#x5B89;&#x88C5;&#x7684;&#x63D2;&#x4EF6;&#xFF0C;&#x5176;&#x4F7F;&#x7528;&#x975E;&#x5E38;&#x5E7F;&#x6CDB;&#xFF0C;&#x8BBE;&#x8BA1;&#x76EE;&#x6807;&#x4FBF;&#x662F;&#x5E2E;&#x52A9;&#x535A;&#x5BA2;&#x7F51;&#x7AD9;&#x6765;&#x8FC7;&#x6EE4;&#x7559;&#x8A00;Spam&#x3002;&#x6709;&#x4E86;Akismet&#x4E4B;&#x540E;&#xFF0C;&#x57FA;&#x672C;&#x4E0A;&#x4E0D;&#x7528;&#x62C5;&#x5FC3;&#x5783;&#x573E;&#x7559;&#x8A00;&#x7684;&#x70E6;&#x607C;&#x4E86;&#x3002;<br>
&#x542F;&#x7528;Akismet&#x540E;&#xFF0C;&#x5F53;&#x535A;&#x5BA2;&#x518D;&#x6536;&#x5230;&#x7559;&#x8A00;&#x4F1A;&#x81EA;&#x52A8;&#x5C06;&#x5176;&#x63D0;&#x4EA4;&#x5230;Akismet&#x5E76;&#x4E0E;Akismet&#x4E0A;&#x7684;&#x9ED1;&#x540D;&#x5355;&#x8FDB;&#x884C;&#x6BD4;&#x5BF9;&#xFF0C;&#x5982;&#x679C;&#x540D;&#x5217;&#x8BE5;&#x9ED1;&#x540D;&#x5355;&#x4E2D;&#xFF0C;&#x5219;&#x8BE5;&#x6761;&#x7559;&#x8A00;&#x4F1A;&#x88AB;&#x6807;&#x8BB0;&#x4E3A;&#x5783;&#x573E;&#x8BC4;&#x8BBA;&#x4E14;&#x4E0D;&#x4F1A;&#x53D1;&#x5E03;&#x3002;</p>
</blockquote>
<p>&#x5982;&#x679C;&#x8FD8;&#x6CA1;&#x6709;Akismet Key&#xFF0C;&#x4F60;&#x53EF;&#x4EE5;&#x53BB; <a href="https://akismet.com/development/">AKISMET FOR DEVELOPERS &#x514D;&#x8D39;&#x7533;&#x8BF7;&#x4E00;&#x4E2A;</a>&#xFF1B;<br>
<strong>&#x5F53;AKISMET_KEY&#x8BBE;&#x4E3A;MANUAL_REVIEW&#x65F6;&#xFF0C;&#x5F00;&#x542F;&#x4EBA;&#x5DE5;&#x5BA1;&#x6838;&#x6A21;&#x5F0F;&#xFF1B;</strong><br>
&#x5982;&#x679C;&#x4F60;&#x4E0D;&#x9700;&#x8981;&#x53CD;&#x5783;&#x573E;&#x8BC4;&#x8BBA;&#xFF0C;Akismet Key &#x73AF;&#x5883;&#x53D8;&#x91CF;&#x53EF;&#x4EE5;&#x5FFD;&#x7565;&#x3002;</p>
<p><strong>&#x4E3A;&#x4E86;&#x5B9E;&#x73B0;&#x8F83;&#x4E3A;&#x7CBE;&#x51C6;&#x7684;&#x5783;&#x573E;&#x8BC4;&#x8BBA;&#x8BC6;&#x522B;&#xFF0C;&#x91C7;&#x96C6;&#x7684;&#x5224;&#x636E;&#x9664;&#x4E86;&#x8BC4;&#x8BBA;&#x5185;&#x5BB9;&#x3001;&#x90AE;&#x4EF6;&#x5730;&#x5740;&#x548C;&#x7F51;&#x7AD9;&#x5730;&#x5740;&#x5916;&#xFF0C;&#x8FD8;&#x5305;&#x62EC;&#x8BC4;&#x8BBA;&#x8005;&#x7684;IP&#x5730;&#x5740;&#x3001;&#x6D4F;&#x89C8;&#x5668;&#x4FE1;&#x606F;&#x7B49;&#xFF0C;&#x4F46;&#x4EC5;&#x5728;&#x4E91;&#x5F15;&#x64CE;&#x540E;&#x53F0;&#x4F7F;&#x7528;&#x8FD9;&#x4E9B;&#x6570;&#x636E;&#xFF0C;&#x786E;&#x4FDD;&#x9690;&#x79C1;&#x548C;&#x5B89;&#x5168;&#x3002;</strong></p>
<p><strong>&#x5982;&#x679C;&#x4F7F;&#x7528;&#x4E86;&#x672C;&#x7AD9;&#x6700;&#x65B0;&#x7684;Valine&#x548C;Valine Admin&#xFF0C;&#x5E76;&#x8BBE;&#x7F6E;&#x4E86;Akismet Key&#xFF0C;&#x53EF;&#x4EE5;&#x6709;&#x6548;&#x5730;&#x62E6;&#x622A;&#x5783;&#x573E;&#x8BC4;&#x8BBA;&#x3002;&#x88AB;&#x6807;&#x4E3A;&#x5783;&#x573E;&#x7684;&#x8BC4;&#x8BBA;&#x53EF;&#x4EE5;&#x5728;&#x7BA1;&#x7406;&#x9875;&#x9762;&#x53D6;&#x6D88;&#x6807;&#x6CE8;&#x3002;</strong></p>
<table>
<thead>
<tr>
<th>&#x73AF;&#x5883;&#x53D8;&#x91CF;</th>
<th>&#x793A;&#x4F8B;</th>
<th>&#x8BF4;&#x660E;</th>
</tr>
</thead>
<tbody>
<tr>
<td>AKISMET_KEY</td>
<td>xxxxxxxxxxxx</td>
<td>[&#x53EF;&#x9009;]Akismet Key &#x7528;&#x4E8E;&#x5783;&#x573E;&#x8BC4;&#x8BBA;&#x68C0;&#x6D4B;</td>
</tr>
</tbody>
</table>
<h4 id>&#x624B;&#x52A8;&#x914D;&#x7F6E;&#x90AE;&#x4EF6;&#x670D;&#x52A1;&#x5668;</h4>
<ul>
<li>&#x81EA;&#x5B9A;&#x4E49;&#x90AE;&#x4EF6;&#x670D;&#x52A1;&#x5668;&#x5730;&#x5740;&#x548C;&#x7AEF;&#x53E3;&#x4FE1;&#x606F;&#xFF0C;&#x5220;&#x9664;SMTP_SERVICE&#x73AF;&#x5883;&#x53D8;&#x91CF;&#xFF0C;&#x65B0;&#x589E;&#x4EE5;&#x4E0B;&#x53D8;&#x91CF;&#xFF1A;</li>
</ul>
<table>
<thead>
<tr>
<th>&#x53D8;&#x91CF;</th>
<th>&#x793A;&#x4F8B;</th>
<th>&#x8BF4;&#x660E;</th>
</tr>
</thead>
<tbody>
<tr>
<td>SMTP_HOST</td>
<td>smtp.qq.com</td>
<td>[&#x53EF;&#x9009;]SMTP_SERVICE&#x7559;&#x7A7A;&#x65F6;&#xFF0C;&#x81EA;&#x5B9A;&#x4E49;SMTP&#x670D;&#x52A1;&#x5668;&#x5730;&#x5740;</td>
</tr>
<tr>
<td>SMTP_PORT</td>
<td>465</td>
<td>[&#x53EF;&#x9009;]SMTP_SERVICE&#x7559;&#x7A7A;&#x65F6;&#xFF0C;&#x81EA;&#x5B9A;&#x4E49;SMTP&#x7AEF;&#x53E3;</td>
</tr>
<tr>
<td>SMTP_SECURE</td>
<td>true</td>
<td>[&#x53EF;&#x9009;]&#x4F7F;&#x7528;TLS</td>
</tr>
</tbody>
</table>
<h3 id="troubleshooting">Troubleshooting</h3>
<ul>
<li>&#x90E8;&#x7F72;&#x5931;&#x8D25;&#xFF0C;&#x8BF7;&#x5728;&#x8BC4;&#x8BBA;&#x4E2D;&#x9644;&#x56FE;&#xFF0C;&#x6216;&#x53BB;Github&#x53D1;&#x8D77;Issue</li>
<li>&#x90AE;&#x4EF6;&#x53D1;&#x9001;&#x5931;&#x8D25;&#xFF0C;&#x786E;&#x4FDD;&#x73AF;&#x5883;&#x53D8;&#x91CF;&#x90FD;&#x6CA1;&#x95EE;&#x9898;&#x540E;&#xFF0C;&#x91CD;&#x542F;&#x4E91;&#x5F15;&#x64CE;<br>
<img src="https://cloud.panjunwen.com/2018/09/ping-mu-kuai-zhao-2018-09-15-xia-wu-5-22-56.png" alt="Valine Admin &#x914D;&#x7F6E;&#x624B;&#x518C;" loading="lazy"></li>
<li>&#x535A;&#x4E3B;&#x901A;&#x77E5;&#x6A21;&#x677F;&#x4E2D;&#x4E0D;&#x8981;&#x51FA;&#x73B0;<code>PARENT*</code>&#x76F8;&#x5173;&#x53C2;&#x6570;&#xFF0C;&#x6CE8;&#x610F;&#x533A;&#x5206;MAIL_TEMPLATE&#x548C;MAIL_TEMPLATE_ADMIN</li>
<li>&#x70B9;&#x51FB;&#x90AE;&#x4EF6;&#x4E2D;&#x7684;&#x94FE;&#x63A5;&#x8DF3;&#x8F6C;&#x81F3;&#x76F8;&#x5E94;&#x8BC4;&#x8BBA;&#xFF0C;&#x8FD9;&#x4E00;&#x7EC6;&#x8282;&#x5B9E;&#x73B0;&#x9700;&#x8981;&#x5728;Web&#x524D;&#x7AEF;&#x6DFB;&#x52A0;&#x4E00;&#x70B9;&#x989D;&#x5916;&#x7684;&#x4EE3;&#x7801;&#xFF1A;</li>
</ul>
<pre><code class="language-javascript">&lt;script&gt;
    if(window.location.hash){
        var checkExist = setInterval(function() {
           if ($(window.location.hash).length) {
              $(&apos;html, body&apos;).animate({scrollTop: $(window.location.hash).offset().top-90}, 1000);
              clearInterval(checkExist);
           }
        }, 100);
    }
&lt;/script&gt;
</code></pre>
<ul>
<li>&#x5EFA;&#x8BAE;&#x53C2;&#x8003;&#x7684;&#x5176;&#x4ED6;&#x6559;&#x7A0B;&#xFF1A;<a href="https://spoience.com/valine-admin.html">Valine Admin&#x98DF;&#x7528;&#x6307;&#x5357;</a>&#xFF0C;<a href="https://crosschannel.cc/daily/valine-admin-autoAwaken.html">&#x89E3;&#x51B3;valine-admin&#x4E91;&#x5F15;&#x64CE;&#x5524;&#x9192;&#x5931;&#x8D25;</a> &#x7B49;&#xFF0C;&#x7279;&#x522B;&#x611F;&#x8C22;track13&#xFF0C;Spoience&#xFF0C;&#x4EE5;&#x53CA;&#x5728;Github&#x548C;&#x8BC4;&#x8BBA;&#x533A;&#x8BA8;&#x8BBA;&#x7684;&#x5404;&#x4F4D;&#x540C;&#x5B66;&#x3002;</li>
</ul>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[macOS Handoff失效解决方法]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>macOS&#x548C;iOS&#x95F4;&#x7684;&#x63A5;&#x529B;&#x529F;&#x80FD;&#x975E;&#x5E38;&#x597D;&#x7528;&#xFF0C;&#x6700;&#x8FD1;&#x53D1;&#x73B0;&#x5B83;&#x65F6;&#x5E38;&#x5931;&#x6548;&#xFF0C;&#x6BCF;&#x6B21;&#x90FD;&#x5F97;&#x5173;&#x95ED;&#x84DD;&#x7259;&#x91CD;&#x65B0;&#x5F00;&#x542F;&#xFF0C;&#x77ED;&#x6682;&#x7684;&#x6B63;&#x5E38;&#x540E;&#x8FD8;&#x662F;&#x4F1A;&#x5931;&#x6548;&#xFF0C;&#x540C;</p>]]></description><link>https://deserts.io/handoff-bluetooth-fix/</link><guid isPermaLink="false">62938184d119ff1b94794cde</guid><category><![CDATA[macOS]]></category><dc:creator><![CDATA[Junwen]]></dc:creator><pubDate>Fri, 11 Sep 2020 01:04:33 GMT</pubDate><media:content url="https://cloud.panjunwen.com/deserts.io/2020/09/photo-1517059224940-d4af9eec41b7.jpeg" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><img src="https://cloud.panjunwen.com/deserts.io/2020/09/photo-1517059224940-d4af9eec41b7.jpeg" alt="macOS Handoff&#x5931;&#x6548;&#x89E3;&#x51B3;&#x65B9;&#x6CD5;"><p>macOS&#x548C;iOS&#x95F4;&#x7684;&#x63A5;&#x529B;&#x529F;&#x80FD;&#x975E;&#x5E38;&#x597D;&#x7528;&#xFF0C;&#x6700;&#x8FD1;&#x53D1;&#x73B0;&#x5B83;&#x65F6;&#x5E38;&#x5931;&#x6548;&#xFF0C;&#x6BCF;&#x6B21;&#x90FD;&#x5F97;&#x5173;&#x95ED;&#x84DD;&#x7259;&#x91CD;&#x65B0;&#x5F00;&#x542F;&#xFF0C;&#x77ED;&#x6682;&#x7684;&#x6B63;&#x5E38;&#x540E;&#x8FD8;&#x662F;&#x4F1A;&#x5931;&#x6548;&#xFF0C;&#x540C;&#x65F6;&#x84DD;&#x7259;&#x9F20;&#x6807;&#x4E5F;&#x4F1A;&#x5728;&#x4F11;&#x7720;&#x5524;&#x9192;&#x540E;&#x5931;&#x6548;&#x3002;&#x5C1D;&#x8BD5;&#x8FC7;&#x5404;&#x79CD;&#x65B9;&#x6848;&#x540E;&#xFF0C;&#x53D1;&#x73B0;&#x771F;&#x6B63;&#x6709;&#x6548;&#x7684;&#x8FD8;&#x662F;&#x89E3;&#x51B3;&#x84DD;&#x7259;&#x95EE;&#x9898;&#x3002;</p>
<ul>
<li>&#x5728;&#x83DC;&#x5355;&#x680F;&#x4E2D;&#x663E;&#x793A;&#x84DD;&#x7259;&#x56FE;&#x6807;</li>
<li>&#x6309;&#x4F4F;option+shift&#x540C;&#x65F6;&#x70B9;&#x51FB;&#x84DD;&#x7259;&#x56FE;&#x6807;-&#x8C03;&#x8BD5;-&#x79FB;&#x9664;&#x6240;&#x6709;&#x8BBE;&#x5907;&#xFF0C;&#x8FD8;&#x539F;&#x84DD;&#x7259;&#x6A21;&#x5757;</li>
<li>&#x91CD;&#x65B0;&#x8FDE;&#x63A5;&#x84DD;&#x7259;&#x8BBE;&#x5907;&#x540E;&#x6B63;&#x5E38;&#xFF08;&#x65E0;&#x9700;&#x5355;&#x72EC;&#x8FDE;&#x63A5;iPhone&#x548C;  Watch&#x7B49;&#x901A;&#x8FC7;iCloud&#x5171;&#x4EAB;&#x7684;&#x84DD;&#x7259;&#x8BBE;&#x5907;&#xFF09;</li>
</ul>
<p>&#x6B64;&#x5916;&#xFF0C;&#x5728;&#x8BBE;&#x7F6E;-&#x5B89;&#x5168;&#x548C;&#x9690;&#x79C1;&#x4E2D;&#xFF0C;&#x53D6;&#x6D88;&#x52FE;&#x9009;&#x201C;&#x4F7F;&#x7528;&#x60A8;&#x7684; Watch&#x89E3;&#x9501;App&#x548C;Mac&#x201D;&#xFF0C;&#x518D;&#x6B21;&#x52FE;&#x9009;&#xFF0C;&#x5C31;&#x4F1A;&#x53D1;&#x73B0;Apple Watch&#x89E3;&#x9501;&#x529F;&#x80FD;&#x4E5F;&#x590D;&#x6D3B;&#x4E86;&#x3002;</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[炼丹工具之Web端GPU信息整合]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>&#x5B9E;&#x9A8C;&#x5BA4;&#x6709;&#x6570;&#x5341;&#x53F0;GPU&#x670D;&#x52A1;&#x5668;&#x4EE5;&#x53CA;&#x8FD1;30&#x4EBA;&#x7684;&#x4F7F;&#x7528;&#x8FD9;&#x4E9B;&#x673A;&#x5668;&#xFF0C;&#x800C;&#x4E14;&#x6709;&#x4E9B;&#x673A;&#x5668;&#x7684;IP&#x4F1A;&#x7ECF;&#x5E38;&#x53D8;&#x5316;&#x3002;&#x4E00;&#x4E2A;&#x7B80;&#x5355;&#x7684;&#x9700;&#x6C42;&#x662F;&#xFF1A;&#x5982;&#x4F55;&#x5FEB;</p>]]></description><link>https://deserts.io/nvidia-smi/</link><guid isPermaLink="false">62938184d119ff1b94794ce8</guid><category><![CDATA[折腾]]></category><dc:creator><![CDATA[Junwen]]></dc:creator><pubDate>Fri, 17 Jul 2020 01:56:31 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1495592822108-9e6261896da8?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=MnwxMTc3M3wwfDF8c2VhcmNofDF8fGRlZXAlMjBsZWFybmluZ3xlbnwwfHx8fDE2NTM4Mzc2ODc&amp;ixlib=rb-1.2.1&amp;q=80&amp;w=2000" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><img src="https://images.unsplash.com/photo-1495592822108-9e6261896da8?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=MnwxMTc3M3wwfDF8c2VhcmNofDF8fGRlZXAlMjBsZWFybmluZ3xlbnwwfHx8fDE2NTM4Mzc2ODc&amp;ixlib=rb-1.2.1&amp;q=80&amp;w=2000" alt="&#x70BC;&#x4E39;&#x5DE5;&#x5177;&#x4E4B;Web&#x7AEF;GPU&#x4FE1;&#x606F;&#x6574;&#x5408;"><p>&#x5B9E;&#x9A8C;&#x5BA4;&#x6709;&#x6570;&#x5341;&#x53F0;GPU&#x670D;&#x52A1;&#x5668;&#x4EE5;&#x53CA;&#x8FD1;30&#x4EBA;&#x7684;&#x4F7F;&#x7528;&#x8FD9;&#x4E9B;&#x673A;&#x5668;&#xFF0C;&#x800C;&#x4E14;&#x6709;&#x4E9B;&#x673A;&#x5668;&#x7684;IP&#x4F1A;&#x7ECF;&#x5E38;&#x53D8;&#x5316;&#x3002;&#x4E00;&#x4E2A;&#x7B80;&#x5355;&#x7684;&#x9700;&#x6C42;&#x662F;&#xFF1A;&#x5982;&#x4F55;&#x5FEB;&#x901F;&#x5730;&#x83B7;&#x77E5;&#x673A;&#x5668;&#x7684;IP&#x5730;&#x5740;&#x4EE5;&#x53CA;GPU&#x7684;&#x8FD0;&#x884C;&#x72B6;&#x6001;&#xFF1F;</p>
<p>&#x901A;&#x5E38;&#x6211;&#x4EEC;&#x4F1A;&#x5728;shell&#x4E2D;&#x6267;&#x884C;nvidia-smi&#x6765;&#x67E5;&#x770B;&#x673A;&#x5668;&#x7684;GPU&#x4F7F;&#x7528;&#x72B6;&#x6001;&#xFF0C;&#x5F53;&#x673A;&#x5668;&#x6570;&#x91CF;&#x592A;&#x591A;&#x65F6;&#x53D8;&#x5F97;&#x5F02;&#x5E38;&#x9EBB;&#x70E6;&#x3002;&#x7B14;&#x8005;&#x5229;&#x7528;LeanCloud&#x6570;&#x636E;&#x5E93;&#x7B80;&#x5355;&#x5B9E;&#x73B0;&#x4E86;&#x4E00;&#x5957;&#x5DE5;&#x5177;&#xFF0C;&#x5C06;&#x6240;&#x6709;&#x673A;&#x5668;&#x7684;&#x4FE1;&#x606F;&#x6C47;&#x805A;&#x5728;Web&#x9875;&#x9762;&#x6765;&#x663E;&#x793A;&#x3002;</p>
<p>&#x5229;&#x7528;LeanCloud&#x505A;&#x6570;&#x636E;&#x5E93;&#xFF0C;&#x8BBE;&#x8BA1;&#x4E86;&#x4E00;&#x4E2A;&#x7B80;&#x5355;&#x7684;GPU&#x8FD0;&#x884C;&#x72B6;&#x6001;&#x4FE1;&#x606F;&#x7684;Hub&#x3002;&#x6BCF;&#x53F0;&#x673A;&#x5668;&#x5B9A;&#x65F6;&#x5C06;GPU&#x4FE1;&#x606F;&#x53D1;&#x9001;&#x5230;LeanCloud&#x6570;&#x636E;&#x5E93;&#xFF0C;&#x7136;&#x540E;&#x7528;&#x4E00;&#x4E2A;&#x524D;&#x7AEF;&#x9875;&#x9762;&#x5C06;GPU&#x4FE1;&#x606F;&#x5C55;&#x793A;&#x51FA;&#x6765;&#x3002;</p>
<h2 id>&#x670D;&#x52A1;&#x5668;&#x4FE1;&#x606F;&#x540C;&#x6B65;</h2>
<p>&#x5728;&#x6240;&#x6709;&#x670D;&#x52A1;&#x5668;&#x4E0A;&#x5B9A;&#x65F6;&#x8FD0;&#x884C;&#x8BE5;Python&#x811A;&#x672C;&#xFF0C;&#x5373;&#x53EF;&#x5C06;&#x4FE1;&#x606F;&#x540C;&#x6B65;&#x5230;LeanCloud&#x6570;&#x636E;&#x5E93;&#x3002;</p>
<script src="https://gist.github.com/DesertsP/78631f2094a0b4d386d4906bdabdb3fb.js"></script>
<style>.gist{width: 100% !important}</style>
<h2 id="gpuhub">GPU Hub</h2>
<p>&#x8BBF;&#x95EE;<a href="https://nvidia-smi.github.io/signin.html">https://nvidia-smi.github.io/signin.html</a>&#x83B7;&#x53D6; GPU&#x4FE1;&#x606F;&#xFF0C;&#x4F7F;&#x7528;&#x4F60;&#x7684;LeanCloud&#x7684;AppID&#x548C;AppKey&#x4F5C;&#x4E3A;&#x8BA4;&#x8BC1;&#x4FE1;&#x606F;&#x3002;&#x5982;&#x4E0B;&#x56FE;</p>
<p><img src="https://cloud.panjunwen.com/deserts.io/2020/07/nvi.png" alt="&#x70BC;&#x4E39;&#x5DE5;&#x5177;&#x4E4B;Web&#x7AEF;GPU&#x4FE1;&#x606F;&#x6574;&#x5408;" loading="lazy"></p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[利用LXD容器构建共享的GPU服务器]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>&#x591A;&#x4EBA;&#x5171;&#x4EAB;&#x7684;GPU&#x670D;&#x52A1;&#x5668;&#x6700;&#x5927;&#x7684;&#x75DB;&#x70B9;&#x5728;&#x4E8E;&#xFF0C;&#x6BCF;&#x4E2A;&#x4EBA;&#x90FD;&#x5E0C;&#x671B;&#x62E5;&#x6709;root&#x6743;&#x9650;&#x5E76;&#x4E14;&#x8FC7;&#x5EA6;&#x81EA;&#x4FE1;&#x3002;</p>
<p>&#x7B14;&#x8005;&#x63A5;&#x624B;&#x5B9E;&#x9A8C;&#x5BA4;&#x7684;&#x670D;&#x52A1;&#x5668;&#x7BA1;&#x7406;&#x4EE5;&#x6765;</p>]]></description><link>https://deserts.io/lxd-gpu-server/</link><guid isPermaLink="false">62938184d119ff1b94794ce2</guid><category><![CDATA[折腾]]></category><category><![CDATA[Python]]></category><dc:creator><![CDATA[Junwen]]></dc:creator><pubDate>Fri, 17 Jul 2020 01:22:12 GMT</pubDate><media:content url="https://cloud.panjunwen.com/deserts.io/2020/07/photo-1591488320449-011701bb6704.jpeg" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><img src="https://cloud.panjunwen.com/deserts.io/2020/07/photo-1591488320449-011701bb6704.jpeg" alt="&#x5229;&#x7528;LXD&#x5BB9;&#x5668;&#x6784;&#x5EFA;&#x5171;&#x4EAB;&#x7684;GPU&#x670D;&#x52A1;&#x5668;"><p>&#x591A;&#x4EBA;&#x5171;&#x4EAB;&#x7684;GPU&#x670D;&#x52A1;&#x5668;&#x6700;&#x5927;&#x7684;&#x75DB;&#x70B9;&#x5728;&#x4E8E;&#xFF0C;&#x6BCF;&#x4E2A;&#x4EBA;&#x90FD;&#x5E0C;&#x671B;&#x62E5;&#x6709;root&#x6743;&#x9650;&#x5E76;&#x4E14;&#x8FC7;&#x5EA6;&#x81EA;&#x4FE1;&#x3002;</p>
<p>&#x7B14;&#x8005;&#x63A5;&#x624B;&#x5B9E;&#x9A8C;&#x5BA4;&#x7684;&#x670D;&#x52A1;&#x5668;&#x7BA1;&#x7406;&#x4EE5;&#x6765;&#xFF0C;&#x5C1D;&#x8BD5;LXD&#x5BB9;&#x5668;&#x4F5C;&#x4E3A;&#x865A;&#x62DF;&#x5316;&#x65B9;&#x6848;&#x81F3;&#x4ECA;&#x5DF2;&#x6709;&#x4E00;&#x5E74;&#x591A;&#x3002;&#x673A;&#x5668;&#x591A;&#x4E3A;4&#x5361;TitanXP&#x6216;4&#x5361;2080Ti&#xFF0C;&#x8FD1;30&#x4E2A;&#x4EBA;&#x5171;&#x4EAB;&#x4F7F;&#x7528;&#x3002;&#x603B;&#x4F53;&#x4E0A;&#xFF0C;LXD&#x865A;&#x62DF;&#x5316;&#x65B9;&#x6848;&#x8FD0;&#x884C;&#x7A33;&#x5B9A;&#xFF0C;&#x4F7F;&#x7528;&#x65B9;&#x4FBF;&#xFF0C;&#x914D;&#x5408;&#x4E00;&#x7CFB;&#x5217;&#x811A;&#x672C;&#xFF0C;&#x80FD;&#x591F;&#x6781;&#x5927;&#x7684;&#x89E3;&#x653E;&#x7BA1;&#x7406;&#x5458;&#xFF0C;&#x964D;&#x4F4E;&#x5DE5;&#x4F5C;&#x91CF;&#x3002;</p>
<p>Google&#x641C;&#x7D22;LXD+GPU&#x80FD;&#x591F;&#x627E;&#x5230;&#x5927;&#x91CF;&#x7684;&#x4E2D;&#x82F1;&#x6587;&#x8D44;&#x6599;&#xFF0C;&#x56E0;&#x6B64;&#x672C;&#x6587;&#x53EA;&#x4F1A;&#x7B80;&#x8FF0;&#x5B89;&#x88C5;&#x548C;&#x914D;&#x7F6E;&#x8FC7;&#x7A0B;&#xFF0C;&#x7740;&#x91CD;&#x5206;&#x4EAB;&#x4E0D;&#x540C;&#x73AF;&#x5883;&#x4E0B;&#x7684;&#x6311;&#x6218;&#x548C;&#x89E3;&#x51B3;&#x65B9;&#x6848;&#x3002;</p>
<p>&#x7B14;&#x8005;&#x4E5F;&#x5C06;&#x8BF4;&#x660E;&#x6587;&#x6863;&#x5171;&#x4EAB;&#x51FA;&#x6765;&#xFF0C;&#x4F9B;&#x5927;&#x5BB6;&#x53C2;&#x8003;&#x4F7F;&#x7528;&#xFF1A;<a href="https://deserts.gitbook.io/gpu/manual">https://deserts.gitbook.io/gpu/manual</a></p>
<h2 id>&#x5B89;&#x88C5;&#x914D;&#x7F6E;</h2>
<h3 id>&#x5BBF;&#x4E3B;&#x673A;&#x9A71;&#x52A8;&#x914D;&#x7F6E;</h3>
<p>&#x7B14;&#x8005;&#x4E60;&#x60EF;&#x4F7F;&#x7528;Ubuntu&#x670D;&#x52A1;&#x5668;&#x7248;&#x7CFB;&#x7EDF;&#x3002;&#x9996;&#x5148;&#x5B89;&#x88C5;&#x82F1;&#x4F1F;&#x8FBE;&#x663E;&#x5361;&#x9A71;&#x52A8;&#xFF0C;CUDA&#x5728;&#x5BBF;&#x4E3B;&#x673A;&#x4E0A;&#x5E76;&#x975E;&#x5FC5;&#x8981;&#x3002;</p>
<pre><code class="language-bash">apt install git gcc g++ make cmake build-essential curl -y
apt-get remove --purge nvidia* -y

#&#x628A; nouveau &#x9A71;&#x52A8;&#x52A0;&#x5165;&#x9ED1;&#x540D;&#x5355;&#x5E76;&#x7981;&#x7528;&#x7528; nouveau &#x5185;&#x6838;&#x6A21;&#x5757;
# &#x5728;&#x6587;&#x4EF6; blacklist-nouveau.conf &#x4E2D;&#x52A0;&#x5165;&#x5982;&#x4E0B;&#x5185;&#x5BB9;
echo &quot;blacklist nouveau&quot; &gt;&gt; /etc/modprobe.d/blacklist-nouveau.conf
echo &quot;options nouveau modeset=0&quot; &gt;&gt; /etc/modprobe.d/blacklist-nouveau.conf

# &#x4FDD;&#x5B58;&#x9000;&#x51FA;&#xFF0C;&#x6267;&#x884C;
update-initramfs -u
</code></pre>
<pre><code class="language-bash">#&#x7ED9;&#x9A71;&#x52A8;run&#x6587;&#x4EF6;&#x8D4B;&#x4E88;&#x6267;&#x884C;&#x6743;&#x9650;&#xFF1A;
sudo chmod +x NVIDIA-Linux-x86_64-&lt;&#x7248;&#x672C;&gt;.run
#&#x540E;&#x9762;&#x7684;&#x53C2;&#x6570;&#x975E;&#x5E38;&#x91CD;&#x8981;&#xFF0C;&#x4E0D;&#x53EF;&#x7701;&#x7565;&#xFF1A;
sudo ./NVIDIA-Linux-x86_64-&lt;&#x7248;&#x672C;&gt;.run --no-opengl-files
</code></pre>
<p>&#x5B89;&#x88C5;nvidia-container-runtime&#xFF0C;&#x8FD9;&#x6837;&#x5728;&#x5BB9;&#x5668;&#x4E2D;&#x53EF;&#x4EE5;&#x76F4;&#x63A5;&#x8C03;&#x7528;&#x5BBF;&#x4E3B;&#x673A;&#x7684;&#x663E;&#x5361;&#x9A71;&#x52A8;&#x3002;</p>
<pre><code class="language-bash"># Add the package repositories
curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | apt-key add -

distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | tee /etc/apt/sources.list.d/nvidia-docker.list
apt-get update

apt install libnvidia-container-dev libnvidia-container-tools nvidia-container-runtime -y
</code></pre>
<h3 id="lxd">&#x5BBF;&#x4E3B;&#x673A;LXD&#x914D;&#x7F6E;</h3>
<p>&#x5B89;&#x88C5;ZFS&#x5E76;&#x914D;&#x7F6E;&#xFF0C;&#x4F7F;&#x7528;ZFS&#x4F5C;&#x4E3A;LXD&#x7684;&#x5B58;&#x50A8;&#x7BA1;&#x7406;&#x5DE5;&#x5177;&#x3002;ZFS&#x6587;&#x4EF6;&#x7CFB;&#x7EDF;&#x5F00;&#x542F;&#x53BB;&#x91CD;&#x3002;</p>
<pre><code class="language-bash">apt install zfsutils-linux

zpool create tank /dev/sda
zfs create tank/lxd
zfs set dedup=on tank/lxd
</code></pre>
<p>&#x5B89;&#x88C5;LXD</p>
<pre><code class="language-bash">snap install lxd
</code></pre>
<p>&#x6362;&#x6E90;&#x548C;&#x62C9;&#x53D6;&#x955C;&#x50CF;</p>
<pre><code class="language-bash">lxc remote add tuna-images https://mirrors.tuna.tsinghua.edu.cn/lxc-images/ --protocol=simplestreams --public
lxc image copy tuna-images:ubuntu/18.04 local: --alias ubuntu/18.04 --copy-aliases --public
</code></pre>
<p>&#x521D;&#x59CB;&#x5316;LXD&#xFF0C;&#x6CE8;&#x610F;ZFS pool&#x4F7F;&#x7528;&#x4E0A;&#x9762;&#x521B;&#x5EFA;&#x7684;&#xFF0C;&#x662F;&#x5426;&#x4F7F;&#x7528;&#x7F51;&#x6865;&#x89C6;&#x60C5;&#x51B5;&#x800C;&#x5B9A;&#x3002;</p>
<pre><code class="language-bash">lxd init
</code></pre>
<pre><code>Would you like to use LXD clustering? (yes/no) [default=no]:
Do you want to configure a new storage pool? (yes/no) [default=yes]:
Name of the new storage pool [default=default]: 
Name of the storage backend to use (btrfs, ceph, dir, lvm, zfs) [default=zfs]:
Create a new ZFS pool? (yes/no) [default=yes]:
Would you like to use an existing block device? (yes/no) [default=no]:
Size in GB of the new loop device (1GB minimum) [default=100GB]: 
Would you like to connect to a MAAS server? (yes/no) [default=no]:
Would you like to create a new local network bridge? (yes/no) [default=yes]: no
Would you like to configure LXD to use an existing bridge or host interface? (yes/no) [default=no]: yes
Name of the existing bridge or host interface: br0
Would you like LXD to be available over the network? (yes/no) [default=no]:
Would you like stale cached images to be updated automatically? (yes/no) [default=yes]
Would you like a YAML &quot;lxd init&quot; preseed to be printed? (yes/no) [default=no]:
</code></pre>
<pre><code class="language-bash">lxc profile set default nvidia.runtime true
lxc profile device add default gpu gpu
</code></pre>
<p>&#x521B;&#x5EFA;&#x6A21;&#x677F;&#x5BB9;&#x5668;</p>
<pre><code class="language-bash">lxc init ubuntu/18.04 template -p default
lxc start template
</code></pre>
<p>&#x8FDB;&#x5165;&#x6A21;&#x677F;&#x5BB9;&#x5668;&#x5185;&#x5B89;&#x88C5;&#x5FC5;&#x8981;&#x7684;&#x8F6F;&#x4EF6;&#xFF0C;&#x5982;conda&#x7B49;</p>
<pre><code>lxc exec template bash
</code></pre>
<p>&#x5B8C;&#x6210;&#x540E;&#xFF0C;&#x53D1;&#x5E03;&#x5C06;&#x6A21;&#x677F;&#x5BB9;&#x5668;&#x53D1;&#x5E03;&#x4E3A;&#x6A21;&#x677F;&#x955C;&#x50CF;&#xFF0C;&#x5220;&#x9664;&#x6A21;&#x677F;&#x5BB9;&#x5668;</p>
<pre><code class="language-bash">sudo lxc stop template
sudo lxc publish template --alias template --public
sudo lxc rm template
</code></pre>
<h2 id>&#x81EA;&#x52A8;&#x5316;&#x811A;&#x672C;</h2>
<p>&#x5229;&#x7528;&#x7B14;&#x8005;&#x63D0;&#x4F9B;&#x7684;shell&#x811A;&#x672C;&#xFF0C;&#x5373;&#x53EF;&#x5B9E;&#x73B0;&#x7528;&#x6237;&#x521B;&#x5EFA;&#x65F6;&#x81EA;&#x52A8;&#x521B;&#x5EFA;&#x5BB9;&#x5668;&#x3002;&#x4F7F;&#x7528;add_user.sh&#x65B0;&#x5EFA;&#x7528;&#x6237;&#x53CA;&#x5BB9;&#x5668;&#xFF0C;&#x7528;&#x6237;&#x767B;&#x5F55;&#x5BBF;&#x4E3B;&#x673A;&#x540E;&#x6267;&#x884C;login.sh&#x3002;</p>
<p>&#x65B0;&#x5EFA;&#x7528;&#x6237;&#xFF1A;</p>
<pre><code class="language-bash">ssh addu@172.26.xxx.xxx
# &#x5BC6;&#x7801;
addu@172.26.xxx.xxx&apos;s password:
=====Welcome!
We need to get sudo permission first. Enter the password for `addu`.
# &#x8F93;&#x5165;addu&#x7684;&#x5BC6;&#x7801;&#xFF0C;&#x83B7;&#x53D6;sudo&#x6743;&#x9650;
[sudo] password for addu:
=====Let&apos;s setup a new account and create a container now.
# &#x8F93;&#x5165;&#x7528;&#x6237;&#x540D;&#xFF0C;&#x63A5;&#x4E0B;&#x6765;&#x81EA;&#x52A8;&#x521B;&#x5EFA;&#x7528;&#x6237;&#x5E76;&#x65B0;&#x5EFA;&#x865A;&#x62DF;&#x673A;
Enter your username: test
Creating user...
Allocating container for test...
Creating test
Allocating ssh port... 10020
Device sshproxy added to test
# &#x8BBE;&#x7F6E;&#x7528;&#x6237;&#x5BC6;&#x7801;
set password for test now (host only).
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully
Login this host via `ssh &lt;username&gt;@&lt;host-ip&gt;` to manage your container.
Done!
</code></pre>
<p>&#x7528;&#x6237;&#x767B;&#x5F55;&#xFF1A;</p>
<pre><code class="language-bash"># &#x4F7F;&#x7528;&#x65B0;&#x5EFA;&#x7684;&#x7528;&#x6237;&#x767B;&#x9646;&#x5E76;&#x7BA1;&#x7406;&#x865A;&#x62DF;&#x673A;
ssh test@172.26.xxx.xxx
test@172.26.xxx.xxx&apos;s password:
Welcome to Ubuntu 18.04.2 LTS (GNU/Linux 4.15.0-54-generic x86_64)
&#x2026;&#x2026;
 Hi, test
 You&apos;re using the GPU Server in Vision Group.

==========About your container:
Your container is not running.
Transfer data to your container using scp or sftp;
File sharing is encouraged, access datasets at shared/datasets, access download files at shared/downloads, etc

See GPU load: nvidia-smi.
    memory usage: free -h.
    disk usage: df -h.

===== main menu  =====
[1] start your container  # &#x5F00;&#x673A;
[2] enter your container  # &#x5207;&#x6362;&#x81F3;&#x865A;&#x62DF;&#x673A;
[3] stop your container   # &#x5173;&#x673A;&#xFF08;&#x4E5F;&#x53EF;&#x4EE5;&#x76F4;&#x63A5;&#x5728;&#x865A;&#x62DF;&#x673A;&#x4E2D;&#x6267;&#x884C;shutdown now&#xFF09;
[4] change your password  # &#x66F4;&#x6539;&#x5BC6;&#x7801;&#xFF08;&#x5982;&#x679C;&#x9700;&#x8981;&#x6539;&#x865A;&#x62DF;&#x673A;&#x5BC6;&#x7801;&#xFF0C;&#x8FDB;&#x5165;&#x865A;&#x62DF;&#x673A;&#x540E;&#x6267;&#x884C;passwd&#xFF09;
[5] allocate ports        # &#x8FDB;&#x884C;&#x7AEF;&#x53E3;&#x6620;&#x5C04;
[6] release ports         # &#x91CA;&#x653E;&#x7533;&#x8BF7;&#x7684;&#x7AEF;&#x53E3;
[0] show info             # &#x663E;&#x793A;&#x865A;&#x62DF;&#x673A;&#x8FD0;&#x884C;&#x72B6;&#x6001;
[x] exit                  # &#x9000;&#x51FA;&#x7BA1;&#x7406;
# &#x542F;&#x52A8;&#x865A;&#x62DF;&#x673A;
Enter your choice: 1
========== Starting your container...

Press any key to continue...
</code></pre>
<script src="https://gist.github.com/DesertsP/8c2af4ec2639fe1cc7f8b1dc7b9cfbee.js"></script>
<style>
    .gist {
    width: 100% !important;
    }
    </style><!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Hello, GAN! 生成对抗网络入门]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>Generative Adversarial Networks (GANs, &#x751F;&#x6210;&#x5BF9;&#x6297;&#x7F51;&#x7EDC;) &#x662F;&#x4E00;&#x79CD;&#x7531;&#x4E24;&#x4E2A;&#x7F51;&#x7EDC;&#x6784;&#x6210;&#x7684;&#x901A;&#x8FC7;&#x5BF9;&#x6297;&#x5B66;&#x4E60;&#x8BAD;&#x7EC3;&#x7684;&#x751F;&#x6210;&#x6A21;&#x578B;&#xFF0C;&#x7531; Ian Goodfellow &#x7B49;&#x4EBA;&#xFF08;&#x5305;&#x62EC; Yoshua Bengio&#xFF09;&#x5728; 2014 &#x5E74;&#x63D0;</p>]]></description><link>https://deserts.io/gan-tutorial-for-beginners/</link><guid isPermaLink="false">62938184d119ff1b94794cdc</guid><category><![CDATA[Deeplearning]]></category><category><![CDATA[Neural Network]]></category><category><![CDATA[Machine Learning]]></category><dc:creator><![CDATA[Junwen]]></dc:creator><pubDate>Thu, 24 Jan 2019 01:53:24 GMT</pubDate><media:content url="https://cloud.panjunwen.com/2019/01/aipainter.jpg" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><img src="https://cloud.panjunwen.com/2019/01/aipainter.jpg" alt="Hello, GAN! &#x751F;&#x6210;&#x5BF9;&#x6297;&#x7F51;&#x7EDC;&#x5165;&#x95E8;"><p>Generative Adversarial Networks (GANs, &#x751F;&#x6210;&#x5BF9;&#x6297;&#x7F51;&#x7EDC;) &#x662F;&#x4E00;&#x79CD;&#x7531;&#x4E24;&#x4E2A;&#x7F51;&#x7EDC;&#x6784;&#x6210;&#x7684;&#x901A;&#x8FC7;&#x5BF9;&#x6297;&#x5B66;&#x4E60;&#x8BAD;&#x7EC3;&#x7684;&#x751F;&#x6210;&#x6A21;&#x578B;&#xFF0C;&#x7531; Ian Goodfellow &#x7B49;&#x4EBA;&#xFF08;&#x5305;&#x62EC; Yoshua Bengio&#xFF09;&#x5728; 2014 &#x5E74;&#x63D0;&#x51FA;&#xFF0C;&#x5E76;&#x5F97;&#x5230;&#x4E86; <a href="https://www.quora.com/What-are-some-recent-and-potentially-upcoming-breakthroughs-in-deep-learning">Yann LeCun &#x7684;&#x76DB;&#x8D5E;</a>&#xFF0C;&#x79F0;&#x5176;&#x4E3A;&#x300E;&#x673A;&#x5668;&#x5B66;&#x4E60;&#x754C;10&#x5E74;&#x6765;&#x6700;&#x6709;&#x8DA3;&#x7684;&#x70B9;&#x5B50;&#x300F;&#x3002;</p>
<p>&#x672C;&#x6587;&#x5C06;&#x4ECE;&#x65B0;&#x624B;&#x7684;&#x89D2;&#x5EA6;&#x4ECB;&#x7ECD;GAN&#x7684;&#x601D;&#x60F3;&#x548C;&#x5B9E;&#x73B0;&#x65B9;&#x6CD5;&#xFF0C;&#x524D;&#x7F6E;&#x77E5;&#x8BC6;&#x4EC5;&#x9700;&#x8981;&#x795E;&#x7ECF;&#x7F51;&#x7EDC;&#x57FA;&#x7840;&#x3002;</p>
<h3 id="vs">&#x76D1;&#x7763; vs. &#x975E;&#x76D1;&#x7763;</h3>
<p>&#x51E0;&#x4E4E;&#x6240;&#x6709;&#x4EBA;&#x5B66;&#x4E60;&#x795E;&#x7ECF;&#x7F51;&#x7EDC;&#x90FD;&#x662F;&#x4ECE;&#x5206;&#x7C7B;&#x5668;&#x5B66;&#x8D77;&#x7684;&#xFF0C;&#x4E5F;&#x5C31;&#x662F;&#x300E;&#x5582;&#x7ED9;&#x300F;&#x795E;&#x7ECF;&#x7F51;&#x7EDC;&#x7684;&#x6570;&#x636E;&#x96C6;&#x5305;&#x62EC;&#x4E24;&#x90E8;&#x5206;&#xFF1A;&#x539F;&#x59CB;&#x6570;&#x636E;&#xFF08;x&#xFF09;&#x548C;&#x6807;&#x6CE8;&#xFF08;y&#xFF09;&#xFF0C;&#x6211;&#x4EEC;&#x5E0C;&#x671B;&#x6784;&#x9020;&#x4E00;&#x4E2A;&#x590D;&#x6742;&#x7684;&#x975E;&#x7EBF;&#x6027;&#x51FD;&#x6570;&#x6765;&#x8868;&#x793A; $f:x \rightarrow y$ &#x7684;&#x6620;&#x5C04;&#xFF0C;&#x8FD9;&#x662F;&#x76D1;&#x7763;&#x5B66;&#x4E60;&#xFF0C;&#x5982;&#x5206;&#x7C7B;&#x3001;&#x56DE;&#x5F52;&#x3001;&#x76EE;&#x6807;&#x68C0;&#x6D4B;&#x3001;&#x8BED;&#x4E49;&#x5206;&#x5272;&#x7B49;&#x3002;</p>
<p>&#x5BF9;&#x4E8E;&#x975E;&#x76D1;&#x7763;&#x5B66;&#x4E60;&#xFF0C;&#x8BAD;&#x7EC3;&#x6570;&#x636E;&#x4EC5;&#x6709;&#x539F;&#x59CB;&#x7684;&#x6570;&#x636E;&#x800C;&#x6CA1;&#x6709;&#x6807;&#x8BB0;&#xFF0C;&#x6211;&#x4EEC;&#x5E0C;&#x671B;&#x7B97;&#x6CD5;&#x5B66;&#x4E60;&#x6570;&#x636E;&#x4E2D;&#x9690;&#x542B;&#x7684;&#x6A21;&#x5F0F;&#x6216;&#x7ED3;&#x6784;&#xFF0C;&#x5982;&#x805A;&#x7C7B;&#xFF0C;&#x964D;&#x7EF4;&#xFF0C;&#x7279;&#x5F81;&#x5B66;&#x4E60;&#x7B49;&#x3002;</p>
<p>&#x672C;&#x6587;&#x6240;&#x8FF0;&#x7684; GAN&#xFF0C;&#x4E5F;&#x662F;&#x6700;&#x7B80;&#x5355;&#x6700;&#x539F;&#x59CB;&#x7684;GAN&#xFF0C;&#x662F;<strong>&#x975E;&#x76D1;&#x7763;&#x5B66;&#x4E60;</strong>&#xFF0C;&#x6211;&#x77E5;&#x9053;&#x5BF9;&#x4E8E;&#x5927;&#x90E8;&#x5206;&#x65B0;&#x624B;&#x6765;&#x8BF4;&#x7528;&#x795E;&#x7ECF;&#x7F51;&#x7EDC;&#x505A;&#x975E;&#x76D1;&#x7763;&#x5B66;&#x4E60;&#x662F;&#x4E0D;&#x592A;&#x597D;&#x63A5;&#x53D7;&#x7684;&#x3002;</p>
<h3 id="vs">&#x751F;&#x6210;&#x7B97;&#x6CD5; vs. &#x5206;&#x7C7B;&#x7B97;&#x6CD5;</h3>
<p>GAN &#x4F5C;&#x4E3A;&#x4E00;&#x79CD;&#x751F;&#x6210;&#x7B97;&#x6CD5;&#xFF0C;&#x5176;&#x76EE;&#x6807;&#x662F;&#x80FD;&#x591F;&#x300E;&#x6A21;&#x4EFF;&#x300F;&#x7ED9;&#x5B9A;&#x6570;&#x636E;&#x96C6;&#x4E2D;&#x7684;&#x6570;&#x636E;&#xFF0C;&#x751F;&#x6210;&#x65B0;&#x7684;&#x7B26;&#x5408;&#x6570;&#x636E;&#x96C6;&#x7279;&#x5F81;&#x7684;&#x6570;&#x636E;&#x3002;</p>
<p>&#x6211;&#x4EEC;&#x5148;&#x6765;&#x56DE;&#x5FC6;&#x7B80;&#x5355;&#x7684;&#x4E8C;&#x5206;&#x7C7B;&#x7B97;&#x6CD5;&#x3002;&#x4F8B;&#x5982;&#xFF0C;&#x5BF9;&#x4E8E;&#x4E00;&#x4E2A;&#x5783;&#x573E;&#x90AE;&#x4EF6;&#x5206;&#x7C7B;&#xFF08;&#x9274;&#x522B;&#xFF09;&#x7B97;&#x6CD5;&#xFF0C;&#x7ED9;&#x5B9A;&#x90AE;&#x4EF6;&#x5185;&#x5BB9;&#x4E2D;&#x7684;&#x6240;&#x6709;&#x6587;&#x672C;&#xFF0C;&#x5206;&#x7C7B;&#x5668;&#x80FD;&#x591F;&#x9884;&#x6D4B;&#x51FA;&#x8BE5;&#x6587;&#x672C;&#x662F;&#x5426;&#x662F;&#x5783;&#x573E;&#x3002;&#x7528;&#x4E00;&#x4E2A;&#x7B80;&#x5355;&#x7684;&#x6570;&#x5B66;&#x8868;&#x8FBE;&#x5F0F;&#x8868;&#x793A;&#x5373;&#x4E3A; $P(y|x)$&#xFF0C;&#x5176;&#x4E2D;$x$&#x4E3A;&#x8F93;&#x5165;&#x5206;&#x7C7B;&#x5668;&#x7684;&#x7279;&#x5F81;&#xFF0C;$y$&#x4E3A;&#x6807;&#x7B7E;&#xFF0C;&#x5206;&#x7C7B;&#x5668;&#x80FD;&#x591F;&#x9884;&#x6D4B;&#x7ED9;&#x5B9A;&#x7684;$x$&#x7C7B;&#x522B;&#x4E3A;$y$&#x7684;&#x6982;&#x7387;&#x3002;&#x4E5F;&#x5C31;&#x662F;&#x5206;&#x7C7B;&#x5668;&#x662F;<strong>&#x4ECE;&#x9AD8;&#x7EF4;&#x7279;&#x5F81;&#x5411;&#x4F4E;&#x7EF4;&#x6807;&#x7B7E;&#x7684;&#x6620;&#x5C04;</strong>&#x3002;</p>
<p>&#x751F;&#x6210;&#x7B97;&#x6CD5;&#x7684;&#x76EE;&#x6807;&#x4E0E;&#x5206;&#x7C7B;&#x7B97;&#x6CD5;&#x7684;&#x76EE;&#x6807;&#x6B63;&#x597D;&#x76F8;&#x53CD;&#xFF0C;&#x751F;&#x6210;&#x5668;&#x8BD5;&#x56FE;&#x4ECE;&#x7ED9;&#x5B9A;&#x7684;&#x4F4E;&#x7EF4;&#x6807;&#x7B7E;&#x751F;&#x6210;&#x9AD8;&#x7EF4;&#x7684;&#x7279;&#x5F81;&#xFF0C;&#x5373;&#x8BD5;&#x56FE;&#x5F97;&#x5230; $P(x|y)$&#x3002;</p>
<p>&#x4E5F;&#x5C31;&#x662F;&#x8BF4;&#xFF0C;&#x5C06;&#x7B80;&#x5355;&#x7684;&#x5206;&#x7C7B;&#x7F51;&#x7EDC;&#x524D;&#x540E;&#x7FFB;&#x8F6C;&#xFF0C;&#x5C31;&#x662F;&#x4E00;&#x4E2A;&#x751F;&#x6210;&#x7F51;&#x7EDC;&#x4E86;&#x3002;&#x95EE;&#x9898;&#x5728;&#x4E8E;&#xFF0C;&#x5982;&#x4F55;&#x8BAD;&#x7EC3;&#x8FD9;&#x4E2A;&#x751F;&#x6210;&#x7F51;&#x7EDC;&#xFF0C;&#x4F7F;&#x5176;&#x80FD;&#x591F;&#x6A21;&#x4EFF;&#x8BAD;&#x7EC3;&#x96C6;&#x6765;&#x751F;&#x6210;&#x6570;&#x636E;&#xFF0C;&#x6216;&#x8005;&#x8BF4;&#x5B66;&#x4E60;&#x5230;&#x8BAD;&#x7EC3;&#x96C6;&#x4E2D;&#x7684;&#x6570;&#x636E;&#x5206;&#x5E03;&#x3002;</p>
<h3 id="gan">GAN &#x7684;&#x7ED3;&#x6784;</h3>
<p>GAN &#x662F;&#x7531;&#x4E24;&#x4E2A;&#x795E;&#x7ECF;&#x7F51;&#x7EDC;&#xFF0C;&#x5373;&#x751F;&#x6210;&#x5668;&#xFF08;Generator&#xFF09;&#x548C;&#x9274;&#x522B;&#x5668;&#xFF08;Discriminator&#xFF09;&#x6784;&#x6210;&#x7684;&#x3002;</p>
<p>&#x6240;&#x8C13;&#x9274;&#x522B;&#x5668;&#xFF0C;&#x5C31;&#x662F;&#x4E00;&#x4E2A;&#x7B80;&#x5355;&#x7684;&#x4E8C;&#x5206;&#x7C7B;&#x795E;&#x7ECF;&#x7F51;&#x7EDC;&#xFF0C;&#x6216;&#x8005;&#x53EB;&#x5206;&#x7C7B;&#x5668;&#xFF0C;&#x7528;&#x4E8E;&#x5224;&#x5B9A;&#x8F93;&#x5165;&#x7684;&#x56FE;&#x7247;&#x662F;&#x6765;&#x81EA;&#x4E8E;&#x771F;&#x5B9E;&#x7684;&#x6570;&#x636E;&#x96C6;&#x8FD8;&#x662F;&#x7531;&#x751F;&#x6210;&#x5668;&#x751F;&#x6210;&#x7684;&#x3002;&#x4EE5;&#x4E0B;&#x4EE3;&#x7801;&#x7528;Keras&#x5B9E;&#x73B0;&#x4E00;&#x4E2A;&#x4E8C;&#x5206;&#x7C7B;&#x7684;&#x5168;&#x8FDE;&#x63A5;&#x7F51;&#x7EDC;&#xFF0C;&#x5373;&#x4E3A;&#x9274;&#x522B;&#x5668;&#x3002;</p>
<pre><code class="language-python"># Disctiminator
D = Sequential([
    Flatten(input_shape=img_shape, name=&apos;flatten&apos;),
    Dense(512, activation=&apos;relu&apos;, name=&apos;fully_connected1&apos;),
    Dense(256, activation=&apos;relu&apos;, name=&apos;fully_connected2&apos;),
    Dense(1, activation=&apos;sigmoid&apos;, name=&apos;classifier&apos;)
])
</code></pre>
<p>&#x751F;&#x6210;&#x5668;&#x7F51;&#x7EDC;&#x5C06;&#x8F93;&#x5165;&#x7684;&#x4F4E;&#x7EF4;&#x5EA6;&#x5411;&#x91CF;&#xFF08;&#x8FD9;&#x91CC;&#x7528;&#x957F;&#x5EA6;100&#x7684;&#x5411;&#x91CF;&#xFF09;&#x6620;&#x5C04;&#x5230;&#x4E00;&#x4E2A;&#x9AD8;&#x7EF4;&#x5EA6;&#x5411;&#x91CF;&#x540E;reshape&#x5230;&#x56FE;&#x7247;&#x5C3A;&#x5BF8;&#x3002;Keras &#x5B9E;&#x73B0;&#x5982;&#x4E0B;&#x3002;</p>
<pre><code class="language-python"># Generator
G = Sequential([
    Dense(256, activation=&apos;relu&apos;, input_dim=latent_dim, name=&apos;fully_connected1&apos;),
    Dense(512, activation=&apos;relu&apos;, name=&apos;fully_connected2&apos;),
    Dense(1024, activation=&apos;relu&apos;, name=&apos;fully_connected3&apos;),
    Dense(np.prod(img_shape), activation=&apos;tanh&apos;, name=&apos;output_generated&apos;),
    Reshape(img_shape)
])
</code></pre>
<p>&#x5F53;&#x6211;&#x4EEC;&#x7528;&#x8BAD;&#x7EC3;&#x597D;&#x7684;&#x795E;&#x7ECF;&#x7F51;&#x7EDC;&#x751F;&#x6210;&#x6570;&#x636E;&#x65F6;&#xFF0C;&#x9274;&#x522B;&#x5668;D&#x5C31;&#x6CA1;&#x6709;&#x7528;&#x4E86;&#xFF0C;&#x53EA;&#x9700;&#x8981;&#x4E00;&#x884C;&#x4EE3;&#x7801;&#x5373;&#x53EF;&#x8BA9;&#x751F;&#x6210;&#x5668;G&#x751F;&#x6210;&#x4E00;&#x5F20;&#x56FE;&#x7247; <code>img = G.predict(noise_vector)</code>&#x3002;&#x4E5F;&#x5C31;&#x662F;&#x8BF4;&#xFF0C;&#x9274;&#x522B;&#x5668;D&#x5BF9;&#x4E8E;GAN&#x6765;&#x8BF4;&#x53EA;&#x662F;&#x7528;&#x6765;&#x300E;&#x5E2E;&#x52A9;&#x300F;&#x8BAD;&#x7EC3;&#x751F;&#x6210;&#x5668;G&#x7684;&#x53C2;&#x6570;&#x7684;&#x3002;</p>
<p>&#x867D;&#x7136;&#x7F51;&#x7EDC;&#x7ED3;&#x6784;&#x5F88;&#x7B80;&#x5355;&#xFF0C;&#x4F46;&#x5982;&#x4F55;&#x8BA9;&#x751F;&#x6210;&#x5668;&#x751F;&#x6210;&#x6EE1;&#x610F;&#x7684;&#x56FE;&#x50CF;&#xFF0C;&#x6216;&#x8005;&#x8BF4;&#x8BA9;&#x751F;&#x6210;&#x5668;&#x5B66;&#x4E60;&#x5230;&#x8BAD;&#x7EC3;&#x96C6;&#x7684;&#x6570;&#x636E;&#x5206;&#x5E03;&#x624D;&#x662F;GAN&#x7684;&#x6838;&#x5FC3;&#x3002;</p>
<p><img src="https://cloud.panjunwen.com/2019/01/gan_schema.png" alt="Hello, GAN! &#x751F;&#x6210;&#x5BF9;&#x6297;&#x7F51;&#x7EDC;&#x5165;&#x95E8;" loading="lazy"></p>
<h3 id>&#x5BF9;&#x6297;&#x8BAD;&#x7EC3;</h3>
<p>&#x6211;&#x4EEC;&#x6709;&#x4E86;&#x751F;&#x6210;&#x5668;G&#x548C;&#x9274;&#x522B;&#x5668;D&#xFF0C;&#x9700;&#x8981;&#x5C06;&#x5176;&#x7EC4;&#x5408;&#x5728;&#x4E00;&#x8D77;&#x8BAD;&#x7EC3;&#xFF0C;&#x5373;&#x4E3A;&#x5BF9;&#x6297;&#x8BAD;&#x7EC3;&#xFF08;Adversarial Training&#xFF09;&#x3002;&#x6240;&#x8C13;&#x5BF9;&#x6297;&#x8BAD;&#x7EC3;&#xFF0C;&#x5C31;&#x662F;&#x5728;&#x53C2;&#x6570;&#x5B66;&#x4E60;&#x8FC7;&#x7A0B;&#x4E2D;&#x9274;&#x522B;&#x5668;D&#x548C;&#x751F;&#x6210;&#x5668;G&#x671D;&#x7740;&#x5BF9;&#x7ACB;&#x7684;&#x65B9;&#x5411;&#x5B66;&#x4E60;&#xFF1A;D&#x8BD5;&#x56FE;&#x4E0D;&#x65AD;&#x63D0;&#x9AD8;&#x5206;&#x522B;&#x56FE;&#x7247;&#x771F;&#x5047;&#x7684;&#x80FD;&#x529B;&#xFF0C;G&#x8BD5;&#x56FE;&#x4E0D;&#x65AD;&#x751F;&#x6210;&#x66F4;&#x903C;&#x771F;&#x7684;&#x56FE;&#x7247;&#x6765;&#x7CCA;&#x5F04;D&#x3002;</p>
<p>GAN &#x8BAD;&#x7EC3;&#x7684;&#x8FC7;&#x7A0B;&#x5982;&#x4E0B;&#xFF1A;</p>
<ul>
<li>&#x8BAD;&#x7EC3;D&#xFF1A;G&#x63A5;&#x6536;&#x4E00;&#x4E2A;&#x968F;&#x673A;&#x5411;&#x91CF;&#x4F5C;&#x4E3A;&#x8F93;&#x5165;&#xFF0C;&#x8F93;&#x51FA;&#x4E00;&#x5F20;&#x56FE;&#x50CF;&#xFF0C;&#x7528;&#x751F;&#x6210;&#x7684;&#x56FE;&#x50CF;&#x4F5C;&#x4E3A;&#x8D1F;&#x6837;&#x672C;&#xFF08;label&#x4E3A;&#x5047;&#xFF09;&#xFF0C;&#x8BAD;&#x7EC3;&#x96C6;&#x4E2D;&#x7684;&#x56FE;&#x50CF;&#x4F5C;&#x4E3A;&#x6B63;&#x6837;&#x672C;&#x8BAD;&#x7EC3;D&#xFF08;label&#x4E3A;&#x771F;&#xFF09;</li>
<li>&#x8BAD;&#x7EC3;G&#xFF1A;G&#x518D;&#x751F;&#x6210;&#x4E00;&#x5F20;&#x56FE;&#x50CF;&#x4F5C;&#x4E3A;&#x6B63;&#x6837;&#x672C;&#xFF08;label&#x4E3A;&#x771F;&#xFF09;&#x8F93;&#x5165;D&#xFF0C;&#x7ECF;&#x7531;D&#x7684;&#x4EE3;&#x4EF7;&#x51FD;&#x6570;&#x540E;&#x53CD;&#x5411;&#x4F20;&#x64AD;&#xFF0C;&#x66F4;&#x65B0;G&#x7684;&#x53C2;&#x6570;&#xFF08;&#x6B64;&#x65F6;D&#x7684;&#x53C2;&#x6570;&#x9501;&#x5B9A;&#xFF09;</li>
</ul>
<p>&#x6211;&#x5C06;&#x8FD9;&#x4E2A;&#x8FC7;&#x7A0B;&#x603B;&#x7ED3;&#x4E3A;&#xFF1A;&#x5206;&#x522B;&#x8BAD;&#x7EC3;&#xFF0C;&#x5171;&#x540C;&#x8FDB;&#x6B65;&#x3002;&#x5728;&#x6BCF;&#x4E00;&#x6B65;&#x4E2D;&#xFF0C;D&#x548C;G&#x7684;&#x53C2;&#x6570;&#x5206;&#x522B;&#x66F4;&#x65B0;&#xFF1B;&#x5728;&#x6574;&#x4E2A;&#x8BAD;&#x7EC3;&#x8FC7;&#x7A0B;&#x4E2D;&#xFF0C;D&#x548C;G&#x540C;&#x6B65;&#x63D0;&#x9AD8;&#x3002;</p>
<p>&#x7528;Keras&#x5B9E;&#x73B0;&#x7684;&#x5BF9;&#x6297;&#x8BAD;&#x7EC3;&#x4EE3;&#x7801;&#x5982;&#x4E0B;&#x3002;</p>
<pre><code class="language-python"># &#x7F16;&#x8BD1;D
D.compile(loss=&apos;binary_crossentropy&apos;, optimizer=d_optimizer, metrics=[&apos;accuracy&apos;])
# &#x5C06;D&#x548C;G&quot;&#x4E32;&#x8054;&quot;&#xFF0C;&#x5F97;&#x5230;&#x6A21;&#x578B;C
z = Input(shape=(latent_dim,))
generated_img = G(z)
D.trainable = False       # &#x6A21;&#x578B;C&#x4E2D;D&#x7684;&#x53C2;&#x6570;&#x9501;&#x5B9A;
validity = D(generated_img)
# Combined model
C = Model(z, validity)
C.compile(loss=&apos;binary_crossentropy&apos;, optimizer=g_optimizer)
C.summary()
</code></pre>
<pre><code class="language-python"># load data
(x_train, _), (_, _) = mnist.load_data()
x_train = x_train / 127.5 - 1
# (60000, 28, 28) -&gt; (60000, 28, 28, 1)
x_train = np.expand_dims(x_train, axis=3)
valid = np.ones((batch_size, 1))
fake = np.zeros((batch_size, 1))

for epoch in range(epochs):
    for _ in range(x_train.shape[0] // batch_size):
        # train D
        idx = np.random.randint(low=0, high=x_train.shape[0], size=batch_size)
        imgs = x_train[idx]
        noise = np.random.normal(0, 1, (batch_size, latent_dim))
        gen_imgs = G.predict(noise)
        D.train_on_batch(imgs, valid)
        D.train_on_batch(gen_imgs, fake)
        # train G
        noise = np.random.normal(0, 1, (batch_size, latent_dim))
        C.train_on_batch(noise, valid)
</code></pre>
<p>&#x770B;&#x5B8C;&#x4EE3;&#x7801;&#xFF0C;&#x76F8;&#x4FE1;&#x4F60;&#x5FC3;&#x4E2D;&#x7684;&#x8BF8;&#x591A;&#x7591;&#x60D1;&#x5DF2;&#x7ECF;&#x89E3;&#x5F00;&#x3002;</p>
<h3 id>&#x5C0F;&#x7ED3;</h3>
<p>&#x672C;&#x6587;&#x8BD5;&#x56FE;&#x629B;&#x5F00;&#x516C;&#x5F0F;&#x548C;&#x7406;&#x8BBA;&#xFF0C;&#x4EE5;&#x76F4;&#x89C2;&#x7684;&#x65B9;&#x5F0F;&#x6765;&#x4ECB;&#x7ECD;GAN&#x7684;&#x7ED3;&#x6784;&#x4E0E;&#x5BF9;&#x6297;&#x8BAD;&#x7EC3;&#x8FC7;&#x7A0B;&#xFF0C;&#x5E76;&#x5F3A;&#x8C03;&#x5728;&#x5B9E;&#x73B0;&#x8FC7;&#x7A0B;&#x4E2D;&#x7406;&#x89E3;&#x548C;&#x638C;&#x63E1;GAN&#x3002;GAN &#x9996;&#x5148;&#x662F;&#x4E00;&#x79CD;&#x65E0;&#x76D1;&#x7763;&#x5B66;&#x4E60;&#x548C;&#x751F;&#x6210;&#x7B97;&#x6CD5;&#xFF0C;&#x5176;&#x6838;&#x5FC3;&#x601D;&#x60F3;&#x5728;&#x4E8E;&#x5BF9;&#x6297;&#x8BAD;&#x7EC3;&#x3002;&#x81F3;&#x4E8E;&#x516C;&#x5F0F;&#x548C;&#x7406;&#x8BBA;&#x5206;&#x6790;&#xFF0C;&#x6211;&#x76F8;&#x4FE1;&#x8FD9;&#x65F6;&#x5019;&#x53BB;&#x9605;&#x8BFB;&#x539F;&#x8BBA;&#x6587;&#x4F1A;&#x662F;&#x4E2A;&#x4E0D;&#x9519;&#x7684;&#x9009;&#x62E9;&#x3002;</p>
<script type="text/javascript" async src="https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-MML-AM_CHTML">
    MathJax.Hub.Config({
    tex2jax: {
        inlineMath: [["$", "$"], ["\\(", "\\)"]],
        processEscapes: true
    }
});
</script><!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Socket doesn't throw exception in Android]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>Several threads from <a href="https://stackoverflow.com/">STACK OVERFLOW</a>:</p>
<blockquote>
<p>We have a simple client server architecture between our mobile device and our server both written in Java. An extremely simple ServerSocket and Socket implementation. However one problem is that when the client terminates abruptly (without closing the socket properly) the server does not know</p></blockquote>]]></description><link>https://deserts.io/socket-does-not-throw-exception-in-android/</link><guid isPermaLink="false">62938184d119ff1b94794cef</guid><category><![CDATA[Android]]></category><category><![CDATA[Code]]></category><category><![CDATA[Development]]></category><dc:creator><![CDATA[Junwen]]></dc:creator><pubDate>Sat, 05 Jan 2019 22:30:53 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1512149673953-1e251807ec7c?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=MnwxMTc3M3wwfDF8c2VhcmNofDIwfHxBbmRyb2lkfGVufDB8fHx8MTY1MzgzNzk4OA&amp;ixlib=rb-1.2.1&amp;q=80&amp;w=2000" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><img src="https://images.unsplash.com/photo-1512149673953-1e251807ec7c?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=MnwxMTc3M3wwfDF8c2VhcmNofDIwfHxBbmRyb2lkfGVufDB8fHx8MTY1MzgzNzk4OA&amp;ixlib=rb-1.2.1&amp;q=80&amp;w=2000" alt="Socket doesn&apos;t throw exception in Android"><p>Several threads from <a href="https://stackoverflow.com/">STACK OVERFLOW</a>:</p>
<blockquote>
<p>We have a simple client server architecture between our mobile device and our server both written in Java. An extremely simple ServerSocket and Socket implementation. However one problem is that when the client terminates abruptly (without closing the socket properly) the server does not know that it is disconnected. Furthermore, the server can continue to write to this socket without getting any exceptions. Why?According to documentation Java sockets should throw exceptions if you try to write to a socket that is not reachable on the other end!</p>
</blockquote>
<p>Another,</p>
<blockquote>
<p>If I put a nonsense url no exception is thrown and none of the rest of my code is executed not even the rest of the asynctask that called the method that connects.</p>
</blockquote>
<p>Typically:</p>
<pre><code class="language-java">    try {
        socket.connect(new InetSocketAddress(address, port), 2000);
    } catch (Exception e) {
        //will never reach this block
    }
</code></pre>
<p>I am facing the same problem. I have tried every means below these questions, but it still did not work. I found that some apps downloaded from Google Play has the same problem that it could connect and send data to a invalid address.</p>
<p>There is no doubt that there is a bug of Android SDK, could found in this thread: <a href="https://issuetracker.google.com/issues/36912723">no IOException on socket read/write after remote close</a> as well.</p>
<p><strong>My solution is to switch the <code>minSdkVersion</code> to a newer version such as 21 and to use the latest build tools.</strong></p>
<p>Android &#x5F00;&#x53D1;&#x8FC7;&#x7A0B;&#x4E2D;&#xFF0C;&#x9047;&#x5230;&#x4E00;&#x4E2A;&#x6BD4;&#x8F83;&#x8BE1;&#x5F02;&#x7684;&#x95EE;&#x9898;&#xFF1A;Socket.connect &#x5373;&#x4F7F;&#x8FDE;&#x63A5;&#x5931;&#x8D25;&#x4E5F;&#x4E0D;&#x4F1A;&#x629B;&#x51FA;&#x4EFB;&#x4F55;&#x5F02;&#x5E38;&#xFF0C;&#x8FD9;&#x4E2A;&#x95EE;&#x9898;&#x5728; STACK OVERFLOW &#x4E0A;&#x5DF2;&#x7ECF;&#x6709;&#x975E;&#x5E38;&#x591A;&#x7684;&#x8BA8;&#x8BBA;&#xFF0C;&#x4F46;&#x6211;&#x7FFB;&#x4E86;&#x65E0;&#x6570;&#x7B54;&#x6848;&#x6CA1;&#x6709;&#x627E;&#x5230;&#x5408;&#x9002;&#x7684;&#x89E3;&#x51B3;&#x65B9;&#x6CD5;&#x3002;&#x6700;&#x540E;&#x53EF;&#x4EE5;&#x786E;&#x8BA4;&#x8FD9;&#x662F;Android&#x5386;&#x53F2;&#x9057;&#x7559;&#x7684;&#x4E00;&#x4E2A;&#x81ED;&#x866B;&#xFF0C;&#x81F3;&#x4E8E;&#x5728;&#x54EA;&#x4E2A;&#x7248;&#x672C;SDK&#x4E2D;&#x88AB;&#x4FEE;&#x590D;&#x4E86;&#x8FD8;&#x4E0D;&#x5F97;&#x800C;&#x77E5;&#xFF0C;&#x6211;&#x6700;&#x540E;&#x5C06; <code>minSdkVersion</code> &#x4ECE;15&#x6362;&#x5230;21&#x89E3;&#x51B3;&#x4E86;&#x8FD9;&#x4E2A;&#x95EE;&#x9898;&#xFF0C;&#x4EE3;&#x4EF7;&#x5C31;&#x662F;APP&#x53EA;&#x80FD;&#x5728; Android 5.0 &#x4EE5;&#x540E;&#x7684;&#x7248;&#x672C;&#x4E0A;&#x8FD0;&#x884C;&#x3002;</p>
<p>&#x5F3A;&#x8FEB;&#x75C7;&#x8FD9;&#x4E2A;&#x75C5;&#xFF0C;&#x5F97;&#x6CBB;&#x3002;</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[拼凑]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>&#x4E1C;&#x62FC;&#x897F;&#x51D1;&#x51FA;&#x4E00;&#x4E2A;Ghost&#x4E3B;&#x9898;&#x3002;&#x4E3B;&#x8981;&#x53C2;&#x8003;&#x4E86; <a href>Cho</a> &#x7684;Bitcron&#x81EA;&#x7528;&#x4E3B;&#x9898;&#x6837;&#x5F0F;&#xFF0C;&#x52A0;&#x5165;&#x4E86;&#x79FB;&#x52A8;&#x7AEF;&#x83DC;&#x5355;&#x3001;&#x5E95;&#x680F;&#x4EE5;&#x53CA; Ghost &#x7684;&#x4E00;&#x4E9B;&#x7279;&#x8272;&#x529F;&#x80FD;&#x3002;&#x524D;&#x7AEF;</p>]]></description><link>https://deserts.io/pin-cou/</link><guid isPermaLink="false">62938184d119ff1b94794cc8</guid><category><![CDATA[前端]]></category><category><![CDATA[Blog]]></category><category><![CDATA[折腾]]></category><dc:creator><![CDATA[Junwen]]></dc:creator><pubDate>Mon, 30 Jul 2018 00:18:51 GMT</pubDate><media:content url="https://cloud.panjunwen.com/2018/07/food-kitchen.jpg" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><img src="https://cloud.panjunwen.com/2018/07/food-kitchen.jpg" alt="&#x62FC;&#x51D1;"><p>&#x4E1C;&#x62FC;&#x897F;&#x51D1;&#x51FA;&#x4E00;&#x4E2A;Ghost&#x4E3B;&#x9898;&#x3002;&#x4E3B;&#x8981;&#x53C2;&#x8003;&#x4E86; <a href>Cho</a> &#x7684;Bitcron&#x81EA;&#x7528;&#x4E3B;&#x9898;&#x6837;&#x5F0F;&#xFF0C;&#x52A0;&#x5165;&#x4E86;&#x79FB;&#x52A8;&#x7AEF;&#x83DC;&#x5355;&#x3001;&#x5E95;&#x680F;&#x4EE5;&#x53CA; Ghost &#x7684;&#x4E00;&#x4E9B;&#x7279;&#x8272;&#x529F;&#x80FD;&#x3002;&#x524D;&#x7AEF;&#x6280;&#x672F;&#x6808;&#x5F31;&#x9E21;&#xFF0C;&#x53EA;&#x4F1A;&#x590D;&#x5236;&#x7C98;&#x8D34;&#x52A0;&#x8C03;&#x8BD5;&#xFF0C;&#x5C0F;&#x6BDB;&#x75C5;&#x662F;&#x6C38;&#x8FDC;&#x90FD;&#x4E0D;&#x53EF;&#x80FD;&#x6539;&#x5B8C;&#x7684;&#x3002;</p>
<blockquote>
<p>Graphic design is the paradise of individuality, eccentricity, heresy, abnormality, hobbies, and humors. &#x2014; George Santayana</p>
</blockquote>
<hr>
<p>&#x56FE;&#x9A97;&#x793A;&#x4F8B;&#xFF1A;</p>
<p><img src="https://cloud.panjunwen.com/2018/07/about-1-2.jpeg" alt="&#x62FC;&#x51D1;" loading="lazy"></p>
<hr>
<p>&#x4EE3;&#x7801;&#x793A;&#x4F8B;&#xFF1A;</p>
<pre><code class="language-python">import torch
import torch.nn as nn

class DiceLoss(nn.Module):
    def __init__(self, eps=1e-5):
        super().__init__()
        self.eps = eps

    def forward(self, prediction, ground_truth):
        batch_size = prediction.size(0)
        classes = prediction.size(1)
        prediction = prediction.float()
        ground_truth = ground_truth.float()
        intersection = prediction * ground_truth
        dice_numerator = 2.0 * intersection.view(batch_size, classes, -1).sum(-1)
        dice_denominator = prediction.view(batch_size, classes, -1).sum(-1) + \
                           ground_truth.view(batch_size, classes, -1).sum(-1) + self.eps
        dice = dice_numerator / dice_denominator
        return 1 - dice.mean()
</code></pre>
<hr>
<p>&#x89C6;&#x9891;&#x793A;&#x4F8B;&#xFF1A;</p>
<div style="max-width:854px"><div style="position:relative;height:0;padding-bottom:56.25%"><iframe src="https://embed.ted.com/talks/lang/zh-cn/george_smoot_on_the_design_of_the_universe" width="854" height="480" style="position:absolute;left:0;top:0;width:100%;height:100%" frameborder="0" scrolling="no" allowfullscreen></iframe></div></div>
<hr>
<p>&#x6EDA;&#x53BB;&#x5B66;&#x4E60;&#xFF01;</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[快速配置深度学习主机环境（下）]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>&#x5FEB;&#x901F;&#x914D;&#x7F6E;&#x6DF1;&#x5EA6;&#x5B66;&#x4E60;&#x4E3B;&#x673A;&#x73AF;&#x5883;&#x7684;&#x4E0B;&#x7BC7;&#x3002;&#x4E0A;&#x7BC7;&#x5DF2;&#x7ECF;&#x914D;&#x7F6E;&#x597D;&#x5E95;&#x5C42;&#x9A71;&#x52A8;&#x548C;CUDA&#xFF0C;&#x53EF;&#x4EE5;&#x5B9E;&#x73B0;SSH&#x8FDC;&#x7A0B;&#x767B;&#x5F55;&#xFF0C;&#x4F7F;&#x7528;SAMBA&#x8FDB;&#x884C;&#x6587;&#x4EF6;&#x5171;&#x4EAB;&#x3002;</p>]]></description><link>https://deserts.io/quick-install-tensorflow-jupyter/</link><guid isPermaLink="false">62938184d119ff1b94794ceb</guid><category><![CDATA[Deeplearning]]></category><dc:creator><![CDATA[Junwen]]></dc:creator><pubDate>Tue, 20 Mar 2018 04:36:55 GMT</pubDate><media:content url="https://cloud.panjunwen.com/2020/05/bash.png" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><img src="https://cloud.panjunwen.com/2020/05/bash.png" alt="&#x5FEB;&#x901F;&#x914D;&#x7F6E;&#x6DF1;&#x5EA6;&#x5B66;&#x4E60;&#x4E3B;&#x673A;&#x73AF;&#x5883;&#xFF08;&#x4E0B;&#xFF09;"><p>&#x5FEB;&#x901F;&#x914D;&#x7F6E;&#x6DF1;&#x5EA6;&#x5B66;&#x4E60;&#x4E3B;&#x673A;&#x73AF;&#x5883;&#x7684;&#x4E0B;&#x7BC7;&#x3002;&#x4E0A;&#x7BC7;&#x5DF2;&#x7ECF;&#x914D;&#x7F6E;&#x597D;&#x5E95;&#x5C42;&#x9A71;&#x52A8;&#x548C;CUDA&#xFF0C;&#x53EF;&#x4EE5;&#x5B9E;&#x73B0;SSH&#x8FDC;&#x7A0B;&#x767B;&#x5F55;&#xFF0C;&#x4F7F;&#x7528;SAMBA&#x8FDB;&#x884C;&#x6587;&#x4EF6;&#x5171;&#x4EAB;&#x3002;&#x8FD9;&#x7BC7;&#x5C06;&#x5B8C;&#x6210;TensorFlow&#xFF0C;Jupyter&#xFF0C;PyCharm&#x7684;&#x5B89;&#x88C5;&#x914D;&#x7F6E;&#x3002;</p>
<h2 id="pythontensorflow">Python &amp; TensorFlow</h2>
<ol>
<li>
<p>&#x5B89;&#x88C5;Conda&#x5230;<code>/usr/local/cellers/conda3</code>&#xFF0C;&#x9ED8;&#x8BA4;&#x7684;python&#x548C;pip&#x5DF2;&#x7ECF;&#x66FF;&#x6362;&#x4E3A;Anaconda&#x7684;&#x7248;&#x672C;</p>
<blockquote>
<p>NOTE&#xFF1A;&#x5982;&#x679C;&#x4F60;&#x4E0D;&#x77E5;&#x9053;&#x5F53;&#x524D;&#x8FD0;&#x884C;&#x7684;Python&#x6216;pip&#x5230;&#x5E95;&#x662F;&#x54EA;&#x4E00;&#x4E2A;&#x4EC0;&#x4E48;&#x7248;&#x672C;&#xFF0C;&#x4F60;&#x53EF;&#x4EE5;&#x4F7F;&#x7528;<code>which python</code>&#x67E5;&#x770B;&#x3002;</p>
</blockquote>
</li>
<li>
<p>&#x521B;&#x5EFA;&#x865A;&#x62DF;&#x73AF;&#x5883;&#xFF1A;<code>conda create -n tf_env</code>&#xFF0C;&#x8FDB;&#x5165;&#xFF1A;<code>source activate tf_env</code>&#xFF0C;&#x5B89;&#x88C5;pip&#xFF1A;<code>conda install pip</code></p>
</li>
<li>
<p>&#x5B89;&#x88C5;Tensorflow 1.6&#xFF1A;<code>pip install --ignore-installed --upgrade tfBinaryURL</code></p>
<p>where <code>tfBinaryURL</code> is the <a href="https://www.tensorflow.org/install/install_linux#the_url_of_the_tensorflow_python_package">URL of the TensorFlow Python package</a>. For example, the following command installs the GPU version of TensorFlow for Python 3.6:</p>
<p><code>pip install --ignore-installed --upgrade https://storage.googleapis.com/tensorflow/linux/gpu/tensorflow_gpu-1.6.0-cp36-cp36m-linux_x86_64.whl</code></p>
<p>&#x4E5F;&#x53EF;&#x4EE5;&#x4F7F;&#x7528;&#xFF1A;<code>pip install tensorflow-gpu</code></p>
</li>
</ol>
<h2 id="jupyter">Jupyter</h2>
<ol>
<li><code>conda install jupyter</code>&#x5B89;&#x88C5; Jupyter&#xFF0C;<code> jupyter notebook --generate-config</code>&#xFF0C;&#x7F16;&#x8F91;&#x751F;&#x6210;&#x7684;&#x6587;&#x4EF6;<code>vi ~/.jupyter/jupyter_notebook_config.py</code>&#xFF0C;</li>
</ol>
<pre><code class="language-python">   c.NotebookApp.ip = &apos;0.0.0.0&apos;
   c.NotebookApp.port = 8080
   c.NotebookApp.password = u&apos;sha1:c3182135f429:0b593978f9f157b26871b7d2e9c478e4cbb6c556&apos;
   c.NotebookApp.notebook_dir = u&apos;/home/deserts/Projects&apos;
</code></pre>
<p>&#x4E0A;&#x9762;&#x7684;&#x5BC6;&#x7801;&#x8FD9;&#x4E48;&#x6765;&#x7684;&#xFF1A;</p>
<pre><code class="language-Python">   &gt;&gt;&gt; from IPython.lib import passwd
   &gt;&gt;&gt; passwd()
   Enter password:
   Verify password:
   &apos;sha1:7d95d331a799:305429d9f9d799dce42cb8635b770a63d254c419&apos;
</code></pre>
<ol start="2">
<li>&#x8BBE;&#x7F6E;systemd&#x968F;&#x5F00;&#x673A;&#x542F;&#x52A8;&#xFF0C;<code>sudo vi /etc/systemd/system/jupyter.service</code>&#xFF0C;&#x8FD9;&#x91CC;&#x4F7F;&#x7528;Environment&#x6307;&#x5B9A;PATH&#x548C;LD_LIBRARY_PATH&#x73AF;&#x5883;&#x53D8;&#x91CF;&#xFF0C;&#x56E0;&#x4E3A;systemd&#x4E0D;&#x80FD;&#x4F7F;&#x7528;.bashrc&#x4E2D;&#x7684;&#x73AF;&#x5883;&#x53D8;&#x91CF;&#x3002;&#x5177;&#x4F53;&#x53C2;&#x6570;&#x89C6;&#x60C5;&#x51B5;&#x800C;&#x5B9A;&#x3002;</li>
</ol>
<pre><code class="language-shell">   [Unit]
   Description=Jupyter Notebook
   After=network.target
   [Service]
   Type=simple
   Environment=PATH=/usr/local/cuda-9.0/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin LD_LIBRARY_PATH=/usr/local/cuda-9.0/lib64
   ExecStart=/usr/local/cellers/miniconda3/bin/jupyter notebook  --config=/home/deserts/.jupyter/jupyter_notebook_config.py --no-browser
   User=deserts
   Group=deserts
   WorkingDirectory=/home/deserts/Projects/
   Restart=always
   RestartSec=10
   [Install]
   WantedBy=multi-user.target
</code></pre>
<p>&#x591A;&#x4EBA;&#x72EC;&#x7ACB;&#x7684;Jupyter&#x73AF;&#x5883;&#x53EA;&#x9700;&#x8981;&#x7528;&#x4E0D;&#x540C;&#x7684;&#x914D;&#x7F6E;&#x6587;&#x4EF6;&#x548C;Python&#x5185;&#x6838;&#x5373;&#x53EF;&#x3002;<br>
&#x66F4;&#x597D;&#x7684;&#x4FDD;&#x8BC1;&#x5B89;&#x5168;&#x53C2;&#x9605;&#xFF1A;<a href="https://bitmingw.com/2017/07/09/run-jupyter-notebook-server/">https://bitmingw.com/2017/07/09/run-jupyter-notebook-server/</a></p>
<h2 id="pycharm">PyCharm</h2>
<ol>
<li>Interpreter&#x8BBE;&#x5B9A;&#xFF1A;preference -&gt; project -&gt; project interpreter&#xFF0C;&#x70B9;&#x51FB;&#x5C0F;&#x6273;&#x624B;&#xFF0C;add remote&#xFF0C;&#x5982;&#x4E0B;&#x56FE;&#x8FDB;&#x884C;&#x914D;&#x7F6E;&#xFF1A;</li>
</ol>
<p><img src="https://cloud.panjunwen.com/2018/03/ping-mu-kuai-zhao-2018-03-20-xia-wu-8-31-57.png" alt="&#x5FEB;&#x901F;&#x914D;&#x7F6E;&#x6DF1;&#x5EA6;&#x5B66;&#x4E60;&#x4E3B;&#x673A;&#x73AF;&#x5883;&#xFF08;&#x4E0B;&#xFF09;" loading="lazy"></p>
<ol start="2">
<li>&#x6587;&#x4EF6;&#x540C;&#x6B65;&#xFF1A;Tools -&gt; deployment -&gt; configuration&#xFF0C;&#x6309;&#x7167;&#x4E0B;&#x56FE;&#x914D;&#x7F6E;&#xFF1A;</li>
</ol>
<p><img src="https://cloud.panjunwen.com/2018/03/ping-mu-kuai-zhao-2018-03-20-xia-wu-8-35-05.png" alt="&#x5FEB;&#x901F;&#x914D;&#x7F6E;&#x6DF1;&#x5EA6;&#x5B66;&#x4E60;&#x4E3B;&#x673A;&#x73AF;&#x5883;&#xFF08;&#x4E0B;&#xFF09;" loading="lazy"></p>
<p>&#x8BBE;&#x7F6E;&#x8DEF;&#x5F84;&#x6620;&#x5C04;&#xFF0C;&#x6CE8;&#x610F;&#x90E8;&#x7F72;&#x8DEF;&#x5F84;&#x57FA;&#x4E8E;&#x4E0A;&#x56FE;&#x7684;ROOT&#x8DEF;&#x5F84;&#x8BBE;&#x5B9A;&#x3002;</p>
<p><img src="https://cloud.panjunwen.com/2018/03/ping-mu-kuai-zhao-2018-03-20-xia-wu-8-35-25.png" alt="&#x5FEB;&#x901F;&#x914D;&#x7F6E;&#x6DF1;&#x5EA6;&#x5B66;&#x4E60;&#x4E3B;&#x673A;&#x73AF;&#x5883;&#xFF08;&#x4E0B;&#xFF09;" loading="lazy"></p>
<ol start="3">
<li>&#x52FE;&#x9009; Tools -&gt; deployment -&gt; Automatic upload&#xFF0C;&#x5373;&#x53EF;&#x81EA;&#x52A8;&#x540C;&#x6B65;&#x6587;&#x4EF6;&#x3002;</li>
</ol>
<p>PyCharm&#x6309;&#x7167;&#x4EE5;&#x4E0A;&#x6D41;&#x7A0B;&#x8BBE;&#x7F6E;&#x597D;&#x4EE5;&#x540E;&#xFF0C;&#x53EF;&#x4EE5;&#x5728;&#x53F3;&#x4FA7;&#x8FB9;&#x680F;&#x6253;&#x5F00;&#x8FDC;&#x7A0B;&#x6587;&#x4EF6;&#x6D4F;&#x89C8;&#xFF0C;&#x624B;&#x5DE5;&#x8FDB;&#x884C;&#x6587;&#x4EF6;&#x64CD;&#x4F5C;&#x3002;&#x5982;&#x679C;&#x9700;&#x8981;&#x66F4;&#x4E30;&#x5BCC;&#x7684;&#x8FDC;&#x7A0B;&#x6587;&#x4EF6;&#x7BA1;&#x7406;&#xFF0C;&#x53EF;&#x4EE5;&#x501F;&#x52A9;&#x4E0A;&#x7BC7;&#x63D0;&#x53CA;&#x7684;Samba&#x6620;&#x5C04;&#x7F51;&#x7EDC;&#x9A71;&#x52A8;&#x5668;&#x3002;&#x6216;&#x8005;&#x4F7F;&#x7528;&#x5176;&#x4ED6;SFTP&#x5DE5;&#x5177;&#x3002;</p>
<p>&#x81F3;&#x4E8E;&#x66F4;&#x590D;&#x6742;&#x7684;&#x7F51;&#x7EDC;&#x62D3;&#x6251;&#xFF0C;&#x53EF;&#x4EE5;&#x4F7F;&#x7528;&#x8DEF;&#x7531;&#x5668;&#x7684;&#x7AEF;&#x53E3;&#x6620;&#x5C04;&#x529F;&#x80FD;&#x5B9E;&#x73B0;&#x5E7F;&#x57DF;&#x7F51;&#xFF08;&#x6216;&#x6821;&#x5185;&#x7F51;&#xFF09;&#x8BBF;&#x95EE;&#x3002;</p>
<p>&#x81F3;&#x6B64;&#xFF0C;&#x53EF;&#x4EE5;&#x4F18;&#x96C5;&#x7684;&#x4F7F;&#x7528;&#x8FDC;&#x7A0B;&#x673A;&#x5668;&#x8FDB;&#x884C;&#x6DF1;&#x5EA6;&#x5B66;&#x4E60;&#x5F00;&#x53D1;&#x3002;</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[快速配置深度学习主机环境（上）]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>&#x5199;&#x4E24;&#x7BC7;&#x65E5;&#x5FD7;&#x8BB0;&#x5F55;&#x4E0B;&#x914D;&#x7F6E;&#x6DF1;&#x5EA6;&#x5B66;&#x4E60;&#x73AF;&#x5883;&#x7684;&#x6D41;&#x7A0B;&#x548C;&#x5FC3;&#x5F97;&#x3002;&#x76EE;&#x6807;&#x662F;&#x5FEB;&#x901F;&#x642D;&#x5EFA;&#x51FA;&#x6DF1;&#x5EA6;&#x5B66;&#x4E60;&#x73AF;&#x5883;&#xFF0C;&#x5B9E;&#x73B0;&#x5C40;&#x57DF;&#x7F51;&#x5185;&#x591A;&#x4EBA;&#x5171;&#x4EAB;&#x8BBF;&#x95EE;</p>]]></description><link>https://deserts.io/quick-install-cuda-on-ubuntu/</link><guid isPermaLink="false">62938184d119ff1b94794cea</guid><category><![CDATA[Deeplearning]]></category><category><![CDATA[Linux]]></category><dc:creator><![CDATA[Junwen]]></dc:creator><pubDate>Tue, 20 Mar 2018 04:09:22 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1571786256017-aee7a0c009b6?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=MnwxMTc3M3wwfDF8c2VhcmNofDN8fHNlcnZlcnxlbnwwfHx8fDE2NTM4Mzk5MTg&amp;ixlib=rb-1.2.1&amp;q=80&amp;w=2000" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><img src="https://images.unsplash.com/photo-1571786256017-aee7a0c009b6?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=MnwxMTc3M3wwfDF8c2VhcmNofDN8fHNlcnZlcnxlbnwwfHx8fDE2NTM4Mzk5MTg&amp;ixlib=rb-1.2.1&amp;q=80&amp;w=2000" alt="&#x5FEB;&#x901F;&#x914D;&#x7F6E;&#x6DF1;&#x5EA6;&#x5B66;&#x4E60;&#x4E3B;&#x673A;&#x73AF;&#x5883;&#xFF08;&#x4E0A;&#xFF09;"><p>&#x5199;&#x4E24;&#x7BC7;&#x65E5;&#x5FD7;&#x8BB0;&#x5F55;&#x4E0B;&#x914D;&#x7F6E;&#x6DF1;&#x5EA6;&#x5B66;&#x4E60;&#x73AF;&#x5883;&#x7684;&#x6D41;&#x7A0B;&#x548C;&#x5FC3;&#x5F97;&#x3002;&#x76EE;&#x6807;&#x662F;&#x5FEB;&#x901F;&#x642D;&#x5EFA;&#x51FA;&#x6DF1;&#x5EA6;&#x5B66;&#x4E60;&#x73AF;&#x5883;&#xFF0C;&#x5B9E;&#x73B0;&#x5C40;&#x57DF;&#x7F51;&#x5185;&#x591A;&#x4EBA;&#x5171;&#x4EAB;&#x8BBF;&#x95EE;&#x3002;&#x5206;&#x6210;&#x4E24;&#x90E8;&#x5206;&#x6765;&#x5199;&#xFF0C;&#x4E0A;&#x7BC7;&#x4E3B;&#x8981;&#x8BB2;&#x5FEB;&#x901F;&#x7684;&#x914D;&#x7F6E;&#x64CD;&#x4F5C;&#x7CFB;&#x7EDF;&#x548C;&#x5E95;&#x5C42;&#x73AF;&#x5883;&#xFF0C;&#x5305;&#x62EC;Ubuntu&#xFF0C;CUDA&#xFF0C;cuDNN&#x7684;&#x5B89;&#x88C5;&#xFF0C;&#x4E0B;&#x7BC7;&#x4E3B;&#x8981;&#x8BB2;&#x8F6F;&#x4EF6;&#x73AF;&#x5883;&#x7684;&#x914D;&#x7F6E;&#x548C;&#x4F7F;&#x7528;&#x3002;</p>
<p><em>&#x6CE8;&#xFF1A;TensorFlow 1.6 &#x9884;&#x7F16;&#x8BD1;&#x7248;&#x4E0D;&#x652F;&#x6301; CUDA 9.1&#xFF0C;&#x53EA;&#x652F;&#x6301;9.0&#x3002;&#x8BF7;&#x6CE8;&#x610F;&#x4E0B;&#x9762;&#x7684;&#x8DEF;&#x5F84;&#x548C;&#x5B89;&#x88C5;&#x6587;&#x4EF6;&#x5927;&#x90E8;&#x5206;&#x90FD;&#x662F;9.1&#x3002;</em></p>
<h3 id>&#x5FEB;&#x901F;&#x5B89;&#x88C5;&#x8FC7;&#x7A0B;</h3>
<ol>
<li>
<p>&#x5B89;&#x88C5;&#x6700;&#x65B0;&#x7248;<a href="https://www.ubuntu.com/download/desktop/thank-you?country=CN&amp;version=16.04.3&amp;architecture=amd64">Ubuntu 16.04 Desktop &#x684C;&#x9762;&#x7248;</a></p>
</li>
<li>
<p>&#x51C6;&#x5907;&#x5DE5;&#x4F5C;&#xFF1A;<br>
<a href="https://developer.nvidia.com/cuda-downloads?target_os=Linux&amp;target_arch=x86_64&amp;target_distro=Ubuntu&amp;target_version=1604&amp;target_type=runfilelocal">&#x4E0B;&#x8F7D;CUDA 9.1&#x5B89;&#x88C5;&#x6587;&#x4EF6;</a>&#xFF0C;<br>
&#x5176;&#x4ED6;&#x4F9D;&#x8D56;&#x73AF;&#x5883;&#x5982;gcc&#xFF0C;Ubuntu&#x6700;&#x65B0;&#x7248;&#x5DF2;&#x7ECF;&#x81EA;&#x5E26;&#xFF0C;<br>
&#x5378;&#x8F7D;&#x5DF2;&#x6709;&#x7684;NVIDIA&#x9A71;&#x52A8;&#xFF08;&#x53EF;&#x9009;&#xFF09;&#xFF1A;<code>sudo apt-get remove --purge nvidia*</code><br>
&#x4E00;&#x4E9B;&#x5F00;&#x53D1;&#x9700;&#x8981;&#x7684;&#x5305;&#xFF08;&#x53EF;&#x9009;&#xFF09;&#xFF1A;</p>
</li>
</ol>
<pre><code>sudo apt-get install build-essential
sudo apt-get install vim cmake git
sudo apt-get install libprotobuf-dev libleveldb-dev libsnappy-dev libopencv-dev libboost-all-dev libhdf5-serial-dev
</code></pre>
<ol start="3">
<li>&#x5C4F;&#x853D;nouveau&#xFF0C;<code>sudo nano /etc/modprobe.d/blacklist-nouveau.conf</code>&#xFF0C;&#x52A0;&#x5165;</li>
</ol>
<pre><code>blacklist nouveau
blacklist lbm-nouveau
options nouveau modeset=0
alias nouveau off
alias lbm-nouveau off
</code></pre>
<p>&#x7981;&#x7528; nouveau &#x5185;&#x6838;&#x6A21;&#x5757;</p>
<pre><code>echo options nouveau modeset=0 | sudo tee -a /etc/modprobe.d/nouveau-kms.conf
sudo update-initramfs -u
</code></pre>
<p>&#x91CD;&#x542F;&#x8BA1;&#x7B97;&#x673A; <code>sudo reboot</code></p>
<ol start="4">
<li>&#xFF08;&#x5EFA;&#x8BAE;&#xFF09;&#x6C38;&#x4E45;&#x5173;&#x95ED;&#x56FE;&#x5F62;&#x754C;&#x9762;&#xFF1A;&#x66F4;&#x6539;&#x8FD0;&#x884C;&#x7EA7;&#x522B;runlevel&#x4E3A;3&#xFF0C;<code>sudo systemctl set-default multi-user.target</code>&#xFF0C;&#x4FEE;&#x6539;&#x542F;&#x52A8;&#x754C;&#x9762;&#x4E3A;&#x7EAF;&#x6587;&#x672C;&#xFF0C;<code>sudo vi /etc/default/grub</code>&#xFF0C;&#x4FEE;&#x6539;<code>GRUB_CMDLINE_LINUX_DEFAULT=&quot;text&quot;</code>&#xFF0C;&#x4FDD;&#x5B58;&#xFF0C;<code>sudo update-grub</code>&#xFF0C;&#x91CD;&#x542F;&#x540E;&#x5373;&#x4E3A;text mode&#x3002;<br>
<em>&#x4E34;&#x65F6;&#x5173;&#x95ED;&#x56FE;&#x5F62;&#x754C;&#x9762;&#xFF1A;<br>
&#x5207;&#x6362;&#x81F3;&#x6587;&#x672C;&#x6A21;&#x5F0F;&#xFF08;ctrl+alt+F1&#xFF09;&#xFF0C;&#x767B;&#x5F55;&#x5E76;&#x5207;&#x6362;&#x81F3;cuda&#x5B89;&#x88C5;&#x6587;&#x4EF6;&#x6240;&#x5728;&#x76EE;&#x5F55;&#xFF0C;&#x5173;&#x95ED;GUI&#x670D;&#x52A1;&#x3002;</em></li>
</ol>
<pre><code>sudo service lightdm stop
</code></pre>
<ol start="5">
<li>&#x6267;&#x884C;&#x5B89;&#x88C5;&#xFF08;&#x6CE8;&#x610F;&#x53C2;&#x6570;&#xFF0C;&#x4E0D;&#x5B89;&#x88C5;opengl-lib&#xFF09;</li>
</ol>
<pre><code>sudo sh cuda_&lt;version&gt;_linux.run --override --no-opengl-lib
</code></pre>
<pre><code>Do you accept the previously read EULA? (accept/decline/quit): accept
Install NVIDIA Accelerated Graphics Driver for Linux-x86_64? ((y)es/(n)o/(q)uit): y
Install the CUDA  Toolkit? ((y)es/(n)o/(q)uit): y
Enter Toolkit Location [ default is /usr/local/cuda-9.1 ]:
Do you want to install a symbolic link at /usr/local/cuda? ((y)es/(n)o/(q)uit): y
Install the CUDA Samples? ((y)es/(n)o/(q)uit): y
Enter CUDA Samples Location [ default is /home/user ]:
</code></pre>
<p>&#x5982;&#x679C;&#x5B89;&#x88C5;&#x6CA1;&#x6709;&#x62A5;&#x9519;&#xFF0C;&#x91CD;&#x542F;&#x4F7F;&#x9A71;&#x52A8;&#x751F;&#x6548;&#x3002;&#x68C0;&#x67E5;&#x9A71;&#x52A8;&#x72B6;&#x6001;&#xFF1A; <code>nvidia-smi</code>&#x3002;</p>
<p>6.&#x4FEE;&#x6539;&#x73AF;&#x5883;&#x53D8;&#x91CF;: &#xFF08;&#x53EF;&#x7F16;&#x8F91; .bashrc &#x6216; /etc/profile &#x6587;&#x4EF6;&#xFF09;</p>
<pre><code>$ export PATH=/usr/local/cuda-9.1/bin${PATH:+:${PATH}}
$ export LD_LIBRARY_PATH=/usr/local/cuda-9.1/lib64 ${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}
</code></pre>
<p>&#x7F16;&#x8BD1;&#x8FD0;&#x884C;CUDA&#x6D4B;&#x8BD5;&#x7528;&#x4F8B;&#xFF08;&#x81EA;&#x884C;&#x67E5;&#x770B;&#x5B98;&#x65B9;&#x8BF4;&#x660E;&#xFF09;&#x3002;</p>
<ol start="7">
<li><a href="https://developer.nvidia.com/cudnn">&#x6CE8;&#x518C;&#x4E0B;&#x8F7D; NVIDIA cuDNN</a> &#xFF08;&#x52A0;&#x901F;&#x795E;&#x7ECF;&#x7F51;&#x7EDC;&#x8BA1;&#x7B97;&#xFF09;&#xFF0C;&#x5B89;&#x88C5;&#x53EA;&#x9700;&#x8981;&#x89E3;&#x538B;&#x590D;&#x5236;&#x5230;&#x5BF9;&#x5E94;&#x4F4D;&#x7F6E;&#x5373;&#x53EF;</li>
</ol>
<p>Unzip the cuDNN package.</p>
<pre><code>$ tar -xzvf cudnn-&lt;&gt;.tgz
</code></pre>
<p>Copy the following files into the CUDA Toolkit directory.&#xFF08;&#x6CE8;&#x610F;&#x8DEF;&#x5F84;&#xFF09;</p>
<pre><code>$ sudo cp cuda/include/cudnn.h /usr/local/cuda/include
$ sudo cp cuda/lib64/libcudnn* /usr/local/cuda/lib64
$ sudo chmod a+r /usr/local/cuda/include/cudnn.h /usr/local/cuda/lib64/libcudnn*
</code></pre>
<p>&#x7F16;&#x8BD1;&#x8FD0;&#x884C;CUDA&#x6D4B;&#x8BD5;&#x7528;&#x4F8B;&#xFF08;&#x81EA;&#x884C;&#x67E5;&#x770B;&#x5B98;&#x65B9;&#x8BF4;&#x660E;&#xFF09;&#x3002;</p>
<h3 id>&#x89E3;&#x51B3;&#x95EE;&#x9898;&#x7684;&#x601D;&#x8DEF;</h3>
<p>&#x4E3B;&#x8981;&#x95EE;&#x9898;&#xFF1A;NVIDIA&#x9A71;&#x52A8;&#x88C5;&#x4E0D;&#x4E0A;&#xFF08;&#x6216;&#x8005;&#x88C5;&#x5B8C;&#x56FE;&#x5F62;&#x754C;&#x9762;&#x51FA;&#x73B0;&#x95EE;&#x9898;&#xFF09;&#x3001;&#x9A71;&#x52A8;&#x88C5;&#x4E0A;&#x4E86;&#x4F46;&#x548C;CUDA&#x8981;&#x6C42;&#x7684;&#x7248;&#x672C;&#x4E0D;&#x5339;&#x914D;</p>
<ol>
<li>&#x8C28;&#x614E;&#x4F7F;&#x7528;&#x6700;&#x65B0;&#x7248;NVIDIA&#x9A71;&#x52A8;&#x548C;Ubuntu&#x81EA;&#x5E26;&#x7684;&#x9644;&#x52A0;&#x9A71;&#x52A8;</li>
<li>&#x5EFA;&#x8BAE;&#x4F7F;&#x7528;CUDA&#x81EA;&#x5E26;&#x7684;GPU&#x9A71;&#x52A8;&#x7A0B;&#x5E8F;&#xFF0C;&#x4E0D;&#x5EFA;&#x8BAE;&#x5355;&#x72EC;&#x5B89;&#x88C5;&#x9A71;&#x52A8;&#x7A0B;&#x5E8F;</li>
<li>&#x5EFA;&#x8BAE;&#x53C2;&#x8003;&#x5B98;&#x65B9;&#x6559;&#x7A0B;&#x8FDB;&#x884C;&#x5B89;&#x88C5;</li>
<li>&#x65E7;&#x7248;&#x6559;&#x7A0B;&#x53C2;&#x8003;&#x610F;&#x4E49;&#x4E0D;&#x5927;</li>
<li>&#x5EFA;&#x8BAE;&#x5173;&#x6389;&#x56FE;&#x5F62;&#x754C;&#x9762;&#x8FDB;&#x884C;&#x5B89;&#x88C5;</li>
</ol>
<h3 id="troubleshooting">Troubleshooting</h3>
<ol>
<li>
<p>&#x5B89;&#x88C5;&#x8FC7;&#x7A0B;&#x51FA;&#x73B0; &quot;The driver installation is unable to locate the kernel source. &quot;&#xFF0C;&#x4F7F;&#x7528;uname -r&#x67E5;&#x770B;&#x5185;&#x6838;&#x7248;&#x672C;&#xFF0C;&#x5982;&#x679C;&#x9AD8;&#x4E8E;4.10&#xFF0C;&#x5982;4.13.0&#xFF0C;CUDA 9.1&#x81EA;&#x5E26;&#x9A71;&#x52A8;&#x4E0D;&#x652F;&#x6301;&#x6700;&#x65B0;Linux&#x5185;&#x6838;&#xFF0C;&#x8BF7;&#x964D;&#x7EA7;&#x5185;&#x6838;&#xFF1A;</p>
<pre><code>sudo apt-get purge linux-image-4.13.0-26-generic
sudo apt-get purge linux-headers-4.13.0-26-generic
</code></pre>
<p>Update initramfs image:</p>
<pre><code>sudo update-initramfs -u
</code></pre>
<p>&#x91CD;&#x542F;&#xFF0C;&#x4F7F;&#x7528; uname -r &#x547D;&#x4EE4;&#x786E;&#x4FDD;&#x5185;&#x6838;&#x7248;&#x672C;&#x6B63;&#x786E;</p>
</li>
<li>
<p>&#x5982;&#x679C;<strong>&#x786E;&#x8BA4;</strong>&#x5185;&#x6838;&#x7248;&#x672C;&#x6CA1;&#x95EE;&#x9898;&#x4E86;&#xFF0C;&#x8FD8;&#x51FA;&#x73B0;&#xFF08;1&#xFF09;&#x7684;&#x95EE;&#x9898;&#xFF0C;&#x518D;&#x5C1D;&#x8BD5;&#x5B89;&#x88C5;&#x4EE5;&#x4E0B;&#x5305;&#xFF1A;</p>
<pre><code>apt-get install linux-source
apt-get source linux-image-$(uname -r)
apt-get install linux-headers-$(uname -r)
</code></pre>
</li>
<li>
<p>&#x5176;&#x4ED6;&#x4F60;&#x53EF;&#x80FD;&#x9047;&#x5230;&#x7684;&#x95EE;&#x9898;&#xFF0C;&#x53EF;&#x4EE5;&#x53C2;&#x8003;&#xFF1A;</p>
<p>&#x5B98;&#x65B9;&#x6559;&#x7A0B;&#xFF1A;<a href="http://docs.nvidia.com/cuda/cuda-installation-guide-linux/index.html#runfile-nouveau">http://docs.nvidia.com/cuda/cuda-installation-guide-linux/index.html#runfile-nouveau</a></p>
<p>&#x5404;&#x79CD;&#x95EE;&#x9898;&#x89E3;&#x51B3;&#x65B9;&#x6CD5;&#x548C;&#x89E3;&#x91CA;&#xFF1A;<a href="https://www.linkedin.com/pulse/installing-nvidia-cuda-80-ubuntu-1604-linux-gpu-new-victor/">https://www.linkedin.com/pulse/installing-nvidia-cuda-80-ubuntu-1604-linux-gpu-new-victor/</a></p>
</li>
</ol>
<h3 id>&#x591A;&#x4EBA;&#x73AF;&#x5883;&#x914D;&#x7F6E;</h3>
<ol>
<li>&#x5B89;&#x88C5;ssh&#x670D;&#x52A1;&#x5668;&#xFF1A;<code>sudo apt-get install openssh-server</code></li>
<li>&#x5B89;&#x88C5;samba&#x670D;&#x52A1;&#xFF1A;<code>sudo apt-get install samba</code></li>
<li>&#x521B;&#x5EFA;&#x591A;&#x4E2A;&#x7528;&#x6237;&#xFF1A;&#x7528;&#x5230;&#x7684;&#x547D;&#x4EE4;&#xFF1A;useradd&#xFF0C;usermod&#x7B49;</li>
</ol>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[算法：红黑树删除操作的实现]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>&#x6700;&#x8FD1;&#x91CD;&#x65B0;&#x62FE;&#x8D77; Sedgewick &#x7684;&#x300A;&#x7B97;&#x6CD5;&#xFF08;&#x7B2C;4&#x7248;&#xFF09;&#x300B;&#xFF0C;&#x5BF9;&#x4E4B;&#x524D;&#x5B66;&#x7684;&#x4E0D;&#x624E;&#x5B9E;&#x7684;&#x7B97;&#x6CD5;&#x548C;&#x6570;&#x636E;&#x7ED3;&#x6784;&#x505A;&#x4E2A;&#x56DE;&#x987E;&#x3002;&#x7EA2;&#x9ED1;&#x6811;&#x7684;&#x5B9E;&#x73B0;&#x548C;&#x5220;&#x9664;&#x6BD4;&#x8F83;</p>]]></description><link>https://deserts.io/red-black-tree-deletion/</link><guid isPermaLink="false">62938184d119ff1b94794ced</guid><category><![CDATA[Algorithms]]></category><category><![CDATA[Code]]></category><dc:creator><![CDATA[Junwen]]></dc:creator><pubDate>Mon, 13 Nov 2017 23:00:39 GMT</pubDate><media:content url="https://cloud.panjunwen.com/2018/11/2840083756.jpg" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><img src="https://cloud.panjunwen.com/2018/11/2840083756.jpg" alt="&#x7B97;&#x6CD5;&#xFF1A;&#x7EA2;&#x9ED1;&#x6811;&#x5220;&#x9664;&#x64CD;&#x4F5C;&#x7684;&#x5B9E;&#x73B0;"><p>&#x6700;&#x8FD1;&#x91CD;&#x65B0;&#x62FE;&#x8D77; Sedgewick &#x7684;&#x300A;&#x7B97;&#x6CD5;&#xFF08;&#x7B2C;4&#x7248;&#xFF09;&#x300B;&#xFF0C;&#x5BF9;&#x4E4B;&#x524D;&#x5B66;&#x7684;&#x4E0D;&#x624E;&#x5B9E;&#x7684;&#x7B97;&#x6CD5;&#x548C;&#x6570;&#x636E;&#x7ED3;&#x6784;&#x505A;&#x4E2A;&#x56DE;&#x987E;&#x3002;&#x7EA2;&#x9ED1;&#x6811;&#x7684;&#x5B9E;&#x73B0;&#x548C;&#x5220;&#x9664;&#x6BD4;&#x8F83;&#x590D;&#x6742;&#xFF0C;&#x8FD9;&#x91CC;&#x5BF9;&#x4E66;&#x4E2D;&#x4E00;&#x4E9B;&#x63CF;&#x8FF0;&#x4E0D;&#x591F;&#x6E05;&#x6670;&#x751A;&#x81F3;&#x6709;&#x758F;&#x6F0F;&#x7684;&#x5730;&#x65B9;&#x8FDB;&#x884C;&#x6CE8;&#x89E3;&#x3002;&#x672F;&#x8BED;&#x7684;&#x8868;&#x8FF0;&#x57FA;&#x672C;&#x4E0E;&#x300A;&#x7B97;&#x6CD5;&#x300B;&#x4E00;&#x81F4;&#xFF0C;&#x907F;&#x514D;&#x4F7F;&#x7528;&#x4E71;&#x4E03;&#x516B;&#x7CDF;&#x7684;&#x300E;&#x4EB2;&#x621A;&#x79F0;&#x547C;&#x300F;&#x3002;</p>
<p>&#x7EA2;&#x9ED1;&#x6811;&#x7684;&#x96BE;&#x70B9;&#x5728;&#x4E8E;&#x300E;&#x5199;&#x64CD;&#x4F5C;&#x300F;&#xFF0C;&#x5373;<code>put</code>&#x548C;<code>delete</code>&#x65B9;&#x6CD5;&#x7684;&#x5B9E;&#x73B0;&#x3002;&#x8FD9;&#x91CC;&#x4EE5;<code>put</code>&#x65B9;&#x6CD5;&#x7684;&#x5B9E;&#x73B0;&#x548C;&#x7B80;&#x5355;&#x5206;&#x6790;&#x4F5C;&#x4E3A;&#x70ED;&#x8EAB;&#xFF0C;&#x7740;&#x91CD;&#x8BA8;&#x8BBA;&#x4E66;&#x4E2D;&#x63CF;&#x8FF0;&#x4E0D;&#x591F;&#x6E05;&#x6670;&#x7684;<code>delete</code>&#x65B9;&#x6CD5;&#x7684;&#x5B9E;&#x73B0;&#x3002;&#x5168;&#x9762;&#x7684;&#x8BB2;&#x89E3;&#x8BF7;&#x770B;&#x539F;&#x8457;&#x548C;&#x666E;&#x6797;&#x65AF;&#x987F;&#x5927;&#x5B66;&#x7684;<a href="https://www.cs.princeton.edu/~rs/talks/LLRB/RedBlack.pdf">&#x6388;&#x8BFE;PPT</a>&#xFF0C;&#x6B64;&#x5916;&#x6709;<a href="https://algs4.cs.princeton.edu/33balanced/RedBlackBST.java.html">&#x5B8C;&#x6574;&#x4EE3;&#x7801;</a>&#x548C;<a href="https://www.cs.princeton.edu/~rs/talks/LLRB/LLRB.pdf">&#x5B8C;&#x6574;&#x8BBA;&#x6587;</a>&#x3002;</p>
<h3 id="23">2-3&#x6811;&#x548C;&#x7EA2;&#x9ED1;&#x6811;</h3>
<p>&#x7531;&#x4E8E;&#x7EA2;&#x9ED1;&#x6811;&#xFF08;LLRB Tree&#xFF09;&#x53EF;&#x4EE5;&#x770B;&#x505A;&#x662F;<strong>&#x7528;&#x4E8C;&#x53C9;&#x641C;&#x7D22;&#x6811;&#xFF08;BST&#xFF09;&#x5B9E;&#x73B0;&#x7684;2-3&#x6811;</strong>&#xFF0C;&#x6240;&#x4EE5;&#x4ECE;2-3&#x6811;&#x5165;&#x624B;&#xFF0C;&#x8BA8;&#x8BBA;&#x8FC7;&#x7A0B;&#x4E2D;&#x968F;&#x65F6;&#x56DE;&#x5230;2-3&#x6811;&#x8FDB;&#x884C;&#x6BD4;&#x5BF9;&#x5206;&#x6790;&#x3002;</p>
<p>2-3&#x6811;&#x4E3A;&#x4EC0;&#x4E48;&#x80FD;&#x4FDD;&#x6301;&#x5B8C;&#x7F8E;&#x5E73;&#x8861;&#xFF1F;</p>
<blockquote>
<p>&#x76F4;&#x89C2;&#x7684;&#x8BF4;&#xFF0C;&#x63D2;&#x5165;&#x65F6;&#xFF0C;&#x603B;&#x662F;&#x901A;&#x8FC7;&#x300E;&#x81A8;&#x80C0;&#x300F;&#x4F7F;&#x5F97;&#x539F;&#x952E;&#x7684;&#x300E;&#x5EA6;&#x300F;&#x589E;&#x52A0;&#xFF0C;&#x518D;&#x505A;&#x300E;&#x9002;&#x5F53;&#x8C03;&#x6574;&#x300F;&#x4F7F;&#x5F97;&#x6811;&#x4FDD;&#x6301;&#x5E73;&#x8861;&#x5E76;&#x6EE1;&#x8DB3;2-3&#x6811;&#x7684;&#x57FA;&#x672C;&#x6027;&#x8D28;&#xFF08;&#x5DE6;&#x503E;&#x3001;&#x53EA;&#x6709;2-&#x7ED3;&#x70B9;&#x548C;3-&#x7ED3;&#x70B9;&#xFF09;&#xFF1B;&#x5F53;&#x51FA;&#x73B0;4-&#x7ED3;&#x70B9;&#x65F6;&#xFF0C;&#x300E;&#x8C03;&#x6574;&#x64CD;&#x4F5C;&#x300F;&#x4F1A;&#x4F7F;&#x5F97;&#x6811;&#x957F;&#x9AD8;&#xFF0C;&#x56E0;&#x4E3A;&#x603B;&#x662F;&#x300E;&#x63D0;&#x51FA;&#x300F;4-&#x7ED3;&#x70B9;&#x4E2D;&#x7684;&#x300E;&#x4E2D;&#x95F4;&#x952E;&#x300F;&#xFF0C;&#x6240;&#x4EE5;&#x80FD;&#x4FDD;&#x6301;&#x5B8C;&#x7F8E;&#x5E73;&#x8861;&#x3002;</p>
</blockquote>
<p>&#x5BF9;&#x4E8E;&#x7EA2;&#x9ED1;&#x6811;&#xFF0C;&#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x8FD9;&#x4E48;&#x7406;&#x89E3;&#xFF0C;</p>
<blockquote>
<p>&#x7EA2;&#x94FE;&#x63A5;&#x6CBF;&#x7740;&#x300E;&#x4E2D;&#x95F4;&#x7ED3;&#x70B9;&#x300F;&#x5411;&#x4E0A;&#x4F20;&#x9012;&#x3002;</p>
</blockquote>
<h3 id>&#x63D2;&#x5165;&#x64CD;&#x4F5C;</h3>
<p><strong>&#x7B2C;&#x4E00;&#x8F6E;&#x70ED;&#x8EAB;&#xFF1A;</strong> &#x7EA2;&#x9ED1;&#x6811;&#x63D2;&#x5165;&#x64CD;&#x4F5C;&#x7684;&#x5B9E;&#x73B0;&#xFF0C;&#x57FA;&#x4E8E;BST&#x7684;&#x63D2;&#x5165;&#x64CD;&#x4F5C;&#xFF0C;&#x5173;&#x952E;&#x5728;&#x4E8E;&#x5B9E;&#x73B0;&#x4E0A;&#x8FF0;&#x7684;&#x300E;&#x81A8;&#x80C0;&#x300F;&#x3001;&#x300E;&#x9002;&#x5F53;&#x8C03;&#x6574;&#x300F;&#x548C;&#x300E;&#x63D0;&#x51FA;&#x4E2D;&#x95F4;&#x952E;&#x300F;&#xFF0C;&#x5373;&#x300E;&#x65B0;&#x63D2;&#x5165;&#x7ED3;&#x70B9;&#x67D3;&#x4E3A;&#x7EA2;&#x8272;&#x300F;&#x3001;&#x7528;&#x300E;&#x5DE6;&#x65CB;&#x300F;&#x4FDD;&#x8BC1;&#x5DE6;&#x503E;&#x3001;&#x300E;&#x53F3;&#x65CB;&#x300F;&#x548C;&#x300E;&#x53CD;&#x8272;&#x300F;&#x4FDD;&#x8BC1;&#x4E2D;&#x95F4;&#x7ED3;&#x70B9;&#x4E0A;&#x79FB;&#x3002;</p>
<blockquote>
<p><img src="https://cloud.panjunwen.com/2017/11/ping-mu-kuai-zhao-2017-11-14-xia-wu-2-48-38.png" alt="&#x7B97;&#x6CD5;&#xFF1A;&#x7EA2;&#x9ED1;&#x6811;&#x5220;&#x9664;&#x64CD;&#x4F5C;&#x7684;&#x5B9E;&#x73B0;" loading="lazy"></p>
</blockquote>
<p>&#x4EE5;&#x4E0A;&#x72B6;&#x6001;&#x8F6C;&#x79FB;&#x56FE;&#x63CF;&#x8FF0;&#x4E86;&#x6240;&#x6709;&#x9700;&#x8981;&#x8003;&#x8651;&#x7684;&#x60C5;&#x5F62;&#xFF0C;&#x53EF;&#x4EE5;&#x5F97;&#x51FA;&#x4E09;&#x79CD;&#x8C03;&#x6574;&#x7684;&#x5148;&#x540E;&#x987A;&#x5E8F;&#x3002;&#x63D2;&#x5165;&#x64CD;&#x4F5C;&#x4EE3;&#x7801;&#x5982;&#x4E0B;&#xFF0C;&#x6CE8;&#x91CA;&#x90E8;&#x5206;&#x4E3A;&#x7EA2;&#x9ED1;&#x6811;&#x6709;&#x522B;&#x4E8E;BST&#x7684;&#x4EE3;&#x7801;&#xFF1A;</p>
<pre><code class="language-java">    public void put(Key key, Value value) {
        root = put(root, key, value);
        //&#x6839;&#x8282;&#x70B9;&#x94FE;&#x63A5;&#x4E3A;&#x9ED1;&#x8272;
        root.color = BLACK;
    }

    private Node put(Node node, Key key, Value value) {
        if (node == null)   // &#x65B0;&#x5EFA;&#x7ED3;&#x70B9;&#x4E3A;&#x7EA2;&#x8272;
            return new Node(key, value, 1, RED);

        int cmp = key.compareTo(node.key);
        if (cmp &lt; 0)       node.left = put(node.left, key, value);
        else if (cmp &gt; 0)  node.right = put(node.right, key, value);
        else               node.value = value;

        //&#x300E;&#x5DE6;&#x65CB;&#x300F;&#x4FDD;&#x8BC1;&#x5DE6;&#x503E;
        if (!isRed(node.left) &amp;&amp; isRed(node.right)) node = rotateLeft(node);
        //&#x300E;&#x53F3;&#x65CB;&#x300F;&#x548C;&#x300E;&#x53CD;&#x8272;&#x300F;&#x4FDD;&#x8BC1;&#x4E2D;&#x95F4;&#x7ED3;&#x70B9;&#x4E0A;&#x79FB;
        if (isRed(node.left) &amp;&amp; isRed(node.left.left)) node = rotateRight(node);
        if (isRed(node.left) &amp;&amp; isRed(node.right)) flipColors(node);

        node.N = size(node.left) + size(node.right) + 1;
        return node;
    }
</code></pre>
<p>&#x4E0A;&#x8FF0;&#x63D2;&#x5165;&#x4EE3;&#x7801;&#x5728;&#x9012;&#x5F52;&#x5411;&#x4E0B;&#x8FC7;&#x7A0B;&#x4E2D;&#x4E0D;&#x65AD;&#x641C;&#x7D22;&#x76F4;&#x5230;&#x627E;&#x5230;&#x300E;&#x5408;&#x9002;&#x4F4D;&#x7F6E;&#x300F;&#x5C06;&#x65B0;&#x7ED3;&#x70B9;&#x63D2;&#x5165;&#xFF0C;&#x56DE;&#x6EAF;&#x8FC7;&#x7A0B;&#x4E2D;&#x5BF9;&#x6811;&#x8FDB;&#x884C;&#x300E;&#x4FEE;&#x6B63;&#x64CD;&#x4F5C;&#x300F;&#x3002;</p>
<p>&#x5982;&#x679C;&#x6211;&#x4EEC;&#x5C06;&#x4E0A;&#x8FF0;&#x4EE3;&#x7801;&#x4E2D;&#x7684;<code>if (isRed(node.left) &amp;&amp; isRed(node.right)) flipColors(node);</code>&#x8FD9;&#x53E5;&#x63D0;&#x524D;&#x5230;&#x9012;&#x5F52;&#x524D;&#xFF08;&#x6BD4;&#x8F83;&#x64CD;&#x4F5C;&#x4E4B;&#x524D;&#xFF09;&#xFF0C;&#x5373;&#x628A;&#x9012;&#x5F52;&#x5411;&#x4E0A;&#x65F6;&#x7684;&#x6700;&#x540E;&#x4E00;&#x6B65;&#x300E;&#x53CD;&#x8272;&#x300F;&#x64CD;&#x4F5C;&#xFF0C;&#x300E;&#x5EF6;&#x8FDF;&#x300F;&#x5230;&#x4E0B;&#x6B21;&#x63D2;&#x5165;&#x64CD;&#x4F5C;&#x4E4B;&#x524D;&#xFF0C;&#x8FD9;&#x6837;&#x63D2;&#x5165;&#x5B8C;&#x6210;&#x540E;&#x6811;&#x4E2D;&#x5C06;&#x5B58;&#x5728;4-&#x7ED3;&#x70B9;&#xFF0C;&#x751F;&#x6210;&#x7684;&#x662F;2-3-4&#x6811;&#x3002;</p>
<h3 id>&#x5220;&#x9664;&#x6700;&#x5927;&#x6700;&#x5C0F;&#x952E;</h3>
<p><strong>&#x7B2C;&#x4E8C;&#x8F6E;&#x70ED;&#x8EAB;&#xFF1A;</strong> &#x5220;&#x9664;&#x6700;&#x5C0F;&#x952E;&#x548C;&#x6700;&#x5927;&#x952E;&#x3002;&#x5728;2-3&#x6811;&#x4E2D;&#xFF0C;&#x5220;&#x9664;&#x5E95;&#x90E8;&#x7684;2-&#x7ED3;&#x70B9;&#x4F1A;&#x5F71;&#x54CD;&#x6811;&#x7684;&#x5B8C;&#x7F8E;&#x5E73;&#x8861;&#xFF0C;&#x800C;&#x5220;&#x9664;3-&#x7ED3;&#x70B9;&#x6216;4-&#x7ED3;&#x70B9;&#x4E2D;&#x7684;&#x952E;&#x5219;&#x6CA1;&#x6709;&#x95EE;&#x9898;&#x3002;</p>
<blockquote>
<p>&#x5220;&#x9664;&#x64CD;&#x4F5C;&#x53EF;&#x4EE5;&#x89C6;&#x4E3A;&#x63D2;&#x5165;&#x64CD;&#x4F5C;&#x7684;&#x300E;&#x9006;&#x64CD;&#x4F5C;&#x300F;&#x3002;&#x5982;&#x5220;&#x9664;&#x6700;&#x5C0F;&#x952E;&#x64CD;&#x4F5C;&#x4E2D;&#xFF0C;&#x6CBF;&#x7740;&#x5DE6;&#x94FE;&#x63A5;&#x5411;&#x4E0B;&#x53D8;&#x6362;&#x4F7F;&#x5F97;&#x7EA2;&#x94FE;&#x63A5;&#x5411;&#x5DE6;&#x4E0B;&#x79FB;&#x52A8;&#xFF0C;&#x786E;&#x4FDD;&#x5F53;&#x524D;&#x7ED3;&#x70B9;&#x4E0D;&#x662F;2-&#x7ED3;&#x70B9;&#x3002;</p>
</blockquote>
<p>&#x4EE5;&#x5220;&#x9664;&#x6700;&#x5C0F;&#x952E;&#x4E3A;&#x4F8B;&#x5C55;&#x5F00;&#x8BF4;&#x660E;&#xFF1A;</p>
<ul>
<li>&#x5982;&#x679C;&#x5F53;&#x524D;&#x7ED3;&#x70B9;&#x7684;&#x5DE6;&#x5B50;&#x7ED3;&#x70B9;&#x4E0D;&#x662F;2-&#x7ED3;&#x70B9;&#xFF0C;&#x4E0D;&#x5904;&#x7406;&#xFF1B;</li>
<li>&#x5982;&#x679C;&#x5F53;&#x524D;&#x7ED3;&#x70B9;&#x7684;&#x5DE6;&#x5B50;&#x7ED3;&#x70B9;&#x662F;2-&#x7ED3;&#x70B9;&#xFF0C;&#x4E14;&#x5DE6;&#x5B50;&#x7ED3;&#x70B9;&#x7684;&#x300E;&#x4EB2;&#x5144;&#x5F1F;&#x300F;&#x7ED3;&#x70B9;&#x4E5F;&#x662F;2-&#x7ED3;&#x70B9;&#xFF0C;&#x5C06;&#x5F53;&#x524D;&#x7ED3;&#x70B9;&#x7684;&#x6700;&#x5C0F;&#x952E;&#x3001;&#x5DE6;&#x5B50;&#x7ED3;&#x70B9;&#x548C;&#x5176;&#x300E;&#x4EB2;&#x5144;&#x5F1F;&#x300F;&#x7ED3;&#x70B9;&#x4E09;&#x4E2A;&#x952E;&#x5408;&#x5E76;&#x6210;&#x4E00;&#x4E2A;4-&#x7ED3;&#x70B9;&#xFF1B;</li>
<li>&#x5982;&#x679C;&#x5F53;&#x524D;&#x7ED3;&#x70B9;&#x7684;&#x5DE6;&#x5B50;&#x7ED3;&#x70B9;&#x662F;2-&#x7ED3;&#x70B9;&#xFF0C;&#x4E14;&#x5DE6;&#x5B50;&#x7684;&#x300E;&#x4EB2;&#x5144;&#x5F1F;&#x300F;&#x7ED3;&#x70B9;&#x662F;<strong>3-&#x7ED3;&#x70B9;</strong>&#xFF0C;&#x5411;&#x5176;&#x300E;&#x4EB2;&#x5144;&#x5F1F;&#x300F;&#x7ED3;&#x70B9;&#x300E;&#x501F;&#x300F;&#x4E00;&#x4E2A;&#x952E;&#xFF0C;&#x4F7F;&#x5F97;&#x5DE6;&#x5B50;&#x7ED3;&#x70B9;&#x6210;&#x4E3A;3-&#x7ED3;&#x70B9;&#xFF1B;</li>
</ul>
<p>&#x4E0B;&#x56FE;&#x662F;&#x300A;&#x7B97;&#x6CD5;&#x300B;&#x4E66;&#x4E0A;2-3&#x6811;&#x5220;&#x9664;&#x6700;&#x5C0F;&#x952E;&#x8FC7;&#x7A0B;&#x4E2D;&#x6240;&#x8FDB;&#x884C;&#x7684;&#x53D8;&#x6362;&#x3002;</p>
<blockquote>
<p><img src="https://cloud.panjunwen.com/2017/11/2-3tree-delete-min-op.png" alt="&#x7B97;&#x6CD5;&#xFF1A;&#x7EA2;&#x9ED1;&#x6811;&#x5220;&#x9664;&#x64CD;&#x4F5C;&#x7684;&#x5B9E;&#x73B0;" loading="lazy"></p>
</blockquote>
<p><strong>&#x8FD9;&#x5F20;&#x56FE;&#x6709;&#x70B9;&#x95EE;&#x9898;&#xFF1A;</strong> &#x6211;&#x4EEC;&#x5728;&#x5411;&#x4E0B;&#x53D8;&#x6362;&#x8FC7;&#x7A0B;&#x4E2D;&#xFF0C;&#x53EA;&#x5141;&#x8BB8;&#x5F53;&#x524D;&#x7ED3;&#x70B9;&#x53CA;&#x300E;&#x6240;&#x8FC7;&#x7ED3;&#x70B9;&#x300F;&#x51FA;&#x73B0;&#x4E34;&#x65F6;&#x7684;4-&#x7ED3;&#x70B9;&#xFF08;&#x7EFF;&#x8272;&#x77E9;&#x5F62;&#x6807;&#x8BC6;&#xFF09;&#xFF0C;&#x5F53;&#x524D;&#x7ED3;&#x70B9;&#x7684;&#x53F3;&#x5B50;&#x7ED3;&#x70B9;&#x662F;&#x4E0D;&#x53EF;&#x80FD;&#x51FA;&#x73B0;4-&#x7ED3;&#x70B9;&#x7684;&#xFF08;&#x7D2B;&#x8272;&#x77E9;&#x5F62;&#x6807;&#x8BC6;&#xFF09;&#xFF0C;&#x8FD9;&#x4E9B;&#x4E34;&#x65F6;4-&#x7ED3;&#x70B9;&#x6216;&#x88AB;&#x63A5;&#x4E0B;&#x6765;&#x7684;&#x53D8;&#x6362;&#x62C6;&#x6563;&#xFF0C;&#x6216;&#x5728;&#x5411;&#x4E0A;&#x56DE;&#x6EAF;&#x8FC7;&#x7A0B;&#x4E2D;&#x88AB;&#x4FEE;&#x590D;&#x3002;&#x6211;&#x5728;&#x4E0A;&#x8FF0;&#x7B2C;&#x4E09;&#x70B9;&#x8BF4;&#x660E;&#x65F6;&#x5C06;&#x539F;&#x4E66;&#x7684;&#x300E;&#x4E0D;&#x662F;2-&#x7ED3;&#x70B9;&#x300F;&#x6539;&#x4E3A;&#x4E86;&#x300E;3-&#x7ED3;&#x70B9;&#x300F;&#x4E5F;&#x662F;&#x51FA;&#x4E8E;&#x6B64;&#x3002;</p>
<p>&#x5BF9;&#x4E8E;&#x6839;&#x8282;&#x70B9;&#x9700;&#x8981;&#x7559;&#x610F;&#x4E0B;&#xFF0C;&#x5728;&#x5B9E;&#x9645;&#x7EA2;&#x9ED1;&#x6811;&#x64CD;&#x4F5C;&#x4E2D;&#x5982;&#x679C;&#x6839;&#x8282;&#x70B9;&#x7684;&#x5DE6;&#x53F3;&#x7ED3;&#x70B9;&#x90FD;&#x662F;&#x9ED1;&#x94FE;&#x63A5;&#xFF0C;&#x6211;&#x4EEC;&#x628A;&#x6307;&#x5411;&#x6839;&#x8282;&#x70B9;&#x7684;&#x94FE;&#x63A5;&#x300E;&#x5047;&#x88C5;&#x300F;&#x6210;&#x7EA2;&#x8272;&#xFF0C;&#x4E5F;&#x5C31;&#x662F;&#x5047;&#x88C5;&#x6839;&#x8282;&#x70B9;&#x7684;&#x952E;&#x5728;3-&#x7ED3;&#x70B9;&#x4E2D;&#x3002;</p>
<p>&#x56DE;&#x5230;&#x7EA2;&#x9ED1;&#x6811;&#x4F3C;&#x4E4E;&#x770B;&#x8D77;&#x6765;&#x66F4;&#x6E05;&#x6670;&#xFF0C;current.right.left&#x7684;&#x989C;&#x8272;&#x51B3;&#x5B9A;&#x4E86;&#x662F;&#x5426;&#x8981;&#x5411;&#x5144;&#x5F1F;&#x7ED3;&#x70B9;&#x501F;&#xFF1A;</p>
<p>&#x4E0A;&#x8FF0;&#x7B2C;&#x4E8C;&#x79CD;&#x60C5;&#x5F62;&#xFF0C;&#x4EC5;&#x9700;&#x8981;&#x8FDB;&#x884C;&#x989C;&#x8272;&#x53CD;&#x8F6C;&#x64CD;&#x4F5C;&#xFF1A;</p>
<blockquote>
<p><img src="https://cloud.panjunwen.com/2017/11/ping-mu-kuai-zhao-2017-11-14-xia-wu-7-27-35.png" alt="&#x7B97;&#x6CD5;&#xFF1A;&#x7EA2;&#x9ED1;&#x6811;&#x5220;&#x9664;&#x64CD;&#x4F5C;&#x7684;&#x5B9E;&#x73B0;" loading="lazy"></p>
</blockquote>
<p>&#x4E0A;&#x8FF0;&#x7B2C;&#x4E09;&#x79CD;&#x60C5;&#x5F62;&#xFF0C;&#x5411;&#x5144;&#x5F1F;&#x7ED3;&#x70B9;&#x501F;&#xFF1A;</p>
<blockquote>
<p><img src="https://cloud.panjunwen.com/2017/11/ping-mu-kuai-zhao-2017-11-14-xia-wu-7-28-30.png" alt="&#x7B97;&#x6CD5;&#xFF1A;&#x7EA2;&#x9ED1;&#x6811;&#x5220;&#x9664;&#x64CD;&#x4F5C;&#x7684;&#x5B9E;&#x73B0;" loading="lazy"></p>
</blockquote>
<p>&#x4EE3;&#x7801;&#x4E5F;&#x5F88;&#x7B80;&#x6D01;&#xFF1A;</p>
<pre><code class="language-java">    public void deleteMin() {
        if (!isRed(root.left) &amp;&amp; !isRed(root.right))
            root.color = RED;
        root = deleteMin(root);
        if (!isEmpty())
            root.color = BLACK;
    }

    private Node deleteMin(Node node) {
        if (node.left == null)
            return null;
        if (!isRed(node.left) &amp;&amp; !isRed(node.right))
            node = moveRedLeft(node);
        node = deleteMin(node);
        return fixUp(node);
    }

    private Node moveRedLeft(Node node) {
        flipColors(node);
        if (isRed(node.right.left)){
            node.right = rotateRight(node.right);
            node = rotateLeft(node);
            flipColors(node);
        }
        return node;
    }
    
    private Node fixUp(Node node) {
        if (isRed(node.right)) node = rotateLeft(node);
        if (isRed(node.left) &amp;&amp; isRed(node.left.left)) node = rotateRight(node);
        if (isRed(node.left) &amp;&amp; isRed(node.right)) flipColors(node);
        return node;
    }
</code></pre>
<p>&#x8FD9;&#x91CC;&#x7684;fixUp&#x5373;&#x5411;&#x4E0A;&#x56DE;&#x6EAF;&#x8FC7;&#x7A0B;&#x4E2D;&#x7684;&#x300E;&#x4FEE;&#x590D;&#x300F;&#x64CD;&#x4F5C;&#xFF0C;&#x4E0E;&#x63D2;&#x5165;&#x64CD;&#x4F5C;&#x4E2D;&#x56DE;&#x6EAF;&#x65F6;&#x7684;&#x4EE3;&#x7801;&#x51E0;&#x4E4E;&#x4E00;&#x6837;&#x3002;&#x7B2C;&#x4E00;&#x4E2A;&#x5224;&#x65AD;&#x6539;&#x6210;&#x4E86;<code>if (isRed(node.right))</code>&#x800C;&#x4E0D;&#x662F;<code>if (!isRed(node.left) &amp;&amp; isRed(node.right))</code>&#xFF08;Why&#xFF1F;&#xFF09;&#x3002;</p>
<p>&#x5BF9;&#x4E8E;&#x5220;&#x9664;&#x6700;&#x5927;&#x952E;&#xFF0C;&#x7531;&#x4E8E;&#x6811;&#x662F;&#x5DE6;&#x503E;&#x7684;&#xFF0C;&#x7A0D;&#x6709;&#x4E0D;&#x540C;&#xFF0C;&#x76F4;&#x63A5;&#x770B;&#x4EE3;&#x7801;&#x753B;&#x56FE;&#x5206;&#x6790;&#x5373;&#x53EF;&#xFF1A;</p>
<pre><code class="language-java">    private Node deleteMax(Node node) {
        if (isRed(node.left))
            node = rotateRight(node);
        if (node.right == null)
            return null;
        if (!isRed(node.right) &amp;&amp; !isRed(node.right.left))
            node = moveRedRight(node);
        return fixUp(node);
    }

    private Node moveRedRight(Node node) {
        flipColors(node);
        if (isRed(node.left.left)) {
            node = rotateRight(node);
            flipColors(node);
        }
        return node;
    }
</code></pre>
<h3 id>&#x5220;&#x9664;&#x4EFB;&#x610F;&#x952E;</h3>
<p>&#x603B;&#x662F;&#x5220;&#x9664;&#x6700;&#x5E95;&#x90E8;&#x7684;&#x952E;&#x3002;&#x5F53;&#x9047;&#x5230;&#x5F85;&#x5220;&#x9664;&#x7684;&#x7ED3;&#x70B9;&#x65F6;&#xFF0C;&#x4F7F;&#x7528;&#x53F3;&#x5B50;&#x6811;&#x4E2D;&#x7684;&#x6700;&#x5C0F;&#x7ED3;&#x70B9;&#x66FF;&#x6362;&#x5F85;&#x5220;&#x9664;&#x7ED3;&#x70B9;&#x3002;&#x5411;&#x5DE6;&#x641C;&#x7D22;&#x65F6;&#xFF0C;&#x4F7F;&#x7528;moveRedLeft&#xFF0C;&#x5411;&#x53F3;&#x641C;&#x7D22;&#x65F6;&#x4F7F;&#x7528;moveRedRight&#x3002;</p>
<p>&#x4EE3;&#x7801;&#x7ED3;&#x5408;&#x4E86;deleteMin&#x548C;deleteMax&#xFF0C;&#x5176;&#x4E2D;&#x2460;&#x5904;&#x8868;&#x793A;&#x5F85;&#x5220;&#x9664;&#x7684;&#x7ED3;&#x70B9;&#x6B63;&#x597D;&#x5728;&#x5E95;&#x90E8;&#xFF0C;&#x53EF;&#x4EE5;&#x76F4;&#x63A5;&#x5220;&#x9664;&#xFF0C;&#x2461;&#x5904;&#x4F7F;&#x7528;&#x4E86;&#x5C0F;&#x6280;&#x5DE7;&#xFF0C;&#x4F7F;&#x7528;&#x53F3;&#x5B50;&#x6811;&#x7684;&#x6700;&#x5C0F;&#x7ED3;&#x70B9;&#x7684;key&#x548C;val&#x66F4;&#x65B0;&#x5F85;&#x5220;&#x9664;&#x7ED3;&#x70B9;&#x7684;&#x5C5E;&#x6027;&#x3002;&#x548C;&#x4E4B;&#x524D;&#x4E00;&#x6837;&#xFF0C;&#x9700;&#x8981;&#x5728;&#x56DE;&#x6EAF;&#x8FC7;&#x7A0B;&#x4E2D;&#x4FEE;&#x590D;&#x7EA2;&#x9ED1;&#x6811;&#x3002;</p>
<pre><code class="language-java">    private Node delete(Node node, Key key) {
        int cmp = key.compareTo(node.key);
        if (cmp &lt; 0){
            if (!isRed(node.left) &amp;&amp; isRed(node.left.left))
                node = moveRedLeft(node);
            node.left = delete(node.left, key);
        } else {
            if (isRed(node.left))
                node = rotateRight(node);
            if (cmp == 0 &amp;&amp; node.right == null) // &#x2460;
                return null;
            if (!isRed(node.right) &amp;&amp; !isRed(node.right.left))
                node = moveRedRight(node);
            if (cmp == 0) {                     // &#x2461;
                node.value = get(node.right, min(node.right).key);
                node.key = min(node.right).key;
                node.right = deleteMin(node.right);
            }
            else node.right = delete(node.right, key);
        }
        return fixUp(node);
    }
</code></pre>
<p><strong>&#x5C0F;&#x7ED3;&#xFF1A;</strong> &#x7EA2;&#x9ED1;&#x6811;&#x7684;&#x5220;&#x9664;&#x64CD;&#x4F5C;&#x5B9E;&#x73B0;&#x8D77;&#x6765;&#x786E;&#x5B9E;&#x5F88;&#x96BE;&#x4E5F;&#x5F88;&#x7E41;&#x7410;&#xFF0C;&#x7ED3;&#x5408;2-3&#x6811;&#x5E76;&#x4F7F;&#x7528;LLRB&#x80FD;&#x591F;&#x964D;&#x4F4E;&#x4E00;&#x90E8;&#x5206;&#x96BE;&#x5EA6;&#x3002;&#x7136;&#x800C;&#x8FD8;&#x662F;&#x6709;&#x4E9B;&#x7EC6;&#x8282;&#x503C;&#x5F97;&#x63A8;&#x6572;&#x7422;&#x78E8;&#x3002;</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Valine: 独立博客评论系统]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>@&#x4E91;&#x6DE1;&#x98CE;&#x8F7B; &#x5F00;&#x53D1;&#x4E86;<a href="https://ioliu.cn/2017/add-valine-comments-to-your-blog/">Valine&#x4E00;&#x6B3E;&#x6781;&#x7B80;&#x7684;&#x8BC4;&#x8BBA;&#x7CFB;&#x7EDF;</a> &#x3002;&#x6211;&#x5192;&#x6627;&#x505A;&#x4E86;&#x4E8C;&#x6B21;&#x4FEE;&#x6539;&#x7ED9;&#x81EA;&#x5DF1;&#x7684;&#x535A;&#x5BA2;&#x7528;&#x4E0A;&#xFF1B;&#x5F3A;&#x8FEB;&#x75C7;&#x4F7F;&#x7136;&#xFF0C;&#x8FD9;&#x4E24;&#x5929;&#x53C8;&#x71AC;&#x591C;&#x5199;&#x4E86;</p>]]></description><link>https://deserts.io/diy-a-comment-system/</link><guid isPermaLink="false">62938184d119ff1b94794cd7</guid><category><![CDATA[折腾]]></category><category><![CDATA[Blog]]></category><category><![CDATA[Code]]></category><dc:creator><![CDATA[Junwen]]></dc:creator><pubDate>Mon, 14 Aug 2017 02:57:47 GMT</pubDate><media:content url="https://cloud.panjunwen.com/2017/08/sarah-dorweiler-123483.jpg" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><img src="https://cloud.panjunwen.com/2017/08/sarah-dorweiler-123483.jpg" alt="Valine: &#x72EC;&#x7ACB;&#x535A;&#x5BA2;&#x8BC4;&#x8BBA;&#x7CFB;&#x7EDF;"><p>@&#x4E91;&#x6DE1;&#x98CE;&#x8F7B; &#x5F00;&#x53D1;&#x4E86;<a href="https://ioliu.cn/2017/add-valine-comments-to-your-blog/">Valine&#x4E00;&#x6B3E;&#x6781;&#x7B80;&#x7684;&#x8BC4;&#x8BBA;&#x7CFB;&#x7EDF;</a> &#x3002;&#x6211;&#x5192;&#x6627;&#x505A;&#x4E86;&#x4E8C;&#x6B21;&#x4FEE;&#x6539;&#x7ED9;&#x81EA;&#x5DF1;&#x7684;&#x535A;&#x5BA2;&#x7528;&#x4E0A;&#xFF1B;&#x5F3A;&#x8FEB;&#x75C7;&#x4F7F;&#x7136;&#xFF0C;&#x8FD9;&#x4E24;&#x5929;&#x53C8;&#x71AC;&#x591C;&#x5199;&#x4E86;&#x4E2A;&#x540E;&#x53F0;&#x7BA1;&#x7406;&#xFF0C;&#x5BF9; Valine &#x505A;&#x4E86;&#x8F7B;&#x5EA6;&#x6539;&#x9020;&#xFF0C;&#x8BA9;&#x5176;&#x66F4;&#x5408;&#x6211;&#x7684;&#x80C3;&#x53E3;&#x3002;Valine &#x53EF;&#x4EE5;&#x8BF4;&#x662F;&#x5F53;&#x524D;&#x6700;&#x597D;&#x7684;&#x72EC;&#x7ACB;&#x535A;&#x5BA2;&#x8BC4;&#x8BBA;&#x89E3;&#x51B3;&#x65B9;&#x6848;&#x4E86;&#x3002;</p>
<div>
<a class="github-button" href="https://github.com/DesertsP/Valine-Admin.git" data-icon="octicon-star" data-size="large" aria-label="Star panjunwen/Valine-Admin on GitHub">Star</a>
<a class="github-button" href="https://github.com/DesertsP/Valine-Admin/issues" data-icon="octicon-issue-opened" data-size="large" aria-label="Issue panjunwen/Valine-Admin on GitHub">Issue</a>
<a class="github-button" href="https://github.com/DesertsP/" data-size="large" aria-label="Follow @DesertsP on GitHub">Follow @DesertsP</a>
<script async defer src="https://cloud.panjunwen.com/buttons.js"></script>
</div> 
<p><a href="https://deserts.io/valine-admin-document/">&#x6700;&#x65B0;&#x7248;Valine Admin&#x914D;&#x7F6E;&#x624B;&#x518C;</a></p>
<p>Valine &#x7684;&#x7279;&#x70B9;&#xFF1A;</p>
<ul>
<li><s>&#x65E0;&#x540E;&#x7AEF;&#x5B9E;&#x73B0;</s></li>
<li>&#x9AD8;&#x901F;&#xFF0C;&#x4F7F;&#x7528;&#x56FD;&#x5185;&#x540E;&#x7AEF;&#x4E91;&#x670D;&#x52A1;&#x63D0;&#x4F9B;&#x5546; LeanCloud &#x63D0;&#x4F9B;&#x7684;&#x5B58;&#x50A8;&#x670D;&#x52A1;</li>
<li>&#x5F00;&#x6E90;&#xFF0C;&#x81EA;&#x5B9A;&#x4E49;&#x7A0B;&#x5EA6;&#x9AD8;</li>
<li>&#x652F;&#x6301;&#x90AE;&#x4EF6;&#x901A;&#x77E5;</li>
<li>&#x652F;&#x6301;&#x9A8C;&#x8BC1;&#x7801;</li>
<li>&#x652F;&#x6301; Markdown</li>
</ul>
<p>&#x6211;&#x5B8C;&#x5584;&#x5B9E;&#x73B0;&#x4E86;&#x4EE5;&#x4E0B;&#x5185;&#x5BB9;&#xFF1A;</p>
<ul>
<li>&#x5934;&#x50CF;&#x663E;&#x793A;&#x3001;&#x6837;&#x5F0F;&#x7F8E;&#x5316;&#x548C;&#x7EC6;&#x8282;&#x4F18;&#x5316;</li>
<li>&#x5B8C;&#x5584;&#x7684;&#x90AE;&#x4EF6;&#x901A;&#x77E5;&#xFF0C;&#x81EA;&#x5B9A;&#x4E49; SMTP &#x53D1;&#x4EF6;&#x9891;&#x7387;&#x548C;&#x5185;&#x5BB9;&#x4E0D;&#x518D;&#x53D7;&#x9650;</li>
<li>&#x57FA;&#x4E8E; Akismet &#x7684;&#x5783;&#x573E;&#x8BC4;&#x8BBA;&#x81EA;&#x52A8;&#x6807;&#x6CE8;&#x548C;&#x8FC7;&#x6EE4;</li>
<li>&#x8BC4;&#x8BBA;&#x7BA1;&#x7406;&#xFF0C;&#x907F;&#x514D;&#x76F4;&#x63A5;&#x64CD;&#x4F5C;&#x6570;&#x636E;&#x5E93;</li>
<li>&#x901A;&#x77E5;&#x90AE;&#x4EF6;&#x8865;&#x53D1;&#xFF08;&#x672A;&#x53D1;&#x9001;&#x6216;&#x53D1;&#x9001;&#x5931;&#x8D25;&#x7684;&#x901A;&#x77E5;&#x90AE;&#x4EF6;&#x53EF;&#x4EE5;&#x8FDB;&#x5165;&#x540E;&#x53F0;&#x8865;&#x53D1;&#xFF09;</li>
<li>Disqus &#x6570;&#x636E;&#x8FC1;&#x79FB;</li>
<li>&#x6E05;&#x7406;&#x4E0D;&#x5FC5;&#x8981;&#x7684;&#x6570;&#x636E;&#x5E93;&#x5B57;&#x6BB5;&#xFF0C;&#x63D0;&#x9AD8;&#x6548;&#x7387;</li>
</ul>
<p>&#x66F4;&#x65B0;&#x65E5;&#x5FD7;&#xFF1A;</p>
<ul>
<li>[2020/10/07] &#x79FB;&#x9664;&#x5BF9;av-min.js&#x548C;jQuery&#x7684;&#x4F9D;&#x8D56;&#xFF0C;&#x65B0;&#x589E;&#x6697;&#x9ED1;&#x6A21;&#x5F0F;&#xFF08;&#x9700;&#x8981;&#x4E3B;&#x9898;&#x914D;&#x5408;&#xFF09;&#xFF0C;&#x65B0;&#x589E;&#x8BC4;&#x8BBA;&#x8BA1;&#x6570;&#x663E;&#x793A;</li>
<li>[2019/03/03] &#x5DF2;&#x652F;&#x6301;PJAX&#x4E3B;&#x9898;</li>
<li>[2019/02/24] &#x5DF2;&#x4FEE;&#x590D;Markdown&#x8BED;&#x6CD5;&#x652F;&#x6301;&#x4E0D;&#x5B8C;&#x6574;&#x95EE;&#x9898;</li>
<li>[2018/09/16] &#x81EA;&#x5B9A;&#x4E49;&#x8868;&#x60C5;&#x5305;&#xFF08;<strong>&#x53C2;&#x8003;&#x4E0B;&#x6587;&#x914D;&#x7F6E;emoticon_url&#x53CA;emoticon_list&#x4E24;&#x4E2A;&#x53C2;&#x6570;</strong>&#xFF09;&#xFF0C;&#x53E6;&#x4E00;&#x5957;&#x9AD8;&#x6E05;&#x8868;&#x60C5;&#x5305;&#x4E0B;&#x8F7D;: <a href="http://cloud.panjunwen.com/alu.zip">&#x70B9;&#x51FB;&#x4E0B;&#x8F7D;</a> &#xFF1B;&#x5168;&#x65B0;&#x7684;&#x8BC4;&#x8BBA;&#x6837;&#x5F0F;&#xFF1B;&#x53BB;&#x9664;&#x70B9;&#x8D5E;&#x529F;&#x80FD;</li>
<li>[2018/09/14] &#x8BC4;&#x8BBA;&#x8868;&#x60C5;&#xFF0C;&#x8868;&#x60C5;&#x5305;&#x4E0B;&#x8F7D;: <a href="http://cloud.panjunwen.com/smiles.zip">&#x70B9;&#x51FB;&#x4E0B;&#x8F7D;</a> &#x89E3;&#x538B;&#x540E;&#x81EA;&#x884C;&#x6258;&#x7BA1;&#x9759;&#x6001;&#x6587;&#x4EF6;&#xFF0C;&#x9700;&#x66F4;&#x65B0;&#x914D;&#x7F6E;&#x53C2;&#x6570;</li>
<li>[2018/08/10] Disqus &#x6570;&#x636E;&#x8FC1;&#x79FB;&#x4EE3;&#x7801;&#x5F00;&#x6E90;&#xFF08;Python&#xFF09;&#xFF0C;<a href="http://cloud.panjunwen.com/disqus2lean.zip">&#x70B9;&#x51FB;&#x4E0B;&#x8F7D;</a></li>
<li>[2017/08/16] &#x9690;&#x79C1;&#x4FDD;&#x62A4;&#xFF1A;&#x654F;&#x611F;&#x5B57;&#x6BB5;&#x9650;&#x5236;&#x8BFB;&#x53D6;&#xFF0C;&#x5982; E-mail&#xFF08;&#x7528;&#x4E8E;&#x5934;&#x50CF;&#x663E;&#x793A;&#x548C;&#x8BC4;&#x8BBA;&#x901A;&#x77E5;&#xFF09;&#x3001;User-Agent&#x3001;IP&#xFF08;&#x7528;&#x4E8E;&#x5783;&#x573E;&#x8BC4;&#x8BBA;&#x5224;&#x522B;&#xFF09;</li>
<li>[2017/08/16] &#x66F4;&#x65B0;&#x4E91;&#x5F15;&#x64CE;&#x4F11;&#x7720;&#x89E3;&#x51B3;&#x65B9;&#x6848; <a href="#leanapp">&#x5173;&#x4E8E;&#x81EA;&#x52A8;&#x4F11;&#x7720;&#x95EE;&#x9898;&#x7684;&#x8BF4;&#x660E;</a></li>
</ul>
<p><a href="https://desertsp.github.io/Valine/">&#x5728;&#x7EBF;&#x9884;&#x89C8;</a></p>
<h2 id>&#x8BC4;&#x8BBA;&#x5B89;&#x88C5;</h2>
<p>&#x5B89;&#x88C5;&#x8FC7;&#x7A0B;&#x975E;&#x5E38;&#x7B80;&#x5355;&#xFF0C;&#x8FD9;&#x91CC;&#x5F15;&#x7528; Valine &#x539F;&#x4F5C;&#x8005; <a href="https://ioliu.cn/2017/add-valine-comments-to-your-blog/">@&#x4E91;&#x6DE1;&#x98CE;&#x8F7B;</a> &#x7684;&#x5B89;&#x88C5;&#x6559;&#x7A0B;&#xFF0C;&#x7A0D;&#x4F5C;&#x4FEE;&#x6539;&#x3002;</p>
<h4 id="1appidappkey">1. &#x83B7;&#x53D6; APP ID &#x548C; APP KEY</h4>
<p><a href="https://leancloud.cn/dashboard/login.html#/signup">&#x70B9;&#x51FB;&#x8FD9;&#x91CC;&#x767B;&#x5F55;&#x6216;&#x6CE8;&#x518C;Leancloud</a><br>
<a href="https://leancloud.cn/dashboard/applist.html#/newapp">&#x70B9;&#x8FD9;&#x91CC;&#x521B;&#x5EFA;&#x5E94;&#x7528;</a>&#xFF0C;&#x5E94;&#x7528;&#x540D;&#x770B;&#x4E2A;&#x4EBA;&#x559C;&#x597D;&#x3002;<br>
&#x9009;&#x62E9;&#x521A;&#x521A;&#x521B;&#x5EFA;&#x7684;&#x5E94;&#x7528;&gt;&#x8BBE;&#x7F6E;&gt;&#x9009;&#x62E9;&#x5E94;&#x7528; Key&#xFF0C;&#x7136;&#x540E;&#x4F60;&#x5C31;&#x80FD;&#x770B;&#x5230;&#x4F60;&#x7684;APP ID&#x548C;APP KEY&#x4E86;&#xFF0C;&#x53C2;&#x8003;&#x4E0B;&#x56FE;&#xFF1A;</p>
<img src="https://cloud.panjunwen.com/2017/08/006qrazegy1fibactm2csj30x80f2dhn.jpg" alt="Valine: &#x72EC;&#x7ACB;&#x535A;&#x5BA2;&#x8BC4;&#x8BBA;&#x7CFB;&#x7EDF;">
<p>&#x4E3A;&#x4E86;&#x60A8;&#x7684;&#x6570;&#x636E;&#x5B89;&#x5168;&#xFF0C;&#x8BF7;&#x586B;&#x5199;&#x5E94;&#x7528;&gt;&#x8BBE;&#x7F6E;&gt;&#x5B89;&#x5168;&#x8BBE;&#x7F6E;&#x4E2D;&#x7684;Web &#x5B89;&#x5168;&#x57DF;&#x540D;&#xFF0C;&#x5982;&#x4E0B;&#x56FE;&#xFF1A;</p>
<img src="https://cloud.panjunwen.com/2017/08/006qrazegy1fiba67warvj30re0k5abv.jpg" alt="Valine: &#x72EC;&#x7ACB;&#x535A;&#x5BA2;&#x8BC4;&#x8BBA;&#x7CFB;&#x7EDF;">
<h4 id="2">2. &#x4FEE;&#x6539;&#x4E3B;&#x9898;&#x6A21;&#x677F;</h4>
<p>&#x5728;&#x4E3B;&#x9898;&#x6A21;&#x677F;&#x7684;&#x6587;&#x7AE0;&#x9875;&#x4E2D;&#x5F15;&#x5165;&#x76F8;&#x5E94;&#x7684; js &#x5373;&#x53EF;&#xFF0C;&#x51E0;&#x4E4E;&#x6240;&#x6709;&#x535A;&#x5BA2;&#x7A0B;&#x5E8F;&#x9002;&#x7528;&#x3002;&#x4EE5; Ghost &#x535A;&#x5BA2;&#x7684;&#x9ED8;&#x8BA4;&#x4E3B;&#x9898;&#x4E3A;&#x4F8B;&#xFF0C;&#x53EA;&#x9700;&#x8981;&#x5728; &#x300C;post.hbs&#x300D; &#x6587;&#x4EF6;&#x4E2D; <code>&lt;/body&gt;</code> &#x524D;&#x63D2;&#x5165;&#x4E0B;&#x65B9;&#x7684;&#x4EE3;&#x7801;&#x5373;&#x53EF;&#x3002;</p>
<p><strong>&#x4F7F;&#x7528;PJAX&#x4E3B;&#x9898;&#x7684;&#x8BF7;&#x89C1;&#x6587;&#x672B;&#x7684;&#x4EE3;&#x7801;&#x3002;</strong></p>
<pre><code class="language-html">&lt;div id=&quot;comment&quot;&gt;&lt;/div&gt;
&lt;span id=&quot;comment-count&quot;&gt;&lt;/span&gt;
</code></pre>
<pre><code class="language-html">&lt;script&gt;
    comment_el = &apos;#comment&apos;;
    comment_count_el = &apos;span.comment-count&apos;;
    new Valine({
        el: comment_el,				// &#x8BC4;&#x8BBA;&#x533A;&#x5143;&#x7D20;&#xFF08;&#x8981;&#x6C42;div&#xFF09;
        count_el: comment_count_el,    // &#x8BC4;&#x8BBA;&#x8BA1;&#x6570;&#x5143;&#x7D20;&#xFF08;&#x8981;&#x6C42;span&#xFF09;
        lang: &apos;zh-cn&apos;,							   // &#x8BED;&#x8A00;&#xFF08;zh-cn&#x6216;en&#xFF09;
        emoticon_url: &apos;https://cloud.panjunwen.com/alu&apos;, // &#x8868;&#x60C5;&#x5305;&#x6839;&#x76EE;&#x5F55;&#xFF08;&#x81EA;&#x884C;&#x89E3;&#x51B3;&#x6587;&#x4EF6;&#x6258;&#x7BA1;&#xFF09;
        emoticon_list: [&quot;&#x5410;.png&quot;, &quot;&#x72C2;&#x6C57;.png&quot;, &quot;&#x4E0D;&#x8BF4;&#x8BDD;.png&quot;], // &#x8868;&#x60C5;&#x5305;&#x6587;&#x4EF6;&#x5217;&#x8868;
        app_id: &apos;&#x4F60;&#x7684;App ID&apos;,			    										   	
        app_key: &apos;&#x4F60;&#x7684;App Key&apos;,    										      
        placeholder: &apos;Write a comment&apos;,  // &#x63D0;&#x793A;&#x7B26;
        admin_email_hash: &apos;f32fc1c3f6674bfb5621a60901b5f96c&apos;, // &#x53EF;&#x9009;&#xFF0C;&#x7BA1;&#x7406;&#x5458;&#x90AE;&#x7BB1;md5&#xFF0C;&#x7528;&#x4E8E;&#x663E;&#x793A;&#x7BA1;&#x7406;&#x5458;&#x6807;&#x5FD7;&#x1F46E;&#x200D;
        max_nest: 3,					// &#x5D4C;&#x5957;&#x8BC4;&#x8BBA;&#x6DF1;&#x5EA6;&#xFF0C;&#x592A;&#x5927;&#x4F1A;&#x5F71;&#x54CD;&#x52A0;&#x8F7D;&#x901F;&#x5EA6;
        page_size: 5					// &#x5206;&#x9875;&#x5927;&#x5C0F;
    });
&lt;/script&gt;
</code></pre>
<p><code>Valine.min.js</code>  &#x4F60;&#x53EF;&#x4EE5;&#x4F7F;&#x7528;&#x522B;&#x4EBA;&#x7684;&#x6216;&#x8005;&#x4E0A;&#x4F20;&#x5230;&#x81EA;&#x5DF1;&#x7684;&#x670D;&#x52A1;&#x5668;&#x6216;&#x4E3B;&#x673A;&#xFF1A;<a href="https://github.com/panjunwen/Valine/releases/">Valine Ex</a></p>
<p>&#x9700;&#x8981;&#x4FEE;&#x6539;&#x7684;&#x53EA;&#x6709;&#xFF1A;el&#x3001;app_id &#x548C; app_key&#x3002;&#x5982;&#x679C;&#x4E4B;&#x524D;&#x6709;&#x7528;&#x539F;&#x7248;Valine&#xFF0C;&#x8BF7;&#x5C06;&#x90AE;&#x4EF6;&#x901A;&#x77E5;&#x548C;&#x9A8C;&#x8BC1;&#x7801;&#x5173;&#x6389;&#xFF1A;notify: false, verify: false&#xFF0C;&#x907F;&#x514D;&#x91CD;&#x590D;&#x53D1;&#x901A;&#x77E5;&#x3002;&#x7B97;&#x672F;&#x9A8C;&#x8BC1;&#x7801;&#x53CD;&#x4EBA;&#x7C7B;&#xFF0C;&#x5F3A;&#x70C8;&#x5EFA;&#x8BAE;&#x505C;&#x7528;&#x3002;<br>
&#x81F3;&#x6B64;&#xFF0C;&#x4F60;&#x7684;&#x8BC4;&#x8BBA;&#x7CFB;&#x7EDF;&#x5DF2;&#x7ECF;&#x53EF;&#x4EE5;&#x5DE5;&#x4F5C;&#x4E86;&#xFF01;&#x662F;&#x4E0D;&#x662F;&#x5F88;&#x7B80;&#x5355;?</p>
<p><strong>&#x7279;&#x522B;&#x63D0;&#x9192;&#xFF0C;&#x4E3A;&#x786E;&#x4FDD;&#x6570;&#x636E;&#x5B89;&#x5168;&#xFF0C;&#x8BF7;&#x5408;&#x7406;&#x8BBE;&#x7F6E;&#x6570;&#x636E;&#x5E93;&#x6743;&#x9650;&#x3002;&#x6B64;&#x5916;&#xFF0C;&#x8BF7;&#x52A1;&#x5FC5;&#x8BBE;&#x7F6E; Web &#x5B89;&#x5168;&#x57DF;&#x540D;&#x3002;</strong></p>
<h2 id></h2>
<h4 id="3">3. &#x6697;&#x9ED1;&#x6A21;&#x5F0F;&#x5207;&#x6362;</h4>
<p>&#x4E3A;&#x4E86;&#x5B9E;&#x73B0;&#x4E3B;&#x9898;&#x548C;&#x8BC4;&#x8BBA;&#x7684;&#x540C;&#x6B65;&#x5207;&#x6362;&#xFF0C;&#x4E14;&#x7B26;&#x5408;&#x4E3B;&#x9898;&#x7684;&#x914D;&#x8272;&#xFF0C;&#x65B0;&#x7248;&#x672C;&#x4E2D;&#x53BB;&#x6389;&#x4E86;Valine&#x7684;&#x989C;&#x8272;&#x5B9A;&#x4E49;&#xFF0C;&#x6539;&#x7528;CSS&#x53D8;&#x91CF;&#x63A7;&#x5236;&#x524D;&#x666F;&#x548C;&#x80CC;&#x666F;&#x8272;&#x3002;&#x4F7F;&#x7528;&#x5982;&#x4E0B;5&#x4E2A;&#x53D8;&#x91CF;&#x63A7;&#x5236;&#x8BC4;&#x8BBA;&#x533A;&#x8272;&#x5F69;&#x3002;&#x5982;&#x679C;&#x4F60;&#x7684;&#x4E3B;&#x9898;&#x8272;&#x5F69;&#x5B9A;&#x4E49;&#x4E0E;&#x5982;&#x4E0B;&#x4E0D;&#x540C;&#xFF0C;&#x6216;&#x8005;&#x4E0D;&#x652F;&#x6301;&#x6697;&#x9ED1;&#x6A21;&#x5F0F;&#x5207;&#x6362;&#xFF0C;&#x9700;&#x8981;&#x6DFB;&#x52A0;&#x5982;&#x4E0B;CSS&#x6765;&#x63D0;&#x4F9B;&#x8272;&#x5F69;&#x53D8;&#x91CF;&#x3002;</p>
<pre><code class="language-CSS">:root {
  /* light theme color */
  --background: #fff;
  --background-secondary: #eaeaea;
  --color: #222;
  --color-secondary: #999;
  --border-color: #dcdcdc;
}

/* dark theme colors &#x5982;&#x679C;&#x4E0D;&#x9700;&#x8981;&#x81EA;&#x52A8;&#x5207;&#x6362;&#x53EF;&#x4EE5;&#x628A;&#x8FD9;&#x91CC;&#x53BB;&#x6389; */
@media (prefers-color-scheme: dark) {
  :root {
    --background: #292a2d;
    --background-secondary: #3b3d42;
    --color: #a9a9b3;
    --color-secondary: #73747b;
    --border-color: #4a4b50;
  }
}
</code></pre>
<h2 id>&#x4E91;&#x5F15;&#x64CE;&#x4E00;&#x952E;&#x90E8;&#x7F72;</h2>
<p>&#x8BF7;&#x53C2;&#x8003; {{&lt;link &quot;valine-admin-document&quot;&gt;}}</p>
<h2 id>&#x6570;&#x636E;&#x8FC1;&#x79FB;</h2>
<p>&#x8BF7;&#x53C2;&#x8003;<a href="https://github.com/DesertsP/disqus2valine">DisqusLeanCloud</a></p>
<h2 id>&#x6548;&#x679C;</h2>
<p>&#x524D;&#x7AEF;&#x6548;&#x679C;&#xFF1A;</p>
<img src="https://cloud.panjunwen.com/2017/08/ping-mu-kuai-zhao-2017-08-14-xia-wu-5-48-25.png" alt="Valine: &#x72EC;&#x7ACB;&#x535A;&#x5BA2;&#x8BC4;&#x8BBA;&#x7CFB;&#x7EDF;">
<p><a href="https://deserts.leanapp.cn">&#x540E;&#x53F0;&#x6F14;&#x793A;</a></p>
<p>&#x540E;&#x53F0;&#x622A;&#x56FE;&#xFF1A;</p>
<p><img src="https://cloud.panjunwen.com/2017/11/ping-mu-kuai-zhao-2017-11-12-xia-wu-2-57-13.png" alt="Valine: &#x72EC;&#x7ACB;&#x535A;&#x5BA2;&#x8BC4;&#x8BBA;&#x7CFB;&#x7EDF;" loading="lazy"></p>
<p>&#x90AE;&#x4EF6;&#x901A;&#x77E5;&#xFF1A;</p>
<p><img src="https://cloud.panjunwen.com/2017/11/ping-mu-kuai-zhao-2017-11-12-xia-wu-2-52-48.png" alt="Valine: &#x72EC;&#x7ACB;&#x535A;&#x5BA2;&#x8BC4;&#x8BBA;&#x7CFB;&#x7EDF;" loading="lazy"></p>
<h2 id>&#x5C0F;&#x7ED3;</h2>
<p>Valine &#x300E;&#x65E0;&#x540E;&#x7AEF;&#x300F;&#x5DF2;&#x7ECF;&#x53EF;&#x4EE5;&#x5F88;&#x597D;&#x7684;&#x8FD0;&#x884C;&#xFF0C;&#x4F46;&#x53CD;&#x5783;&#x573E;&#x8BC4;&#x8BBA;&#x548C;&#x90AE;&#x4EF6;&#x901A;&#x77E5;&#x8FD8;&#x5F97;&#x9760;&#x540E;&#x53F0;&#x6765;&#x505A;&#xFF0C;&#x6B63;&#x597D; LeanCloud &#x63D0;&#x4F9B;&#x514D;&#x8D39;&#x7684;&#x4E91;&#x5F15;&#x64CE;&#x548C;&#x4E91; Hook&#xFF0C;&#x5F97;&#x4EE5;&#x5B9E;&#x73B0;&#x4E0A;&#x8FF0;&#x529F;&#x80FD;&#x3002;LeanCloud &#x5B9E;&#x5728;&#x592A;&#x597D;&#x7528;&#x4E86;&#xFF0C;&#x501F;&#x52A9;&#x5B98;&#x65B9;&#x7684;&#x793A;&#x4F8B;&#x7A0B;&#x5E8F;&#xFF0C;&#x8FDE; JavaScript &#x8BED;&#x6CD5;&#x90FD;&#x4E0D;&#x61C2;&#x5C31;&#x786C;&#x7740;&#x5934;&#x76AE;&#x7528; Nodejs &#x4E86;&#xFF0C;&#x4EE3;&#x7801;&#x867D;&#x7136;&#x5F88;&#x4E11;&#x8FD8;&#x662F;&#x653E;&#x51FA;&#x6765;&#xFF0C;Github&#xFF1A;<a href="https://github.com/panjunwen/Valine-Admin">Valine-Admin</a>&#x3002;&#x53E6;&#x5916;&#x6570;&#x636E;&#x8FC1;&#x79FB;&#x662F;&#x7528; Flask &#x5199;&#x7684;&#xFF0C;&#x4E5F;&#x662F;&#x7B2C;&#x4E00;&#x6B21;&#x7528;&#xFF0C;&#x6240;&#x4EE5;&#x5C31;&#x4E0D;&#x653E;&#x6E90;&#x7801;&#x732E;&#x4E11;&#x4E86;&#x3002;</p>
<h2 id="pjax">PJAX&#x652F;&#x6301;&#xFF08;&#x5B9E;&#x9A8C;&#x6027;&#xFF09;</h2>
<p>&#x5BF9;&#x4E8E;&#x4F7F;&#x7528;pjax&#x7684;&#x4E3B;&#x9898;&#xFF0C;&#x53EF;&#x4EE5;&#x91C7;&#x7528;&#x4E0B;&#x9762;&#x7684;&#x4EE3;&#x7801;&#x52A0;&#x5230;&#x524D;&#x7AEF;<strong>jQuery&#x52A0;&#x8F7D;&#x4E4B;&#x540E;&#x7684;&#x4F4D;&#x7F6E;</strong>&#xFF0C;&#x786E;&#x4FDD;&#x8FD9;&#x4E9B;js&#x4EE3;&#x7801;<strong>&#x53EA;&#x52A0;&#x8F7D;&#x4E00;&#x6B21;</strong>&#xFF0C;<strong>&#x4E0D;&#x8981;</strong>&#x52A0;&#x5230;<code>&lt;div class=&quot;comment&quot;&gt;&lt;/div&gt;</code>&#x5185;&#x90E8;&#x6216;&#x9644;&#x8FD1;&#x3002;</p>
<pre><code class="language-html">&lt;!--&#x786E;&#x4FDD;jQuery&#x5DF2;&#x7ECF;&#x5728;&#x6B64;&#x4E4B;&#x524D;&#x52A0;&#x8F7D;--&gt;
&lt;script src=&quot;//cdn1.lncld.net/static/js/3.0.4/av-min.js&quot;&gt;&lt;/script&gt;
&lt;script src=&quot;&#x4F60;&#x6258;&#x7BA1;&#x7684;Valine&#x8DEF;&#x5F84;./dist/Valine.min.js&quot;&gt;&lt;/script&gt;
&lt;script&gt;
    &lt;!--.comment&#x8981;&#x4E0E;&#x8BC4;&#x8BBA;&#x533A;&#x5143;&#x7D20;&#x4E00;&#x81F4;--&gt;
    comment_el = &apos;.comment&apos;;
    load_valine = function () {
      if ($(comment_el).length) {
        new Valine({ 
          av: AV,
          el: comment_el,
          emoticon_url: &apos;https://cloud.panjunwen.com/alu&apos;,
          emoticon_list: [&quot;&#x55B7;&#x8840;.png&quot;,&quot;&#x72C2;&#x6C57;.png&quot;,&quot;&#x4E0D;&#x8BF4;&#x8BDD;.png&quot;,&quot;&#x6C57;.png&quot;,&quot;&#x5750;&#x7B49;.png&quot;,&quot;&#x732E;&#x82B1;.png&quot;,&quot;&#x4E0D;&#x9AD8;&#x5174;.png&quot;,&quot;&#x4E2D;&#x5200;.png&quot;,&quot;&#x5BB3;&#x7F9E;.png&quot;],
          app_id: &apos;&#x4F60;&#x7684;id&apos;,
          app_key: &apos;&#x4F60;&#x7684;key&apos;,
          placeholder: &apos;Write a Comment&apos;
          });
      }
    };
    $(document).ready(load_valine);
    $(document).on(&apos;pjax:complete&apos;, function() {
      load_valine();
    });
&lt;/script&gt;
</code></pre>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[使用LeanCloud做评论系统]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>&#x591A;&#x8BF4;&#x79BB;&#x5F00;&#x4E5F;&#x4E0D;&#x662F;&#x4E00;&#x5929;&#x4E24;&#x5929;&#x7684;&#x4E8B;&#x60C5;&#x4E86;&#x3002;&#x6000;&#x5FF5; WordPress &#x81EA;&#x5E26;&#x7684;&#x8BC4;&#x8BBA;&#x7CFB;&#x7EDF;&#x3002;&#x6211;&#x4E00;&#x5F00;&#x59CB;&#x5C31;&#x7528; Disqus &#x793E;&#x4F1A;&#x5316;&#x8BC4;&#x8BBA;?&#xFF0C;&#x73B0;&#x5728;&#x4E5F;&#x5F7B;&#x5E95;&#x5BCC;&#x5F3A;&#x6C11;&#x4E3B;&#x6587;</p>]]></description><link>https://deserts.io/from-disqus-to-leancloud/</link><guid isPermaLink="false">62938184d119ff1b94794cdb</guid><category><![CDATA[Blog]]></category><category><![CDATA[折腾]]></category><category><![CDATA[Code]]></category><category><![CDATA[Development]]></category><dc:creator><![CDATA[Junwen]]></dc:creator><pubDate>Tue, 08 Aug 2017 19:18:33 GMT</pubDate><media:content url="https://cloud.panjunwen.com/2017/08/cooperate.jpg" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><img src="https://cloud.panjunwen.com/2017/08/cooperate.jpg" alt="&#x4F7F;&#x7528;LeanCloud&#x505A;&#x8BC4;&#x8BBA;&#x7CFB;&#x7EDF;"><p>&#x591A;&#x8BF4;&#x79BB;&#x5F00;&#x4E5F;&#x4E0D;&#x662F;&#x4E00;&#x5929;&#x4E24;&#x5929;&#x7684;&#x4E8B;&#x60C5;&#x4E86;&#x3002;&#x6000;&#x5FF5; WordPress &#x81EA;&#x5E26;&#x7684;&#x8BC4;&#x8BBA;&#x7CFB;&#x7EDF;&#x3002;&#x6211;&#x4E00;&#x5F00;&#x59CB;&#x5C31;&#x7528; Disqus &#x793E;&#x4F1A;&#x5316;&#x8BC4;&#x8BBA;?&#xFF0C;&#x73B0;&#x5728;&#x4E5F;&#x5F7B;&#x5E95;&#x5BCC;&#x5F3A;&#x6C11;&#x4E3B;&#x6587;&#x660E;&#x4E86;&#x3002;&#x4ECE; Hexo &#x6362;&#x56DE;&#x4E86; Ghost &#xFF0C;&#x6570;&#x636E;&#x5E93;&#x6709;&#x4E86;&#x53EF;&#x8BC4;&#x8BBA;&#x7CFB;&#x7EDF;&#x8FD8;&#x662F;&#x4E0D;&#x5B58;&#x5728;&#x3002;&#x4E5F;&#x6709;&#x5982; isso &#x8FD9;&#x6837;&#x7684;&#x7EAF;&#x7CB9;&#x7684;&#x8BC4;&#x8BBA;&#x7CFB;&#x7EDF;&#xFF0C;&#x5C31;&#x662F;&#x559C;&#x6B22;&#x4E0D;&#x8D77;&#x6765;&#x3002;&#x8003;&#x8651;&#x9020;&#x4E2A;&#x8F6E;&#x5B50;&#x3002;</p>
<h2 id>&#x9020;&#x8F6E;&#x5B50;</h2>
<p>&#x5B66;&#x4E60; Android &#x65F6;&#x987A;&#x4FBF;&#x7528;&#x4E86;&#x4E0B; LeanCloud &#x7684;&#x5B58;&#x50A8;&#x670D;&#x52A1;&#xFF0C;&#x6709;&#x514D;&#x8D39;&#x7684;&#x5F00;&#x53D1;&#x8005;&#x7248;&#x63D0;&#x4F9B;&#xFF0C;&#x7528;&#x8D77;&#x6765;&#x5F88;&#x987A;&#x624B;&#x3002;</p>
<p>&#x5F00;&#x53D1;&#x8005;&#x7248;&#x7684;&#x4E3B;&#x8981;&#x8D44;&#x6E90;&#x6307;&#x6807;&#xFF1A;10 GB &#x514D;&#x8D39;&#x7A7A;&#x95F4;&#xFF0C;3,0000 API&#x8BF7;&#x6C42;/&#x5929;&#x3002;&#x666E;&#x901A;&#x535A;&#x5BA2;&#x8DB3;&#x591F;&#x4E86;&#x3002;</p>
<p>&#x6628;&#x5929;&#x4E0B;&#x5348;&#x53BB;&#x770B; JavaScript &#x7684;&#x6587;&#x6863;&#xFF0C;&#x51C6;&#x5907;&#x5E72;&#x6D3B;&#xFF1B;&#x665A;&#x4E0A;&#x5230;&#x5BBF;&#x820D;&#x987A;&#x624B;&#x641C;&#x4E86;&#x4E0B;&#x300E;LeanCloud &#x8BC4;&#x8BBA;&#x300F;&#xFF0C;&#x51E0;&#x5C0F;&#x65F6;&#x524D;&#x4E00;&#x4E2A;&#x8F6E;&#x5B50;&#x5DF2;&#x7ECF;&#x8BDE;&#x751F;&#x4E86;&#x2014;&#x2014;<a href="https://ioliu.cn/2017/add-valine-comments-to-your-blog/">Valine &#x4E00;&#x6B3E;&#x6781;&#x7B80;&#x7684;&#x8BC4;&#x8BBA;&#x7CFB;&#x7EDF;</a>&#x3002;&#x4E0D;&#x77E5;&#x9053;&#x662F;&#x8BE5;&#x9AD8;&#x5174;&#x5462;&#x8FD8;&#x662F;&#x8BE5;&#x9AD8;&#x5174;&#x5462;&#x3002;&#x603B;&#x6709;&#x4EBA;&#x963B;&#x6B62;&#x6211;&#x5B66; JavaScript&#xFF01;?</p>
<p>&#x6B32;&#x6C42;&#x603B;&#x662F;&#x65E0;&#x6CD5;&#x586B;&#x6EE1;&#x7684;&#xFF1A;&#x6570;&#x636E;&#x8FC1;&#x79FB;&#x662F;&#x4E2A;&#x95EE;&#x9898;&#x3002;&#x71AC;&#x591C;&#x7528; Python &#x5199;&#x4E86;&#x4E2A; Disqus2LeanCloud&#xFF0C;&#x8003;&#x8651;&#x5230;&#x4E0D;&#x662F;&#x8C01;&#x90FD;&#x6709; Python &#x73AF;&#x5883;&#xFF0C;&#x505A;&#x6210; Web &#x670D;&#x52A1;&#x53EF;&#x4EE5;&#x65B9;&#x4FBF;&#x5927;&#x5BB6;&#xFF08;&#x9A97;&#x70B9;&#x6D41;&#x91CF;&#xFF09;&#x3002;&#x7FFB;&#x4E86;&#x7FFB; Flask &#x7684;&#x6587;&#x6863;&#x5C31;&#x4E0A;&#x624B;&#x505A;&#x4E86;&#xFF0C;&#x653E;&#x5230;&#x4E86;&#x81EA;&#x5DF1;&#x7684;&#x4E3B;&#x673A;&#x4E0A; <a href="http://disqus.panjunwen.com/">Disqus2LeanCloud</a>&#x3002;&#x7B2C;&#x4E00;&#x6B21;&#x7528; Flask&#xFF0C;Python &#x653E;&#x5F00;&#x4E5F;&#x6709;&#x6BB5;&#x65F6;&#x95F4;&#x4E86;&#xFF08;&#x5B66;&#x6821;&#x5929;&#x5929;&#x903C;&#x7740;&#x7528; Java&#xFF0C;&#x6211;&#x7684;&#x4FE1;&#x4EF0;&#x5FEB;&#x52A8;&#x6447;&#x4E86;&#xFF09;&#x3002;</p>
<h2 id>&#x6570;&#x636E;&#x8FC1;&#x79FB;&#x8BF4;&#x660E;</h2>
<p><img src="https://cloud.panjunwen.com/2017/08/2017-08-09-10-54-03.png#fit" alt="&#x4F7F;&#x7528;LeanCloud&#x505A;&#x8BC4;&#x8BBA;&#x7CFB;&#x7EDF;" loading="lazy"></p>
<ol>
<li>&#x5BFC;&#x51FA;&#x6570;&#x636E;&#xFF1A;<a href="https://disqus.com/admin/discussions/export/">&#x53BB; Disqus &#x628A;&#x6570;&#x636E;&#x5BFC;&#x51FA;</a>&#xFF0C;&#x7CFB;&#x7EDF;&#x4F1A;&#x53D1;&#x538B;&#x7F29;&#x5305;&#x5230;&#x90AE;&#x7BB1;&#xFF0C;&#x89E3;&#x538B;&#x51FA;.xml&#x6587;&#x4EF6;&#x5907;&#x7528;&#xFF1B;</li>
<li>&#x5B89;&#x88C5;&#x597D;<a href="https://ioliu.cn/2017/add-valine-comments-to-your-blog/">Valine &#x8BC4;&#x8BBA;&#x7CFB;&#x7EDF;</a>&#xFF0C;&#x6682;&#x65F6;&#x4E0D;&#x8981;&#x8BBE;&#x7F6E; Web &#x5B89;&#x5168;&#x57DF;&#x540D;&#xFF08;&#x4E0D;&#x7136;&#x4EBA;&#x5BB6;&#x600E;&#x4E48;&#x8FDB;&#x53BB;&#xFF09;&#xFF1B;</li>
<li>&#x5907;&#x597D;&#x4F60;&#x7684; APP ID &#x548C; APP KEY&#xFF0C;&#x518D;&#x6B21;&#x5F3A;&#x8C03;&#x4E0D;&#x8981;&#x8BBE;&#x7F6E; Web &#x5B89;&#x5168;&#x57DF;&#x540D;&#x5148;&#xFF1B;<a href="http://disqus.panjunwen.com/">&#x6253;&#x5F00;Disqus2LeanCloud</a>&#xFF0C;&#x586B;&#x5199; APP ID &#x548C; APP KEY&#xFF0C;&#x9009;&#x62E9; .xml&#x6570;&#x636E;&#x6587;&#x4EF6;&#xFF0C;&#x70B9;&#x51FB;&#x5F00;&#x59CB;&#x5373;&#x53EF;&#xFF1B;</li>
<li>&#x6CA1;&#x4E86;&#x3002;&#x53BB;&#x8BBE;&#x7F6E;&#x4F60;&#x7684; Web &#x5B89;&#x5168;&#x57DF;&#x540D;&#x3002;</li>
</ol>
<h2 id>&#x6548;&#x679C;</h2>
<p>&#x5BFC;&#x5165;&#x5B8C;&#x6210;&#x6548;&#x679C;&#x5982;&#x4E0B;&#xFF0C;&#x7531;&#x4E8E; Valine &#x91C7;&#x7528; LeanCloud &#x9ED8;&#x8BA4;&#x751F;&#x6210;&#x7684;&#x65F6;&#x95F4;&#x4F5C;&#x4E3A;&#x8BC4;&#x8BBA;&#x65F6;&#x95F4;&#xFF0C;&#x800C;&#x8FD9;&#x4E2A;&#x65F6;&#x95F4;&#x6709;&#x53EA;&#x8BFB;&#x5C5E;&#x6027;&#xFF0C;&#x6240;&#x4EE5;&#x6CA1;&#x80FD;&#x628A; Disqus &#x4E2D;&#x7684;&#x65F6;&#x95F4;&#x8FC1;&#x79FB;&#x8FC7;&#x6765;&#x3002;&#x82E5;&#x4EE5;&#x540E;&#x6709;&#x65F6;&#x95F4;&#x4F1A;&#x7EE7;&#x7EED;&#x5B8C;&#x5584;&#x3002;</p>
<p><img src="https://cloud.panjunwen.com/2017/08/2017-08-09-11-37-08.jpg#fit" alt="&#x4F7F;&#x7528;LeanCloud&#x505A;&#x8BC4;&#x8BBA;&#x7CFB;&#x7EDF;" loading="lazy"></p>
<h2 id>&#x5C0F;&#x7ED3;</h2>
<p>Valine &#x7684;&#x6837;&#x5F0F;&#x7B80;&#x6D01;&#x6E05;&#x65B0;&#xFF0C;&#x6BD4;&#x8D77; isso &#x7B49;&#x66F4;&#x4EE4;&#x4EBA;&#x6709;&#x98DF;&#x6B32;&#x3002;&#x66F4;&#x91CD;&#x8981;&#x7684;&#x662F;&#xFF0C;&#x501F;&#x52A9;LeanCloud&#x90E8;&#x7F72;&#x6781;&#x5176;&#x65B9;&#x4FBF;&#x5FEB;&#x6377;&#x3002;</p>
<p>&#x5F53;&#x7136;&#xFF0C;&#x73B0;&#x9636;&#x6BB5;&#x4E5F;&#x6709;&#x5F88;&#x591A;&#x9700;&#x8981;&#x5B8C;&#x5584;&#x7684;&#x5730;&#x65B9; <a href="https://ioliu.cn/">@&#x4E91;&#x6DE1;&#x98CE;&#x8F7B;</a>&#xFF0C;&#x6BD4;&#x5982;&#x90AE;&#x4EF6;&#x901A;&#x77E5;&#x529F;&#x80FD;&#x3002;&#x65E2;&#x7136;&#x8925; LeanCloud &#x7684;&#x7F8A;&#x6BDB;&#xFF0C;&#x5C31;&#x7269;&#x5C3D;&#x5176;&#x7528;&#x3002;&#x867D;&#x7136; LeanCloud &#x6CA1;&#x6709;&#x63D0;&#x4F9B;&#x90AE;&#x4EF6;&#x7CFB;&#x7EDF;&#xFF0C;&#x4F46;&#x6709;&#x5B8C;&#x5584;&#x7684;&#x7528;&#x6237;&#x7CFB;&#x7EDF;&#xFF0C;&#x5305;&#x62EC;&#x6CE8;&#x518C;&#x90AE;&#x7BB1;&#x9A8C;&#x8BC1;&#x548C;&#x91CD;&#x7F6E;&#x5BC6;&#x7801;&#x90AE;&#x7BB1;&#x9A8C;&#x8BC1;&#xFF08;&#x770B;&#x8D77;&#x6765;&#x6CA1;&#x6709;&#x5355;&#x72EC;&#x89C4;&#x5B9A;&#x8C03;&#x7528;&#x6B21;&#x6570;&#x9650;&#x5236;&#xFF09;&#xFF0C;&#x800C;&#x4E14;&#x90AE;&#x4EF6;&#x6A21;&#x677F;&#x53EF;&#x4EE5;&#x968F;&#x4FBF;&#x4FEE;&#x6539;&#x3002;&#x867D;&#x7136;&#x4E0D;&#x8BBE;&#x7F6E;&#x6CE8;&#x518C;&#x548C;&#x767B;&#x5F55;&#xFF0C;&#x4F46;&#x53EF;&#x4EE5;&#x628A;&#x7528;&#x6237;&#x529F;&#x80FD;&#x7528;&#x8D77;&#x6765;&#xFF0C;&#x4F7F;&#x7528;&#x90AE;&#x7BB1;&#x4F5C;&#x4E3A;&#x7528;&#x6237;&#x552F;&#x4E00;&#x6807;&#x8BC6;&#xFF0C;&#x6536;&#x5230; @ &#x8BF7;&#x6C42;&#x65F6;&#x5BF9;&#x76F8;&#x5E94;&#x7528;&#x6237;&#x53D1;&#x9001;&#x5BC6;&#x7801;&#x91CD;&#x7F6E;&#x90AE;&#x4EF6;&#x5373;&#x53EF;&#xFF0C;&#x8FD9;&#x6837;&#x4E5F;&#x987A;&#x4FBF;&#x89E3;&#x51B3;&#x4E86; Comment &#x8868;&#x6570;&#x636E;&#x5197;&#x4F59;&#x7684;&#x95EE;&#x9898;&#x3002;</p>
<p>&#x7528;&#x6237;Gavatar&#x5934;&#x50CF;&#x4E5F;&#x6BD4;&#x8F83;&#x5BB9;&#x6613;&#xFF0C;&#x53EF;&#x4EE5;&#x4F7F;&#x7528;LeanCloud&#x7684;&#x6587;&#x4EF6;&#x5B58;&#x50A8;&#x8FDB;&#x884C;&#x5934;&#x50CF;&#x7F13;&#x5B58;&#x3002;</p>
<p>&#x73B0;&#x9636;&#x6BB5;&#x770B;&#x6765;&#xFF0C;&#x7528; Valine &#x662F;&#x4E2A;&#x4E0D;&#x9519;&#x7684;&#x8BC4;&#x8BBA;&#x7CFB;&#x7EDF;&#x89E3;&#x51B3;&#x65B9;&#x6848;&#x3002;&#x5E0C;&#x671B; LeanCloud &#x633A;&#x4F4F;&#x3002;</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Android 入门笔记(三)：Loader]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>AsyncTaskLoader is a better choice for Activity-bound thread management, because it handles lifecycle changes correctly, delivering the result to the current active activity, preventing duplication of background threads, and helping to eliminate duplication of zombie activities.</p>
<p><img src="https://cloud.panjunwen.com/2017/08/loader.png" alt="loader" loading="lazy"></p>
<h3 id="leveragingloaders">Leveraging Loaders</h3>
<p><strong>Steps:</strong></p>
<ol>
<li>Create a Loader ID</li>
<li>Fill-in Loader Callbacks</li>
<li>Init Loader with LoaderManager</li></ol>]]></description><link>https://deserts.io/android-development-note-3/</link><guid isPermaLink="false">62938184d119ff1b94794ccb</guid><category><![CDATA[Android]]></category><category><![CDATA[Code]]></category><category><![CDATA[Development]]></category><dc:creator><![CDATA[Junwen]]></dc:creator><pubDate>Mon, 07 Aug 2017 19:35:24 GMT</pubDate><media:content url="https://cloud.panjunwen.com/2017/08/patrick-tomasso-88398.jpg" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><img src="https://cloud.panjunwen.com/2017/08/patrick-tomasso-88398.jpg" alt="Android &#x5165;&#x95E8;&#x7B14;&#x8BB0;(&#x4E09;)&#xFF1A;Loader"><p>AsyncTaskLoader is a better choice for Activity-bound thread management, because it handles lifecycle changes correctly, delivering the result to the current active activity, preventing duplication of background threads, and helping to eliminate duplication of zombie activities.</p>
<p><img src="https://cloud.panjunwen.com/2017/08/loader.png" alt="Android &#x5165;&#x95E8;&#x7B14;&#x8BB0;(&#x4E09;)&#xFF1A;Loader" loading="lazy"></p>
<h3 id="leveragingloaders">Leveraging Loaders</h3>
<p><strong>Steps:</strong></p>
<ol>
<li>Create a Loader ID</li>
<li>Fill-in Loader Callbacks</li>
<li>Init Loader with LoaderManager</li>
</ol>
<p><strong>Detail:</strong></p>
<h4 id="1createaconstantinttouniquelyidentifytheloader">1. Create a constant int to uniquely identify the loader;</h4>
<p>Implement tne LoaderManager.LoaderCallbacks&lt;&gt; on Activity and override 3 methods(step 2):</p>
<pre><code class="language-java">public class MainActivity extends AppCompatActivity implements
    LoaderManager.LoaderCallbacks&lt;String&gt; 
</code></pre>
<h4 id="2overridemethodsandfillinloadercallbacks">2. Override methods and fill-in Loader Callbacks:</h4>
<pre><code class="language-java">@Override
public Loader&lt;String&gt; onCreateLoader(int id, Bundle args) {
	return new AsyncTaskLoader&lt;String&gt;(this) {
	    @Override
	    protected void onStartLoading() {
	    }
	    @Override
	    public String loadInBackground() {
	    }
	};
}

@Override
public void onLoadFinished(Loader&lt;String&gt; loader, String data) {

}

@Override
public void onLoaderReset(Loader&lt;String&gt; loader) {

}
</code></pre>
<h4 id="3getloadermanagerbycallinggetsupportloadermanager">3. Get LoaderManager by calling getSupportLoaderManager;</h4>
<p>Get Loader by calling getLoader and passing the ID; Pass data to loader by bundle&#xFF1A;</p>
<pre><code class="language-java">Bundle bundle = new Bundle();
bundle.putString(&quot;KEY&quot;, &quot;VALUE&quot;);
LoaderManager loadManager = getSupportLoaderManager();
Loader&lt;String&gt; loader = loadManager.getLoader(LOADER_ID);
if (loader == null)
    loadManager.initLoader(LOADER_ID, bundle, this);
else
    loadManager.restartLoader(LOADER_ID, bundle, this);
</code></pre>
<h2 id="cachingwithloaders">Caching With Loaders</h2>
<h4 id="1createacachemembervariableinyourasynctaskloaderimplementation">1. Create a <strong>cache</strong> member variable in your <code>AsyncTaskLoader</code> implementation.</h4>
<p>Override <code>deliverResult()</code> so that save the fetched data in your cache first, before you call the superclass&apos;s implementation of deliverResult().</p>
<pre><code class="language-java">String cache;
@Override
public void deliverResult(String data) {
    this.cache = data;
    super.deliverResult(data);
}
</code></pre>
<h4 id="2inonstartloadingcheckiftherescacheddataandifsoletyourasynctaskloaderjustdeliverthatotherwisestartloading">2. In <code>onStartLoading()</code> <strong>check if there&apos;s cached data</strong>, and if so, let your AsyncTaskLoader just deliver that. Otherwise, start loading.</h4>
<pre><code class="language-java">@Override
protected void onStartLoading() {
    /*do something here*/
    //If mGithubJson is not null, deliver that result.
    //Otherwise, force a load. 
    if (mGithubJson != null) {
      	/** I think we could call onLoadFinished directly,
            and it works for me well!**/
        //onLoadFinished(this, cache);
        deliverResult(cache);
    }else {
        forceLoad();
    }
}
</code></pre>
<p><strong>Need more ? see <a href="https://stackoverflow.com/questions/25234581/what-does-asynctaskloader-deliverresult-actually-do">here</a></strong></p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Android 入门笔记(二): Activity]]></title><description><![CDATA[<!--kg-card-begin: markdown--><h2 id="activityandintent">Activity and Intent</h2>
<p>An activity is a single, focused thing that the user can do. Almost all activities interact with the user, so the Activity class takes care of creating a window for you in which you can place your UI with <code>setContentView(View)</code>.</p>
<p>While activities are often presented to</p>]]></description><link>https://deserts.io/android-development-note-2/</link><guid isPermaLink="false">62938184d119ff1b94794cca</guid><category><![CDATA[Android]]></category><category><![CDATA[Code]]></category><category><![CDATA[Development]]></category><dc:creator><![CDATA[Junwen]]></dc:creator><pubDate>Mon, 07 Aug 2017 02:35:19 GMT</pubDate><media:content url="https://cloud.panjunwen.com/2017/08/mark-solarski-177426.jpg" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><h2 id="activityandintent">Activity and Intent</h2>
<img src="https://cloud.panjunwen.com/2017/08/mark-solarski-177426.jpg" alt="Android &#x5165;&#x95E8;&#x7B14;&#x8BB0;(&#x4E8C;): Activity"><p>An activity is a single, focused thing that the user can do. Almost all activities interact with the user, so the Activity class takes care of creating a window for you in which you can place your UI with <code>setContentView(View)</code>.</p>
<p>While activities are often presented to the user as full-screen windows, they can also be used in other ways: as floating windows (via a theme with <code>windowIsFloating</code> set) or embedded inside of another activity (using <code>ActivityGroup</code>). There are two methods almost all subclasses of Activity will implement:</p>
<ul>
<li>
<p>An intent is an abstract description of an operation to be performed. It can be used with <code>startActivity</code> to launch an <code>Activity</code>, <code>broadcastIntent</code>to send it to any interested <code>BroadcastReceiver</code> components, and <code>startService(Intent)</code> or <code>bindService(Intent, ServiceConnection, int)</code> to communicate with a background <code>Service</code>.</p>
</li>
<li>
<p>An Intent provides a facility for performing late runtime binding between the code in different applications. Its most significant use is in the launching of activities, where it can be thought of as the glue between activities. It is basically a passive data structure holding an abstract description of an action to be performed.</p>
</li>
</ul>
<h3 id="startactivity">Start Activity</h3>
<pre><code class="language-java">Class destinationClass = ChildActivity.class;
Intent intent = new Intent(context, destinationActivityClass);
startActivity(intent);
</code></pre>
<p>Same as <code>startActivity(Intent, Bundle)</code> with no options specified.</p>
<h3 id="passdata">Pass Data</h3>
<p><strong>putExtra</strong></p>
<pre><code class="language-java">intent.putExtra(Intent.EXTRA_TEXT, textToSend);
</code></pre>
<p><strong>getIntent</strong></p>
<pre><code class="language-java">Intent intent = getIntent();
if (intent.hasExtra(Intent.EXTRA_TEXT)) {
    String textEntered = intent.getStringExtra(Intent.EXTRA_TEXT);
}
</code></pre>
<h3 id="showbackbutton">Show &quot;Back&quot; Button</h3>
<pre><code class="language-xml">&lt;activity
    android:name=&quot;.DetailActivity&quot;
    android:parentActivityName=&quot;.MainActivity&quot;&gt;
    &lt;meta-data
        android:name=&quot;android.support.PARENT_ACTIVITY&quot;
        android:value=&quot;.MainActivity&quot; /&gt;
&lt;/activity&gt;
</code></pre>
<p><strong>Note:</strong></p>
<p>If you want to &quot;back&quot; to the previous activity, use below code in your onCreate method and onOptionsItemSelected:</p>
<pre><code class="language-java">this.getSupportActionBar().setDisplayHomeAsUpEnabled(true);
</code></pre>
<pre><code class="language-java">@Override
public boolean onOptionsItemSelected(MenuItem item) {
    int id = item.getItemId();
    if (id == android.R.id.home) {
        onBackPressed();
    }
    return super.onOptionsItemSelected(item);
}
</code></pre>
<h3 id="implicitintent">Implicit Intent</h3>
<p><a href="https://developer.android.com/guide/components/intents-common.html">Common Intents</a> on Google developer.</p>
<p>URI syntax:<br>
<code>scheme:[//[user[:password]@]host[:port]][/path][?query][#fragment]</code></p>
<p>MIME(Multipurpose Internet Mail Extensions):<br>
<code>Content-Type: [type]/[subtype]; parameter</code></p>
<p>Call Browser to show a web page:</p>
<pre><code class="language-java">private void openWebPage(String url) {
	Uri webpage = Uri.parse(url);
  // Here, we create the Intent with the action of ACTION_VIEW. 
  // This action allows the user to view particular content.
    Intent intent = new Intent(Intent.ACTION_VIEW, webpage);
  // This is a check we perform with every implicit Intent that we launch.
    if (intent.resolveActivity(getPackageManager()) != null) {
        startActivity(intent);
    }
}
</code></pre>
<p><strong>Maps URI</strong></p>
<pre><code class="language-java">String address = &quot;Yanshan University&quot;;
        Uri.Builder builder = new Uri.Builder();
        Uri uri = builder.scheme(&quot;geo&quot;).path(&quot;0,0&quot;)
                .appendQueryParameter(&quot;q&quot;, address)
                .appendQueryParameter(&quot;z&quot;, &quot;10&quot;).build();
</code></pre>
<p><strong>Share Intent</strong></p>
<p><code>ShareCompat.IntentBuilder</code>IntentBuilder is a helper for constructing <code>ACTION_SEND</code> and <code>ACTION_SEND_MULTIPLE</code> sharing intents and starting activities to share content.</p>
<p><code>ShareCompat.IntentReader</code>IntentReader is a helper for reading the data contained within a sharing (ACTION_SEND) Intent.</p>
<pre><code class="language-java">private void shareText (String text) {
    String mimeType = &quot;text/plain&quot;;
    String title = &quot;Learn how to share&quot;;
    Intent intent = ShareCompat.IntentBuilder.from(this)
            .setChooserTitle(title)
            .setType(mimeType)
            .setText(text)
            .getIntent();
    startActivity(intent);
}
</code></pre>
<h2 id="lifecycle">Lifecycle</h2>
<p><img src="https://cloud.panjunwen.com/2017/08/activity_lifecycle.png" alt="Android &#x5165;&#x95E8;&#x7B14;&#x8BB0;(&#x4E8C;): Activity" loading="lazy"></p>
<h3 id="persistdatawithonsaveinstancestate">Persist Data with onSaveInstanceState</h3>
<pre><code class="language-java">@Override
protected void onCreate(Bundle savedInstanceState) {
	/*other things*/
    if (savedInstanceState != null) {
        String queryUrl = savedInstanceState.getString(SEARCH_QUERY_URL_EXTRA);
        mUrlDisplayTextView.setText(queryUrl);
    }
}
</code></pre>
<pre><code class="language-java">@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
  
    String queryUrl = mUrlDisplayTextView.getText().toString();
    outState.putString(SEARCH_QUERY_URL_EXTRA, queryUrl);
}
</code></pre>
<!--kg-card-end: markdown-->]]></content:encoded></item></channel></rss>