<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <author>
    <name>王康力</name>
  </author>
  <generator uri="https://hexo.io/">Hexo</generator>
  <id>https://www.wakli.com/</id>
  <link href="https://www.wakli.com/" rel="alternate"/>
  <link href="https://www.wakli.com/atom.xml" rel="self"/>
  <rights>All rights reserved 2026, 王康力</rights>
  <title>栗子酱</title>
  <updated>2023-06-30T13:01:50.000Z</updated>
  <entry>
    <author>
      <name>王康力</name>
    </author>
    <category term="语义分割" scheme="https://www.wakli.com/categories/%E8%AF%AD%E4%B9%89%E5%88%86%E5%89%B2/"/>
    <category term="深度学习" scheme="https://www.wakli.com/categories/%E8%AF%AD%E4%B9%89%E5%88%86%E5%89%B2/%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0/"/>
    <category term="计算机视觉" scheme="https://www.wakli.com/categories/%E8%AF%AD%E4%B9%89%E5%88%86%E5%89%B2/%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0/%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%A7%86%E8%A7%89/"/>
    <category term="DeepLab" scheme="https://www.wakli.com/tags/DeepLab/"/>
    <category term="空洞卷积(Atrous_conv)" scheme="https://www.wakli.com/tags/%E7%A9%BA%E6%B4%9E%E5%8D%B7%E7%A7%AF-Atrous-conv/"/>
    <content>
      <![CDATA[<h1 id="分割任务"><a href="#分割任务" class="headerlink" title="分割任务"></a>分割任务</h1><ul><li>语义分割（semantic segmentation）：为图像中的每个像素分配一个类别，但是同一类别之间的对象不会区分。</li><li>实例分割（Instance segmentation）：把一个类别里具体的一个个对象（具体的一个个实例）分割出来。</li></ul><img width=500 src="/2022/06/08/语义分割/fig1.png"><span id="more"></span><h3 id="语义分割任务评价指标"><a href="#语义分割任务评价指标" class="headerlink" title="语义分割任务评价指标"></a>语义分割任务评价指标</h3><p>Pixel Accuracy(Global Acc)</p><p>$$\frac{\sum_{i}n_{ii}}{\sum_{i}t_{i}}$$</p><p>Mean Accuracy</p><p>$$\frac{1}{n_{cls}}\times \sum_{i}\frac{n_{ii}}{t_{i}}$$</p><p>Mean IoU</p><p>$$\frac{1}{n_{cls}}\times\sum_{i}\frac{n_{ii}}{t_{i}+\sum_{j}n_{ji}-n_{ii}}$$</p><blockquote><p>$n_{ij}$类别i被预测称类别j的像素个数</p><p>$n_{cls}$目标类别个数（包含背景）</p><p>$t_{i}&#x3D;\sum_{j}n_{ij}$目标类别i的总像素个数（真实标签）</p></blockquote><h1 id="FCN"><a href="#FCN" class="headerlink" title="FCN"></a>FCN</h1><p><a href="https://arxiv.org/abs/1411.4038">Fully Convolutional Networks for Semantic Segmentation</a></p><p><strong>首个端到端的针对像素级预测的全卷积网络</strong></p><img width=500 src="/2022/06/08/语义分割/fig3.png"><h1 id="DeepLab"><a href="#DeepLab" class="headerlink" title="DeepLab"></a>DeepLab</h1><p><a href="https://arxiv.org/abs/1412.7062">deeplabv1 论文原文：Semantic Image Segmentation with Deep Convolutional Nets and Fully Connected CRFs</a></p><p><a href="https://arxiv.org/abs/1606.00915">deeplabv2 论文原文：DeepLab: Semantic Image Segmentation with Deep Convolutional Nets, Atrous Convolution, and Fully Connected CRFs</a></p><p><a href="https://arxiv.org/abs/1706.05587">deeplabv3 论文原文：Rethinking Atrous Convolution for semantic image segmentation</a></p><p><a href="https://arxiv.org/abs/1802.02611">deeplabv3+ 论文原文：Encoder-Decoder with Atrous Separable Convolution for Semantic Image Segmentation</a></p><p>##Deeplabv1</p><p>语义分割任务DCNNs应用中中存在的问题：</p><ol><li>下采样会导致图像分辨率降低</li><li>空间不敏感</li></ol><p>解决方案：</p><ol><li>atrous algorithm （空洞卷积&#x2F;膨胀卷积&#x2F;扩张卷积）</li><li>fully-connected CRF(Conditional Random Field) [注：deeplabv3不使用]</li></ol><h3 id="Atrous-convolution（空洞卷积-膨胀卷积-扩张卷积）"><a href="#Atrous-convolution（空洞卷积-膨胀卷积-扩张卷积）" class="headerlink" title="Atrous convolution（空洞卷积&#x2F;膨胀卷积&#x2F;扩张卷积）"></a>Atrous convolution（空洞卷积&#x2F;膨胀卷积&#x2F;扩张卷积）</h3><img width=400 src="/2022/06/08/语义分割/1624791138742630.gif"><ul><li>增加感受野</li><li>保持原输入特征图W、H</li></ul><p>连续使用膨胀卷积时要注意gridding effect问题。经过多次膨胀卷积后,对于一个像素点来说，它获得对应在原始图像上被卷积的点可能是有间隔的，此时要注意膨胀率$r$的搭配问题。图(a)中出现的为间隔现象，更换膨胀率搭配后如图(b)。</p><img width=600 src="/2022/06/08/语义分割/fig2.png"><h2 id="Deeplabv3"><a href="#Deeplabv3" class="headerlink" title="Deeplabv3"></a>Deeplabv3</h2><p>文中给出两种模型结构</p><ul><li>cascaded model</li></ul><img width=700 src="/2022/06/08/语义分割/fig4.png"><ul><li>ASPP model（效果较好）</li></ul><img width=700 src="/2022/06/08/语义分割/fig5.png"><p>Block都为ResNet原有结构。</p><h1 id="U-Net"><a href="#U-Net" class="headerlink" title="U-Net"></a>U-Net</h1><p><a href="https://link.springer.com/chapter/10.1007/978-3-319-24574-4_28">U-net 论文原文：U-Net: Convolutional Networks for Biomedical Image Segmentation</a></p><p>U-net结构：</p><img width=600 src="/2022/06/08/语义分割/fig6.png"><p>文中方法没有使用padding。拼接时进行中心裁剪，再进行拼接。最终输出与输入图片大小不一样，结果是输入图像中心部分。</p><h2 id="U2-Net"><a href="#U2-Net" class="headerlink" title="U2-Net"></a>U<sup>2</sup>-Net</h2><p><a href="https://www.sciencedirect.com/science/article/abs/pii/S0031320320302077">U<sup>2</sup>-Net论文原文：U<sup>2</sup>-Net: Going deeper with nested U-structure for salient object detection</a></p><p>为了salient object detection（SOD）显著性目标检测任务，只有前景和背景两个类别。</p><img width=500 src="/2022/06/08/语义分割/fig7.png">]]>
    </content>
    <id>https://www.wakli.com/2022/06/08/%E8%AF%AD%E4%B9%89%E5%88%86%E5%89%B2/</id>
    <link href="https://www.wakli.com/2022/06/08/%E8%AF%AD%E4%B9%89%E5%88%86%E5%89%B2/"/>
    <published>2022-06-08T05:22:02.000Z</published>
    <summary>
      <![CDATA[<h1 id="分割任务"><a href="#分割任务" class="headerlink" title="分割任务"></a>分割任务</h1><ul>
<li>语义分割（semantic segmentation）：为图像中的每个像素分配一个类别，但是同一类别之间的对象不会区分。</li>
<li>实例分割（Instance segmentation）：把一个类别里具体的一个个对象（具体的一个个实例）分割出来。</li>
</ul>
<img width=500 src="/2022/06/08/语义分割/fig1.png">]]>
    </summary>
    <title>语义分割</title>
    <updated>2023-06-30T13:01:50.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>王康力</name>
    </author>
    <category term="目标检测" scheme="https://www.wakli.com/categories/%E7%9B%AE%E6%A0%87%E6%A3%80%E6%B5%8B/"/>
    <category term="深度学习" scheme="https://www.wakli.com/categories/%E7%9B%AE%E6%A0%87%E6%A3%80%E6%B5%8B/%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0/"/>
    <category term="计算机视觉" scheme="https://www.wakli.com/categories/%E7%9B%AE%E6%A0%87%E6%A3%80%E6%B5%8B/%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0/%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%A7%86%E8%A7%89/"/>
    <category term="SSD" scheme="https://www.wakli.com/tags/SSD/"/>
    <category term="YOLO" scheme="https://www.wakli.com/tags/YOLO/"/>
    <content>
      <![CDATA[<h1 id="YOLO-v1-You-Only-Look-Once"><a href="#YOLO-v1-You-Only-Look-Once" class="headerlink" title="YOLO v1 :You Only Look Once"></a>YOLO v1 :You Only Look Once</h1><p><a href="https://ieeexplore.ieee.org/document/7780460">论文原文</a></p><h2 id="算法思想"><a href="#算法思想" class="headerlink" title="算法思想"></a>算法思想</h2><h3 id="1、划分Gird-Cell"><a href="#1、划分Gird-Cell" class="headerlink" title="1、划分Gird Cell"></a>1、划分Gird Cell</h3><p>将一幅图像分成SxS个网格(grid cell)，如果某个object的中心落在这个网格中，则这个网格就负责预测这个object。</p><img width=600 src="/2022/04/28/目标检测算法-One-Stage/7780460-fig-2-source-large.gif"><span id="more"></span><h3 id="2、Bounding-box-预测"><a href="#2、Bounding-box-预测" class="headerlink" title="2、Bounding box 预测"></a>2、Bounding box 预测</h3><p>每个网格要预测B个bounding box(B取2)，每个bounding box除了要预测位置之外，还要预测一个confidence值。另外每个网格还要预测c个类别的分数。相当于每个bounding box要预测5个值，4个是位置，1个是confidence。</p><p>$$ confidence &#x3D; Pr(Object)*IOU_{pred}^{truth}$$</p><p>其中$Pr(Object)$如果网格内没有目标则为0，如果有目标为1。</p><p>在最终测试预测时，对于每一个目标最终的概率，会将类别分数与confidence相乘</p><p>$$Pr(Class_{i}|Object)*Pr(Object)*IOU_{pred}^{truth}&#x3D;Pr(Class_{i})*IOU_{pred}^{truth}$$</p><p><strong>！！！这里要注意的是，虽然一个grid cell预测两个bounding box，但是其实一个grid cel只预测一个类别，对于预测2个bounding box，最终只选择IOU最高的bounding box作为该类别检测的输。当一个格子中包含多个物体，只检测出一个。</strong></p><p>网络最终输出的维度是SxSx(5xB+C)&#x3D;7x7x(5x2+20)，每个grid cell的输出排列如下图</p><img width=600 src="/2022/04/28/目标检测算法-One-Stage/fig4.png"><blockquote><p>$x,y$是bounding box中心位置相对于当前格子位置的偏移量，归一化到[0,1]</p><p>$w,h$是box的长和宽相对于input的长和宽的比例，归一化到[0,1]</p></blockquote><h3 id="3、网络结构"><a href="#3、网络结构" class="headerlink" title="3、网络结构"></a>3、网络结构</h3><img width=800 src="/2022/04/28/目标检测算法-One-Stage/7780460-fig-3-source-large.gif"><p>原文中在 imagenet 分类任务上以一半的分辨率对卷积层进行预训练（224 x 224输入图像），然后将分辨率加倍进行检测。</p><h3 id="4、Loss-计算"><a href="#4、Loss-计算" class="headerlink" title="4、Loss 计算"></a>4、Loss 计算</h3><img width=800 src="/2022/04/28/目标检测算法-One-Stage/fig5.png"><h2 id="算法缺陷"><a href="#算法缺陷" class="headerlink" title="算法缺陷"></a>算法缺陷</h2><ol><li>对群体性小目标检测很差，由于grid cell的限制。</li><li>当目标出现新的尺寸比例或结构，效果会变差。</li><li>大多数错误来源于预测位置不准。</li></ol><h1 id="SSD-Single-Shot-Multibox-Detector"><a href="#SSD-Single-Shot-Multibox-Detector" class="headerlink" title="SSD: Single Shot Multibox Detector"></a>SSD: Single Shot Multibox Detector</h1><p><a href="https://link.springer.com/chapter/10.1007/978-3-319-46448-0_2">论文原文</a></p><h3 id="SSD-网络框架"><a href="#SSD-网络框架" class="headerlink" title="SSD 网络框架"></a>SSD 网络框架</h3><img width=800 src="/2022/04/28/目标检测算法-One-Stage/fig1.png"><img width=800 src="/2022/04/28/目标检测算法-One-Stage/fig2.png"><ul><li>输入图像大小为300x300</li><li>前面使用VGG-16的部分，是从开始到Conv5_3。</li><li>其中Conv4_3的输出作为预测特征层1</li><li>Conv5_3之后的池化层在VGG16中使用的是2x2-s2（池化核为2x2，步长为2）使特征图宽高减半，在这里使用的是3x3-s1（padding为1），输出的大小保持不变。</li><li>小的特征图适合检测大目标，大特征图适合检测小目标，在不同特征图分别匹配不同尺度的目标，提升小目标检测效果。</li></ul><img width=700 src="/2022/04/28/目标检测算法-One-Stage/fig3.png"><h3 id="Default-Box-的-Scale-和-aspect"><a href="#Default-Box-的-Scale-和-aspect" class="headerlink" title="Default Box 的 Scale 和 aspect"></a>Default Box 的 Scale 和 aspect</h3><p>如果使用$m$个特征图来进行预测，每个特征图的默认的scale计算如下：</p><p>$$s_{k}&#x3D;s_{min}+\frac{s_{max}-s_{min}}{m-1}(k-1), k\in[1,m]$$</p><blockquote><ul><li><p>其中对VOC数据集的训练中，$s_{min}&#x3D;0.2,s_{max}&#x3D;0.9$，这意味着最低层的scale为0.2，即默认宽高比$1:1$的box像素为300x0.2&#x3D;60，最高层为300x0.9&#x3D;270。</p></li><li><p>aspect比率：对于使用6个box的有五个$a_{r}\in{1,2,3,\frac{1}{2},\frac{1}{3}}$，对于使用4个box的3个$a_{r}\in{1,2,\frac{1}{2}}$。</p></li><li><p>由此每个框的宽度为：$w_{k}^{a}&#x3D;s_{k}\sqrt{a_{r}}$，高度为$h_{k}^{a}&#x3D;s_{k}&#x2F;\sqrt{a_{r}}$。</p></li><li><p>另外每一个特征图都会添加一个box，scale比本层大一些，比下一层小一些，$s_{k}’&#x3D;\sqrt{s_{k}s_{k+!}}$，这个box的aspect为$1:1$，由此每个box的是本层scale的5或3个aspect加上1个$s_{k}’$的box</p></li></ul></blockquote><blockquote><ul><li>对于COCO数据集，目标较小，所以最小的default box的scale使用0.15替代0.2，同时conv4_3的default box的scale为0.07（300x300图像中的21个像素）。具体如下表所示。</li></ul></blockquote><table><thead><tr><th align="center">特征图层</th><th align="center">特征图层宽高</th><th align="center">默认框scale与aspect</th><th align="center">默认框数量</th></tr></thead><tbody><tr><td align="center">1</td><td align="center">$38\times38$</td><td align="center">$21{1,2,\frac{1}{2}}; \sqrt{21\times45}{1}$</td><td align="center">$38\times38\times4$</td></tr><tr><td align="center">2</td><td align="center">$19\times19$</td><td align="center">$45{1,2,3,\frac{1}{2},\frac{1}{3}}; \sqrt{45\times99}{1}$</td><td align="center">$19\times19\times6$</td></tr><tr><td align="center">3</td><td align="center">$10\times10$</td><td align="center">$99{1,2,3,\frac{1}{2},\frac{1}{3}}; \sqrt{99\times153}{1}$</td><td align="center">$10\times10\times6$</td></tr><tr><td align="center">4</td><td align="center">$5\times5$</td><td align="center">$153{1,2,3,\frac{1}{2},\frac{1}{3}}; \sqrt{153\times207}{1}$</td><td align="center">$5\times5\times6$</td></tr><tr><td align="center">5</td><td align="center">$3\times3$</td><td align="center">$207{1,2,\frac{1}{2}}; \sqrt{207\times261}{1}$</td><td align="center">$3\times3\times4$</td></tr><tr><td align="center">6</td><td align="center">$1\times1$</td><td align="center">$261{1,2,\frac{1}{2}}; \sqrt{261\times315}{1}$</td><td align="center">$1\times1\times4$</td></tr></tbody></table><p><strong>Default box总数为8732</strong></p><h3 id="Predictor的实现"><a href="#Predictor的实现" class="headerlink" title="Predictor的实现"></a>Predictor的实现</h3><p>对于$m\times n$的特征图，使用$3\times 3$的卷积核来生成分类概率分数和边界框回归参数，和fasterRCNN的预测器类似。对于特征图上的每个位置会生成$k$个default box，对每个box计算$c$个类别分数（包括背景）和4个回归参数，也就是$(c+4)k$个卷积核（filter），对于一个$m\times n$的特征图会生成$(c+4)kmn$个输出值。</p><p>注意：在Fast–RCNN中边界框回归参数是$4\times c\times k$个，而SSD中是$4\times k$个，是不关注边界框回归参数是关于哪个类别的</p><h3 id="损失计算"><a href="#损失计算" class="headerlink" title="损失计算"></a>损失计算</h3><p>$$L(x,c,l,g)&#x3D;\frac{1}{N}(L_{conf}(x,c)+\alpha L_{loc}(x,l,g))$$</p><blockquote><p>其中$N$为匹配到的正样本个数，平衡系数$\alpha$为1</p></blockquote><h1 id="YOLO-v2-YOLO9000"><a href="#YOLO-v2-YOLO9000" class="headerlink" title="YOLO v2 (YOLO9000)"></a>YOLO v2 (YOLO9000)</h1><p><a href="https://ieeexplore.ieee.org/document/8100173">论文原文</a></p><h2 id="性能改进"><a href="#性能改进" class="headerlink" title="性能改进"></a>性能改进</h2><p>在YOLO v1的基础上进行一系列改进来提升性能，改进尝试如下：</p><h3 id="Batch-Normalization"><a href="#Batch-Normalization" class="headerlink" title="Batch Normalization"></a>Batch Normalization</h3><p>通过添加BN层，对于训练收敛有很大的帮助，减少了一系列正则化操作。可以在移除Dropout操作后不过拟合。</p><p>相比YOLO v1的mAP提升了2%</p><h3 id="High-Resolution-Classifier"><a href="#High-Resolution-Classifier" class="headerlink" title="High Resolution Classifier"></a>High Resolution Classifier</h3><p>采用更高分辨率的分类器，使用448x448的分辨率训练ImageNet，提升了4%mAP。</p><h3 id="Convolutional-with-Anchor-Boxes"><a href="#Convolutional-with-Anchor-Boxes" class="headerlink" title="Convolutional with Anchor Boxes"></a>Convolutional with Anchor Boxes</h3><p>使用基于Anchor的目标边界框预测。相对于直接预测坐标，使用带有偏移的Anchor边界框预测，可以简化目标边界框预测问题，使得网络更好训练。这里会使mAP有0.3%的轻微下降，但是recall增加了8%，这样的结果可以使模型有更大的提升空间。</p><h3 id="Dimension-Clusters"><a href="#Dimension-Clusters" class="headerlink" title="Dimension Clusters"></a>Dimension Clusters</h3><p>使用聚类算法提取anchor boxes的宽高。之前的anchor boxes是基于经验设定的，网络微调anchor box到实际位置的难度较大。这里的做法是对训练集合中标注的边界框进行聚类分析，已找到更好的尺寸。</p><p>论文中使用k-means作为聚类算法。聚类算法最重要的是选择如何计算边界框间距离，使用欧氏距离会导致大边界框有更大的误差。由于更加关心IOU所以我们定义计算公式为：</p><p>$$distance(box,centroid)&#x3D;1-IOU(box,centroid)$$</p><blockquote><p>其中centroid是聚类时被选作中心的边框，box就是其它anchor boxes。IOU越大，距离越近。</p></blockquote><h3 id="Direct-location-prediction"><a href="#Direct-location-prediction" class="headerlink" title="Direct location prediction"></a>Direct location prediction</h3><p>在实验中发现如果不进行限制，anchor boxes可能会出现在图像中的任意点，导致anchor偏离ground truth很远。这里对预测公式进行调整，将预测边界框中心约束在grid cell内：</p><p>$$b_{x}&#x3D;\sigma(t_{x})+c_{x}$$</p><p>$$b_{y}&#x3D;\sigma(t_{y})+c_{y}$$</p><p>$$b_{w}&#x3D;p_{w}e^{t_{w}}$$</p><p>$$b_{h}&#x3D;p_{h}e^{t_{h}}$$</p><p>$$Pr(Object)*IOU(b,Object)&#x3D;\sigma(t_{o})$$</p><blockquote><p>其中，$b_{x},b_{y},b_{w},b_{h}$是预测边界框的中心和宽高。</p><p>$\sigma$是sigmoid函数，控制边界框中心在网格内。</p><p>$t_{x},t_{y},t_{w},t_{h},t_{o}$是要学习的参数，分别用于预测边框中心和宽高以及置信度</p><p>$c_{x},c_{y}$是当前网格左上角到图像左上角的距离。</p><p>$p_{w},p_{h}$是先验框bounding box prior或者说是预设的框的宽高</p></blockquote><img width=500 src="/2022/04/28/目标检测算法-One-Stage/8100173-fig-3-source-large.gif"><h3 id="Fine-Frained-Features"><a href="#Fine-Frained-Features" class="headerlink" title="Fine-Frained Features"></a>Fine-Frained Features</h3><p>论文提到YOLO使用13x13的特征图进行大物体预测拥有很好的效果，即细粒度特征（Fine-Frained Features），而相对比较小的物体则一般。这里引入一种passthrough层的方法在特征图上保留一些信息。</p><p><strong>passthough</strong>层如下图</p><img width=600 src="/2022/04/28/目标检测算法-One-Stage/fig6.png"><p>passthrough层是将前面更高分辨率的图作为输入，将其连接到后面的低分辨率特征图上，但是为了使特征图大小一致进行拼接，会将channles增加4倍。以416x416分辨率为例，对于26x26x512的特征图，通过passthrough层后转换为13x13x2048的特征图，可以与后面的13x13x1024的特征图进行拼接。</p><p>#####YOLO v2完整网络结构图：</p><img width=800 src="/2022/04/28/目标检测算法-One-Stage/fig7.png"><h3 id="Multi-Scale-Training"><a href="#Multi-Scale-Training" class="headerlink" title="Multi-Scale Training"></a>Multi-Scale Training</h3><p>YOLOv2没有券链接层，所以对网络输入大小没有限制，但是由于缩放因子为32（下采样倍数），需要输入尺寸为32的倍数。为了增加模型的鲁棒性，训练时每10个batch就改变一次输入图像大小从320x320到608x608。</p><h2 id="速度改进"><a href="#速度改进" class="headerlink" title="速度改进"></a>速度改进</h2><p>#####BackBone：Darknet-19</p><img width=700 src="/2022/04/28/目标检测算法-One-Stage/8100173-table-6-source-large.gif"><p>删除Darknet-19的最后一个卷积层，并用3个3x3卷积层和一个1x1卷积替代。</p><p>对于VOC数据集，每个网格中预测5个bounding boxes，每个boundingbox有5个参数(4个边界框回归参数+confidence)和20分类，即1+4+20&#x3D;25，每个网格为5x25&#x3D;125个filters。</p><h1 id="YOLO-v3"><a href="#YOLO-v3" class="headerlink" title="YOLO v3"></a>YOLO v3</h1><p><a href="https://arxiv.org/abs/1804.02767">报告原文</a></p><p>由于原文是一篇技术报告，所以在很多地方讲解的都是很模糊的。</p><h3 id="网络结构"><a href="#网络结构" class="headerlink" title="网络结构"></a>网络结构</h3><p>主干网络使用Darknet-53，添加了残差结构</p><p>Darknet53：</p><img width=700 src="/2022/04/28/目标检测算法-One-Stage/fig8.png"><p>在使用时移除了FC层。</p><img width=700 src="/2022/04/28/目标检测算法-One-Stage/fig9.png"><h3 id="目标边界框预测"><a href="#目标边界框预测" class="headerlink" title="目标边界框预测"></a>目标边界框预测</h3><p>YOLOv3在3个特征图中发的分别通过$(4+1+c)\times k$个大小为1x1的卷积核进行预测，$k$为预设边界框(bounding box prior)的个数（k默认取3）。</p><p>根据COCO数据集聚类得到预设边界框尺寸：</p><table><thead><tr><th align="center">特征图层</th><th align="center">特征图大小</th><th align="center">预设边界框尺寸</th><th align="center">预设边界框数量</th></tr></thead><tbody><tr><td align="center">特征图层1</td><td align="center">13x13</td><td align="center">(116x90);(156x198);(373x326)</td><td align="center">13x13x3</td></tr><tr><td align="center">特征图层2</td><td align="center">26x26</td><td align="center">(30x61);(62x45);(59x119)</td><td align="center">26x26x3</td></tr><tr><td align="center">特征图层3</td><td align="center">52x52</td><td align="center">(10x13);(16x30);(33x23)</td><td align="center">52x52x3</td></tr></tbody></table><h3 id="正负样本匹配"><a href="#正负样本匹配" class="headerlink" title="正负样本匹配"></a>正负样本匹配</h3><p>针对每一个GT分配一个Bounding box prior ，即每一个GT分配一个正样本，一个图片中有几个目标，就有几个正样本。分配原则是：将与GT重合程度最高的bounding box prior作为正样本，对于bounding box与GT重合但是不是最大但是超过阈值(0.5)则忽视，其他的则为负样本。如果bounding box prior没有被分配给GT，则它没有定位损失和类别损失，只有confidence。</p><h3 id="损失函数"><a href="#损失函数" class="headerlink" title="损失函数"></a>损失函数</h3><p>$$Loss(o,c,O,C,l,g)&#x3D;\lambda_{1}Loss_{conf}(o,c)+\lambda_{2}Loss_{cla}(O,C)+\lambda_{3}Loss_{loc}(l,g)$$</p><blockquote><p>$\lambda_{1},\lambda_{2},\lambda_{3}$为平衡系数</p></blockquote><p><strong>confidence损失</strong>：Binary Cross Entropy</p><p>$$Loss_{conf}(o,c)&#x3D;-\frac{\sum_{i}(o_{i}ln(\hat{c}<em>{i})+(1-o</em>{i})ln(1-\hat{c}_{i}))}{N}$$</p><blockquote><p>$\hat{c}<em>{i}&#x3D;Sigmoid(c</em>{i})$为预测值c通过Sigmoid函数得到的预测置信度</p><p>$o_{i}\in[0,1]$表示一侧，表示预测目标边界框与真实边界框的IOU</p><p>原文中$o_{i}$只取0或者1，正样本为1，负样本为0</p><p>N为正负样本个数</p></blockquote><p><strong>类别损失</strong></p><p>$$Loss_{cla}(O,C)&#x3D;-\frac{\sum_{i\in pos}\sum_{j\in cla}(O_{ij}ln(\hat{c}<em>{ij})+(1-o</em>{ij})ln(1-\hat{c}<em>{ij}))}{N</em>{pos}}$$</p><blockquote><p>$O_{ij}$取0或1，表示目标框i中是否存在第j类目标</p><p>$N_{pos}$是正样本个数</p></blockquote><blockquote><p> eg：</p><p>类别[A, B, C]</p><p>真实标签:</p><p>Object1:[0, 0, 1]</p><p>Object2:[0, 0, 1]</p><p>预测概率：经过Sigmoid处理，不是softmax，所以概率和不为1</p><p>Object1:[0.1, 0.8, 0.9]</p><p>Object2:[0.2, 0.7, 0.8]</p></blockquote><p><strong>定位损失</strong></p><p>$$Loss_{loc}(t,g)&#x3D;\frac{\sum_{i\in pos}(\sigma(t_{x}^{i})-\hat{g}<em>{x}^{i})^{2}+(\sigma(t</em>{y}^{i})-\hat{g}<em>{y}^{i})^{2}+(t</em>{w}^{i}-\hat{g}<em>{w}^{i})^{2}+(t</em>{h}^{i}-\hat{g}<em>{h}^{i})^{2}}{N</em>{pos}}$$</p><img width=500 src="/2022/04/28/目标检测算法-One-Stage/8100173-fig-3-source-large.gif"><blockquote><p>t是网络预测的回归参数，g是GT中心点坐标x，y与宽高（映射在grid cell中）</p></blockquote>]]>
    </content>
    <id>https://www.wakli.com/2022/04/28/%E7%9B%AE%E6%A0%87%E6%A3%80%E6%B5%8B%E7%AE%97%E6%B3%95-One-Stage/</id>
    <link href="https://www.wakli.com/2022/04/28/%E7%9B%AE%E6%A0%87%E6%A3%80%E6%B5%8B%E7%AE%97%E6%B3%95-One-Stage/"/>
    <published>2022-04-28T08:06:04.000Z</published>
    <summary>
      <![CDATA[<h1 id="YOLO-v1-You-Only-Look-Once"><a href="#YOLO-v1-You-Only-Look-Once" class="headerlink" title="YOLO v1 :You Only Look Once"></a>YOLO v1 :You Only Look Once</h1><p><a href="https://ieeexplore.ieee.org/document/7780460">论文原文</a></p>
<h2 id="算法思想"><a href="#算法思想" class="headerlink" title="算法思想"></a>算法思想</h2><h3 id="1、划分Gird-Cell"><a href="#1、划分Gird-Cell" class="headerlink" title="1、划分Gird Cell"></a>1、划分Gird Cell</h3><p>将一幅图像分成SxS个网格(grid cell)，如果某个object的中心落在这个网格中，则这个网格就负责预测这个object。</p>
<img width=600 src="/2022/04/28/目标检测算法-One-Stage/7780460-fig-2-source-large.gif">]]>
    </summary>
    <title>目标检测算法:One-Stage</title>
    <updated>2026-07-20T02:22:39.571Z</updated>
  </entry>
  <entry>
    <author>
      <name>王康力</name>
    </author>
    <category term="目标检测" scheme="https://www.wakli.com/categories/%E7%9B%AE%E6%A0%87%E6%A3%80%E6%B5%8B/"/>
    <category term="深度学习" scheme="https://www.wakli.com/categories/%E7%9B%AE%E6%A0%87%E6%A3%80%E6%B5%8B/%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0/"/>
    <category term="计算机视觉" scheme="https://www.wakli.com/categories/%E7%9B%AE%E6%A0%87%E6%A3%80%E6%B5%8B/%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0/%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%A7%86%E8%A7%89/"/>
    <category term="RCNN" scheme="https://www.wakli.com/tags/RCNN/"/>
    <category term="Fast-RCNN" scheme="https://www.wakli.com/tags/Fast-RCNN/"/>
    <category term="Faster-RCNN" scheme="https://www.wakli.com/tags/Faster-RCNN/"/>
    <category term="mAP与Recall" scheme="https://www.wakli.com/tags/mAP%E4%B8%8ERecall/"/>
    <content>
      <![CDATA[<h1 id="R-CNN"><a href="#R-CNN" class="headerlink" title="R-CNN"></a>R-CNN</h1><p> <a href="https://ieeexplore.ieee.org/document/6909475">论文原文</a></p><h2 id="算法步骤"><a href="#算法步骤" class="headerlink" title="算法步骤"></a>算法步骤</h2><ol><li>一张图片生成1k-2k个候选区域（使用Selective Search（SS）方法）</li><li>对每个候选区域，遂用深度网络提取特征</li><li>特征送入每一类SVM（支持向量机）分类器，判别是否属于该类</li><li>使用回归器精细修正候选框位置</li></ol><img width=600 src="/2022/04/03/目标检测算法-Two-Stage/6909475-fig-1-source-large.gif"><span id="more"></span><h3 id="1、候选区域的生成"><a href="#1、候选区域的生成" class="headerlink" title="1、候选区域的生成"></a>1、候选区域的生成</h3><p>利用Selective Search算法通过图像分割的方法得到一些原始区域，然后使用一些合并策略将这些区域合并得到一个层次化的区域结构，而这些结构就包含着可能合要的物体。</p><h3 id="2、对每个候选区域，使用深度网络提取特征（fome-tunning阶段）"><a href="#2、对每个候选区域，使用深度网络提取特征（fome-tunning阶段）" class="headerlink" title="2、对每个候选区域，使用深度网络提取特征（fome-tunning阶段）"></a>2、对每个候选区域，使用深度网络提取特征（fome-tunning阶段）</h3><p>将2000个候选区域缩放到277x277像素大小（无论什么形状都会转为277x277），将候选区域输入实现训练好的AlexNet-CNN图像分类网络，得到4096维的特征。最终总共获得2000x4096的矩阵（共2000候选框，每个候选框4096维特征）。</p><img width=600 src="/2022/04/03/目标检测算法-Two-Stage/fig2.png"><h5 id="特征提取网络训练"><a href="#特征提取网络训练" class="headerlink" title="特征提取网络训练"></a>特征提取网络训练</h5><blockquote><p>对使CNN适应目标检测任务（与真实物体框部分重叠的框）。输出为21路（VOC的20分类+背景类）。IoU&gt;0.5为正例，其余为负例。获得模型后使用到网络的FC7层，即4096维，作为特征提取结果。</p></blockquote><h3 id="3、特征送入每一类SVM分类器，判定类别"><a href="#3、特征送入每一类SVM分类器，判定类别" class="headerlink" title="3、特征送入每一类SVM分类器，判定类别"></a>3、特征送入每一类SVM分类器，判定类别</h3><p>将2000×4096维特征与20个SVM组成的权值矩阵4096×20相乘，获得2000×20维矩阵表示每个建议框是某个目标类别的得分。分别对上述2000× 20维短阵中每一列即每一类进行非极大值抑制（NMS）剔除重叠建议框，得到该列即该类中得分最高的一些建议框。</p><p>SVM是二分类分类器，针对每一个类别都有一个分类器</p><p>PASCAL VOC数据集共有20个类别，所以有20个SVM分类器</p><p>下图中应该是行向量，不是列向量！</p><img width=350 src="/2022/04/03/目标检测算法-Two-Stage/fig3.png"><p>2000x4096：共2000行，每一行都是一个候选框得到的4096维特征</p><p>4096x20：共20列，每一列对应一个类别的权值向量</p><p>2000x20：第1行第1列代表第1个候选框是类别1的概率。</p><img width=550 src="/2022/04/03/目标检测算法-Two-Stage/fig4.png"><h5 id="SVM的训练"><a href="#SVM的训练" class="headerlink" title="SVM的训练"></a>SVM的训练</h5><blockquote><p>检测区域区域与实际区域完全一致为正例，与物体无关的为负例，但是与物体部分重叠的区域的标记成为了一个问题。于是设定阈值IoU&#x3D;0.3，低于阈值的全部标记为负例，IOU&#x3D;1的是正例，0.3-1之间的不考虑。简单设置为0.5会降低准确度</p></blockquote><h5 id="非极大值抑制剔除重叠建议框"><a href="#非极大值抑制剔除重叠建议框" class="headerlink" title="非极大值抑制剔除重叠建议框"></a>非极大值抑制剔除重叠建议框</h5><blockquote><p>首先寻找的分最高的目标，计其他目标与改目标的IoU值，删除所有IoU值大于给定阈值的目标（大于阈值即为同一个物体，小雨阈值但是置信度比较高的，认为是其他目标）。重复前面的步骤。这种方法可以识别图中多个同一种类的物体，只要小于阈值就被删除。</p></blockquote><h5 id="在fine-tunning和SVM训练两个阶段，定义正负样例不同的原因"><a href="#在fine-tunning和SVM训练两个阶段，定义正负样例不同的原因" class="headerlink" title="在fine-tunning和SVM训练两个阶段，定义正负样例不同的原因"></a>在fine-tunning和SVM训练两个阶段，定义正负样例不同的原因</h5><blockquote><p>fine-tunning阶段是由于CNN对小样本容易过拟合，需要大量训练数据，故对IoU限制较松： IoU&gt;0.5的建议框为正样本，否则为负样本； SVM这种机制是由于其适用于小样本训练，故对样本IoU限制严格：Ground Truth为正样本，与Ground Truth相交IoU＜0.3的建议框为负样本。</p></blockquote><h5 id="为什么训练一个分类器的原因"><a href="#为什么训练一个分类器的原因" class="headerlink" title="为什么训练一个分类器的原因"></a>为什么训练一个分类器的原因</h5><blockquote><p>为什么单独训练了一个SVM而不是直接用softmax。论文中说，因为微调时和训练SVM时所采用的正负样本阈值不同，微调阶段正样本定义并不强调精准的位置，而SVM正样本只有Ground Truth；并且微调阶段的负样本是随机抽样的，而SVM的负样本是经过hard negative mining方法筛选的（难负例挖掘算法，用途就是正负例数量不均衡，而负例分散代表性又不够的问题，hard negative就是每次把那些顽固的棘手的错误,再送回去继续练，练到不再提升为止），是更加严格的负样本；导致在采用SoftMax会使PSACAL VOC 2007测试集上mAP从54.2%降低到50.9%。</p></blockquote><h3 id="4、使用回归器精细修正候选框位置"><a href="#4、使用回归器精细修正候选框位置" class="headerlink" title="4、使用回归器精细修正候选框位置"></a>4、使用回归器精细修正候选框位置</h3><p>对NMS处理后剩余的建议框进一步筛选。接着分别用20个回归器对上述20个类别中剩余的建议框进行回归操作，最终得到每个类别的休整后的的分最高的Bounding box。</p><p>Region Proposal为建议框，Ground Truth为实际框，G‘表示Region Proposal进行回归后的预测窗口，可以用最小二乘法解决线性回归问题。</p><p>通过回归分类器之后得到4个参数，分别代表Region Proposal中心点的x偏移量、y的偏移量，高度缩放因子、宽度缩放因子。通过得到的四个值对建议框进行修正即G‘</p><h2 id="存在问题"><a href="#存在问题" class="headerlink" title="存在问题"></a>存在问题</h2><ul><li><p>测试速度慢：一张图片53s(CPU)。SS算法提取候选框2s，候选框大量重叠，特征提取冗余。</p></li><li><p>训练速度慢</p></li><li><p>训练所需空间大</p></li></ul><h1 id="Fast-R-CNN"><a href="#Fast-R-CNN" class="headerlink" title="Fast R-CNN"></a>Fast R-CNN</h1><p><a href="https://ieeexplore.ieee.org/document/7410526">论文原文</a></p><h2 id="算法步骤-1"><a href="#算法步骤-1" class="headerlink" title="算法步骤"></a>算法步骤</h2><ol><li>使用SS方法生成1-2k候选区域</li><li>将图像输入网络得到特征图，将SS算法生成的候选框投影到特征图上获得相应的特征矩阵</li><li>将每个特征矩阵通过ROI pooling层缩放到7x7大小的特征图，接着将特征图展平并通过一些列FC层得到预测结果</li></ol><img width=600 src="/2022/04/03/目标检测算法-Two-Stage/fig5.png"><h3 id="计算整张特征图"><a href="#计算整张特征图" class="headerlink" title="计算整张特征图"></a>计算整张特征图</h3><p>将整张图像送入网络，得到特征图，从特征图向上提取对应的候选区域，这些候选区域的特征不需要重复计算。在R-CNN中是把每个候选框都进行特征计算。</p><h3 id="ROI-pooling-缩放"><a href="#ROI-pooling-缩放" class="headerlink" title="ROI pooling 缩放"></a>ROI pooling 缩放</h3><p>将候选区域在特征图上对应的特征矩阵划分为7x7的49等份，然后对每个区域进行最大池化下采样（max pooling）得到7x7xchannel大小的特征矩阵</p><img width=600 src="/2022/04/03/目标检测算法-Two-Stage/fig6.png"><h3 id="Softmax-分类器"><a href="#Softmax-分类器" class="headerlink" title="Softmax 分类器"></a>Softmax 分类器</h3><p>输出N+1个类别的概率，共N+1个节点</p><h3 id="边界框回归器-BBR"><a href="#边界框回归器-BBR" class="headerlink" title="边界框回归器 (BBR)"></a>边界框回归器 (BBR)</h3><p>输出对应N+1个类别的候选边界框回归参数($d_{x}$,$d_{y}$,$d_{w}$,$d_{h}$)，共(N+1)x4个节点。在我的理解中虽然输出了(N+1)x4个节点，但其实只有对应类别的4个节点是有意义的。</p><p>边界框回归的思路可以理解为<strong>平移</strong>和<strong>尺度放缩</strong></p><p>平移：$\Delta x&#x3D;P_{w}d_{x}(P),\Delta y&#x3D;P_{h}d_{y}(P)$。</p><p>$$ \hat{G}<em>{x} &#x3D;P</em>{w}d_{x}(P)+P_{x} $$<br>$$ \hat{G}<em>{y} &#x3D;P</em>{h}d_{y}(P)+P_{y} $$</p><p>尺度放缩：$S_{w}&#x3D;exp(d_{w}(P))$,$S_{h}&#x3D;exp(d_{h}(P))$。</p><p>$$ \hat{G} <em>{w} &#x3D;P</em>{w}exp(d_{w}(P)) $$<br>$$ \hat{G} <em>{h} &#x3D;P</em>{h}exp(d_{h}(P)) $$</p><p>$ P_{x},P_{y},P_{w},P_{h}$分别为候选框的中心x,y坐标以及宽高</p><p>$ \hat{G}<em>{x},\hat{G}</em>{y},\hat{G}<em>{w},\hat{G}</em>{h} $分别为最终预测的边界框的中心x,y坐标以及宽高</p><h3 id="损失计算"><a href="#损失计算" class="headerlink" title="损失计算"></a>损失计算</h3><p>损失函数：</p><p>$$Loss(p,u,t^{u},v)&#x3D;Loss_{cls}(p,u)+\lambda[u\ge1]Loss_{loc}(t^{u},v) $$</p><p><strong>分类损失</strong> $Loss_{cls}(p,u)&#x3D;-logp_{u}$</p><p>$p$是分类器预测的softmax概率分布，$p&#x3D;(p_{0},…,p_{k})$</p><p>$u$是目标真实类别标签</p><p><strong>边界框回归损失</strong></p><p> $$Loss_{loc}(t^{u},v)&#x3D;\sum_{i\in{x,y,w,h}}^{}smooth_{L1}(t^{u}<em>{i}-v</em>{i})$$</p><p>$$smooth_{L1}(x)&#x3D;\begin{cases}<br>  0.5x^{2}&amp; \text{ if } |x|&lt;1 \<br>  |x|-0.5&amp; \text{ otherwise }<br>\end{cases}$$</p><blockquote><p>$\lambda$是一个平衡系数，$[u\ge1]$是艾弗森括号，当括号内条件不满足时即为背景时，则没有边界框回归损失这部分。</p><p>$t^{u}$是边界框回归器预测的对应类别$u$的回归参数$(t^{u}<em>{x},t^{u}</em>{y},t^{u}<em>{w},t^{u}</em>{h})$</p><p>$v$是真实目标的边界框回归参数$(v_{x},v_{y},v_{w},v_{h})$</p></blockquote><p>$v_{x}&#x3D;\frac{\hat{G}<em>{x}-P</em>{x}}{P_{w}}$，$v_{y}&#x3D;\frac{\hat{G}<em>{y}-P</em>{y}}{P_{h}}$</p><p>$v_{w}&#x3D;ln\frac{\hat{G}<em>{w}}{P</em>{w}}$，$v_{h}&#x3D;ln\frac{\hat{G}<em>{h}}{P</em>{h}}$</p><h2 id="缺点"><a href="#缺点" class="headerlink" title="缺点"></a>缺点</h2><p>SS步骤耗时占据检测总时长太多，需要2s成为了速度瓶颈，而后面步骤仅需要不到1s</p><h1 id="Faster-R-CNN"><a href="#Faster-R-CNN" class="headerlink" title="Faster R-CNN"></a>Faster R-CNN</h1><p><a href="https://ieeexplore.ieee.org/document/7485869">论文原文</a></p><h2 id="算法步骤-2"><a href="#算法步骤-2" class="headerlink" title="算法步骤"></a>算法步骤</h2><ol><li>将图像输入网络得到特征图</li><li>使用RPN结构生成候选框，将RPN生成的候选框投影到特征图上，获得对应的特征矩阵</li><li>将每个特征矩阵通过ROI pooling层缩放到7x7大小的特征图，并将特征图展平通过一系列FC层得到预测结果</li></ol><p><strong>Faster &#x3D; RPN+Fast R-CNN</strong></p><img width=400 src="/2022/04/03/目标检测算法-Two-Stage/he2-2577031-small.gif"><h3 id="RPN"><a href="#RPN" class="headerlink" title="RPN"></a>RPN</h3><p><strong>RPN结构</strong>：</p><img width=400 src="/2022/04/03/目标检测算法-Two-Stage/he3-2577031-large.gif"><ul><li>使用一个3x3的滑动窗口（sliding window）在通道数为256的特征图（conv feature map）上滑动，采用步距为1，padding为1的方式进行滑动，得到与宽高与fearure map完全一样的特征矩阵</li><li>每滑动到一个位置上会生成一个1x256的向量通过并联两个全连接层cls layer与reg layer分别输出目标概率2$k$ scores （2是背景或者物体的2分类）以及边界框回归参数4$k$ coordinates（$k$是$k$个anchor boxes）</li></ul><blockquote><p><strong>anchor box</strong></p><ul><li>计算滑动窗口的中心点在原图上的对应位置：(原图的宽度&#x2F;特征图宽度)取整得到$x$轴步距，$x$轴步距x滑动窗口中心点的$x$坐标得到原图上的$x$坐标，$y$坐标同理，得到原图中对应的点坐标$(x,y)$。</li><li>以得到的点$(x,y)$为中心算出$k$个anchor boxes，每一个anchor boxes都是给定的大小和长宽比例。</li><li>论文中给出三个尺度（面积）：($128^{2},256^{2},512^{2}$)。三种尺度：(1:1,1:2,2:1)。即每个位置在原图上都对应9个anchor，即$k$&#x3D;9</li></ul></blockquote><p>其中特征图的通道数以及生成的向量与特征提取网络的backbone有关，论文中使用的ZF网络输出通道数是256，如果是VGG16的话通道数将会是512。</p><p>论文提到：对于一张1000x600x3的图像，大约有60x40x9(21600)个anchor，忽略跨越边界的anchor后，剩下6k左右个，对于RPN生成的候选框之间有大量重叠的问题，基于候选框的cls的得分，使用NMS方法，IoU设置为0.7，每张图大约剩下2k个候选框。</p><h3 id="RPN损失函数"><a href="#RPN损失函数" class="headerlink" title="RPN损失函数"></a>RPN损失函数</h3><p>$$L({p_{i}},{t_{i}})&#x3D;\frac{1}{N_{cls}}\sum_{i}^{}L_{cls}(p_{i},p^{<em>}<em>{i})+\lambda\frac{1}{N</em>{reg}}\sum_{i}^{}p^{</em>}<em>{i}L</em>{reg}(t_{i},t^{*}_{i})$$</p><blockquote><p>$p_{i}$表示第i个anchor预测为物体object（非背景）的概率</p><p>$p^{*}_{i}$当为正样本（object）时为1，当为负样本（background）时为0</p><p>$t_{i}$表示预测第$i$个anchor的边界框回归参数</p><p>$t^{*}_{i}$表示第$i$个anchor对应的GT Box（Ground Truth Box）</p><p>$N_{cls}$表示一个mini-batch中的所有样本数量256（尽量保证每个mini-batch中正负样本比例为1:1）</p><p>$N_{reg}$表示anchor位置的个数（不是anchor的个数）约2400</p></blockquote><p><strong>分类损失</strong></p><ul><li>虽然是二分类，但原文中使用的是Softmax Cross Entropy这种多分类交叉熵，用的one-hot编码的形式，[1,0]是物体，[0,1]是背景。</li></ul><p>$$L_{cls}&#x3D;-log(p_{i})$$</p><ul><li>Pytorch官方的实现中使用的是Binary Cross Entropy，意味着cls layer只输出1k个scores，0代表背景，1代表物体。</li></ul><p>$$L_{cls}&#x3D;-[p^{<em>}<em>{i}log(p</em>{i})+(1-p^{</em>}<em>{i})log(1-p</em>{i})]$$</p><p><strong>边界框回归损失</strong></p><p> $$Loss_{reg}(t_{i},t^{<em>}<em>{i})&#x3D;\sum</em>{i\in[x,y,w,h]}^{}smooth_{L1}(t_{i}-t^{</em>}_{i})$$</p><h2 id="Faster-RCNN训练"><a href="#Faster-RCNN训练" class="headerlink" title="Faster RCNN训练"></a>Faster RCNN训练</h2><blockquote><p><strong>Pytorch中采用RPN Loss + Fast R-CNN Loss的联合训练方法</strong></p></blockquote><h3 id="原论文方法：分别训练RPN于Fast-R-CNN"><a href="#原论文方法：分别训练RPN于Fast-R-CNN" class="headerlink" title="原论文方法：分别训练RPN于Fast R-CNN"></a>原论文方法：分别训练RPN于Fast R-CNN</h3><ol><li>利用ImageNEt与训练分类模型初始化前置卷积神经网络层参数，并开始单独训练RPN网络参数。</li><li>固定RPN网络独有的卷积层以及全连接层参数，再利用ImageNet与训练分类模型初始化前置卷积网络参数，并利用RPN网络生成的目标建议框去训练Fast RCNN网络参数。</li><li>固定利用Fast RCNN训练好的前置卷积网络层参数，微调RPN网络独有的卷积层以及全连接层参数。</li><li>同样保持固定前置卷积层参数，微调Fast RCNN网络的全连接层参数。最后RPN网络与Fast RCNN网络共享前置卷积层参数，构成一个统一网络&#x2F;</li></ol><h2 id="存在问题-1"><a href="#存在问题-1" class="headerlink" title="存在问题"></a>存在问题</h2><ul><li><p>对小目标检测效果较差</p></li><li><p>模型大，检测速度较慢</p></li></ul><h1 id="mAP-Precision（精度）-与Recall（召回率）"><a href="#mAP-Precision（精度）-与Recall（召回率）" class="headerlink" title="mAP\Precision（精度） 与Recall（召回率）"></a>mAP\Precision（精度） 与Recall（召回率）</h1><ul><li>TP（True Positives）：被分为正样本，并且分对了</li><li>TN（True Negatives）：被分为负样本，并且分对了</li><li>FP（False Positives）：被分为正样本，但是分错了</li><li>FN（False Negatives）：被分为负样本，但是分错了</li></ul><p><strong>Precision</strong>是$\frac{TP}{TP+FP}$：预测是正类并且确实是正类的部分占<strong>所有预测中认为是正类</strong>的比例</p><p><strong>Recall</strong>是$\frac{TP}{TP+FN}$：预测是正类并且确实是正类的部分占<strong>所有确实是正类</strong>的比例</p><p><strong>mAP</strong>：mean Average Precision，就是各个类别AP的平均值。</p>]]>
    </content>
    <id>https://www.wakli.com/2022/04/03/%E7%9B%AE%E6%A0%87%E6%A3%80%E6%B5%8B%E7%AE%97%E6%B3%95-Two-Stage/</id>
    <link href="https://www.wakli.com/2022/04/03/%E7%9B%AE%E6%A0%87%E6%A3%80%E6%B5%8B%E7%AE%97%E6%B3%95-Two-Stage/"/>
    <published>2022-04-03T13:11:56.000Z</published>
    <summary>
      <![CDATA[<h1 id="R-CNN"><a href="#R-CNN" class="headerlink" title="R-CNN"></a>R-CNN</h1><p> <a href="https://ieeexplore.ieee.org/document/6909475">论文原文</a></p>
<h2 id="算法步骤"><a href="#算法步骤" class="headerlink" title="算法步骤"></a>算法步骤</h2><ol>
<li>一张图片生成1k-2k个候选区域（使用Selective Search（SS）方法）</li>
<li>对每个候选区域，遂用深度网络提取特征</li>
<li>特征送入每一类SVM（支持向量机）分类器，判别是否属于该类</li>
<li>使用回归器精细修正候选框位置</li>
</ol>
<img width=600 src="/2022/04/03/目标检测算法-Two-Stage/6909475-fig-1-source-large.gif">]]>
    </summary>
    <title>目标检测算法:Two-Stage</title>
    <updated>2026-07-20T02:22:39.571Z</updated>
  </entry>
  <entry>
    <author>
      <name>王康力</name>
    </author>
    <category term="OpenCV" scheme="https://www.wakli.com/categories/OpenCV/"/>
    <category term="计算机视觉" scheme="https://www.wakli.com/categories/OpenCV/%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%A7%86%E8%A7%89/"/>
    <category term="图像操作" scheme="https://www.wakli.com/tags/%E5%9B%BE%E5%83%8F%E6%93%8D%E4%BD%9C/"/>
    <category term="形态学操作" scheme="https://www.wakli.com/tags/%E5%BD%A2%E6%80%81%E5%AD%A6%E6%93%8D%E4%BD%9C/"/>
    <category term="Canny" scheme="https://www.wakli.com/tags/Canny/"/>
    <category term="边缘检测" scheme="https://www.wakli.com/tags/%E8%BE%B9%E7%BC%98%E6%A3%80%E6%B5%8B/"/>
    <category term="二值化" scheme="https://www.wakli.com/tags/%E4%BA%8C%E5%80%BC%E5%8C%96/"/>
    <category term="傅立叶变换" scheme="https://www.wakli.com/tags/%E5%82%85%E7%AB%8B%E5%8F%B6%E5%8F%98%E6%8D%A2/"/>
    <content>
      <![CDATA[<h2 id="图像基本操作"><a href="#图像基本操作" class="headerlink" title="图像基本操作"></a>图像基本操作</h2><h3 id="图像读取"><a href="#图像读取" class="headerlink" title="图像读取"></a>图像读取</h3><ul><li>openCV按照BGR格式读取数据，需要使用pyplot展示时需要转换为RGB模式</li><li>cv2.cvtColor函数提供图像通道转换功能</li></ul><span id="more"></span><figure class="highlight ini"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><code class="hljs ini"><span class="hljs-attr">image</span>=cv2.imread(<span class="hljs-string">&#x27;image.png&#x27;</span>)<br><span class="hljs-attr">img_RGB</span> = cv2.cvtColor(image,cv2.COLOR_BGR2RGB)<br><span class="hljs-attr">img_gray</span> = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)<br><span class="hljs-attr">img_Lab</span> = cv2.cvtColor(image, cv2.COLOR_BGR2Lab) <br><span class="hljs-comment">#Lab通道是亮度、红绿、黄蓝通道，某些业务中使用比RGB通道有更好的效果</span><br><span class="hljs-attr">img_Lab</span> = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)<br><span class="hljs-comment">#HSV通道色调、饱和度、强度</span><br></code></pre></td></tr></table></figure><p>使用pyplot进行展示</p><figure class="highlight stylus"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><code class="hljs stylus">plt<span class="hljs-selector-class">.imshow</span>(img_RGB)<br>plt<span class="hljs-selector-class">.show</span>()<br>plt<span class="hljs-selector-class">.imshow</span>(img_gray, cmap =<span class="hljs-string">&#x27;gray&#x27;</span>) #灰度图展示<br>plt<span class="hljs-selector-class">.show</span>()<br></code></pre></td></tr></table></figure><img width=200 src="/2021/11/25/OpenCV图像处理基础/img1.png"><img width=200 src="/2021/11/25/OpenCV图像处理基础/img2.png"><h3 id="截取图像"><a href="#截取图像" class="headerlink" title="截取图像"></a>截取图像</h3><p>与多维数组裁剪方式一样</p><figure class="highlight apache"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs apache"><span class="hljs-attribute">img_cut</span> = img_RGB[<span class="hljs-number">25</span>:<span class="hljs-number">100</span>,<span class="hljs-number">50</span>:<span class="hljs-number">200</span>]<br></code></pre></td></tr></table></figure><img width=200 src="/2021/11/25/OpenCV图像处理基础/img3.png"><h3 id="通道提取与合并"><a href="#通道提取与合并" class="headerlink" title="通道提取与合并"></a>通道提取与合并</h3><ul><li>使用openCV自带的split函数进行通道提取</li><li>使用merge函数进行合并</li></ul><figure class="highlight tp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><code class="hljs tp"><span class="hljs-keyword">R</span>,G,B = cv<span class="hljs-number">2</span>.split(img_RGB)<br>img_RGB_merge = cv<span class="hljs-number">2</span>.merge((<span class="hljs-keyword">R</span>,G,B))<br>#仅保留一个通道，例仅保留<span class="hljs-keyword">R</span><br>img_R = img_RGB.copy()<br>img_<span class="hljs-built_in">R[<span class="hljs-symbol">:,:,1</span>]</span> = <span class="hljs-number">0</span><br>img_<span class="hljs-built_in">R[<span class="hljs-symbol">:,:,2</span>]</span> = <span class="hljs-number">0</span><br></code></pre></td></tr></table></figure><img width=200 src="/2021/11/25/OpenCV图像处理基础/img4.png"><h3 id="边界扩充"><a href="#边界扩充" class="headerlink" title="边界扩充"></a>边界扩充</h3><ul><li>BORDER_REPLICATE：复制法，也就是复制最边缘像素。</li><li>BORDER_REFLECT：反射法，对感兴趣的图像中的像素在两边进行复制例如：fedcba|abcdefgh|hgfedcb   </li><li>BORDER_REFLECT_101：反射法，也就是以最边缘像素为轴，对称，gfedcb|abcdefgh|gfedcba</li><li>BORDER_WRAP：外包装法cdefgh|abcdefgh|abcdefg  </li><li>BORDER_CONSTANT：常量法，常数值填充。</li></ul><figure class="highlight mipsasm"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><code class="hljs mipsasm">top_size,<span class="hljs-keyword">bottom_size,left_size,right_size </span>= (<span class="hljs-number">50</span>,<span class="hljs-number">50</span>,<span class="hljs-number">50</span>,<span class="hljs-number">50</span>)<br><br>replicate = cv2.copyMakeBorder(img_RGB, top_size, <span class="hljs-keyword">bottom_size, </span>left_size, right_size, <span class="hljs-keyword">borderType=cv2.BORDER_REPLICATE)</span><br><span class="hljs-keyword"></span>reflect = cv2.copyMakeBorder(img_RGB, top_size, <span class="hljs-keyword">bottom_size, </span>left_size, right_size,cv2.<span class="hljs-keyword">BORDER_REFLECT)</span><br><span class="hljs-keyword"></span>reflect101 = cv2.copyMakeBorder(img_RGB, top_size, <span class="hljs-keyword">bottom_size, </span>left_size, right_size, cv2.<span class="hljs-keyword">BORDER_REFLECT_101)</span><br><span class="hljs-keyword"></span>wrap = cv2.copyMakeBorder(img_RGB, top_size, <span class="hljs-keyword">bottom_size, </span>left_size, right_size, cv2.<span class="hljs-keyword">BORDER_WRAP)</span><br><span class="hljs-keyword"></span>constant = cv2.copyMakeBorder(img_RGB, top_size, <span class="hljs-keyword">bottom_size, </span>left_size, right_size,cv2.<span class="hljs-keyword">BORDER_CONSTANT, </span>value=<span class="hljs-number">0</span>)<br></code></pre></td></tr></table></figure><img width=600 src="/2021/11/25/OpenCV图像处理基础/img5.png"><h3 id="图片数值计算"><a href="#图片数值计算" class="headerlink" title="图片数值计算"></a>图片数值计算</h3><p>两图片直接相加 相当于%256</p><figure class="highlight nginx"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs nginx"><span class="hljs-attribute">img1</span> + img2<br></code></pre></td></tr></table></figure><p>使用cv2.add函数相加大于255时直接赋值255</p><figure class="highlight routeros"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs routeros">cv2.<span class="hljs-built_in">add</span>(img1,img2)<br></code></pre></td></tr></table></figure><p>更改图片尺寸</p><ul><li><font color=#dc143c >cv2.resize()函数进行图片缩放时，输入参数中的dsize，即输出图片的大小，顺序应为(w, h)，和cv2.imread()读入图片的顺序相反，cv2.imread()读入图片的通道顺序为(h, w, c)。</font></li></ul><figure class="highlight apache"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs apache"><span class="hljs-attribute">img_resize</span> = cv2.resize(img_RGB, (<span class="hljs-number">100</span>, <span class="hljs-number">100</span>))<br><span class="hljs-attribute">img_resize2</span> = cv2.resize(img_RGB, (<span class="hljs-number">0</span>, <span class="hljs-number">0</span>), fx=<span class="hljs-number">2</span>, fy=<span class="hljs-number">3</span>)<br></code></pre></td></tr></table></figure><img width=400 src="/2021/11/25/OpenCV图像处理基础/img6.png"><h3 id="图片融合"><a href="#图片融合" class="headerlink" title="图片融合"></a>图片融合</h3><p>需要两张相同大小的图片按照权重进行融合，使用cv2.addWeighted函数。</p><p>在将尺寸不同的图片进行融合时要注意resize时的参数顺序</p><figure class="highlight stylus"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><code class="hljs stylus">image2 = cv2<span class="hljs-selector-class">.imread</span>(<span class="hljs-string">&#x27;source/testimg.png&#x27;</span>)<br>img2_RGB = cv2<span class="hljs-selector-class">.cvtColor</span>(image2,cv2.COLOR_BGR2RGB)<br>img2_resize = cv2<span class="hljs-selector-class">.resize</span>(img2_RGB, (<span class="hljs-built_in">int</span>(img_RGB<span class="hljs-selector-class">.shape</span><span class="hljs-selector-attr">[1]</span>), <span class="hljs-built_in">int</span>(img_RGB<span class="hljs-selector-class">.shape</span><span class="hljs-selector-attr">[0]</span>)))<br><span class="hljs-function"><span class="hljs-title">print</span><span class="hljs-params">(img2_resize.shape,img_RGB.shape)</span></span><br>img1&amp;<span class="hljs-number">2</span> = cv2<span class="hljs-selector-class">.addWeighted</span>(img_RGB, <span class="hljs-number">0.4</span>, img2_resize, <span class="hljs-number">0.6</span>, <span class="hljs-number">0</span>)<br></code></pre></td></tr></table></figure><img width=300 src="/2021/11/25/OpenCV图像处理基础/img7.png"><h2 id="图像处理基本操作"><a href="#图像处理基本操作" class="headerlink" title="图像处理基本操作"></a>图像处理基本操作</h2><h3 id="图像阀值处理（二值化）"><a href="#图像阀值处理（二值化）" class="headerlink" title="图像阀值处理（二值化）"></a>图像阀值处理（二值化）</h3><ol><li>threshold 固定阀值二值化</li></ol><figure class="highlight elm"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs elm"><span class="hljs-title">ret</span>, dst = cv2.threshold(src, thresh, maxval, <span class="hljs-keyword">type</span>) <br></code></pre></td></tr></table></figure><ul><li>dst： 输出图</li><li>ret&#x2F;thresh： 阈值</li><li>src： 输入图，只能输入单通道图像，通常来说为灰度图</li><li>maxval： 当像素值超过了阈值（或者小于阈值，根据type来决定），所赋予的值</li><li>type：二值化操作的类型，包含以下5种类型： cv2.THRESH_BINARY； cv2.THRESH_BINARY_INV； cv2.THRESH_TRUNC； cv2.THRESH_TOZERO；cv2.THRESH_TOZERO_INV</li><li>cv2.THRESH_BINARY           超过阈值部分取maxval（最大值），否则取0</li><li>cv2.THRESH_BINARY_INV    THRESH_BINARY的反转</li><li>cv2.THRESH_TRUNC            大于阈值部分设为阈值，否则不变</li><li>cv2.THRESH_TOZERO          大于阈值部分不改变，否则设为0</li><li>cv2.THRESH_TOZERO_INV  THRESH_TOZERO的反转</li></ul><figure class="highlight apache"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><code class="hljs apache"><span class="hljs-attribute">ret</span>, thresh1 = cv2.threshold(img3_gray, <span class="hljs-number">200</span>, <span class="hljs-number">255</span>, cv2.THRESH_BINARY)<br><span class="hljs-attribute">ret</span>, thresh2 = cv2.threshold(img3_gray, <span class="hljs-number">200</span>, <span class="hljs-number">255</span>, cv2.THRESH_BINARY_INV)<br><span class="hljs-attribute">ret</span>, thresh3 = cv2.threshold(img3_gray, <span class="hljs-number">200</span>, <span class="hljs-number">255</span>, cv2.THRESH_TRUNC)<br><span class="hljs-attribute">ret</span>, thresh4 = cv2.threshold(img3_gray, <span class="hljs-number">200</span>, <span class="hljs-number">255</span>, cv2.THRESH_TOZERO)<br><span class="hljs-attribute">ret</span>, thresh5 = cv2.threshold(img3_gray, <span class="hljs-number">200</span>, <span class="hljs-number">255</span>, cv2.THRESH_TOZERO_INV)<br></code></pre></td></tr></table></figure><img width=400 src="/2021/11/25/OpenCV图像处理基础/img8.png"><ol start="2"><li>threshold + OTSU 基于直方图的二值化阀值</li></ol><figure class="highlight ada"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs ada">ret, dst = cv2.threshold(src, <span class="hljs-number">0</span>, maxval, <span class="hljs-keyword">type</span> <span class="hljs-type">+ </span>cv2.THRESH_OTSU)<br></code></pre></td></tr></table></figure><ul><li>不需要手动设置阀值，根据直方图自动设置阀值，thresh填0即可</li></ul><figure class="highlight routeros"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs routeros">re3, th4 = cv2.threshold(img_gray, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)<br><span class="hljs-built_in">print</span>(<span class="hljs-string">&#x27;re3 =&#x27;</span>,re3)<br><span class="hljs-comment"># re3 = 198.0 自动设置阀值为198.0</span><br></code></pre></td></tr></table></figure><img width=200 src="/2021/11/25/OpenCV图像处理基础/img9.png"><ol start="3"><li>adaptiveThreshold 自适应阀值二值化</li></ol><ul><li><font color=#dc143c >自适应阀值法不计算全局图像阀值，是根据图像不同区域亮度分布，计算局部阀值，对于亮度不同的区域自适应计算不同阀值。</font></li></ul><figure class="highlight pf"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs pf">cv2.adaptiveThreshold(src, <span class="hljs-keyword">max</span>Value, adaptiveMethod, thresholdType, <span class="hljs-built_in">block</span>Size, C)<br></code></pre></td></tr></table></figure><ul><li>thresholdType : 二值化操作的类型 只能使用cv2.THRESH_BINARY 或 cv2.THRESH_BINARY_INV</li><li>blockSize : 像素邻域的大小，用来计算像素的阈值，blockSize必须为奇数</li><li>C : 从平均数或加权平均数减去的常量。通常，它是正的，但也可能是零或负数。</li><li>adaptiveMethod : 自适应阈值的方法共两个</li><li>cv2.ADAPTIVE_THRESH_MEAN_C           阈值T(x,y)是(x,y)减去C的Blocksize×Blocksize邻域的平均值。</li><li>cv2.ADAPTIVE_THRESH_GAUSSIAN_C   阈值T(x，y)是(x，y)减去C的Blocksize×Blocksize邻域的加权和(与高斯相关)，默认sigma(标准差)用于指定的Blocksize</li></ul><img width=300 src="/2021/11/25/OpenCV图像处理基础/img10.png"><h3 id="图像平滑"><a href="#图像平滑" class="headerlink" title="图像平滑"></a>图像平滑</h3><ol><li>均值滤波：平均卷积操作</li></ol><figure class="highlight apache"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs apache"><span class="hljs-attribute">blur</span> = cv2.blur(img, (<span class="hljs-number">3</span>, <span class="hljs-number">3</span>))<br></code></pre></td></tr></table></figure><ol start="2"><li>方框滤波（可以归一化的均值滤波）</li></ol><figure class="highlight apache"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs apache"><span class="hljs-attribute">box</span> = cv2.boxFilter(img4_RGB,-<span class="hljs-number">1</span>,(<span class="hljs-number">3</span>,<span class="hljs-number">3</span>), normalize=True)<br><span class="hljs-attribute">box_F</span> = cv2.boxFilter(img4_RGB,-<span class="hljs-number">1</span>,(<span class="hljs-number">3</span>,<span class="hljs-number">3</span>), normalize=False)<br></code></pre></td></tr></table></figure><ul><li>第二个参数为目标图像深度，-1表示与原始图像一致</li><li>normalize为true 时与均值滤波一样，为false时表示任意一个点的像素为周围像素点的和，容易发生溢出超过255</li></ul><ol start="3"><li>高斯滤波：高斯模糊的卷积核里的数值是满足高斯分布的，相当于更重视中间的</li></ol><figure class="highlight apache"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs apache"><span class="hljs-attribute">gaussian</span> = cv2.GaussianBlur(img, (<span class="hljs-number">5</span>, <span class="hljs-number">5</span>), <span class="hljs-number">1</span>) <br></code></pre></td></tr></table></figure><ol start="4"><li>中值滤波：用中值代替</li></ol><figure class="highlight ini"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs ini"><span class="hljs-attr">median</span> = cv2.medianBlur(img, <span class="hljs-number">5</span>)<br></code></pre></td></tr></table></figure><img width=500 src="/2021/11/25/OpenCV图像处理基础/img11.png"><h3 id="形态学操作"><a href="#形态学操作" class="headerlink" title="形态学操作"></a>形态学操作</h3><ol><li>腐蚀操作</li></ol><ul><li>它沿着物体边界移除像素并缩小物体的大小，会增强图像的暗部。</li><li>iterations 为 迭代次数</li></ul><figure class="highlight ini"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs ini"><span class="hljs-attr">kernel</span> = np.<span class="hljs-literal">on</span>es((<span class="hljs-number">3</span>,<span class="hljs-number">3</span>),np.uint8)<br><span class="hljs-attr">erosion</span> = cv2.erode(img5_GRAY,kernel,iterations = <span class="hljs-number">3</span>)<br></code></pre></td></tr></table></figure><img width=400 src="/2021/11/25/OpenCV图像处理基础/img12.png"><ol start="2"><li>膨胀操作</li></ol><ul><li>通过将像素添加到该图像中的对象的感知边界，扩张放大图像中的明亮白色区域。</li></ul><figure class="highlight ini"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs ini"><span class="hljs-attr">dige_dilate</span> = cv2.dilate(erosion,kernel,iterations = <span class="hljs-number">3</span>)<br></code></pre></td></tr></table></figure><img width=400 src="/2021/11/25/OpenCV图像处理基础/img13.png"><ol start="3"><li>开运算与闭运算</li></ol><ul><li>开运算：先腐蚀，再膨胀。 去除白色小信息</li><li>闭运算：先膨胀，再腐蚀。 加强白色小信息</li><li>使用形态学操作函数cv2.morphologyEx()</li></ul><figure class="highlight routeros"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs routeros">closing = cv2.morphologyEx(img, op, kernel, <span class="hljs-attribute">dst</span>=None, <span class="hljs-attribute">anchor</span>=None, <span class="hljs-attribute">iterations</span>=None, <span class="hljs-attribute">borderType</span>=None, <span class="hljs-attribute">borderValue</span>=None)<br></code></pre></td></tr></table></figure><ul><li>op 开运算或闭运算操作  cv2.MORPH_OPEN 或 cv2.MORPH_CLOSE</li><li>iterations 迭代次数 默认为1 即膨胀和腐蚀次数</li></ul><figure class="highlight ini"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs ini"><span class="hljs-attr">opening</span> = cv2.morphologyEx(img5_GRAY, cv2.MORPH_OPEN, kernel, iterations=<span class="hljs-number">3</span>)<br></code></pre></td></tr></table></figure><img width=400 src="/2021/11/25/OpenCV图像处理基础/img14.png"><ol start="4"><li>顶帽与黑帽</li></ol><ul><li>礼帽 &#x3D; 原始输入-开运算结果</li><li>黑帽 &#x3D; 闭运算-原始输入</li></ul><ul><li><p>顶帽与黑帽同样使用形态学操作函数cv2.morphologyEx()</p></li><li><p>op 顶帽与黑帽操作  cv2.MORPH_TOPHAT 或 cv2.MORPH_BLACKHAT</p></li></ul><figure class="highlight ini"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs ini"><span class="hljs-attr">tophat</span> = cv2.morphologyEx(img5_GRAY,  cv2.MORPH_TOPHAT, kernel ,iterations=<span class="hljs-number">3</span>)<br></code></pre></td></tr></table></figure><img width=400 src="/2021/11/25/OpenCV图像处理基础/img15.png"><h3 id="Canny边缘检测"><a href="#Canny边缘检测" class="headerlink" title="Canny边缘检测"></a>Canny边缘检测</h3><ul><li>使用高斯滤波器，以平滑图像，滤除噪声。</li><li>计算图像中每个像素点的梯度强度和方向。</li><li>应用非极大值（Non-Maximum Suppression）抑制，以消除边缘检测带来的杂散响应。</li><li>应用双阈值（Double-Threshold）检测来确定真实的和潜在的边缘。<ul><li>梯度值&gt;maxVal：处理为强边缘边界</li><li>minVal&lt;梯度值&lt;maxVal：与强边缘相连则保留，否则舍弃</li><li>提督值&lt;minVal：弱边缘舍弃</li></ul></li><li>通过抑制孤立的弱边缘最终完成边缘检测。</li><li><font color=#dc143c >明显轮廓断裂</font></li></ul><figure class="highlight fortran"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs fortran">edges = cv.Canny(image, <span class="hljs-built_in">minVal</span>, <span class="hljs-built_in">maxVal</span> ,apertureSize=<span class="hljs-keyword">None</span>, L2gradient=<span class="hljs-keyword">None</span>)<br></code></pre></td></tr></table></figure><ul><li>edges： 计算得到的边缘图像</li><li>minval： 弱边缘阀值</li><li>maxval： 强边缘阀值</li><li>apertureSize： Sobel算子孔径大小</li><li>L2gradient：计算图像梯度幅度（gradient magnitude）的标识。如果为 True，则使用更精确的 L2 范数进行计算（即两个方向的导数的平方和再开方）</li></ul><figure class="highlight apache"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs apache"><span class="hljs-attribute">edge1</span>=cv2.Canny(image5,<span class="hljs-number">100</span>,<span class="hljs-number">150</span>)<br><span class="hljs-attribute">edge2</span>=cv2.Canny(image5,<span class="hljs-number">200</span>,<span class="hljs-number">400</span>)<br></code></pre></td></tr></table></figure><img width=600 src="/2021/11/25/OpenCV图像处理基础/img16.png"><h3 id="图像轮廓"><a href="#图像轮廓" class="headerlink" title="图像轮廓"></a>图像轮廓</h3><ol><li>轮廓检测</li></ol><figure class="highlight oxygene"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs oxygene">contours,hierarchy = cv2.findContours(img,mode,<span class="hljs-keyword">method</span>)<br></code></pre></td></tr></table></figure><ul><li><p>contours：轮廓坐标数组</p></li><li><p>mode：轮廓检索模式</p><ul><li>RETR_EXTERNAL ：只检索最外面的轮廓；</li><li>RETR_LIST：检索所有的轮廓，并将其保存到一条链表当中；</li><li>RETR_CCOMP：检索所有的轮廓，并将他们组织为两层：顶层是各部分的外部边界，第二层是空洞的边界;</li><li>RETR_TREE：检索所有的轮廓，并重构嵌套轮廓的整个层次;</li></ul></li><li><p>method：轮廓逼近方法</p><ul><li>CHAIN_APPROX_NONE：以Freeman链码的方式输出轮廓，所有其他方法输出多边形（顶点的序列）。</li><li>CHAIN_APPROX_SIMPLE:压缩水平的、垂直的和斜的部分，也就是，函数只保留他们的终点部分。</li></ul></li><li><p>一般使用二值图像提高准确率</p></li></ul><ol start="2"><li>轮廓绘制</li></ol><figure class="highlight routeros"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs routeros">res = cv2.drawContours(image, contours, contourIdx, color, <span class="hljs-attribute">thickness</span>=None, <span class="hljs-attribute">lineType</span>=None, <span class="hljs-attribute">hierarchy</span>=None, <span class="hljs-attribute">maxLevel</span>=None, <span class="hljs-attribute">offset</span>=None)<br></code></pre></td></tr></table></figure><ul><li>contours：轮廓list</li><li>contourIdx：需要绘制的轮廓在contours的list中的索引，-1为默认绘制所有轮廓</li><li>color：为轮廓线颜色</li><li>thickness：为轮廓线宽度</li><li>hierarchy：绘制分层轮廓时使用</li></ul><figure class="highlight stylus"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><code class="hljs stylus">contours,hierarchy = cv2<span class="hljs-selector-class">.findContours</span>(img5_GRAY, cv2<span class="hljs-selector-class">.RETR_TREE</span>, cv2.CHAIN_APPROX_SIMPLE)<br><span class="hljs-function"><span class="hljs-title">print</span><span class="hljs-params">(hierarchy,contours)</span></span><br>draw_img = img5_RGB<span class="hljs-selector-class">.copy</span>()<br>res = cv2<span class="hljs-selector-class">.drawContours</span>(draw_img, contours, -<span class="hljs-number">1</span>, (<span class="hljs-number">255</span>, <span class="hljs-number">0</span>, <span class="hljs-number">0</span>), <span class="hljs-number">2</span>)<br></code></pre></td></tr></table></figure><img width=400 src="/2021/11/25/OpenCV图像处理基础/img17.png"><ol start="3"><li>根据轮廓操作</li></ol><ul><li>轮廓周长</li></ul><figure class="highlight ini"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs ini"><span class="hljs-attr">length</span> = cv2.arcLength(cnt,closed = <span class="hljs-literal">True</span>)<br></code></pre></td></tr></table></figure><p>closed为是否闭合，True为闭合</p><ul><li>计算最大轮廓</li></ul><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><code class="hljs python"><span class="hljs-keyword">def</span> <span class="hljs-title function_">findMaxContour</span>(<span class="hljs-params">contours</span>):<br>    largeCnt = []<br>    maxLength = <span class="hljs-number">0</span><br>    <span class="hljs-keyword">for</span> c <span class="hljs-keyword">in</span> contours:<br>        <span class="hljs-comment"># 计算轮廓近似</span><br>        <span class="hljs-keyword">if</span> maxLength&lt;cv2.arcLength(c, <span class="hljs-literal">True</span>):<br>            maxLength = cv2.arcLength(c, <span class="hljs-literal">True</span>)<br>            largeCnt = c<br>    <span class="hljs-keyword">return</span> maxLength,largeCnt<br></code></pre></td></tr></table></figure><p>maxLength：最大轮廓长度</p><p>largeCnt：最大轮廓array</p><ul><li>轮廓面积</li></ul><figure class="highlight abnf"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs abnf"><span class="hljs-attribute">area</span> <span class="hljs-operator">=</span> cv2.contourArea(cnt)<br></code></pre></td></tr></table></figure><ul><li>外接圆</li></ul><figure class="highlight hsp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs hsp">(x,y),radius = cv2.minEnclosingCircle(<span class="hljs-keyword">cnt</span>) <br>center = (<span class="hljs-keyword">int</span>(x),<span class="hljs-keyword">int</span>(y)) <span class="hljs-meta">#圆心</span><br>radius = <span class="hljs-keyword">int</span>(radius)  <span class="hljs-meta">#半径</span><br></code></pre></td></tr></table></figure><ul><li>外接矩形</li></ul><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs python">x,y,w,h = cv2.boundingRect(cnt)<br></code></pre></td></tr></table></figure><p>x：右上x坐标   y：右上y坐标   w：宽度   h：高度</p><h3 id="傅立叶变换"><a href="#傅立叶变换" class="headerlink" title="傅立叶变换"></a>傅立叶变换</h3><ul><li>高频：变化剧烈的灰度分量，比如边界</li><li>低频：变化缓慢的灰度分量，比如背景</li><li>高通滤波器：只保留高频，使图像细节增强</li><li>低通滤波器：只保留高频，使图像模糊</li><li>进行傅立叶变换得到频域结果使用cv2.dft()，cv2.idft()，输入图像需要先转换成np.float32 格式。</li><li>得到的结果中频率为0的部分会在左上角，通常要转换到中心位置，可以通过shift变换来实现。</li><li>cv2.dft()返回的结果是双通道的（实部，虚部），通常还需要转换成图像格式才能展示（0,255）。</li></ul><ol><li>傅立叶变换</li></ol><figure class="highlight ini"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><code class="hljs ini"><span class="hljs-attr">img7_float32</span> = np.float32(image7)<br><span class="hljs-attr">dft</span> = cv2.dft(img7_float32, flags = cv2.DFT_COMPLEX_OUTPUT)<br><span class="hljs-comment"># 将结果中边角的转换到中心位置，即将低频值转换到中间</span><br><span class="hljs-attr">dft_shift</span> = np.fft.fftshift(dft) <br><span class="hljs-comment"># 得到灰度图能表示的形式</span><br><span class="hljs-comment"># 先通过cv2.magnitude对两个通道进行转换，因为转换后的结果数值较小所以通过公式转换至0-255</span><br><span class="hljs-attr">magnitude_spectrum</span> = <span class="hljs-number">20</span>*np.log(cv2.magnitude(dft_shift[:,:,<span class="hljs-number">0</span>],dft_shift[:,:,<span class="hljs-number">1</span>]))<br><span class="hljs-attr">dft_spectrum</span> = <span class="hljs-number">20</span>*np.log(cv2.magnitude(dft[:,:,<span class="hljs-number">0</span>],dft[:,:,<span class="hljs-number">1</span>]))<br></code></pre></td></tr></table></figure><img width=600 src="/2021/11/25/OpenCV图像处理基础/img18.png"><ol start="2"><li>低通滤波器</li></ol><figure class="highlight stan"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><code class="hljs stan">mg7_float32 = np.float32(image7)<br>dft = cv2.dft(img7_float32, flags = cv2.DFT_COMPLEX_OUTPUT)<br>dft_shift = np.<span class="hljs-built_in">fft</span>.fftshift(dft) <br><br><span class="hljs-built_in">rows</span>, <span class="hljs-built_in">cols</span> = image7.shape<br>crow, ccol = <span class="hljs-type">int</span>(<span class="hljs-built_in">rows</span>/<span class="hljs-number">2</span>) , <span class="hljs-type">int</span>(<span class="hljs-built_in">cols</span>/<span class="hljs-number">2</span>)     <span class="hljs-comment"># 中心位置</span><br><br><span class="hljs-comment"># 低通滤波 取中心点周围30的矩形以内的点</span><br>mask = np.zeros((<span class="hljs-built_in">rows</span>, <span class="hljs-built_in">cols</span>, <span class="hljs-number">2</span>), np.uint8)<br>mask[crow-<span class="hljs-number">30</span>:crow+<span class="hljs-number">30</span>, ccol-<span class="hljs-number">30</span>:ccol+<span class="hljs-number">30</span>] = <span class="hljs-number">1</span><br><br><span class="hljs-comment"># IDFT</span><br>fshift = dft_shift*mask<br>f_ishift = np.<span class="hljs-built_in">fft</span>.ifftshift(fshift)<br>img_back = cv2.idft(f_ishift)<br>img_back = cv2.magnitude(img_back[:,:,<span class="hljs-number">0</span>],img_back[:,:,<span class="hljs-number">1</span>])<br></code></pre></td></tr></table></figure><img width=400 src="/2021/11/25/OpenCV图像处理基础/img19.png"><ol start="3"><li>高通滤波器</li></ol><figure class="highlight stan"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><code class="hljs stan">img7_float32 = np.float32(image7)<br>dft = cv2.dft(img7_float32, flags = cv2.DFT_COMPLEX_OUTPUT)<br>dft_shift = np.<span class="hljs-built_in">fft</span>.fftshift(dft)<br><br><br><span class="hljs-built_in">rows</span>, <span class="hljs-built_in">cols</span> = image7.shape<br>crow, ccol = <span class="hljs-type">int</span>(<span class="hljs-built_in">rows</span>/<span class="hljs-number">2</span>) , <span class="hljs-type">int</span>(<span class="hljs-built_in">cols</span>/<span class="hljs-number">2</span>)     <span class="hljs-comment"># 中心位置</span><br><br><span class="hljs-comment"># 高通滤波 取中心点周围30的矩形以外的点</span><br>mask = np.ones((<span class="hljs-built_in">rows</span>, <span class="hljs-built_in">cols</span>, <span class="hljs-number">2</span>), np.uint8)<br>mask[crow-<span class="hljs-number">30</span>:crow+<span class="hljs-number">30</span>, ccol-<span class="hljs-number">30</span>:ccol+<span class="hljs-number">30</span>] = <span class="hljs-number">0</span><br><br><span class="hljs-comment"># IDFT</span><br>fshift = dft_shift*mask<br>f_ishift = np.<span class="hljs-built_in">fft</span>.ifftshift(fshift)<br>img_back = cv2.idft(f_ishift)<br>img_back = cv2.magnitude(img_back[:,:,<span class="hljs-number">0</span>],img_back[:,:,<span class="hljs-number">1</span>])<br></code></pre></td></tr></table></figure><img width=400 src="/2021/11/25/OpenCV图像处理基础/img20.png"><h3 id="Canny、形态学运算、轮廓检测应用"><a href="#Canny、形态学运算、轮廓检测应用" class="headerlink" title="Canny、形态学运算、轮廓检测应用"></a>Canny、形态学运算、轮廓检测应用</h3><p>Canny轮廓检测会有间断，所以使用形态学闭运算先膨胀再腐蚀后再进行轮廓检测会有较好效果</p><figure class="highlight apache"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br></pre></td><td class="code"><pre><code class="hljs apache"><span class="hljs-attribute">import</span> cv2<br><span class="hljs-attribute">import</span> numpy as np<br><span class="hljs-attribute">import</span> matplotlib.pyplot as plt<br><br><span class="hljs-attribute">img</span> = cv2.imread(<span class="hljs-string">&quot;source/test17.png&quot;</span>) #<span class="hljs-number">0</span>表示灰度图<br><br><span class="hljs-attribute">gray</span> = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)<br><span class="hljs-attribute">image</span> = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)<br><br><span class="hljs-attribute">gray</span> = cv2.GaussianBlur(gray, (<span class="hljs-number">5</span>, <span class="hljs-number">5</span>), <span class="hljs-number">0</span>)<br><span class="hljs-attribute">edged</span> = cv2.Canny(gray, <span class="hljs-number">15</span>,<span class="hljs-number">30</span>)<br><br><span class="hljs-attribute">def</span> contourLength(cnt):<br>    <span class="hljs-attribute">return</span> cv2.arcLength(cnt,closed = True)<br><br><span class="hljs-comment">#Canny后直接边缘检测</span><br><span class="hljs-attribute">contours</span>,hierarchy = cv2.findContours(edged, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)<br><span class="hljs-attribute">cnts</span> = sorted(contours, key = contourLength, reverse = True)[:<span class="hljs-number">3</span>]<br><span class="hljs-attribute">draw_img</span> = image.copy()<br><span class="hljs-attribute">cv2</span>.drawContours(draw_img, cnts, -<span class="hljs-number">1</span>, (<span class="hljs-number">0</span>, <span class="hljs-number">255</span>, <span class="hljs-number">0</span>), <span class="hljs-number">1</span>)<br><br><span class="hljs-comment">#Canny后进行闭运算后再进行轮廓检测</span><br><span class="hljs-attribute">kernel</span> = np.ones((<span class="hljs-number">3</span>,<span class="hljs-number">3</span>),np.uint8)<br><span class="hljs-attribute">closing</span> = cv2.morphologyEx(edged, cv2.MORPH_CLOSE, kernel)<br><br><span class="hljs-attribute">contours_close</span>,hierarchy_close = cv2.findContours(closing.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)<br><span class="hljs-attribute">cnts</span> = sorted(contours_close, key = contourLength, reverse = True)[:<span class="hljs-number">3</span>]<br><span class="hljs-attribute">draw_img_close</span> = image.copy()<br><span class="hljs-attribute">cv2</span>.drawContours(draw_img_close, cnts, -<span class="hljs-number">1</span>, (<span class="hljs-number">0</span>, <span class="hljs-number">255</span>, <span class="hljs-number">0</span>), <span class="hljs-number">1</span>)<br><br><span class="hljs-attribute">plt</span>.subplot(<span class="hljs-number">231</span>), plt.imshow(image), plt.title(&#x27;ORIGINAL&#x27;)<br><span class="hljs-attribute">plt</span>.subplot(<span class="hljs-number">232</span>), plt.imshow(edged,&#x27;gray&#x27;), plt.title(&#x27;CANNY&#x27;)<br><span class="hljs-attribute">plt</span>.subplot(<span class="hljs-number">233</span>), plt.imshow(draw_img), plt.title(&#x27;CONTOUR&#x27;)<br><span class="hljs-attribute">plt</span>.subplot(<span class="hljs-number">234</span>), plt.imshow(gray,&#x27;gray&#x27;), plt.title(&#x27;ORIGINAL_GRAY&#x27;)<br><span class="hljs-attribute">plt</span>.subplot(<span class="hljs-number">235</span>), plt.imshow(closing,&#x27;gray&#x27;), plt.title(&#x27;CANNY_CLOSE&#x27;)<br><span class="hljs-attribute">plt</span>.subplot(<span class="hljs-number">236</span>), plt.imshow(draw_img_close), plt.title(&#x27;CONTOUR_CLOSE&#x27;)<br><span class="hljs-attribute">plt</span>.show()<br></code></pre></td></tr></table></figure><img width=600 src="/2021/11/25/OpenCV图像处理基础/img21.png">]]>
    </content>
    <id>https://www.wakli.com/2021/11/25/OpenCV%E5%9B%BE%E5%83%8F%E5%A4%84%E7%90%86%E5%9F%BA%E7%A1%80/</id>
    <link href="https://www.wakli.com/2021/11/25/OpenCV%E5%9B%BE%E5%83%8F%E5%A4%84%E7%90%86%E5%9F%BA%E7%A1%80/"/>
    <published>2021-11-25T07:33:17.000Z</published>
    <summary>
      <![CDATA[<h2 id="图像基本操作"><a href="#图像基本操作" class="headerlink" title="图像基本操作"></a>图像基本操作</h2><h3 id="图像读取"><a href="#图像读取" class="headerlink" title="图像读取"></a>图像读取</h3><ul>
<li>openCV按照BGR格式读取数据，需要使用pyplot展示时需要转换为RGB模式</li>
<li>cv2.cvtColor函数提供图像通道转换功能</li>
</ul>]]>
    </summary>
    <title>OpenCV图像处理基础</title>
    <updated>2021-11-25T08:58:16.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>王康力</name>
    </author>
    <category term="机器学习" scheme="https://www.wakli.com/categories/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0/"/>
    <category term="知识点" scheme="https://www.wakli.com/categories/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0/%E7%9F%A5%E8%AF%86%E7%82%B9/"/>
    <category term="Dropout" scheme="https://www.wakli.com/tags/Dropout/"/>
    <category term="Regularization" scheme="https://www.wakli.com/tags/Regularization/"/>
    <content>
      <![CDATA[<ul><li>More data</li><li>Constraint model complexity 减少模型复杂的<ul><li>shallow</li><li>regularization</li></ul></li><li>Dropout </li><li>Data argumentation 数据增强</li><li>Early Stoping</li></ul><span id="more"></span><h3 id="Regularization"><a href="#Regularization" class="headerlink" title="Regularization"></a>Regularization</h3><p>正则化在loss函数中引入模型复杂度指标，利用给W加权值，减弱表达能力，弱化了训练数据的噪声</p><ul><li>L1-regularization 在原来loss基础上加一范数</li><li>L2-regularization 在原来loss基础上加二范数</li></ul><figure class="highlight routeros"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><code class="hljs routeros">l2_model =keras.models.Sequential([<br>keras.layers.Dense(16,<span class="hljs-attribute">kernel_regularizer</span>=keras.regularizers.l2(0.001),#正则化的权值<br><span class="hljs-attribute">activation</span>=tf.nn.relu),<br>keras.layers.Dense(16,<span class="hljs-attribute">kernel_regularizer</span>=keras.regularizers.l2(0.001),<br><span class="hljs-attribute">activation</span>=tf.nn.relu),<br>keras.layers.Dense(16,<span class="hljs-attribute">activation</span>=tf.nn.sigmoid)<br>])<br></code></pre></td></tr></table></figure><figure class="highlight stylus"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><code class="hljs stylus"><span class="hljs-keyword">for</span> step, (<span class="hljs-attribute">x</span>,y) in <span class="hljs-built_in">enumerate</span>(db):<br>    with tf<span class="hljs-selector-class">.GradientTape</span>() as tape:<br>        loss = tf<span class="hljs-selector-class">.losses</span><span class="hljs-selector-class">.categorical_crossentropy</span>(y_onehot, logits, from_logits=True)<br>        loss_regularization = <span class="hljs-selector-attr">[]</span><br>        <span class="hljs-keyword">for</span> <span class="hljs-selector-tag">p</span> <span class="hljs-keyword">in</span> network<span class="hljs-selector-class">.trainable_variables</span>: #根据存储方式只取w<br>            loss_regularization<span class="hljs-selector-class">.append</span>(tf<span class="hljs-selector-class">.nn</span><span class="hljs-selector-class">.l2_loss</span>(p))<br>        loss_regularization = tf<span class="hljs-selector-class">.reduce_sum</span>(tf<span class="hljs-selector-class">.stack</span>(loss_regularization))<br>        loss = loss+<span class="hljs-number">0.001</span>*loss_regularization<br>    grads = tape<span class="hljs-selector-class">.gradient</span>(loss, network.trainable_variables)<br>    optimizer<span class="hljs-selector-class">.apply_gradients</span>(<span class="hljs-built_in">zip</span>(grads, network.trainable_variables))<br></code></pre></td></tr></table></figure><h3 id="Early-Stopping"><a href="#Early-Stopping" class="headerlink" title="Early Stopping"></a>Early Stopping</h3><p>在训练过程中，训练集正确率持续上升，验证集正确率到达最高点后会因为训练过拟合而衰减，我们需要在最高点后让训练停止。</p><h3 id="Dropout"><a href="#Dropout" class="headerlink" title="Dropout"></a>Dropout</h3><img width="300" src="/2020/04/04/ReduceOverfitting/img1.png"><figure class="highlight apache"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><code class="hljs apache"><span class="hljs-attribute">network</span> =keras.models.Sequential([<br>    <span class="hljs-attribute">keras</span>.layers.Dense(<span class="hljs-number">256</span>,activation=tf.nn.relu),<br>    <span class="hljs-attribute">layers</span>.Dropout(<span class="hljs-number">0</span>.<span class="hljs-number">5</span>) #去掉<span class="hljs-number">50</span>%<br>    <span class="hljs-attribute">keras</span>.layers.Dense(<span class="hljs-number">128</span>,activation=tf.nn.relu),<br>    <span class="hljs-attribute">layers</span>.Dropout(<span class="hljs-number">0</span>.<span class="hljs-number">5</span>),<br>    <span class="hljs-attribute">keras</span>.layers.Dense(<span class="hljs-number">64</span>,activation=tf.nn.relu),<br>    <span class="hljs-attribute">keras</span>.layers.Dense(<span class="hljs-number">32</span>,activation=tf.nn.relu),<br>    <span class="hljs-attribute">keras</span>.layers.Dense(<span class="hljs-number">10</span>)])<br></code></pre></td></tr></table></figure><p>使用dropout时,Train和Test是不同的</p><figure class="highlight ini"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><code class="hljs ini"><span class="hljs-comment">#train</span><br><span class="hljs-attr">out</span> = network.(x,training=<span class="hljs-literal">true</span>)<br><span class="hljs-comment">#test</span><br><span class="hljs-attr">out</span> = network.(x,training=<span class="hljs-literal">false</span>)<br></code></pre></td></tr></table></figure>]]>
    </content>
    <id>https://www.wakli.com/2020/04/04/ReduceOverfitting/</id>
    <link href="https://www.wakli.com/2020/04/04/ReduceOverfitting/"/>
    <published>2020-04-04T08:59:41.000Z</published>
    <summary>
      <![CDATA[<ul>
<li>More data</li>
<li>Constraint model complexity 减少模型复杂的<ul>
<li>shallow</li>
<li>regularization</li>
</ul>
</li>
<li>Dropout </li>
<li>Data argumentation 数据增强</li>
<li>Early Stoping</li>
</ul>]]>
    </summary>
    <title>ReduceOverfitting</title>
    <updated>2020-04-04T09:52:40.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>王康力</name>
    </author>
    <category term="机器学习" scheme="https://www.wakli.com/categories/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0/"/>
    <category term="Keras" scheme="https://www.wakli.com/categories/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0/Keras/"/>
    <category term="keras" scheme="https://www.wakli.com/tags/keras/"/>
    <category term="自定义网络" scheme="https://www.wakli.com/tags/%E8%87%AA%E5%AE%9A%E4%B9%89%E7%BD%91%E7%BB%9C/"/>
    <content>
      <![CDATA[<p>Keras !&#x3D; tf.keras</p><p>Keras建立在其他接口之上的高层接口</p><p>TF2中实际不需要Keras，TF2中有对Keras的实现</p><ul><li>datasets</li><li>layers</li><li>losses</li><li>metrics</li><li>optimizers</li></ul><span id="more"></span><h2 id="KerasAPI"><a href="#KerasAPI" class="headerlink" title="KerasAPI"></a>KerasAPI</h2><h3 id="Keras-Metrics"><a href="#Keras-Metrics" class="headerlink" title="Keras.Metrics"></a>Keras.Metrics</h3><p>在DL中经常要计算loss和accuracy，这并不是指某一次迭代或某batch的loss和accuracy，至少是一个epoch的平均。我们要新建list，每1个batch向其中加入一个loss，经过数次后到达观测的节点，计算出这个list的avg，可以比较好的反应前后两次观测的变化情况，这个功能就是一个测量表的功能，也是Metrics的功能。</p><ul><li>Metrics 新建</li></ul><p>两个meter即为两个测量尺</p><figure class="highlight ini"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs ini"><span class="hljs-attr">acc_meter</span> = metrics.Accuracy() <span class="hljs-comment">#新建准确度meter</span><br><span class="hljs-attr">loss_meter</span> = metrics.Mean()<br></code></pre></td></tr></table></figure><ul><li>update_state 添加数据</li></ul><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs python">loss_meter.update_state(loss) <br>acc_meter.update_state(y,pred) <span class="hljs-comment">#添加的并不是和loss一样的实时数据</span><br></code></pre></td></tr></table></figure><ul><li>result().numpy() 需要使用时得到结果</li></ul><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs python"><span class="hljs-built_in">print</span>(step,<span class="hljs-string">&#x27;loss:&#x27;</span>loss_meter.result().numpy())<br><span class="hljs-built_in">print</span>(step,<span class="hljs-string">&#x27;Evaluate Acc:&#x27;</span>,total_correct/total,acc_meter.result().numpy())<br></code></pre></td></tr></table></figure><ul><li>reset_states 清零</li></ul><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><code class="hljs python"><span class="hljs-keyword">if</span> step % <span class="hljs-number">100</span> == <span class="hljs-number">0</span>:<br><span class="hljs-built_in">print</span>(step,<span class="hljs-string">&#x27;loss:&#x27;</span>loss_meter.result().numpy())<br>loss_meter.reset_states()<br><span class="hljs-keyword">if</span> step % <span class="hljs-number">500</span> == <span class="hljs-number">0</span>:<br>total,total_correct = <span class="hljs-number">0.</span>,<span class="hljs-number">0</span><br>acc_meter.reset_states()<br></code></pre></td></tr></table></figure><h3 id="Compile-Fit"><a href="#Compile-Fit" class="headerlink" title="Compile&amp;Fit"></a>Compile&amp;Fit</h3><p>快捷训练方法</p><ul><li>Compile装载的功能，指定loss、优化器、评估指标的选择</li></ul><figure class="highlight routeros"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs routeros">network.compile(optimizer = optimizer.Adam(<span class="hljs-attribute">lr</span>=0.01),<br><span class="hljs-attribute">loss</span>=tf.losses.CategoricalCrossentropy(from_logits=True))<br></code></pre></td></tr></table></figure><ul><li>fit 完成标准创建流程</li></ul><figure class="highlight routeros"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs routeros">network.fit(db,<span class="hljs-attribute">epochs</span>=10)<br></code></pre></td></tr></table></figure><ul><li>evaluate 进行测试</li></ul><figure class="highlight stylus"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><code class="hljs stylus">network<span class="hljs-selector-class">.compile</span>(optimizer = optimizer<span class="hljs-selector-class">.Adam</span>(lr=<span class="hljs-number">0.01</span>),<br>loss=tf<span class="hljs-selector-class">.losses</span><span class="hljs-selector-class">.CategoricalCrossentropy</span>(from_logits=True),<br>metrics<span class="hljs-selector-attr">[<span class="hljs-string">&#x27;accuracy&#x27;</span>]</span>)<br>network<span class="hljs-selector-class">.fit</span>(db,epochs=<span class="hljs-number">10</span>,validation_data=ds_val,validation_freq=<span class="hljs-number">2</span>)<br><span class="hljs-selector-id">#ds_val</span> 测试集 validation_freq 每？个epoch进行一次validation 可以停止eg:<span class="hljs-keyword">if</span> acc&gt;<span class="hljs-number">0.99</span> save break<br>network<span class="hljs-selector-class">.evaluate</span>(ds_val) 在training结束之后进行<br></code></pre></td></tr></table></figure><h3 id="交叉验证"><a href="#交叉验证" class="headerlink" title="交叉验证"></a>交叉验证</h3><p>数据集分为训练集，验证集，测试集。一般测试集不在我们手中，所以我们要把训练集分为两份，一份为训练集train，另一份为验证集validation。交叉验证，每个epoch选择不同的验证集进行验证。</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><code class="hljs python"><span class="hljs-keyword">for</span> epoch <span class="hljs-keyword">in</span> <span class="hljs-built_in">range</span>(<span class="hljs-number">500</span>):<br>    idx = tf.<span class="hljs-built_in">range</span>(<span class="hljs-number">600000</span>)<br>    idx = tf.random.shuffle(idx)<br>    x_train,y_train = tf.gather(x,idx[:<span class="hljs-number">500000</span>]),tf.gather(y,idx[:<span class="hljs-number">500000</span>])<br>    x_val,y_val = tf.gather(x,idx[-<span class="hljs-number">100000</span>:]),tf.gather(y,idx[-<span class="hljs-number">100000</span>:])<br>    <br>    db_train = tf.data.Datasets.from_tensor_slices((x_train,y_train))<br>    db_train = db_train.<span class="hljs-built_in">map</span>(preprocess).shuffle(<span class="hljs-number">500000</span>).batch(batchsz)<br>    <br>    db_val = tf.data.Datasets.from_tensor_slices((x_val,y_val))<br>    db_val = db_val.<span class="hljs-built_in">map</span>(preprocess).shuffle(<span class="hljs-number">500000</span>).batch(batchsz)<br></code></pre></td></tr></table></figure><p>也可以是直接使用fit</p><figure class="highlight apache"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs apache"><span class="hljs-attribute">network</span>.fit(db_train_val,epoch=<span class="hljs-number">6</span>,validation_split=<span class="hljs-number">0</span>.<span class="hljs-number">1</span>,validation_freq=<span class="hljs-number">2</span>)<br></code></pre></td></tr></table></figure><h2 id="自定义网络"><a href="#自定义网络" class="headerlink" title="自定义网络"></a>自定义网络</h2><h3 id="keras-Sequential"><a href="#keras-Sequential" class="headerlink" title="keras.Sequential"></a>keras.Sequential</h3><p>容器，可以把已有层和自己的层串联在一起，可以方便组织参数</p><figure class="highlight routeros"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><code class="hljs routeros">network = Sequential([layers.Dense(256,<span class="hljs-attribute">activation</span>=<span class="hljs-string">&#x27;relu&#x27;</span>),<br> layers.Dense(128,<span class="hljs-attribute">activation</span>=<span class="hljs-string">&#x27;relu&#x27;</span>),<br> layers.Dense(64,<span class="hljs-attribute">activation</span>=<span class="hljs-string">&#x27;relu&#x27;</span>),<br> layers.Dense(32,<span class="hljs-attribute">activation</span>=<span class="hljs-string">&#x27;relu&#x27;</span>),<br> layers.Dense(10)])<br>network.build(input_shape=(None,29<span class="hljs-number">*28</span>))<br>network.summary()<br></code></pre></td></tr></table></figure><ul><li><p>model.trainable_variables 所有的训练参数</p></li><li><p>model.call() 调用Sequential时内部调用 使用model(x) -&gt;会调用</p><figure class="highlight llvm"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs llvm">model.__call__(<span class="hljs-keyword">x</span>) #这其中有<span class="hljs-keyword">call</span>方法<br></code></pre></td></tr></table></figure></li></ul><h3 id="Layer-Model"><a href="#Layer-Model" class="headerlink" title="Layer&#x2F;Model"></a>Layer&#x2F;Model</h3><ul><li><p>Inherit from keras.layers.Layer keras.Model</p></li><li><p>__init__</p></li><li><p>call</p></li></ul><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br></pre></td><td class="code"><pre><code class="hljs python"><span class="hljs-keyword">class</span> <span class="hljs-title class_">MyDense</span>(layers.Layer): <span class="hljs-comment">#继承自layers.Layer</span><br>    <span class="hljs-keyword">def</span> <span class="hljs-title function_">__init__</span>(<span class="hljs-params">self, inp_dim,outp_dim</span>):<br>        <span class="hljs-built_in">super</span>(MyDense,<span class="hljs-variable language_">self</span>).__init__()<br><br>        <span class="hljs-variable language_">self</span>.kernel = <span class="hljs-variable language_">self</span>.add_variable(<span class="hljs-string">&#x27;w&#x27;</span>,[inp_dim,outp_dim])<br>        <span class="hljs-variable language_">self</span>.bias = <span class="hljs-variable language_">self</span>.add_variable(<span class="hljs-string">&#x27;b&#x27;</span>,[outp_dim])<br><br>    <span class="hljs-keyword">def</span> <span class="hljs-title function_">call</span>(<span class="hljs-params">self,inputs,training=<span class="hljs-literal">None</span></span>):<br>        out = inputs @ <span class="hljs-variable language_">self</span>.kernel + <span class="hljs-variable language_">self</span>.bias<br>        <span class="hljs-keyword">return</span> out<br><span class="hljs-keyword">class</span> <span class="hljs-title class_">MyModel</span>(keras.Model):<br>    <span class="hljs-keyword">def</span> <span class="hljs-title function_">__init__</span>(<span class="hljs-params">self</span>):<br>        <span class="hljs-built_in">super</span>(MyModel,<span class="hljs-variable language_">self</span>).__init__()<br>        <span class="hljs-variable language_">self</span>.fc1 = MyDense(<span class="hljs-number">28</span> * <span class="hljs-number">28</span>,<span class="hljs-number">256</span>)<br>        <span class="hljs-variable language_">self</span>.fc2 = MyDense(<span class="hljs-number">256</span>, <span class="hljs-number">128</span>)<br>        <span class="hljs-variable language_">self</span>.fc3 = MyDense(<span class="hljs-number">128</span>, <span class="hljs-number">64</span>)<br>        <span class="hljs-variable language_">self</span>.fc4 = MyDense(<span class="hljs-number">64</span>, <span class="hljs-number">32</span>)<br>        <span class="hljs-variable language_">self</span>.fc5 = MyDense(<span class="hljs-number">32</span>, <span class="hljs-number">10</span>)<br>    <span class="hljs-keyword">def</span> <span class="hljs-title function_">call</span>(<span class="hljs-params">self,inputs,training=<span class="hljs-literal">None</span></span>):<br>        x = <span class="hljs-variable language_">self</span>.fc1(inputs)<br>        x = tf.nn.relu(x)<br>        x = <span class="hljs-variable language_">self</span>.fc2(x)<br>        x = tf.nn.relu(x)<br>        x = <span class="hljs-variable language_">self</span>.fc3(x)      <span class="hljs-comment">#在任意层之间可以加任意的操作，这是使用自定义层的优势，比如x=x-1</span><br>        x = tf.nn.relu(x)<br>        x = <span class="hljs-variable language_">self</span>.fc4(x)<br>        x = tf.nn.relu(x)<br>        x = <span class="hljs-variable language_">self</span>.fc5(x)<br>        <span class="hljs-keyword">return</span> x<br>        <br>        <br></code></pre></td></tr></table></figure><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br></pre></td><td class="code"><pre><code class="hljs python"><span class="hljs-keyword">import</span> tensorflow <span class="hljs-keyword">as</span> tf<br><span class="hljs-keyword">from</span> tensorflow.keras <span class="hljs-keyword">import</span> datasets, layers, optimizers, Sequential, metrics<br><span class="hljs-keyword">from</span> tensorflow <span class="hljs-keyword">import</span> keras<br><br><span class="hljs-keyword">def</span> <span class="hljs-title function_">preprocess</span>(<span class="hljs-params">x, y</span>):<br>    <span class="hljs-string">&quot;&quot;&quot;</span><br><span class="hljs-string">    x is a simple image, not a batch</span><br><span class="hljs-string">    &quot;&quot;&quot;</span><br>    x = tf.cast(x, dtype=tf.float32) / <span class="hljs-number">255.</span><br>    x = tf.reshape(x, [<span class="hljs-number">28</span> * <span class="hljs-number">28</span>])<br>    y = tf.cast(y, dtype=tf.int32)<br>    y = tf.one_hot(y, depth=<span class="hljs-number">10</span>)<br>    <span class="hljs-keyword">return</span> x, y<br><br><span class="hljs-keyword">class</span> <span class="hljs-title class_">MyDense</span>(layers.Layer):<br>    <span class="hljs-keyword">def</span> <span class="hljs-title function_">__init__</span>(<span class="hljs-params">self, inp_dim, outp_dim</span>):<br>        <span class="hljs-built_in">super</span>(MyDense, <span class="hljs-variable language_">self</span>).__init__()<br>        <span class="hljs-variable language_">self</span>.kernel = <span class="hljs-variable language_">self</span>.add_weight(<span class="hljs-string">&#x27;w&#x27;</span>, [inp_dim, outp_dim])<br>        <span class="hljs-variable language_">self</span>.bias = <span class="hljs-variable language_">self</span>.add_weight(<span class="hljs-string">&#x27;b&#x27;</span>, [outp_dim])<br>    <span class="hljs-keyword">def</span> <span class="hljs-title function_">call</span>(<span class="hljs-params">self, inputs, training=<span class="hljs-literal">None</span></span>):<br>        out = inputs @ <span class="hljs-variable language_">self</span>.kernel + <span class="hljs-variable language_">self</span>.bias<br>        <span class="hljs-keyword">return</span> out<br><br><span class="hljs-keyword">class</span> <span class="hljs-title class_">MyModel</span>(keras.Model):<br>    <span class="hljs-keyword">def</span> <span class="hljs-title function_">__init__</span>(<span class="hljs-params">self</span>):<br>        <span class="hljs-built_in">super</span>(MyModel, <span class="hljs-variable language_">self</span>).__init__()<br><br>        <span class="hljs-variable language_">self</span>.fc1 = MyDense(<span class="hljs-number">28</span> * <span class="hljs-number">28</span>, <span class="hljs-number">256</span>)<br>        <span class="hljs-variable language_">self</span>.fc2 = MyDense(<span class="hljs-number">256</span>, <span class="hljs-number">128</span>)<br>        <span class="hljs-variable language_">self</span>.fc3 = MyDense(<span class="hljs-number">128</span>, <span class="hljs-number">64</span>)<br>        <span class="hljs-variable language_">self</span>.fc4 = MyDense(<span class="hljs-number">64</span>, <span class="hljs-number">32</span>)<br>        <span class="hljs-variable language_">self</span>.fc5 = MyDense(<span class="hljs-number">32</span>, <span class="hljs-number">10</span>)<br>    <span class="hljs-keyword">def</span> <span class="hljs-title function_">call</span>(<span class="hljs-params">self, inputs, training=<span class="hljs-literal">None</span></span>):<br>        x = <span class="hljs-variable language_">self</span>.fc1(inputs)<br>        x = tf.nn.relu(x)<br>        x = <span class="hljs-variable language_">self</span>.fc2(x)<br>        x = tf.nn.relu(x)<br>        x = <span class="hljs-variable language_">self</span>.fc3(x)<br>        x = tf.nn.relu(x)<br>        x = <span class="hljs-variable language_">self</span>.fc4(x)<br>        x = tf.nn.relu(x)<br>        x = <span class="hljs-variable language_">self</span>.fc5(x)<br>        <span class="hljs-keyword">return</span> x<br><br><span class="hljs-keyword">def</span> <span class="hljs-title function_">run</span>():<br>    batchsz = <span class="hljs-number">128</span><br>    (x, y), (x_val, y_val) = datasets.mnist.load_data()<br>    db = tf.data.Dataset.from_tensor_slices((x, y))<br>    db = db.<span class="hljs-built_in">map</span>(preprocess).shuffle(<span class="hljs-number">60000</span>).batch(batchsz)<br>    ds_val = tf.data.Dataset.from_tensor_slices((x_val, y_val))<br>    ds_val = ds_val.<span class="hljs-built_in">map</span>(preprocess).batch(batchsz)<br><br>    network = MyModel()<br><br>    network.<span class="hljs-built_in">compile</span>(optimizer=optimizers.Adam(lr=<span class="hljs-number">0.01</span>),<br>                    loss=tf.losses.CategoricalCrossentropy(from_logits=<span class="hljs-literal">True</span>),<br>                    metrics=[<span class="hljs-string">&#x27;accuracy&#x27;</span>])<br>    <br>    network.build(input_shape=(<span class="hljs-literal">None</span>, <span class="hljs-number">28</span> * <span class="hljs-number">28</span>))<br>    network.summary()<br>    <br>    network.fit(db, epochs=<span class="hljs-number">5</span>, validation_data=ds_val,<br>                validation_freq=<span class="hljs-number">2</span>)<br><br>    network.evaluate(ds_val)<br><br>    sample = <span class="hljs-built_in">next</span>(<span class="hljs-built_in">iter</span>(ds_val))<br>    x = sample[<span class="hljs-number">0</span>]<br>    y = sample[<span class="hljs-number">1</span>]  <span class="hljs-comment"># one-hot</span><br>    pred = network.predict(x)  <span class="hljs-comment"># [b, 10]</span><br>    <span class="hljs-comment"># convert back to number</span><br>    y = tf.argmax(y, axis=<span class="hljs-number">1</span>)<br>    pred = tf.argmax(pred, axis=<span class="hljs-number">1</span>)<br><br>    <span class="hljs-built_in">print</span>(pred)<br>    <span class="hljs-built_in">print</span>(y)<br><br><span class="hljs-keyword">if</span> __name__ == <span class="hljs-string">&#x27;__main__&#x27;</span>:<br>    run()<br></code></pre></td></tr></table></figure><figure class="highlight tap"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br></pre></td><td class="code"><pre><code class="hljs tap">Model: &quot;my_model&quot;<br>_________________________________________________________________<br>Layer (type)                 Output Shape              Param <span class="hljs-comment">#   </span><br>=================================================================<br>my_dense (MyDense)           multiple                 <span class="hljs-number"> 200960 </span>   <br>_________________________________________________________________<br>my_dense_1 (MyDense)         multiple                 <span class="hljs-number"> 32896 </span>    <br>_________________________________________________________________<br>my_dense_2 (MyDense)         multiple                 <span class="hljs-number"> 8256 </span>     <br>_________________________________________________________________<br>my_dense_3 (MyDense)         multiple                 <span class="hljs-number"> 2080 </span>     <br>_________________________________________________________________<br>my_dense_4 (MyDense)         multiple                 <span class="hljs-number"> 330 </span>      <br>=================================================================<br>Total params: 244,522<br>Trainable params: 244,522<br>Non-trainable params: 0<br>_________________________________________________________________<br>Train for<span class="hljs-number"> 469 </span>steps, validate for<span class="hljs-number"> 79 </span>steps<br>Epoch 1/5<br>469/469 [==============================] - 3s 7ms/step - loss: 0.2781 - accuracy: 0.9147<br>Epoch 2/5<br>469/469 [==============================] - 4s 8ms/step - loss: 0.1352 - accuracy: 0.9616 - val_loss: 0.1384 - val_accuracy: 0.9618<br>Epoch 3/5<br>469/469 [==============================] - 3s 6ms/step - loss: 0.1055 - accuracy: 0.9709<br>Epoch 4/5<br>469/469 [==============================] - 4s 8ms/step - loss: 0.0977 - accuracy: 0.9736 - val_loss: 0.1329 - val_accuracy: 0.9660<br>Epoch 5/5<br>469/469 [==============================] - 3s 7ms/step - loss: 0.0898 - accuracy: 0.9750<br>79/79 [==============================] - 1s 7ms/step - loss: 0.1225 - accuracy: 0.9680<br>tf.Tensor(<br>[7<span class="hljs-number"> 2 </span>1<span class="hljs-number"> 0 </span>4<span class="hljs-number"> 1 </span>4<span class="hljs-number"> 9 </span>5<span class="hljs-number"> 9 </span>0<span class="hljs-number"> 6 </span>9<span class="hljs-number"> 0 </span>1<span class="hljs-number"> 5 </span>9<span class="hljs-number"> 7 </span>3<span class="hljs-number"> 4 </span>9<span class="hljs-number"> 6 </span>6<span class="hljs-number"> 5 </span>4<span class="hljs-number"> 0 </span>7<span class="hljs-number"> 4 </span>0<span class="hljs-number"> 1 </span>3<span class="hljs-number"> 1 </span>3<span class="hljs-number"> 0 </span>7<span class="hljs-number"> 2 </span>7<br><span class="hljs-number"> 1 </span>2<span class="hljs-number"> 1 </span>1<span class="hljs-number"> 7 </span>4<span class="hljs-number"> 2 </span>3<span class="hljs-number"> 5 </span>1<span class="hljs-number"> 2 </span>4<span class="hljs-number"> 4 </span>6<span class="hljs-number"> 3 </span>5<span class="hljs-number"> 5 </span>6<span class="hljs-number"> 0 </span>4<span class="hljs-number"> 1 </span>9<span class="hljs-number"> 5 </span>7<span class="hljs-number"> 8 </span>9<span class="hljs-number"> 3 </span>7<span class="hljs-number"> 4 </span>6<span class="hljs-number"> 4 </span>3<span class="hljs-number"> 0 </span>7<span class="hljs-number"> 0 </span>2 9<br><span class="hljs-number"> 1 </span>7<span class="hljs-number"> 3 </span>2<span class="hljs-number"> 9 </span>7<span class="hljs-number"> 7 </span>6<span class="hljs-number"> 2 </span>7<span class="hljs-number"> 8 </span>4<span class="hljs-number"> 7 </span>3<span class="hljs-number"> 6 </span>1<span class="hljs-number"> 3 </span>6<span class="hljs-number"> 9 </span>3<span class="hljs-number"> 1 </span>4<span class="hljs-number"> 1 </span>7<span class="hljs-number"> 6 </span>9<span class="hljs-number"> 6 </span>0<span class="hljs-number"> 5 </span>4<span class="hljs-number"> 9 </span>9<span class="hljs-number"> 2 </span>1<span class="hljs-number"> 9 </span>4 8<br><span class="hljs-number"> 7 </span>3<span class="hljs-number"> 9 </span>7<span class="hljs-number"> 4 </span>4<span class="hljs-number"> 4 </span>9<span class="hljs-number"> 2 </span>5<span class="hljs-number"> 4 </span>7<span class="hljs-number"> 6 </span>7<span class="hljs-number"> 9 </span>0 5], shape=(128,), dtype=int64)<br>tf.Tensor(<br>[7<span class="hljs-number"> 2 </span>1<span class="hljs-number"> 0 </span>4<span class="hljs-number"> 1 </span>4<span class="hljs-number"> 9 </span>5<span class="hljs-number"> 9 </span>0<span class="hljs-number"> 6 </span>9<span class="hljs-number"> 0 </span>1<span class="hljs-number"> 5 </span>9<span class="hljs-number"> 7 </span>3<span class="hljs-number"> 4 </span>9<span class="hljs-number"> 6 </span>6<span class="hljs-number"> 5 </span>4<span class="hljs-number"> 0 </span>7<span class="hljs-number"> 4 </span>0<span class="hljs-number"> 1 </span>3<span class="hljs-number"> 1 </span>3<span class="hljs-number"> 4 </span>7<span class="hljs-number"> 2 </span>7<br><span class="hljs-number"> 1 </span>2<span class="hljs-number"> 1 </span>1<span class="hljs-number"> 7 </span>4<span class="hljs-number"> 2 </span>3<span class="hljs-number"> 5 </span>1<span class="hljs-number"> 2 </span>4<span class="hljs-number"> 4 </span>6<span class="hljs-number"> 3 </span>5<span class="hljs-number"> 5 </span>6<span class="hljs-number"> 0 </span>4<span class="hljs-number"> 1 </span>9<span class="hljs-number"> 5 </span>7<span class="hljs-number"> 8 </span>9<span class="hljs-number"> 3 </span>7<span class="hljs-number"> 4 </span>6<span class="hljs-number"> 4 </span>3<span class="hljs-number"> 0 </span>7<span class="hljs-number"> 0 </span>2 9<br><span class="hljs-number"> 1 </span>7<span class="hljs-number"> 3 </span>2<span class="hljs-number"> 9 </span>7<span class="hljs-number"> 7 </span>6<span class="hljs-number"> 2 </span>7<span class="hljs-number"> 8 </span>4<span class="hljs-number"> 7 </span>3<span class="hljs-number"> 6 </span>1<span class="hljs-number"> 3 </span>6<span class="hljs-number"> 9 </span>3<span class="hljs-number"> 1 </span>4<span class="hljs-number"> 1 </span>7<span class="hljs-number"> 6 </span>9<span class="hljs-number"> 6 </span>0<span class="hljs-number"> 5 </span>4<span class="hljs-number"> 9 </span>9<span class="hljs-number"> 2 </span>1<span class="hljs-number"> 9 </span>4 8<br><span class="hljs-number"> 7 </span>3<span class="hljs-number"> 9 </span>7<span class="hljs-number"> 4 </span>4<span class="hljs-number"> 4 </span>9<span class="hljs-number"> 2 </span>5<span class="hljs-number"> 4 </span>7<span class="hljs-number"> 6 </span>7<span class="hljs-number"> 9 </span>0 5], shape=(128,), dtype=int64)<br></code></pre></td></tr></table></figure>]]>
    </content>
    <id>https://www.wakli.com/2020/04/02/keras%E5%B8%B8%E7%94%A8%E6%8E%A5%E5%8F%A3/</id>
    <link href="https://www.wakli.com/2020/04/02/keras%E5%B8%B8%E7%94%A8%E6%8E%A5%E5%8F%A3/"/>
    <published>2020-04-02T04:22:33.000Z</published>
    <summary>
      <![CDATA[<p>Keras !&#x3D; tf.keras</p>
<p>Keras建立在其他接口之上的高层接口</p>
<p>TF2中实际不需要Keras，TF2中有对Keras的实现</p>
<ul>
<li>datasets</li>
<li>layers</li>
<li>losses</li>
<li>metrics</li>
<li>optimizers</li>
</ul>]]>
    </summary>
    <title>Keras常用接口与自定义网络</title>
    <updated>2020-04-03T12:10:02.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>王康力</name>
    </author>
    <category term="机器学习" scheme="https://www.wakli.com/categories/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0/"/>
    <category term="问题解决" scheme="https://www.wakli.com/tags/%E9%97%AE%E9%A2%98%E8%A7%A3%E5%86%B3/"/>
    <content>
      <![CDATA[<h3 id="因之前tf-keras数据集下载中途退出而导致再次下载时失败-mac-Linux"><a href="#因之前tf-keras数据集下载中途退出而导致再次下载时失败-mac-Linux" class="headerlink" title="因之前tf.keras数据集下载中途退出而导致再次下载时失败(mac&#x2F;Linux)"></a>因之前tf.keras数据集下载中途退出而导致再次下载时失败(mac&#x2F;Linux)</h3><ul><li>fashionmnist&#x2F;mnist、boston housing、cifar10&#x2F;100、imdb keras也就这6个数据集啦</li></ul><p>通常为EOSError</p><figure class="highlight livecodeserver"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs livecodeserver">EOFError: Compressed <span class="hljs-built_in">file</span> ended <span class="hljs-keyword">before</span> <span class="hljs-keyword">the</span> <span class="hljs-keyword">end</span>-<span class="hljs-keyword">of</span>-stream marker was reached<br></code></pre></td></tr></table></figure><p>一般就是因为keras认为你的数据不对而报错，解决方法也非常的简单</p><span id="more"></span><h3 id="解决步骤"><a href="#解决步骤" class="headerlink" title="解决步骤"></a>解决步骤</h3><p>打开Terminal，在用户根目录下有一个隐藏文件 .keras</p><p>通过以下指令可以看到 .keras</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-built_in">ls</span> -a<br></code></pre></td></tr></table></figure><img width=150 src="/2020/04/01/keras因中断导致下载数据集报错/img1.png"><p>接下来进入这个隐藏文件夹</p><figure class="highlight jboss-cli"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs jboss-cli"><span class="hljs-keyword">cd</span> <span class="hljs-string">.keras</span><br></code></pre></td></tr></table></figure><p>可以看到其中有一个datasets文件夹</p><img width=230 src="/2020/04/01/keras因中断导致下载数据集报错/img2.png"><p>继续进入到datasets</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-built_in">cd</span> datasets<br></code></pre></td></tr></table></figure><p>此时ls可以看到你要下载数据集的文件夹，删除它即可 比如我的是fashion-mnist</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-built_in">rm</span> -rf fashion-mnist<br></code></pre></td></tr></table></figure><p><a href="https://www.wakli.com/2020/03/08/SSH%E5%85%8D%E5%AF%86%E8%BF%9E%E6%8E%A5/">关于mac在finder中直接查看隐藏文件的操作</a></p>]]>
    </content>
    <id>https://www.wakli.com/2020/04/01/keras%E5%9B%A0%E4%B8%AD%E6%96%AD%E5%AF%BC%E8%87%B4%E4%B8%8B%E8%BD%BD%E6%95%B0%E6%8D%AE%E9%9B%86%E6%8A%A5%E9%94%99/</id>
    <link href="https://www.wakli.com/2020/04/01/keras%E5%9B%A0%E4%B8%AD%E6%96%AD%E5%AF%BC%E8%87%B4%E4%B8%8B%E8%BD%BD%E6%95%B0%E6%8D%AE%E9%9B%86%E6%8A%A5%E9%94%99/"/>
    <published>2020-03-31T16:23:59.000Z</published>
    <summary>
      <![CDATA[<h3 id="因之前tf-keras数据集下载中途退出而导致再次下载时失败-mac-Linux"><a href="#因之前tf-keras数据集下载中途退出而导致再次下载时失败-mac-Linux" class="headerlink" title="因之前tf.keras数据集下载中途退出而导致再次下载时失败(mac&#x2F;Linux)"></a>因之前tf.keras数据集下载中途退出而导致再次下载时失败(mac&#x2F;Linux)</h3><ul>
<li>fashionmnist&#x2F;mnist、boston housing、cifar10&#x2F;100、imdb keras也就这6个数据集啦</li>
</ul>
<p>通常为EOSError</p>
<figure class="highlight livecodeserver"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs livecodeserver">EOFError: Compressed <span class="hljs-built_in">file</span> ended <span class="hljs-keyword">before</span> <span class="hljs-keyword">the</span> <span class="hljs-keyword">end</span>-<span class="hljs-keyword">of</span>-stream marker was reached<br></code></pre></td></tr></table></figure>

<p>一般就是因为keras认为你的数据不对而报错，解决方法也非常的简单</p>]]>
    </summary>
    <title>keras下载数据集报错(Mac/Linux)</title>
    <updated>2020-04-01T04:19:26.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>王康力</name>
    </author>
    <category term="机器学习" scheme="https://www.wakli.com/categories/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0/"/>
    <category term="Tensorflow" scheme="https://www.wakli.com/categories/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0/Tensorflow/"/>
    <category term="gradient" scheme="https://www.wakli.com/tags/gradient/"/>
    <category term="Activation Functions" scheme="https://www.wakli.com/tags/Activation-Functions/"/>
    <category term="LOSS" scheme="https://www.wakli.com/tags/LOSS/"/>
    <category term="softmax" scheme="https://www.wakli.com/tags/softmax/"/>
    <content>
      <![CDATA[<h2 id="梯度下降"><a href="#梯度下降" class="headerlink" title="梯度下降"></a>梯度下降</h2><h3 id="Gradient"><a href="#Gradient" class="headerlink" title="Gradient"></a>Gradient</h3><ul><li>导数derivative:一维</li><li>偏微分partial derivate:多元函数中按照某一方向的导数</li><li>梯度gradient:是多轴组合而成的向量</li></ul><p>gradient的方向就代表了函数值增大的方向，loss找到最小值即是向梯度相反的方向更新</p><span id="more"></span><h3 id="AutoGrad"><a href="#AutoGrad" class="headerlink" title="AutoGrad"></a>AutoGrad</h3><p>自动求梯度</p><ul><li>with tf.GradientTape() as tape: 将计算过程包在tape计算环境当中</li><li>[w_grad] &#x3D; tape.gradient(loss,[w]) 传入loss函数和需要求解的参数就会返回梯度</li></ul><figure class="highlight inform7"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><code class="hljs inform7">In <span class="hljs-comment">[2]</span>: w = tf.constant(1.)<br>In <span class="hljs-comment">[3]</span>: x = tf.constant(2.)<br>In <span class="hljs-comment">[4]</span>: y = x*w<br><br>In <span class="hljs-comment">[7]</span>: with tf.GradientTape() as tape:<br>   ...:     tape.watch(<span class="hljs-comment">[w]</span>)<br>   ...:     y2 = x*w<br>   ...: grad1 = tape.gradient(y,<span class="hljs-comment">[w]</span>)<br><br>In <span class="hljs-comment">[8]</span>: grad1<br>Out<span class="hljs-comment">[8]</span>: <span class="hljs-comment">[None]</span><br><br>In <span class="hljs-comment">[9]</span>: with tf.GradientTape() as tape:<br>   ...:     tape.watch(<span class="hljs-comment">[w]</span>)<br>   ...:     y2 = x*w<br>   ...: grad2 = tape.gradient(y2,<span class="hljs-comment">[w]</span>)<br><br>In <span class="hljs-comment">[10]</span>: grad2<br>Out<span class="hljs-comment">[10]</span>: <span class="hljs-comment">[&lt;tf.Tensor: shape=(), dtype=float32, numpy=2.0&gt;]</span><br></code></pre></td></tr></table></figure><p>Persistent GradientTape</p><ul><li><p>tape.gradient()只能调用求解一次，求解后就会自动释放掉一大部分资源</p></li><li><p>如果需要调用两次，则要使用Persistent GradientTape</p></li></ul><figure class="highlight clean"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs clean"><span class="hljs-keyword">with</span> tf.GradientTape(persistent=<span class="hljs-literal">True</span>) <span class="hljs-keyword">as</span> tape:<br></code></pre></td></tr></table></figure><ul><li>如果要不使用watch的话需要将变量改为tf.Variable</li></ul><h3 id="2nd-order-二阶梯度"><a href="#2nd-order-二阶梯度" class="headerlink" title="2nd-order 二阶梯度"></a>2nd-order 二阶梯度</h3><p>也就是求二阶导数</p><figure class="highlight stylus"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><code class="hljs stylus">In <span class="hljs-selector-attr">[47]</span>: with tf<span class="hljs-selector-class">.GradientTape</span>() as t1:<br>    ...:     t1<span class="hljs-selector-class">.watch</span>(<span class="hljs-selector-attr">[w,b]</span>)<br>    ...:     with tf<span class="hljs-selector-class">.GradientTape</span>() as t2:<br>    ...:         t2<span class="hljs-selector-class">.watch</span>(<span class="hljs-selector-attr">[w,b]</span>)<br>    ...:         <span class="hljs-attribute">y</span> = x*w +b<br>    ...:     dy_dw,dy_db = t2<span class="hljs-selector-class">.gradient</span>(<span class="hljs-attribute">y</span>,[w,b])<br>    ...:     <span class="hljs-built_in">print</span>(dy_dw,dy_db)<br>    ...: d2y_dw2 = t1<span class="hljs-selector-class">.gradient</span>(dy_dw,w)<br>    ...: <span class="hljs-built_in">print</span>(d2y_dw2)<br>tf<span class="hljs-selector-class">.Tensor</span>(<span class="hljs-number">2.0</span>, shape=(), dtype=float32) tf<span class="hljs-selector-class">.Tensor</span>(<span class="hljs-number">1.0</span>, shape=(), dtype=float32)<br>None  #<span class="hljs-attribute">x</span>对w的导数<br></code></pre></td></tr></table></figure><h2 id="Activation-Functions-激活函数"><a href="#Activation-Functions-激活函数" class="headerlink" title="Activation Functions 激活函数"></a>Activation Functions 激活函数</h2><ul><li>神经元机制并不是一个简单的输入加权求和，而是有一个预值响应机制，只有大于某个预值时才会输出，而且输出是固定的。这个预值就是激活函数的产生来源，这种到预值输出的激活函数是一种不可导的激活函数</li></ul><h3 id="Sigmod-Logistic"><a href="#Sigmod-Logistic" class="headerlink" title="Sigmod&#x2F;Logistic"></a>Sigmod&#x2F;Logistic</h3><p>解决激活函数不可导的问题</p><img width=350 src="/2020/03/31/梯度下降/img1.png"><p> 函数非常光滑，相当于一个压缩功能，将(-∞,+∞)的值压缩到有限的范围当中(0,1)</p><p>sigmod当x趋近于无穷时，导数趋近于0，梯度会长时间得不到更新，会造成梯度离散</p><figure class="highlight subunit"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><code class="hljs subunit">In [4]: a = tf.linspace(<span class="hljs-string">-10</span>.,10.,10)<br>&lt;tf.Tensor: shape=(10,), dtype=float32, numpy=<br>array([<span class="hljs-string">-10</span>.       ,  <span class="hljs-string">-7</span>.7777777,  <span class="hljs-string">-5</span>.5555553,  <span class="hljs-string">-3</span>.333333 ,  <span class="hljs-string">-1</span>.1111107,<br>         1.1111116,   3.333334 ,   5.5555563,   7.7777786,  10.       ],<br>      dtype=float32)&gt;<br>      <br>In [7]: with tf.GradientTape() as tape:<br>   ...:     tape.watch(a)<br>   ...:     y = tf.sigmoid(a)<br>   ...: grads = tape.gradient(y,[a])<br>#y<br>tf.Tensor(<br>[4.5397872e<span class="hljs-string">-05</span> 4.1876672e<span class="hljs-string">-04</span> 3.8510333e<span class="hljs-string">-03</span> 3.4445208e<span class="hljs-string">-02</span> 2.4766390e<span class="hljs-string">-01</span><br> 7.5233626e<span class="hljs-string">-01</span> 9.6555483e<span class="hljs-string">-01</span> 9.9614894e<span class="hljs-string">-01</span> 9.9958128e<span class="hljs-string">-01</span> 9.9995458e<span class="hljs-string">-01</span>], shape=(10,), dtype=float32)<br>#grads<br>[&lt;tf.Tensor: shape=(10,), dtype=float32, numpy=<br> array([4.5395809e<span class="hljs-string">-05</span>, 4.1859134e<span class="hljs-string">-04</span>, 3.8362027e<span class="hljs-string">-03</span>, 3.3258736e<span class="hljs-string">-02</span>,<br>        1.8632649e<span class="hljs-string">-01</span>, 1.8632641e<span class="hljs-string">-01</span>, 3.3258699e<span class="hljs-string">-02</span>, 3.8362255e<span class="hljs-string">-03</span>,<br>        4.1854731e<span class="hljs-string">-04</span>, 4.5416677e<span class="hljs-string">-05</span>], dtype=float32)&gt;]<br></code></pre></td></tr></table></figure><p>可以看出在|x|&gt;3时会出现梯度离散</p><h3 id="Tanh"><a href="#Tanh" class="headerlink" title="Tanh"></a>Tanh</h3><p>往往用在循环神经网络当中，它可以有sigmod表示 tanh(x) &#x3D; 2sigmod(2x)-1</p><img width=350 src="/2020/03/31/梯度下降/img2.png"><figure class="highlight dns"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><code class="hljs dns">In [<span class="hljs-number">10</span>]: a = tf.linspace(-<span class="hljs-number">5</span>.,<span class="hljs-number">5</span>.,<span class="hljs-number">10</span>)<br><br>In [<span class="hljs-number">11</span>]: tf.tanh(a)<br>Out[<span class="hljs-number">11</span>]:<br>&lt;tf.Tensor: shape=(<span class="hljs-number">10</span>,), dtype=float32, numpy=<br>array([-<span class="hljs-number">0.99990916</span>, -<span class="hljs-number">0.9991625</span> , -<span class="hljs-number">0.99229795</span>, -<span class="hljs-number">0.9311096</span> , -<span class="hljs-number">0.5046722</span> ,<br>        <span class="hljs-number">0.5046726</span> ,  <span class="hljs-number">0.93110967</span>,  <span class="hljs-number">0.99229795</span>,  <span class="hljs-number">0.9991625</span> ,  <span class="hljs-number">0.99990916</span>],<br>      dtype=float32)&gt;<br></code></pre></td></tr></table></figure><h3 id="Relu-Rectified-Linear-Unit整型线性单元"><a href="#Relu-Rectified-Linear-Unit整型线性单元" class="headerlink" title="Relu (Rectified Linear Unit整型线性单元)"></a>Relu (Rectified Linear Unit整型线性单元)</h3><p>Relu导数非常简单，而且保持梯度不变，很大程度减轻梯度离散和梯度爆炸</p><img width=350 src="/2020/03/31/梯度下降/img3.png"><figure class="highlight dns"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><code class="hljs dns">In [<span class="hljs-number">12</span>]: a = tf.linspace(-<span class="hljs-number">1</span>.,<span class="hljs-number">1</span>.,<span class="hljs-number">10</span>)<br>&lt;tf.Tensor: shape=(<span class="hljs-number">10</span>,), dtype=float32, numpy=<br>array([-<span class="hljs-number">1</span>.        , -<span class="hljs-number">0.7777778</span> , -<span class="hljs-number">0.5555556</span> , -<span class="hljs-number">0.3333333</span> , -<span class="hljs-number">0.1111111</span> ,<br>        <span class="hljs-number">0.11111116</span>,  <span class="hljs-number">0.33333337</span>,  <span class="hljs-number">0.5555556</span> ,  <span class="hljs-number">0.7777778</span> ,  <span class="hljs-number">1</span>.        ],<br>      dtype=float32)&gt;<br>      <br>In [<span class="hljs-number">13</span>]: tf.nn.relu(a)<br>Out[<span class="hljs-number">13</span>]:<br>&lt;tf.Tensor: shape=(<span class="hljs-number">10</span>,), dtype=float32, numpy=<br>array([<span class="hljs-number">0</span>.        , <span class="hljs-number">0</span>.        , <span class="hljs-number">0</span>.        , <span class="hljs-number">0</span>.        , <span class="hljs-number">0</span>.        ,<br>       <span class="hljs-number">0.11111116</span>, <span class="hljs-number">0.33333337</span>, <span class="hljs-number">0.5555556</span> , <span class="hljs-number">0.7777778</span> , <span class="hljs-number">1</span>.        ],<br>      dtype=float32)&gt;<br>   <br>In [<span class="hljs-number">15</span>]: tf.nn.leaky_relu(a)<br>Out[<span class="hljs-number">15</span>]:<br>&lt;tf.Tensor: shape=(<span class="hljs-number">10</span>,), dtype=float32, numpy=<br>array([-<span class="hljs-number">0</span>.<span class="hljs-number">2</span>       , -<span class="hljs-number">0.15555556</span>, -<span class="hljs-number">0.11111112</span>, -<span class="hljs-number">0.06666666</span>, -<span class="hljs-number">0.02222222</span>,<br>        <span class="hljs-number">0.11111116</span>,  <span class="hljs-number">0.33333337</span>,  <span class="hljs-number">0.5555556</span> ,  <span class="hljs-number">0.7777778</span> ,  <span class="hljs-number">1</span>.        ],<br>      dtype=float32)&gt;<br></code></pre></td></tr></table></figure><h2 id="Typical-Loss"><a href="#Typical-Loss" class="headerlink" title="Typical Loss"></a>Typical Loss</h2><h3 id="Mean-Squared-Error-均方差"><a href="#Mean-Squared-Error-均方差" class="headerlink" title="Mean Squared Error 均方差"></a>Mean Squared Error 均方差</h3><h4 id="MSE"><a href="#MSE" class="headerlink" title="MSE"></a>MSE</h4><img width=200 src="/2020/03/31/梯度下降/img4.png"><img style="padding-top:10px" width=200  src="/2020/03/31/梯度下降/img5.png"><img style="padding-top:10px" width=200  src="/2020/03/31/梯度下降/img6.png"><h4 id="Derivative"><a href="#Derivative" class="headerlink" title="Derivative"></a>Derivative</h4><img width=400 src="/2020/03/31/梯度下降/img7.png"><figure class="highlight inform7"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><code class="hljs inform7">In <span class="hljs-comment">[3]</span>: x=tf.random.normal(<span class="hljs-comment">[2,4]</span>)<br>In <span class="hljs-comment">[4]</span>: w=tf.random.normal(<span class="hljs-comment">[4,3]</span>)<br>In <span class="hljs-comment">[6]</span>: b=tf.zeros(<span class="hljs-comment">[3]</span>)<br>In <span class="hljs-comment">[7]</span>: y = tf.constant(<span class="hljs-comment">[2,0]</span>)<br><br>In <span class="hljs-comment">[10]</span>: with tf.GradientTape() as tape:<br>    ...:     tape.watch(<span class="hljs-comment">[w,b]</span>)<br>    ...:     prob = tf.nn.softmax(x@w+b,axis=1)<br>    ...:     loss = tf.reduce_mean(tf.losses.MSE(tf.one_hot(y,depth=3),prob))<br>    ...: grads = tape.gradient(loss,<span class="hljs-comment">[w,b]</span>)<br>    <br>In <span class="hljs-comment">[11]</span>: grads<span class="hljs-comment">[0]</span><br>Out<span class="hljs-comment">[11]</span>:<br>&lt;tf.Tensor: shape=(4, 3), dtype=float32, numpy=<br>array(<span class="hljs-comment">[<span class="hljs-comment">[-0.11654878,  0.0167967 ,  0.09975209]</span>,</span><br><span class="hljs-comment">       <span class="hljs-comment">[-0.03289018, -0.0634746 ,  0.09636479]</span>,</span><br><span class="hljs-comment">       <span class="hljs-comment">[ 0.02359655, -0.01446564, -0.00913091]</span>,</span><br><span class="hljs-comment">       <span class="hljs-comment">[ 0.01675941, -0.05286441,  0.03610501]</span>]</span>, dtype=float32)&gt;<br>In <span class="hljs-comment">[12]</span>: grads<span class="hljs-comment">[1]</span><br>Out<span class="hljs-comment">[12]</span>: &lt;tf.Tensor: shape=(3,), dtype=float32, numpy=array(<span class="hljs-comment">[-0.00793203,  0.06198916, -0.05405714]</span>, dtype=float32)&gt;<br></code></pre></td></tr></table></figure><p>axis为求softmax的维度。[b,3],如果是axis求0维无意义，这里softmax函数axis默认为-1</p><h3 id="softmax"><a href="#softmax" class="headerlink" title="softmax"></a>softmax</h3><p>当n分类的n个输出通过softmax 函数后，便满足了概率分布的要求使得每一个元素的范围都在(0,1)之间，并且所有元素的和为1</p><img width=200 src="/2020/03/31/梯度下降/img8.png"><img width=420 src="/2020/03/31/梯度下降/img9.png"><h3 id="CrossEntropy-CE"><a href="#CrossEntropy-CE" class="headerlink" title="CrossEntropy CE"></a>CrossEntropy CE</h3><p>配合softmax</p><figure class="highlight routeros"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><code class="hljs routeros"><span class="hljs-keyword">In</span> [22]: <span class="hljs-attribute">x</span>=tf.random.normal([2,4])<br>    <span class="hljs-built_in">..</span>.: <span class="hljs-attribute">w</span>=tf.random.normal([4,3])<br>    <span class="hljs-built_in">..</span>.: <span class="hljs-attribute">b</span>=tf.zeros([3])<br>    <span class="hljs-built_in">..</span>.: y = tf.constant([2,0])<br><br><span class="hljs-keyword">In</span> [23]: with tf.GradientTape() as tape:<br>    <span class="hljs-built_in">..</span>.:     tape.watch([w,b])<br>    <span class="hljs-built_in">..</span>.:     logits = x@w+b<br>    <span class="hljs-built_in">..</span>.:     loss = tf.reduce_mean(tf.losses.categorical_crossentropy(tf.one_hot(y,<span class="hljs-attribute">depth</span>=3),logits,from_logits=True))<br>    <span class="hljs-built_in">..</span>.:<br>    <span class="hljs-built_in">..</span>.: grads = tape.gradient(loss,[w,b])<br>    <span class="hljs-built_in">..</span>.: <span class="hljs-built_in">print</span>(grads)<br>[&lt;tf.Tensor: shape=(4, 3), <span class="hljs-attribute">dtype</span>=float32, numpy=<br>array([[-0.66708755,  1.213526  , -0.5464386 ],<br>       [ 0.09902969,  0.15032136, -0.24935105],<br>       [-0.49425828,  1.421092  , -0.92683387],<br>       [-0.87035865,  1.703031  , -0.83267236]], <span class="hljs-attribute">dtype</span>=float32)&gt;, <br>       &lt;tf.Tensor: shape=(3,), <span class="hljs-attribute">dtype</span>=float32, <span class="hljs-attribute">numpy</span>=array([-0.49924132,  0.9968054 , -0.49756414], <span class="hljs-attribute">dtype</span>=float32)&gt;]<br></code></pre></td></tr></table></figure><h2 id="链式法则"><a href="#链式法则" class="headerlink" title="链式法则"></a>链式法则</h2><p>通过使用链式法则可以将最后一层的误差，一层层输出到中间层的权值当中，从而得到中间层的梯度信息，更好的优化权值，达到最优化的效果</p><img width=150 src="/2020/03/31/梯度下降/img10.png"><figure class="highlight jboss-cli"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><code class="hljs jboss-cli">In [3]: x = tf.constant<span class="hljs-params">(1.)</span><br>   <span class="hljs-string">...</span>: w1 = tf.constant<span class="hljs-params">(2.)</span><br>   <span class="hljs-string">...</span>: b1 = tf.constant<span class="hljs-params">(1.)</span><br>   <span class="hljs-string">...</span>: w2 = tf.constant<span class="hljs-params">(2.)</span><br>   <span class="hljs-string">...</span>: b2 = tf.constant<span class="hljs-params">(1.)</span><br>   <span class="hljs-string">...</span>:<br>   <span class="hljs-string">...</span>: with tf.GradientTape<span class="hljs-params">(<span class="hljs-attr">persistent</span>=True)</span> as tape:<br>   <span class="hljs-string">...</span>:     tape.watch<span class="hljs-params">([w1,b1,w2,b2])</span><br>   <span class="hljs-string">...</span>:     y1 = x*w1 + b1<br>   <span class="hljs-string">...</span>:     y2 = y1*w2 + b2<br>   <span class="hljs-string">...</span>: dy2_dy1 = tape.gradient<span class="hljs-params">(y2,[y1])</span>[0]<br>   <span class="hljs-string">...</span>: dy1_dw1 = tape.gradient<span class="hljs-params">(y1,[w1])</span>[0]<br>   <span class="hljs-string">...</span>: dy2_dw1 = tape.gradient<span class="hljs-params">(y2,[w1])</span>[0]<span class="hljs-comment">#这里可以自动进行这样的链式运算</span><br>   <span class="hljs-string">...</span>: print<span class="hljs-params">(dy2_dy1*dy1_dw1,dy2_dw1)</span><span class="hljs-comment">#链式法则结果相同</span><br>tf.Tensor<span class="hljs-params">(2.0, <span class="hljs-attr">shape</span>=()</span>, dtype=float32) tf.Tensor<span class="hljs-params">(2.0, <span class="hljs-attr">shape</span>=()</span>, dtype=float32)<br></code></pre></td></tr></table></figure><h2 id="FASHION-MNIST数据集-实践"><a href="#FASHION-MNIST数据集-实践" class="headerlink" title="FASHION_MNIST数据集 实践"></a>FASHION_MNIST数据集 实践</h2><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br></pre></td><td class="code"><pre><code class="hljs python"><span class="hljs-keyword">import</span>  os<br>os.environ[<span class="hljs-string">&#x27;TF_CPP_MIN_LOG_LEVEL&#x27;</span>] = <span class="hljs-string">&#x27;2&#x27;</span><br><br><span class="hljs-keyword">import</span> tensorflow <span class="hljs-keyword">as</span> tf<br><span class="hljs-keyword">from</span>    tensorflow <span class="hljs-keyword">import</span> keras<br><span class="hljs-keyword">from</span>    tensorflow.keras <span class="hljs-keyword">import</span> datasets, layers, optimizers, Sequential, metrics<br><br><span class="hljs-keyword">assert</span> tf.__version__.startswith(<span class="hljs-string">&#x27;2.&#x27;</span>)<br><br><span class="hljs-keyword">def</span> <span class="hljs-title function_">preprocess</span>(<span class="hljs-params">x, y</span>):<br><br>    x = tf.cast(x, dtype=tf.float32) / <span class="hljs-number">255.</span><br>    y = tf.cast(y, dtype=tf.int32)<br>    <span class="hljs-keyword">return</span> x,y<br><br><br>(x, y), (x_test, y_test) = datasets.fashion_mnist.load_data()<br><span class="hljs-built_in">print</span>(x.shape, y.shape)<br><br>batchsz = <span class="hljs-number">128</span><br><br>db = tf.data.Dataset.from_tensor_slices((x,y))<br>db = db.<span class="hljs-built_in">map</span>(preprocess).shuffle(<span class="hljs-number">10000</span>).batch(batchsz)<br><br>db_test = tf.data.Dataset.from_tensor_slices((x_test,y_test))<br>db_test = db_test.<span class="hljs-built_in">map</span>(preprocess).batch(batchsz)<br><br>db_iter = <span class="hljs-built_in">iter</span>(db)<br>sample = <span class="hljs-built_in">next</span>(db_iter)<br><span class="hljs-built_in">print</span>(<span class="hljs-string">&#x27;batch:&#x27;</span>, sample[<span class="hljs-number">0</span>].shape, sample[<span class="hljs-number">1</span>].shape)<br><br>model = Sequential([<br>    layers.Dense(<span class="hljs-number">256</span>, activation=tf.nn.relu), <span class="hljs-comment"># [b, 784] =&gt; [b, 256]</span><br>    layers.Dense(<span class="hljs-number">128</span>, activation=tf.nn.relu), <span class="hljs-comment"># [b, 256] =&gt; [b, 128]</span><br>    layers.Dense(<span class="hljs-number">64</span>, activation=tf.nn.relu), <span class="hljs-comment"># [b, 128] =&gt; [b, 64]</span><br>    layers.Dense(<span class="hljs-number">32</span>, activation=tf.nn.relu), <span class="hljs-comment"># [b, 64] =&gt; [b, 32]</span><br>    layers.Dense(<span class="hljs-number">10</span>) <span class="hljs-comment"># [b, 32] =&gt; [b, 10], 330 = 32*10 + 10</span><br>])<br>model.build(input_shape=[<span class="hljs-literal">None</span>, <span class="hljs-number">28</span>*<span class="hljs-number">28</span>])<br>model.summary()<br><span class="hljs-comment"># w = w - lr*grad</span><br>optimizer = optimizers.Adam(lr=<span class="hljs-number">1e-3</span>)<br><br><span class="hljs-keyword">def</span> <span class="hljs-title function_">main</span>():<br><br>    <span class="hljs-keyword">for</span> epoch <span class="hljs-keyword">in</span> <span class="hljs-built_in">range</span>(<span class="hljs-number">30</span>):<br><br>        <span class="hljs-keyword">for</span> step, (x,y) <span class="hljs-keyword">in</span> <span class="hljs-built_in">enumerate</span>(db):<br><br>            <span class="hljs-comment"># x: [b, 28, 28] =&gt; [b, 784]</span><br>            <span class="hljs-comment"># y: [b]</span><br>            x = tf.reshape(x, [-<span class="hljs-number">1</span>, <span class="hljs-number">28</span>*<span class="hljs-number">28</span>])<br><br>            <span class="hljs-keyword">with</span> tf.GradientTape() <span class="hljs-keyword">as</span> tape:<br>                <span class="hljs-comment"># [b, 784] =&gt; [b, 10]</span><br>                logits = model(x)<span class="hljs-comment">#前向传播就在这一句话即可完成</span><br>                y_onehot = tf.one_hot(y, depth=<span class="hljs-number">10</span>)<br>                <span class="hljs-comment"># [b]</span><br>                loss_mse = tf.reduce_mean(tf.losses.MSE(y_onehot, logits))<br>                loss_ce = tf.losses.categorical_crossentropy(y_onehot, logits, from_logits=<span class="hljs-literal">True</span>)<br>                loss_ce = tf.reduce_mean(loss_ce)<br><br>            grads = tape.gradient(loss_ce, model.trainable_variables)<br><br>            <span class="hljs-comment">#根据w = w-lr*grad对数据进行原地更新</span><br>            optimizer.apply_gradients(<span class="hljs-built_in">zip</span>(grads, model.trainable_variables))<br><br>            <span class="hljs-keyword">if</span> step % <span class="hljs-number">100</span> == <span class="hljs-number">0</span>:<br>                <span class="hljs-built_in">print</span>(epoch, step, <span class="hljs-string">&#x27;loss:&#x27;</span>, <span class="hljs-built_in">float</span>(loss_ce), <span class="hljs-built_in">float</span>(loss_mse))<br><br><br>        <span class="hljs-comment"># test</span><br>        total_correct = <span class="hljs-number">0</span><br>        total_num = <span class="hljs-number">0</span><br>        <span class="hljs-keyword">for</span> x,y <span class="hljs-keyword">in</span> db_test:<br><br>            <span class="hljs-comment"># x: [b, 28, 28] =&gt; [b, 784]</span><br>            <span class="hljs-comment"># y: [b]</span><br>            x = tf.reshape(x, [-<span class="hljs-number">1</span>, <span class="hljs-number">28</span>*<span class="hljs-number">28</span>])<br>            <span class="hljs-comment"># [b, 10]</span><br>            logits = model(x)<br>            <span class="hljs-comment"># logits =&gt; prob, [b, 10]</span><br>            prob = tf.nn.softmax(logits, axis=<span class="hljs-number">1</span>)<br>            <span class="hljs-comment"># [b, 10] =&gt; [b], int64</span><br>            pred = tf.argmax(prob, axis=<span class="hljs-number">1</span>)<br>            pred = tf.cast(pred, dtype=tf.int32)<br>            <span class="hljs-comment"># pred:[b]</span><br>            <span class="hljs-comment"># y: [b]</span><br>            <span class="hljs-comment"># correct: [b], True: equal, False: not equal</span><br>            correct = tf.equal(pred, y)<br>            correct = tf.reduce_sum(tf.cast(correct, dtype=tf.int32))<br><br>            total_correct += <span class="hljs-built_in">int</span>(correct)<br>            total_num += x.shape[<span class="hljs-number">0</span>]<br><br>        acc = total_correct / total_num<br>        <span class="hljs-built_in">print</span>(epoch, <span class="hljs-string">&#x27;test acc:&#x27;</span>, acc)<br><br><span class="hljs-keyword">if</span> __name__ == <span class="hljs-string">&#x27;__main__&#x27;</span>:<br>    main()<br></code></pre></td></tr></table></figure><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br></pre></td><td class="code"><pre><code class="hljs markdown">(60000, 28, 28) (60000,)<br>batch: (128, 28, 28) (128,)<br>Model: &quot;sequential&quot;<br><span class="hljs-strong">____</span><span class="hljs-strong">____</span><span class="hljs-strong">____</span><span class="hljs-strong">____</span><span class="hljs-strong">____</span><span class="hljs-strong">____</span><span class="hljs-strong">____</span><span class="hljs-strong">____</span><span class="hljs-strong">____</span><span class="hljs-strong">____</span><span class="hljs-strong">____</span><span class="hljs-strong">____</span><span class="hljs-strong">____</span><span class="hljs-strong">____</span><span class="hljs-strong">____</span><span class="hljs-strong">____</span>_<br><span class="hljs-section">Layer (type)                 Output Shape              Param #   </span><br><span class="hljs-section">=================================================================</span><br>dense (Dense)                multiple                  200960    <br><span class="hljs-strong">____</span><span class="hljs-strong">____</span><span class="hljs-strong">____</span><span class="hljs-strong">____</span><span class="hljs-strong">____</span><span class="hljs-strong">____</span><span class="hljs-strong">____</span><span class="hljs-strong">____</span><span class="hljs-strong">____</span><span class="hljs-strong">____</span><span class="hljs-strong">____</span><span class="hljs-strong">____</span><span class="hljs-strong">____</span><span class="hljs-strong">____</span><span class="hljs-strong">____</span><span class="hljs-strong">____</span>_<br>dense<span class="hljs-emphasis">_1 (Dense)              multiple                  32896     </span><br><span class="hljs-emphasis"><span class="hljs-strong">____</span><span class="hljs-strong">____</span><span class="hljs-strong">____</span><span class="hljs-strong">____</span><span class="hljs-strong">____</span><span class="hljs-strong">____</span><span class="hljs-strong">____</span><span class="hljs-strong">____</span><span class="hljs-strong">____</span><span class="hljs-strong">____</span><span class="hljs-strong">____</span><span class="hljs-strong">____</span><span class="hljs-strong">____</span><span class="hljs-strong">____</span><span class="hljs-strong">____</span><span class="hljs-strong">____</span>_</span><br>dense<span class="hljs-emphasis">_2 (Dense)              multiple                  8256      </span><br><span class="hljs-emphasis"><span class="hljs-strong">____</span><span class="hljs-strong">____</span><span class="hljs-strong">____</span><span class="hljs-strong">____</span><span class="hljs-strong">____</span><span class="hljs-strong">____</span><span class="hljs-strong">____</span><span class="hljs-strong">____</span><span class="hljs-strong">____</span><span class="hljs-strong">____</span><span class="hljs-strong">____</span><span class="hljs-strong">____</span><span class="hljs-strong">____</span><span class="hljs-strong">____</span><span class="hljs-strong">____</span><span class="hljs-strong">____</span>_</span><br>dense<span class="hljs-emphasis">_3 (Dense)              multiple                  2080      </span><br><span class="hljs-emphasis"><span class="hljs-strong">____</span><span class="hljs-strong">____</span><span class="hljs-strong">____</span><span class="hljs-strong">____</span><span class="hljs-strong">____</span><span class="hljs-strong">____</span><span class="hljs-strong">____</span><span class="hljs-strong">____</span><span class="hljs-strong">____</span><span class="hljs-strong">____</span><span class="hljs-strong">____</span><span class="hljs-strong">____</span><span class="hljs-strong">____</span><span class="hljs-strong">____</span><span class="hljs-strong">____</span><span class="hljs-strong">____</span>_</span><br><span class="hljs-section">dense<span class="hljs-emphasis">_4 (Dense)              multiple                  330       </span></span><br><span class="hljs-emphasis"><span class="hljs-section">=================================================================</span></span><br><span class="hljs-emphasis"><span class="hljs-section">Total params: 244,522</span></span><br><span class="hljs-emphasis"><span class="hljs-section">Trainable params: 244,522</span></span><br><span class="hljs-emphasis"><span class="hljs-section">Non-trainable params: 0</span></span><br><span class="hljs-emphasis"><span class="hljs-section"><span class="hljs-strong">____</span><span class="hljs-strong">____</span><span class="hljs-strong">____</span><span class="hljs-strong">____</span><span class="hljs-strong">____</span><span class="hljs-strong">____</span><span class="hljs-strong">____</span><span class="hljs-strong">____</span><span class="hljs-strong">____</span><span class="hljs-strong">____</span><span class="hljs-strong">____</span><span class="hljs-strong">____</span><span class="hljs-strong">____</span><span class="hljs-strong">____</span><span class="hljs-strong">____</span><span class="hljs-strong">____</span>_</span></span><br><span class="hljs-section">0 0 loss: 2.3202524185180664 0.14212539792060852</span><br><span class="hljs-section">0 100 loss: 0.7960939407348633 13.527359008789062</span><br><span class="hljs-section">0 200 loss: 0.49242451786994934 15.604676246643066</span><br><span class="hljs-section">0 300 loss: 0.3477419316768646 15.686136245727539</span><br><span class="hljs-section">0 400 loss: 0.2666846513748169 15.745983123779297</span><br><span class="hljs-section">0 test acc: 0.8465</span><br><span class="hljs-section">1 0 loss: 0.45068711042404175 17.90788459777832</span><br><span class="hljs-section">1 100 loss: 0.3727279603481293 15.884428977966309</span><br><span class="hljs-section">1 200 loss: 0.4774554371833801 20.82514190673828</span><br><span class="hljs-section">1 300 loss: 0.33690470457077026 19.180904388427734</span><br><span class="hljs-section">1 400 loss: 0.39581966400146484 20.918468475341797</span><br><span class="hljs-section">1 test acc: 0.8679 </span><br><span class="hljs-section">...</span><br></code></pre></td></tr></table></figure>]]>
    </content>
    <id>https://www.wakli.com/2020/03/31/%E6%A2%AF%E5%BA%A6%E4%B8%8B%E9%99%8D/</id>
    <link href="https://www.wakli.com/2020/03/31/%E6%A2%AF%E5%BA%A6%E4%B8%8B%E9%99%8D/"/>
    <published>2020-03-31T12:24:35.000Z</published>
    <summary>
      <![CDATA[<h2 id="梯度下降"><a href="#梯度下降" class="headerlink" title="梯度下降"></a>梯度下降</h2><h3 id="Gradient"><a href="#Gradient" class="headerlink" title="Gradient"></a>Gradient</h3><ul>
<li>导数derivative:一维</li>
<li>偏微分partial derivate:多元函数中按照某一方向的导数</li>
<li>梯度gradient:是多轴组合而成的向量</li>
</ul>
<p>gradient的方向就代表了函数值增大的方向，loss找到最小值即是向梯度相反的方向更新</p>]]>
    </summary>
    <title>随机梯度下降</title>
    <updated>2020-04-01T04:25:34.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>王康力</name>
    </author>
    <category term="机器学习" scheme="https://www.wakli.com/categories/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0/"/>
    <category term="Tensorflow" scheme="https://www.wakli.com/categories/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0/Tensorflow/"/>
    <category term="datasets" scheme="https://www.wakli.com/tags/datasets/"/>
    <category term="Cross Entropy" scheme="https://www.wakli.com/tags/Cross-Entropy/"/>
    <category term="熵" scheme="https://www.wakli.com/tags/%E7%86%B5/"/>
    <content>
      <![CDATA[<h2 id="小型经典数据集加载"><a href="#小型经典数据集加载" class="headerlink" title="小型经典数据集加载"></a>小型经典数据集加载</h2><h3 id="keras-datasets-常用数据集"><a href="#keras-datasets-常用数据集" class="headerlink" title="keras.datasets  常用数据集"></a>keras.datasets  常用数据集</h3><p>keras.datasets下载数据集是在google源下载，需要科学上网。已经下载过一遍的数据集第二次就不需要下载了（有需要科学上网的同学可以到About me邮件联系我）</p><ul><li>boston housing：波士顿房价回归模型</li><li>mnist&#x2F;fashion minst：手写数字识别</li><li>cifar10&#x2F;100：小型图片分类，cifar100是cifar10的再分类</li><li>imdb：评语情感分类</li></ul><span id="more"></span><h4 id="MNIST"><a href="#MNIST" class="headerlink" title="MNIST"></a>MNIST</h4><p>共70k[28*28]图片，60k来做训练，10k做检测</p><figure class="highlight inform7"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><code class="hljs inform7">In <span class="hljs-comment">[2]</span>: import  tensorflow as tf<br>   ...: from tensorflow import keras<br>In <span class="hljs-comment">[4]</span>: (x,y),(x_test,y_test) = keras.datasets.mnist.load_data() #返回numpy格式的两个tuple<br>In <span class="hljs-comment">[7]</span>: x.shape,y.shape<br>Out<span class="hljs-comment">[7]</span>: ((60000, 28, 28), (60000,))<br>In <span class="hljs-comment">[9]</span>: x.min(),x.max(),x.mean()#numpy的min、max<br>Out<span class="hljs-comment">[9]</span>: (0, 255, 33.318421449829934)<br>In <span class="hljs-comment">[10]</span>: x_test.shape,y_test.shape<br>Out<span class="hljs-comment">[10]</span>: ((10000, 28, 28), (10000,))<br><br>In <span class="hljs-comment">[13]</span>: y_onehot = tf.one_hot(y, depth=10)#将lable转换为onehot编码<br><br>In <span class="hljs-comment">[15]</span>: y<span class="hljs-comment">[:2]</span>,y_onehot<span class="hljs-comment">[0:2]</span><br>Out<span class="hljs-comment">[15]</span>:<br>(array(<span class="hljs-comment">[5, 0]</span>, dtype=uint8),<br> &lt;tf.Tensor: shape=(2, 10), dtype=float32, numpy=<br> array(<span class="hljs-comment">[<span class="hljs-comment">[0., 0., 0., 0., 0., 1., 0., 0., 0., 0.]</span>,</span><br><span class="hljs-comment">        <span class="hljs-comment">[1., 0., 0., 0., 0., 0., 0., 0., 0., 0.]</span>]</span>, dtype=float32)&gt;)<br></code></pre></td></tr></table></figure><h4 id="CIFAR10-100"><a href="#CIFAR10-100" class="headerlink" title="CIFAR10&#x2F;100"></a>CIFAR10&#x2F;100</h4><p>共60k[32*32*3]图片，50k来做训练，10k做检测</p><figure class="highlight fortran"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs fortran"><span class="hljs-keyword">In</span> [<span class="hljs-number">16</span>]: (x,y),(x_test,y_test) = keras.datasets.cifar10.load_data()<br><span class="hljs-keyword">In</span> [<span class="hljs-number">17</span>]: x.<span class="hljs-built_in">shape</span>,y.<span class="hljs-built_in">shape</span>,x_test.<span class="hljs-built_in">shape</span>,y_test.<span class="hljs-built_in">shape</span><br><span class="hljs-keyword">Out</span>[<span class="hljs-number">17</span>]: ((<span class="hljs-number">50000</span>, <span class="hljs-number">32</span>, <span class="hljs-number">32</span>, <span class="hljs-number">3</span>), (<span class="hljs-number">50000</span>, <span class="hljs-number">1</span>), (<span class="hljs-number">10000</span>, <span class="hljs-number">32</span>, <span class="hljs-number">32</span>, <span class="hljs-number">3</span>), (<span class="hljs-number">10000</span>, <span class="hljs-number">1</span>))<br></code></pre></td></tr></table></figure><h3 id="tf-data-Dataset"><a href="#tf-data-Dataset" class="headerlink" title="tf.data.Dataset"></a>tf.data.Dataset</h3><p>我们需要numpy-&gt;tensor-&gt;iter，tf.data.Dataset是专门进行数据集迭代的类</p><h4 id="from-tensor-slices-直接转换为对象"><a href="#from-tensor-slices-直接转换为对象" class="headerlink" title="from_tensor_slices 直接转换为对象"></a>from_tensor_slices 直接转换为对象</h4><figure class="highlight inform7"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><code class="hljs inform7">In <span class="hljs-comment">[19]</span>: (x,y),(x_test,y_test) = keras.datasets.cifar10.load_data()<br><br>In <span class="hljs-comment">[20]</span>: db = tf.data.Dataset.from_tensor_slices(x)<br>In <span class="hljs-comment">[21]</span>: next(iter(db)).shape #先使用iter生成db的迭代器，在使用next每次调用向后迭代一次<br>Out<span class="hljs-comment">[21]</span>: TensorShape(<span class="hljs-comment">[32, 32, 3]</span>)<br><br>In <span class="hljs-comment">[28]</span>: db = tf.data.Dataset.from_tensor_slices((x,y))<br>In <span class="hljs-comment">[29]</span>: next(iter(db))<span class="hljs-comment">[0]</span>.shape<br>Out<span class="hljs-comment">[29]</span>: TensorShape(<span class="hljs-comment">[32, 32, 3]</span>)<br>In <span class="hljs-comment">[30]</span>: next(iter(db))<span class="hljs-comment">[1]</span>.shape<br>Out<span class="hljs-comment">[30]</span>: TensorShape(<span class="hljs-comment">[1]</span>)<br></code></pre></td></tr></table></figure><h4 id="shuffle-随机打散"><a href="#shuffle-随机打散" class="headerlink" title=".shuffle 随机打散"></a>.shuffle 随机打散</h4><figure class="highlight stylus"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs stylus">In <span class="hljs-selector-attr">[31]</span>: db = tf<span class="hljs-selector-class">.data</span><span class="hljs-selector-class">.Dataset</span><span class="hljs-selector-class">.from_tensor_slices</span>((x_test,y_test)) #对应随机打散<br>In <span class="hljs-selector-attr">[32]</span>: db = db<span class="hljs-selector-class">.shuffle</span>(<span class="hljs-number">10000</span>) #这个参数可以给的大一点，<span class="hljs-number">10000</span>这个范围内的随机打散<br></code></pre></td></tr></table></figure><h4 id="map-数据预处理"><a href="#map-数据预处理" class="headerlink" title=".map 数据预处理"></a>.map 数据预处理</h4><p>map(a)对db中每一个数据进行a处理</p><figure class="highlight apache"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><code class="hljs apache"><span class="hljs-attribute">In</span><span class="hljs-meta"> [33]: def preprocess(x,y):</span><br><span class="hljs-meta">    ...:     x=tf.cast(x,dtype=tf.float32)/255.</span><br><span class="hljs-meta">    ...:     y=tf.cast(y,dtype=tf.int32)</span><br><span class="hljs-meta">    ...:     y=tf.one_hot(y,depth=10)</span><br><span class="hljs-meta">    ...:     return(x,y)</span><br><span class="hljs-meta">    ...:</span><br><span class="hljs-meta"></span><br><span class="hljs-meta">In [34]: db2 = db.map(preprocess)</span><br><span class="hljs-meta"></span><br><span class="hljs-meta">In [35]: res = next(iter(db2))</span><br><span class="hljs-meta"></span><br><span class="hljs-meta">In [36]: res[0].shape,res[1].shape</span><br><span class="hljs-meta">Out[36]: (TensorShape([32, 32, 3]), TensorShape([1, 10]))</span><br><span class="hljs-meta"></span><br><span class="hljs-meta">In [49]: res[1]</span><br><span class="hljs-attribute">Out</span>[<span class="hljs-number">49</span>]: &lt;tf.Tensor: shape=(<span class="hljs-number">1</span>, <span class="hljs-number">10</span>), dtype=float32, numpy=array([[<span class="hljs-number">1</span>., <span class="hljs-number">0</span>., <span class="hljs-number">0</span>., <span class="hljs-number">0</span>., <span class="hljs-number">0</span>., <span class="hljs-number">0</span>., <span class="hljs-number">0</span>., <span class="hljs-number">0</span>., <span class="hljs-number">0</span>., <span class="hljs-number">0</span>.]], dtype=float32)&gt;<br></code></pre></td></tr></table></figure><h4 id="batch"><a href="#batch" class="headerlink" title=".batch"></a>.batch</h4><p>一般进行数据集读取都是读取多张</p><figure class="highlight inform7"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><code class="hljs inform7">In <span class="hljs-comment">[50]</span>: db3 = db2.batch(32)<br><br>In <span class="hljs-comment">[51]</span>: res = next(iter(db3))<br><br>In <span class="hljs-comment">[52]</span>: res<span class="hljs-comment">[0]</span>.shape,res<span class="hljs-comment">[1]</span>.shape<br>Out<span class="hljs-comment">[52]</span>: (TensorShape(<span class="hljs-comment">[32, 32, 32, 3]</span>), TensorShape(<span class="hljs-comment">[32, 1, 10]</span>)) <br>#这里我们不需要<span class="hljs-comment">[32,1,10]</span>中的1，所以要在前面预处理中使用tf.squeeze将1去掉<br><br>In <span class="hljs-comment">[61]</span>: def preprocess(x,y):<br>    ...:     x=tf.cast(x,dtype=tf.float32)/255.<br>    ...:     y=tf.cast(y,dtype=tf.int32)<br>    ...:     y=tf.one_hot(y,depth=10)<br>    ...:     y = tf.squeeze(y)<br>    ...:     return(x,y)<br>In <span class="hljs-comment">[62]</span>: db2 = db.map(preprocess)<br>In <span class="hljs-comment">[63]</span>: db3 = db2.batch(32)<br>In <span class="hljs-comment">[64]</span>: res = next(iter(db3))<br>In <span class="hljs-comment">[65]</span>:  res<span class="hljs-comment">[0]</span>.shape,res<span class="hljs-comment">[1]</span>.shape<br>Out<span class="hljs-comment">[65]</span>: (TensorShape(<span class="hljs-comment">[32, 32, 32, 3]</span>), TensorShape(<span class="hljs-comment">[32, 10]</span>))<br></code></pre></td></tr></table></figure><h4 id="StopIteration"><a href="#StopIteration" class="headerlink" title="StopIteration"></a>StopIteration</h4><p>使用</p><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs css">for <span class="hljs-attribute">x</span>,<span class="hljs-attribute">y</span> in db：<br>#迭代next<br></code></pre></td></tr></table></figure><p>正常</p><p>如果使用</p><figure class="highlight isbl"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs isbl"><span class="hljs-variable"><span class="hljs-keyword">In</span></span> [<span class="hljs-number">54</span>]: <span class="hljs-variable"><span class="hljs-keyword">while</span></span> <span class="hljs-variable"><span class="hljs-literal">True</span></span>:<br>    ...:     <span class="hljs-function"><span class="hljs-title">next</span>(<span class="hljs-variable">db_iter</span>)</span><br></code></pre></td></tr></table></figure><p>则会报StopIteration 错误</p><p>也就是循环50k次之后继续迭代会报错，如果需要多次迭代，可以使用repeat</p><h4 id="repeat"><a href="#repeat" class="headerlink" title=".repeat"></a>.repeat</h4><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs css">In <span class="hljs-selector-attr">[66]</span>: db4 = db3.<span class="hljs-built_in">repeat</span>(<span class="hljs-number">10</span>)<br></code></pre></td></tr></table></figure><p>在使用for迭代db4的时候会迭代10次50k</p><h3 id="完整步骤"><a href="#完整步骤" class="headerlink" title="完整步骤"></a>完整步骤</h3><figure class="highlight gml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><code class="hljs gml">import  tensorflow as tf<br>from tensorflow import keras<br><br>def prepare_mnist_features_and_labels(<span class="hljs-variable language_">x</span>,<span class="hljs-variable language_">y</span>):<br>    <span class="hljs-variable language_">x</span> = tf.cast(<span class="hljs-variable language_">x</span>, tf.float32) / <span class="hljs-number">255.</span><br>    <span class="hljs-variable language_">y</span> = tf.cast(<span class="hljs-variable language_">y</span>, tf.<span class="hljs-built_in">int64</span>)<br>    <span class="hljs-keyword">return</span> <span class="hljs-variable language_">x</span>,<span class="hljs-variable language_">y</span><br>def mnist_datasets():<br>    (<span class="hljs-variable language_">x</span>,<span class="hljs-variable language_">y</span>),(x_val,y_val) = keras.datasets.fashion_mnist.load_data()<br>    <span class="hljs-variable language_">y</span> = tf.one_hot(<span class="hljs-variable language_">y</span>,<span class="hljs-variable language_">depth</span>=<span class="hljs-number">10</span>)<br>    y_val = tf.one_hot(y_val,<span class="hljs-variable language_">depth</span>=<span class="hljs-number">10</span>)<br><br>    ds = tf.data.Dataset.from_tensor_slices((<span class="hljs-variable language_">x</span>,<span class="hljs-variable language_">y</span>))<br>    ds = ds.map(prepare_mnist_features_and_labels)<br>    ds = ds.shuffle(<span class="hljs-number">60000</span>).batch(<span class="hljs-number">100</span>)<br>    ds_val = tf.data.Dataset.from_tensor_slices((x_val, y_val))<br>    ds_val = ds_val.map(prepare_mnist_features_and_labels)<br>    ds_val = ds_val.shuffle(<span class="hljs-number">60000</span>).batch(<span class="hljs-number">100</span>)<br>    <span class="hljs-keyword">return</span> ds,ds_val<br></code></pre></td></tr></table></figure><h2 id="全连接层"><a href="#全连接层" class="headerlink" title="全连接层"></a>全连接层</h2><h3 id="Layers"><a href="#Layers" class="headerlink" title="Layers"></a>Layers</h3><ul><li>Input</li><li>Hidden</li><li>Output</li></ul><figure class="highlight inform7"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><code class="hljs inform7">In <span class="hljs-comment">[3]</span>: x = tf.random.normal(<span class="hljs-comment">[4,784]</span>)<br><br>In <span class="hljs-comment">[4]</span>: net = tf.keras.layers.Dense(512)<br>In <span class="hljs-comment">[5]</span>: out = net(x) #自动根据输入的x生成w和b<br><br>In <span class="hljs-comment">[6]</span>: out.shape<br>Out<span class="hljs-comment">[6]</span>: TensorShape(<span class="hljs-comment">[4, 512]</span>)<br><br>In <span class="hljs-comment">[7]</span>: net.kernel.shape,net.bias.shape<br>Out<span class="hljs-comment">[7]</span>: (TensorShape(<span class="hljs-comment">[784, 512]</span>), TensorShape(<span class="hljs-comment">[512]</span>))<br></code></pre></td></tr></table></figure><figure class="highlight dns"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br></pre></td><td class="code"><pre><code class="hljs dns">In [<span class="hljs-number">2</span>]: net = tf.keras.layers.Dense(<span class="hljs-number">10</span>)<br>In [<span class="hljs-number">3</span>]: net.bias<br>AttributeError: &#x27;Dense&#x27; object has no attribute &#x27;bias&#x27;<br>#在声明netDense的时候并没有完成对w和b的创建<br>In [<span class="hljs-number">7</span>]: net.get_weights()<br>Out[<span class="hljs-number">7</span>]: []<br>In [<span class="hljs-number">8</span>]: net.weights<br>Out[<span class="hljs-number">8</span>]: []<br>#可以通过build来实现w和b的创建<br>In [<span class="hljs-number">9</span>]: net.build(input_shape=(None,<span class="hljs-number">4</span>))<br>In [<span class="hljs-number">10</span>]: net.kernel.shape,net.bias.shape<br>Out[<span class="hljs-number">10</span>]: (TensorShape([<span class="hljs-number">4</span>, <span class="hljs-number">10</span>]), TensorShape([<span class="hljs-number">10</span>]))<br>#可以重复创建kernal的参数<br>In [<span class="hljs-number">11</span>]: net.build(input_shape=(<span class="hljs-number">2</span>,<span class="hljs-number">4</span>))<br>In [<span class="hljs-number">12</span>]: net.kernel<br>Out[<span class="hljs-number">12</span>]:<br>&lt;tf.Variable &#x27;kernel:<span class="hljs-number">0</span>&#x27; shape=(<span class="hljs-number">4</span>, <span class="hljs-number">10</span>) dtype=float32, numpy=<br>array([[ <span class="hljs-number">0.61441875</span>,  <span class="hljs-number">0.24404484</span>,  <span class="hljs-number">0.46651304</span>,  <span class="hljs-number">0.19085598</span>, -<span class="hljs-number">0.05145264</span>,<br>        -<span class="hljs-number">0.35335562</span>, -<span class="hljs-number">0.10202849</span>, -<span class="hljs-number">0.15380013</span>,  <span class="hljs-number">0.01670462</span>,  <span class="hljs-number">0.41096544</span>],<br>       [-<span class="hljs-number">0.57477844</span>,  <span class="hljs-number">0.335864</span>  ,  <span class="hljs-number">0.02894145</span>, -<span class="hljs-number">0.6324929</span> ,  <span class="hljs-number">0.3016789</span> ,<br>         <span class="hljs-number">0.38328493</span>,  <span class="hljs-number">0.33733964</span>, -<span class="hljs-number">0.5588818</span> ,  <span class="hljs-number">0.20204544</span>, -<span class="hljs-number">0.15296638</span>],<br>       [-<span class="hljs-number">0.56863743</span>,  <span class="hljs-number">0.53329456</span>,  <span class="hljs-number">0.38212597</span>, -<span class="hljs-number">0.29313013</span>,  <span class="hljs-number">0.5511124</span> ,<br>         <span class="hljs-number">0.22399694</span>, -<span class="hljs-number">0.13377267</span>, -<span class="hljs-number">0.24024266</span>,  <span class="hljs-number">0.6475775</span> , -<span class="hljs-number">0.61608607</span>],<br>       [ <span class="hljs-number">0.51299465</span>, -<span class="hljs-number">0.19775617</span>, -<span class="hljs-number">0.0596118</span> ,  <span class="hljs-number">0.13451362</span>,  <span class="hljs-number">0.5777488</span> ,<br>         <span class="hljs-number">0.02472413</span>, -<span class="hljs-number">0.5219021</span> , -<span class="hljs-number">0.19751549</span>, -<span class="hljs-number">0.62549543</span>,  <span class="hljs-number">0.17085516</span>]],<br>      dtype=float32)&gt;<br></code></pre></td></tr></table></figure><p>在前面调用net(x)时会自动调用net.build()</p><p>若提前手动设定的输入shape与实际输入shape不同时会报错 </p><p>每个节点和每个节点都有连接即为全连接</p><h3 id="Multi-Layers"><a href="#Multi-Layers" class="headerlink" title="Multi-Layers"></a>Multi-Layers</h3><ul><li>keras.Sequemtial([layer1,layer2,layer3]) 调用容器，多个Dense层组成list交给容器，调用一次forward，就会进行一层数据流动</li></ul><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br></pre></td><td class="code"><pre><code class="hljs markdown">In [14]: x = tf.random.normal([2,4])<br>In [15]: model = keras.Sequential([])<br><br>In [16]: model = keras.Sequential([keras.layers.Dense(2,activation=&#x27;relu&#x27;),<br><span class="hljs-code">keras.layers.Dense(2,activation=&#x27;relu&#x27;),</span><br><span class="hljs-code">keras.layers.Dense(2)])</span><br><span class="hljs-code"></span><br>In [17]: model.build(input<span class="hljs-emphasis">_shape=[None,4])</span><br><span class="hljs-emphasis"></span><br><span class="hljs-emphasis">In [18]: model.summary() #方便查看网络结构</span><br><span class="hljs-emphasis">Model: &quot;sequential_</span>1&quot;<br><span class="hljs-strong">____</span><span class="hljs-strong">____</span><span class="hljs-strong">____</span><span class="hljs-strong">____</span><span class="hljs-strong">____</span><span class="hljs-strong">____</span><span class="hljs-strong">____</span><span class="hljs-strong">____</span><span class="hljs-strong">____</span><span class="hljs-strong">____</span><span class="hljs-strong">____</span><span class="hljs-strong">____</span><span class="hljs-strong">____</span><span class="hljs-strong">____</span><span class="hljs-strong">____</span><span class="hljs-strong">____</span>_<br><span class="hljs-section">Layer (type)                 Output Shape              Param #</span><br><span class="hljs-section">=================================================================</span><br>dense<span class="hljs-emphasis">_1 (Dense)              multiple                  10</span><br><span class="hljs-emphasis"><span class="hljs-strong">____</span><span class="hljs-strong">____</span><span class="hljs-strong">____</span><span class="hljs-strong">____</span><span class="hljs-strong">____</span><span class="hljs-strong">____</span><span class="hljs-strong">____</span><span class="hljs-strong">____</span><span class="hljs-strong">____</span><span class="hljs-strong">____</span><span class="hljs-strong">____</span><span class="hljs-strong">____</span><span class="hljs-strong">____</span><span class="hljs-strong">____</span><span class="hljs-strong">____</span><span class="hljs-strong">____</span>_</span><br>dense<span class="hljs-emphasis">_2 (Dense)              multiple                  6</span><br><span class="hljs-emphasis"><span class="hljs-strong">____</span><span class="hljs-strong">____</span><span class="hljs-strong">____</span><span class="hljs-strong">____</span><span class="hljs-strong">____</span><span class="hljs-strong">____</span><span class="hljs-strong">____</span><span class="hljs-strong">____</span><span class="hljs-strong">____</span><span class="hljs-strong">____</span><span class="hljs-strong">____</span><span class="hljs-strong">____</span><span class="hljs-strong">____</span><span class="hljs-strong">____</span><span class="hljs-strong">____</span><span class="hljs-strong">____</span>_</span><br><span class="hljs-section">dense<span class="hljs-emphasis">_3 (Dense)              multiple                  6</span></span><br><span class="hljs-emphasis"><span class="hljs-section">=================================================================</span></span><br><span class="hljs-emphasis"><span class="hljs-section">Total params: 22</span></span><br><span class="hljs-emphasis"><span class="hljs-section">Trainable params: 22</span></span><br><span class="hljs-emphasis"><span class="hljs-section">Non-trainable params: 0</span></span><br><span class="hljs-emphasis"><span class="hljs-section"><span class="hljs-strong">____</span><span class="hljs-strong">____</span><span class="hljs-strong">____</span><span class="hljs-strong">____</span><span class="hljs-strong">____</span><span class="hljs-strong">____</span><span class="hljs-strong">____</span><span class="hljs-strong">____</span><span class="hljs-strong">____</span><span class="hljs-strong">____</span><span class="hljs-strong">____</span><span class="hljs-strong">____</span><span class="hljs-strong">____</span><span class="hljs-strong">____</span><span class="hljs-strong">____</span><span class="hljs-strong">____</span>_</span></span><br><span class="hljs-section"></span><br><span class="hljs-section">In [19]: for p in model.trainable<span class="hljs-emphasis">_variables:</span></span><br><span class="hljs-emphasis"><span class="hljs-section">    ...:     print(p.name,p.shape)</span></span><br><span class="hljs-emphasis"><span class="hljs-section">    ...:</span></span><br><span class="hljs-emphasis"><span class="hljs-section">dense_</span>1/kernel:0 (4, 2)</span><br><span class="hljs-section">dense<span class="hljs-emphasis">_1/bias:0 (2,)</span></span><br><span class="hljs-emphasis"><span class="hljs-section">dense_</span>2/kernel:0 (2, 2)</span><br><span class="hljs-section">dense<span class="hljs-emphasis">_2/bias:0 (2,)</span></span><br><span class="hljs-emphasis"><span class="hljs-section">dense_</span>3/kernel:0 (2, 2)</span><br><span class="hljs-section">dense<span class="hljs-emphasis">_3/bias:0 (2,)</span></span><br></code></pre></td></tr></table></figure><h2 id="误差计算"><a href="#误差计算" class="headerlink" title="误差计算"></a>误差计算</h2><h3 id="MSE"><a href="#MSE" class="headerlink" title="MSE"></a>MSE</h3><ul><li>loss</li></ul><img weight="150" src="/2020/03/30/神经网络NN与全连接层FCL/img1.png"><ul><li>二范数</li></ul><img weight="150" src="/2020/03/30/神经网络NN与全连接层FCL/img2.png"><figure class="highlight routeros"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><code class="hljs routeros"><span class="hljs-keyword">In</span> [22]: y = tf.constant([1,2,3,0,2])<br><span class="hljs-keyword">In</span> [23]: y = tf.one_hot(y,<span class="hljs-attribute">depth</span>=4)<br><span class="hljs-keyword">In</span> [24]: y = tf.cast(y,<span class="hljs-attribute">dtype</span>=tf.float32)<br><br><span class="hljs-keyword">In</span> [25]: out = tf.random.normal([5,4])<br><br><span class="hljs-keyword">In</span> [26]: loss1 = tf.reduce_mean(tf.square(y-out))<br><span class="hljs-keyword">In</span> [27]: loss2 = tf.square(tf.norm(y-out))/(5<span class="hljs-number">*4</span>)<br><span class="hljs-keyword">In</span> [28]: loss3 = tf.reduce_mean(tf.losses.MSE(y,out))<br><span class="hljs-comment">#tf.losses.MSE(y,out) 返回的是每个instance的mse [b]</span><br><span class="hljs-keyword">In</span> [29]: loss1,loss2,loss3<br>Out[29]:<br>(&lt;tf.Tensor: shape=(), <span class="hljs-attribute">dtype</span>=float32, <span class="hljs-attribute">numpy</span>=0.5689168&gt;,<br> &lt;tf.Tensor: shape=(), <span class="hljs-attribute">dtype</span>=float32, <span class="hljs-attribute">numpy</span>=0.5689168&gt;,<br> &lt;tf.Tensor: shape=(), <span class="hljs-attribute">dtype</span>=float32, <span class="hljs-attribute">numpy</span>=0.5689168&gt;)<br></code></pre></td></tr></table></figure><h3 id="Cross-Entropy-Loss"><a href="#Cross-Entropy-Loss" class="headerlink" title="Cross Entropy Loss"></a>Cross Entropy Loss</h3><h4 id="Entropy-熵"><a href="#Entropy-熵" class="headerlink" title="Entropy 熵"></a>Entropy 熵</h4><p>信息论中的概念</p><ul><li>信息不确定性的度量方法</li><li>measure of surprise</li><li>lower entropy -&gt; more certainty</li></ul><img weight="150" src="/2020/03/30/神经网络NN与全连接层FCL/img3.png"><h4 id="Cross-Entropy-交叉熵"><a href="#Cross-Entropy-交叉熵" class="headerlink" title="Cross Entropy 交叉熵"></a>Cross Entropy 交叉熵</h4><img weight="150" src="/2020/03/30/神经网络NN与全连接层FCL/img4.png"><p>交叉熵针对两个值，而后可以推导出 p的熵+pq离散度（衡量pq距离，p&#x3D;q时离散度为0）</p><img weight="150" src="/2020/03/30/神经网络NN与全连接层FCL/img5.png"><p>使用交叉熵时，使pq离散度趋于0，也就是y与out的离散度，就是我们需要的状态</p><figure class="highlight stylus"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><code class="hljs stylus">In <span class="hljs-selector-attr">[30]</span>: tf<span class="hljs-selector-class">.losses</span><span class="hljs-selector-class">.categorical_crossentropy</span>(<span class="hljs-selector-attr">[0,1,0,0]</span>,<span class="hljs-selector-attr">[0.25,0.25,0.25,0.25]</span>)<br>Out<span class="hljs-selector-attr">[30]</span>: &lt;tf<span class="hljs-selector-class">.Tensor</span>: shape=(), dtype=float32, numpy=<span class="hljs-number">1.3862944</span>&gt;<br><br>In <span class="hljs-selector-attr">[31]</span>: tf<span class="hljs-selector-class">.losses</span><span class="hljs-selector-class">.categorical_crossentropy</span>(<span class="hljs-selector-attr">[0,1,0,0]</span>,<span class="hljs-selector-attr">[0.1,0.8,0.05,0.05]</span>)<br>Out<span class="hljs-selector-attr">[31]</span>: &lt;tf<span class="hljs-selector-class">.Tensor</span>: shape=(), dtype=float32, numpy=<span class="hljs-number">0.22314353</span>&gt;<br><br>In <span class="hljs-selector-attr">[32]</span>: tf<span class="hljs-selector-class">.losses</span><span class="hljs-selector-class">.categorical_crossentropy</span>(<span class="hljs-selector-attr">[0,1,0,0]</span>,<span class="hljs-selector-attr">[0.01,0.97,0.01,0.01]</span>)<br>Out<span class="hljs-selector-attr">[32]</span>: &lt;tf<span class="hljs-selector-class">.Tensor</span>: shape=(), dtype=float32, numpy=<span class="hljs-number">0.030459179</span>&gt;<br></code></pre></td></tr></table></figure><ul><li>对比MSE ，sigmod+MSE可能造成gradient vanish</li><li>Cross Entropy在预测错误较严重时，收敛会相对较快</li><li>具体问题具体分析 比如meta-learning使用MSE就会比较稳定</li></ul><img weight="350" src="/2020/03/30/神经网络NN与全连接层FCL/img6.png"><p>logit指的是最后一层没有加激活函数，经过softmax和CE会有数值不稳定的问题，我们将最后两个部分统一合并为一起，作为一个函数，在函数内部已经做好优化</p><figure class="highlight stylus"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs stylus">In <span class="hljs-selector-attr">[34]</span>: tf<span class="hljs-selector-class">.losses</span><span class="hljs-selector-class">.categorical_crossentropy</span>(<span class="hljs-selector-attr">[0,1,0,0]</span>,logits,from_logits=True)<br></code></pre></td></tr></table></figure><p>from_logits一定要设定</p><p>且传入的是logits，而不是经过softmax函数的</p>]]>
    </content>
    <id>https://www.wakli.com/2020/03/30/%E7%A5%9E%E7%BB%8F%E7%BD%91%E7%BB%9CNN%E4%B8%8E%E5%85%A8%E8%BF%9E%E6%8E%A5%E5%B1%82FCL/</id>
    <link href="https://www.wakli.com/2020/03/30/%E7%A5%9E%E7%BB%8F%E7%BD%91%E7%BB%9CNN%E4%B8%8E%E5%85%A8%E8%BF%9E%E6%8E%A5%E5%B1%82FCL/"/>
    <published>2020-03-30T03:40:45.000Z</published>
    <summary>
      <![CDATA[<h2 id="小型经典数据集加载"><a href="#小型经典数据集加载" class="headerlink" title="小型经典数据集加载"></a>小型经典数据集加载</h2><h3 id="keras-datasets-常用数据集"><a href="#keras-datasets-常用数据集" class="headerlink" title="keras.datasets  常用数据集"></a>keras.datasets  常用数据集</h3><p>keras.datasets下载数据集是在google源下载，需要科学上网。已经下载过一遍的数据集第二次就不需要下载了（有需要科学上网的同学可以到About me邮件联系我）</p>
<ul>
<li>boston housing：波士顿房价回归模型</li>
<li>mnist&#x2F;fashion minst：手写数字识别</li>
<li>cifar10&#x2F;100：小型图片分类，cifar100是cifar10的再分类</li>
<li>imdb：评语情感分类</li>
</ul>]]>
    </summary>
    <title>神经网络NN与全连接层FCL</title>
    <updated>2020-03-31T08:34:04.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>王康力</name>
    </author>
    <category term="机器学习" scheme="https://www.wakli.com/categories/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0/"/>
    <category term="Tensorflow" scheme="https://www.wakli.com/categories/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0/Tensorflow/"/>
    <category term="vactor norm" scheme="https://www.wakli.com/tags/vactor-norm/"/>
    <category term="Top_k" scheme="https://www.wakli.com/tags/Top-k/"/>
    <category term="限幅" scheme="https://www.wakli.com/tags/%E9%99%90%E5%B9%85/"/>
    <content>
      <![CDATA[<h2 id="合并与分割"><a href="#合并与分割" class="headerlink" title="合并与分割"></a>合并与分割</h2><h3 id="concat-拼接"><a href="#concat-拼接" class="headerlink" title="concat 拼接"></a>concat 拼接</h3><p>axis&#x3D;? 合并某一个维度的数据</p><p>要求除了要拼接的维度外的所有维度都相等</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><code class="hljs python">In [<span class="hljs-number">2</span>]: a = tf.ones([<span class="hljs-number">4</span>,<span class="hljs-number">35</span>,<span class="hljs-number">8</span>])<br>In [<span class="hljs-number">3</span>]: b = tf.zeros([<span class="hljs-number">2</span>,<span class="hljs-number">35</span>,<span class="hljs-number">8</span>])<br>In [<span class="hljs-number">4</span>]: c = tf.concat([a,b],axis = <span class="hljs-number">0</span>)<br>TensorShape([<span class="hljs-number">6</span>, <span class="hljs-number">35</span>, <span class="hljs-number">8</span>])<br>In [<span class="hljs-number">6</span>]: b = tf.zeros([<span class="hljs-number">4</span>,<span class="hljs-number">3</span>,<span class="hljs-number">8</span>])<br>In [<span class="hljs-number">7</span>]: c = tf.concat([a,b],axis = <span class="hljs-number">1</span>)<br>TensorShape([<span class="hljs-number">4</span>, <span class="hljs-number">38</span>, <span class="hljs-number">8</span>])<br><br>In [<span class="hljs-number">10</span>]: a = tf.ones([<span class="hljs-number">4</span>,<span class="hljs-number">3</span>])<br>In [<span class="hljs-number">11</span>]: b = tf.zeros([<span class="hljs-number">4</span>,<span class="hljs-number">4</span>])<br>In [<span class="hljs-number">13</span>]: c = tf.concat([a,b],axis = <span class="hljs-number">1</span>)<br>&lt;tf.Tensor: shape=(<span class="hljs-number">4</span>, <span class="hljs-number">7</span>), dtype=float32, numpy=<br>array([[<span class="hljs-number">1.</span>, <span class="hljs-number">1.</span>, <span class="hljs-number">1.</span>, <span class="hljs-number">0.</span>, <span class="hljs-number">0.</span>, <span class="hljs-number">0.</span>, <span class="hljs-number">0.</span>],<br>       [<span class="hljs-number">1.</span>, <span class="hljs-number">1.</span>, <span class="hljs-number">1.</span>, <span class="hljs-number">0.</span>, <span class="hljs-number">0.</span>, <span class="hljs-number">0.</span>, <span class="hljs-number">0.</span>],<br>       [<span class="hljs-number">1.</span>, <span class="hljs-number">1.</span>, <span class="hljs-number">1.</span>, <span class="hljs-number">0.</span>, <span class="hljs-number">0.</span>, <span class="hljs-number">0.</span>, <span class="hljs-number">0.</span>],<br>       [<span class="hljs-number">1.</span>, <span class="hljs-number">1.</span>, <span class="hljs-number">1.</span>, <span class="hljs-number">0.</span>, <span class="hljs-number">0.</span>, <span class="hljs-number">0.</span>, <span class="hljs-number">0.</span>]], dtype=float32)&gt;<br></code></pre></td></tr></table></figure><h3 id="stack-创建新的维度"><a href="#stack-创建新的维度" class="headerlink" title="stack 创建新的维度"></a>stack 创建新的维度</h3><span id="more"></span><p>所有维度必须完全一致</p><figure class="highlight stylus"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><code class="hljs stylus">In <span class="hljs-selector-attr">[22]</span>: <span class="hljs-selector-tag">a</span> = tf<span class="hljs-selector-class">.ones</span>(<span class="hljs-selector-attr">[4,35,8]</span>)<br>In <span class="hljs-selector-attr">[23]</span>: <span class="hljs-selector-tag">b</span> = tf<span class="hljs-selector-class">.zeros</span>(<span class="hljs-selector-attr">[4,35,8]</span>)<br><br>In <span class="hljs-selector-attr">[24]</span>: tf<span class="hljs-selector-class">.stack</span>(<span class="hljs-selector-attr">[a,b]</span>,axis=<span class="hljs-number">0</span>)<span class="hljs-selector-class">.shape</span><br>Out<span class="hljs-selector-attr">[24]</span>: <span class="hljs-built_in">TensorShape</span>(<span class="hljs-selector-attr">[2, 4, 35, 8]</span>)<br></code></pre></td></tr></table></figure><h3 id="unstack-拆分"><a href="#unstack-拆分" class="headerlink" title="unstack 拆分"></a>unstack 拆分</h3><p>维度上有多少就拆分成多少</p><figure class="highlight stylus"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><code class="hljs stylus">In <span class="hljs-selector-attr">[26]</span>: <span class="hljs-selector-tag">a</span> = tf<span class="hljs-selector-class">.ones</span>(<span class="hljs-selector-attr">[4,35,8]</span>)<br>In <span class="hljs-selector-attr">[27]</span>: <span class="hljs-selector-tag">b</span> = tf<span class="hljs-selector-class">.ones</span>(<span class="hljs-selector-attr">[4,35,8]</span>)<br>In <span class="hljs-selector-attr">[28]</span>: c = tf<span class="hljs-selector-class">.stack</span>(<span class="hljs-selector-attr">[a,b]</span>)<br><span class="hljs-function"><span class="hljs-title">TensorShape</span><span class="hljs-params">([<span class="hljs-number">2</span>, <span class="hljs-number">4</span>, <span class="hljs-number">35</span>, <span class="hljs-number">8</span>])</span></span><br><br>In <span class="hljs-selector-attr">[31]</span>: aa,bb = tf<span class="hljs-selector-class">.unstack</span>(c,axis = <span class="hljs-number">0</span>)<br>In <span class="hljs-selector-attr">[32]</span>: aa<span class="hljs-selector-class">.shape</span>,bb<span class="hljs-selector-class">.shape</span><br>Out<span class="hljs-selector-attr">[32]</span>: (<span class="hljs-built_in">TensorShape</span>(<span class="hljs-selector-attr">[4, 35, 8]</span>), <span class="hljs-built_in">TensorShape</span>(<span class="hljs-selector-attr">[4, 35, 8]</span>))<br><br>In <span class="hljs-selector-attr">[33]</span>: res = tf<span class="hljs-selector-class">.unstack</span>(c,axis=<span class="hljs-number">3</span>)<br>In <span class="hljs-selector-attr">[37]</span>: res<span class="hljs-selector-attr">[0]</span><span class="hljs-selector-class">.shape</span>,res<span class="hljs-selector-attr">[7]</span><span class="hljs-selector-class">.shape</span><br>Out<span class="hljs-selector-attr">[37]</span>: (<span class="hljs-built_in">TensorShape</span>(<span class="hljs-selector-attr">[2, 4, 35]</span>), <span class="hljs-built_in">TensorShape</span>(<span class="hljs-selector-attr">[2, 4, 35]</span>))<br></code></pre></td></tr></table></figure><h3 id="Split"><a href="#Split" class="headerlink" title="Split"></a>Split</h3><p>比unstack灵活性更强</p><figure class="highlight stylus"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><code class="hljs stylus">In <span class="hljs-selector-attr">[39]</span>: res = tf<span class="hljs-selector-class">.split</span>(c,axis=<span class="hljs-number">3</span>,num_or_size_splits=<span class="hljs-number">2</span>)<br>In <span class="hljs-selector-attr">[40]</span>: <span class="hljs-built_in">len</span>(res)<br>Out<span class="hljs-selector-attr">[40]</span>: <span class="hljs-number">2</span><br>In <span class="hljs-selector-attr">[41]</span>: res<span class="hljs-selector-attr">[0]</span><span class="hljs-selector-class">.shape</span><br>Out<span class="hljs-selector-attr">[41]</span>: <span class="hljs-built_in">TensorShape</span>(<span class="hljs-selector-attr">[2, 4, 35, 4]</span>)<br><br>In <span class="hljs-selector-attr">[42]</span>: res = tf<span class="hljs-selector-class">.split</span>(c,axis=<span class="hljs-number">3</span>,num_or_size_splits=<span class="hljs-selector-attr">[2,2,4]</span>)<br>In <span class="hljs-selector-attr">[43]</span>: res<span class="hljs-selector-attr">[0]</span><span class="hljs-selector-class">.shape</span>,res<span class="hljs-selector-attr">[1]</span><span class="hljs-selector-class">.shape</span>,res<span class="hljs-selector-attr">[2]</span><span class="hljs-selector-class">.shape</span><br>Out<span class="hljs-selector-attr">[43]</span>:<br>(<span class="hljs-built_in">TensorShape</span>(<span class="hljs-selector-attr">[2, 4, 35, 2]</span>),<br> <span class="hljs-built_in">TensorShape</span>(<span class="hljs-selector-attr">[2, 4, 35, 2]</span>),<br> <span class="hljs-built_in">TensorShape</span>(<span class="hljs-selector-attr">[2, 4, 35, 4]</span>))<br></code></pre></td></tr></table></figure><h2 id="数据统计"><a href="#数据统计" class="headerlink" title="数据统计"></a>数据统计</h2><h3 id="Vector-Norm-向量范数"><a href="#Vector-Norm-向量范数" class="headerlink" title="Vector Norm 向量范数"></a>Vector Norm 向量范数</h3><p>二范数：平方和开根号</p><img width="150px" src="/2020/03/22/Tensor操作/img1.png"><p>无穷范数：元素中最大值的绝对值</p><img width="150px" src="/2020/03/22/Tensor操作/img2.png"><p>一范数：绝对值的和</p><img width="150px" src="/2020/03/22/Tensor操作/img3.png"><figure class="highlight stylus"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><code class="hljs stylus"><span class="hljs-selector-id">#norm</span> Vector Norm 向量范数 默认为二范数<br>In <span class="hljs-selector-attr">[2]</span>: <span class="hljs-selector-tag">a</span> = tf<span class="hljs-selector-class">.ones</span>(<span class="hljs-selector-attr">[2,2]</span>)<br><br>In <span class="hljs-selector-attr">[3]</span>: tf<span class="hljs-selector-class">.norm</span>(a)<br>Out<span class="hljs-selector-attr">[3]</span>: &lt;tf<span class="hljs-selector-class">.Tensor</span>: shape=(), dtype=float32, numpy=<span class="hljs-number">2.0</span>&gt;<br>In <span class="hljs-selector-attr">[4]</span>: tf<span class="hljs-selector-class">.sqrt</span>(tf<span class="hljs-selector-class">.reduce_sum</span>(tf<span class="hljs-selector-class">.square</span>(a)))<br>Out<span class="hljs-selector-attr">[4]</span>: &lt;tf<span class="hljs-selector-class">.Tensor</span>: shape=(), dtype=float32, numpy=<span class="hljs-number">2.0</span>&gt;<br><br>In <span class="hljs-selector-attr">[5]</span>: <span class="hljs-selector-tag">a</span> = tf<span class="hljs-selector-class">.ones</span>(<span class="hljs-selector-attr">[4,28,28,3]</span>)<br><br>In <span class="hljs-selector-attr">[6]</span>: tf<span class="hljs-selector-class">.norm</span>(a)<br>Out<span class="hljs-selector-attr">[6]</span>: &lt;tf<span class="hljs-selector-class">.Tensor</span>: shape=(), dtype=float32, numpy=<span class="hljs-number">96.99484</span>&gt;<br>In <span class="hljs-selector-attr">[7]</span>: tf<span class="hljs-selector-class">.sqrt</span>(tf<span class="hljs-selector-class">.reduce_sum</span>(tf<span class="hljs-selector-class">.square</span>(a)))<br>Out<span class="hljs-selector-attr">[7]</span>: &lt;tf<span class="hljs-selector-class">.Tensor</span>: shape=(), dtype=float32, numpy=<span class="hljs-number">96.99484</span>&gt;<br></code></pre></td></tr></table></figure><p>ord指定范数</p><figure class="highlight stylus"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><code class="hljs stylus">In <span class="hljs-selector-attr">[23]</span>: <span class="hljs-selector-tag">a</span> = tf<span class="hljs-selector-class">.ones</span>(<span class="hljs-selector-attr">[2]</span>)<br>In <span class="hljs-selector-attr">[24]</span>: b= tf<span class="hljs-selector-class">.fill</span>(<span class="hljs-selector-attr">[2]</span>,<span class="hljs-number">2</span>.)<br>In <span class="hljs-selector-attr">[25]</span>: c = tf<span class="hljs-selector-class">.stack</span>(<span class="hljs-selector-attr">[a,b]</span>,axis=<span class="hljs-number">0</span>)<br>&lt;tf<span class="hljs-selector-class">.Tensor</span>: shape=(<span class="hljs-number">2</span>, <span class="hljs-number">2</span>), dtype=float32, numpy=<br><span class="hljs-built_in">array</span>(<span class="hljs-selector-attr">[[1., 1.]</span>,<br>       <span class="hljs-selector-attr">[2., 2.]</span>], dtype=float32)&gt;<br><br>In <span class="hljs-selector-attr">[27]</span>: tf<span class="hljs-selector-class">.norm</span>(c,ord=<span class="hljs-number">1</span>)<br>Out<span class="hljs-selector-attr">[27]</span>: &lt;tf<span class="hljs-selector-class">.Tensor</span>: shape=(), dtype=float32, numpy=<span class="hljs-number">6.0</span>&gt;<br><br>In <span class="hljs-selector-attr">[28]</span>: tf<span class="hljs-selector-class">.norm</span>(c,ord=<span class="hljs-number">1</span>,axis=<span class="hljs-number">0</span>)<br>Out<span class="hljs-selector-attr">[28]</span>: &lt;tf<span class="hljs-selector-class">.Tensor</span>: shape=(<span class="hljs-number">2</span>,), dtype=float32, numpy=<span class="hljs-built_in">array</span>(<span class="hljs-selector-attr">[3., 3.]</span>, dtype=float32)&gt;<br><br>In <span class="hljs-selector-attr">[29]</span>: tf<span class="hljs-selector-class">.norm</span>(c,ord=<span class="hljs-number">1</span>,axis=<span class="hljs-number">1</span>)<br>Out<span class="hljs-selector-attr">[29]</span>: &lt;tf<span class="hljs-selector-class">.Tensor</span>: shape=(<span class="hljs-number">2</span>,), dtype=float32, numpy=<span class="hljs-built_in">array</span>(<span class="hljs-selector-attr">[2., 4.]</span>, dtype=float32)&gt;<br></code></pre></td></tr></table></figure><h3 id="reduce-min-max-mean"><a href="#reduce-min-max-mean" class="headerlink" title="reduce_min&#x2F;max&#x2F;mean"></a>reduce_min&#x2F;max&#x2F;mean</h3><p>最小值&#x2F;最大值&#x2F;平均值</p><p>指定axis后会求某维度的均值，不指定求全均值</p><figure class="highlight routeros"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><code class="hljs routeros"><span class="hljs-keyword">In</span> [33]: tf.reduce_min(c),tf.reduce_max(c),tf.reduce_mean(c)<br>Out[33]:<br>(&lt;tf.Tensor: shape=(), <span class="hljs-attribute">dtype</span>=float32, <span class="hljs-attribute">numpy</span>=1.0&gt;,<br> &lt;tf.Tensor: shape=(), <span class="hljs-attribute">dtype</span>=float32, <span class="hljs-attribute">numpy</span>=2.0&gt;,<br> &lt;tf.Tensor: shape=(), <span class="hljs-attribute">dtype</span>=float32, <span class="hljs-attribute">numpy</span>=1.5&gt;)<br> <br><span class="hljs-keyword">In</span> [34]: tf.reduce_min(c , <span class="hljs-attribute">axis</span>=1)<br>Out[34]: &lt;tf.Tensor: shape=(2,), <span class="hljs-attribute">dtype</span>=float32, <span class="hljs-attribute">numpy</span>=array([1., 2.], <span class="hljs-attribute">dtype</span>=float32)&gt;<br></code></pre></td></tr></table></figure><h3 id="argmax-argmin"><a href="#argmax-argmin" class="headerlink" title="argmax&#x2F;argmin"></a>argmax&#x2F;argmin</h3><p>最大值最小值所在的位置,默认axis为0</p><figure class="highlight stylus"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><code class="hljs stylus">In <span class="hljs-selector-attr">[31]</span>: <span class="hljs-selector-tag">a</span> = tf<span class="hljs-selector-class">.random</span><span class="hljs-selector-class">.normal</span>(<span class="hljs-selector-attr">[4,10]</span>)<br>In <span class="hljs-selector-attr">[35]</span>: tf<span class="hljs-selector-class">.argmax</span>(a)<br>Out<span class="hljs-selector-attr">[35]</span>: &lt;tf<span class="hljs-selector-class">.Tensor</span>: shape=(<span class="hljs-number">10</span>,), dtype=int64, numpy=<span class="hljs-built_in">array</span>(<span class="hljs-selector-attr">[1, 2, 3, 0, 0, 2, 3, 0, 2, 1]</span>)&gt;<br><br>In <span class="hljs-selector-attr">[51]</span>: d<br>Out<span class="hljs-selector-attr">[51]</span>:<br>&lt;tf<span class="hljs-selector-class">.Tensor</span>: shape=(<span class="hljs-number">3</span>, <span class="hljs-number">2</span>), dtype=float32, numpy=<br><span class="hljs-built_in">array</span>(<span class="hljs-selector-attr">[[1., 1.]</span>,<br>       <span class="hljs-selector-attr">[2., 2.]</span>,<br>       <span class="hljs-selector-attr">[0., 3.]</span>], dtype=float32)&gt;<br><br>In <span class="hljs-selector-attr">[52]</span>: tf<span class="hljs-selector-class">.argmax</span>(d)<br>Out<span class="hljs-selector-attr">[52]</span>: &lt;tf<span class="hljs-selector-class">.Tensor</span>: shape=(<span class="hljs-number">2</span>,), dtype=int64, numpy=<span class="hljs-built_in">array</span>(<span class="hljs-selector-attr">[1, 2]</span>)&gt;<br><br>In <span class="hljs-selector-attr">[53]</span>: tf<span class="hljs-selector-class">.argmin</span>(d)<br>Out<span class="hljs-selector-attr">[53]</span>: &lt;tf<span class="hljs-selector-class">.Tensor</span>: shape=(<span class="hljs-number">2</span>,), dtype=int64, numpy=<span class="hljs-built_in">array</span>(<span class="hljs-selector-attr">[2, 0]</span>)&gt;<br><br>In <span class="hljs-selector-attr">[54]</span>: tf<span class="hljs-selector-class">.argmax</span>(d,axis=<span class="hljs-number">1</span>)<br>Out<span class="hljs-selector-attr">[54]</span>: &lt;tf<span class="hljs-selector-class">.Tensor</span>: shape=(<span class="hljs-number">3</span>,), dtype=int64, numpy=<span class="hljs-built_in">array</span>(<span class="hljs-selector-attr">[0, 0, 1]</span>)&gt;<br></code></pre></td></tr></table></figure><h3 id="equal"><a href="#equal" class="headerlink" title="equal"></a>equal</h3><figure class="highlight stylus"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><code class="hljs stylus">In <span class="hljs-selector-attr">[56]</span>: b= tf<span class="hljs-selector-class">.range</span>(<span class="hljs-number">5</span>)<br>In <span class="hljs-selector-attr">[58]</span>: <span class="hljs-selector-tag">a</span> = tf<span class="hljs-selector-class">.constant</span>(<span class="hljs-selector-attr">[0,1,3,2,4]</span>)<br><br>In <span class="hljs-selector-attr">[59]</span>: tf<span class="hljs-selector-class">.equal</span>(<span class="hljs-selector-tag">a</span>,b)<br>Out<span class="hljs-selector-attr">[59]</span>: &lt;tf<span class="hljs-selector-class">.Tensor</span>: shape=(<span class="hljs-number">5</span>,), dtype=bool, numpy=<span class="hljs-built_in">array</span>(<span class="hljs-selector-attr">[ True,  True, False, False,  True]</span>)&gt;<br><br>In <span class="hljs-selector-attr">[60]</span>: res = tf<span class="hljs-selector-class">.equal</span>(<span class="hljs-selector-tag">a</span>,b)<br>In <span class="hljs-selector-attr">[62]</span>: tf<span class="hljs-selector-class">.reduce_sum</span>(tf<span class="hljs-selector-class">.cast</span>(res,dtype=tf.int32)) #cast数据类型转换 得到同样的个数<br>Out<span class="hljs-selector-attr">[62]</span>: &lt;tf<span class="hljs-selector-class">.Tensor</span>: shape=(), dtype=int32, numpy=<span class="hljs-number">3</span>&gt;<br></code></pre></td></tr></table></figure><h3 id="Accuary"><a href="#Accuary" class="headerlink" title="Accuary"></a>Accuary</h3><figure class="highlight routeros"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><code class="hljs routeros"><span class="hljs-keyword">In</span> [64]: a<br>Out[64]:<br>&lt;tf.Tensor: shape=(2, 3), <span class="hljs-attribute">dtype</span>=float32, numpy=<br>array([[0.1 , 0.2 , 0.7 ],<br>       [0.9 , 0.05, 0.05]], <span class="hljs-attribute">dtype</span>=float32)&gt;<br>       <br><span class="hljs-keyword">In</span> [67]: pred = tf.cast(tf.argmax(a,<span class="hljs-attribute">axis</span>=1),dtype=tf.int32)<br>&lt;tf.Tensor: shape=(2,), <span class="hljs-attribute">dtype</span>=int32, <span class="hljs-attribute">numpy</span>=array([2, 0], <span class="hljs-attribute">dtype</span>=int32)&gt;<br><br><span class="hljs-keyword">In</span> [72]: y<br>Out[72]: &lt;tf.Tensor: shape=(2,), <span class="hljs-attribute">dtype</span>=int32, <span class="hljs-attribute">numpy</span>=array([2, 1], <span class="hljs-attribute">dtype</span>=int32)&gt;<br><br><span class="hljs-keyword">In</span> [82]: correct = tf.reduce_mean(tf.cast(tf.equal(y,pred),dtype = tf.float32))<br><span class="hljs-keyword">In</span> [83]: correct<br>Out[83]: &lt;tf.Tensor: shape=(), <span class="hljs-attribute">dtype</span>=float32, <span class="hljs-attribute">numpy</span>=0.5&gt;<br></code></pre></td></tr></table></figure><h3 id="unique"><a href="#unique" class="headerlink" title="unique"></a>unique</h3><figure class="highlight stylus"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><code class="hljs stylus">In <span class="hljs-selector-attr">[84]</span>: <span class="hljs-selector-tag">a</span> = tf<span class="hljs-selector-class">.constant</span>(<span class="hljs-selector-attr">[4,2,2,4,3]</span>)<br>In <span class="hljs-selector-attr">[87]</span>: unique,idx = tf<span class="hljs-selector-class">.unique</span>(a)<br>In <span class="hljs-selector-attr">[88]</span>: unique<br>Out<span class="hljs-selector-attr">[88]</span>: &lt;tf<span class="hljs-selector-class">.Tensor</span>: shape=(<span class="hljs-number">3</span>,), dtype=int32, numpy=<span class="hljs-built_in">array</span>(<span class="hljs-selector-attr">[4, 2, 3]</span>, dtype=int32)&gt;<br><br>In <span class="hljs-selector-attr">[89]</span>: idx<br>Out<span class="hljs-selector-attr">[89]</span>: &lt;tf<span class="hljs-selector-class">.Tensor</span>: shape=(<span class="hljs-number">5</span>,), dtype=int32, numpy=<span class="hljs-built_in">array</span>(<span class="hljs-selector-attr">[0, 1, 1, 0, 2]</span>, dtype=int32)&gt;<br><br>In <span class="hljs-selector-attr">[90]</span>: tf<span class="hljs-selector-class">.gather</span>(unique,idx) #前按后中存储索引排列<br>Out<span class="hljs-selector-attr">[90]</span>: &lt;tf<span class="hljs-selector-class">.Tensor</span>: shape=(<span class="hljs-number">5</span>,), dtype=int32, numpy=<span class="hljs-built_in">array</span>(<span class="hljs-selector-attr">[4, 2, 2, 4, 3]</span>, dtype=int32)&gt;<br></code></pre></td></tr></table></figure><h2 id="张量排序"><a href="#张量排序" class="headerlink" title="张量排序"></a>张量排序</h2><ul><li>Sort,argsort</li></ul><p>一维</p><figure class="highlight stylus"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><code class="hljs stylus">In <span class="hljs-selector-attr">[3]</span>: <span class="hljs-selector-tag">a</span> = tf<span class="hljs-selector-class">.random</span><span class="hljs-selector-class">.shuffle</span>(tf<span class="hljs-selector-class">.range</span>(<span class="hljs-number">5</span>))<br>&lt;tf<span class="hljs-selector-class">.Tensor</span>: shape=(<span class="hljs-number">5</span>,), dtype=int32, numpy=<span class="hljs-built_in">array</span>(<span class="hljs-selector-attr">[2, 3, 0, 4, 1]</span>, dtype=int32)&gt;<br><br>In <span class="hljs-selector-attr">[5]</span>: tf<span class="hljs-selector-class">.sort</span>(<span class="hljs-selector-tag">a</span>,<span class="hljs-attribute">direction</span> = <span class="hljs-string">&#x27;DESCENDING&#x27;</span>)#降序<br>Out<span class="hljs-selector-attr">[5]</span>: &lt;tf<span class="hljs-selector-class">.Tensor</span>: shape=(<span class="hljs-number">5</span>,), dtype=int32, numpy=<span class="hljs-built_in">array</span>(<span class="hljs-selector-attr">[4, 3, 2, 1, 0]</span>, dtype=int32)&gt;<br>In <span class="hljs-selector-attr">[6]</span>: tf<span class="hljs-selector-class">.argsort</span>(<span class="hljs-selector-tag">a</span>,<span class="hljs-attribute">direction</span> = <span class="hljs-string">&#x27;DESCENDING&#x27;</span>)#降序排序后原所在位置<br>Out<span class="hljs-selector-attr">[6]</span>: &lt;tf<span class="hljs-selector-class">.Tensor</span>: shape=(<span class="hljs-number">5</span>,), dtype=int32, numpy=<span class="hljs-built_in">array</span>(<span class="hljs-selector-attr">[3, 1, 0, 4, 2]</span>, dtype=int32)&gt;<br><br>In <span class="hljs-selector-attr">[7]</span>: idx = tf<span class="hljs-selector-class">.argsort</span>(<span class="hljs-selector-tag">a</span>,<span class="hljs-attribute">direction</span> = <span class="hljs-string">&#x27;DESCENDING&#x27;</span>)<br>In <span class="hljs-selector-attr">[8]</span>: tf<span class="hljs-selector-class">.gather</span>(<span class="hljs-selector-tag">a</span>,idx)<br>Out<span class="hljs-selector-attr">[8]</span>: &lt;tf<span class="hljs-selector-class">.Tensor</span>: shape=(<span class="hljs-number">5</span>,), dtype=int32, numpy=<span class="hljs-built_in">array</span>(<span class="hljs-selector-attr">[4, 3, 2, 1, 0]</span>, dtype=int32)&gt;<br><br><br></code></pre></td></tr></table></figure><p>高维，对最后一个维度排序</p><figure class="highlight stylus"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><code class="hljs stylus">In <span class="hljs-selector-attr">[9]</span>: <span class="hljs-selector-tag">a</span> = tf<span class="hljs-selector-class">.random</span><span class="hljs-selector-class">.uniform</span>(<span class="hljs-selector-attr">[3,3]</span>,maxval=<span class="hljs-number">10</span>,dtype=tf.int32)<br>&lt;tf<span class="hljs-selector-class">.Tensor</span>: shape=(<span class="hljs-number">3</span>, <span class="hljs-number">3</span>), dtype=int32, numpy=<br><span class="hljs-built_in">array</span>(<span class="hljs-selector-attr">[[8, 0, 8]</span>,<br>       <span class="hljs-selector-attr">[9, 2, 8]</span>,<br>       <span class="hljs-selector-attr">[2, 4, 9]</span>], dtype=int32)&gt;<br>       <br>In <span class="hljs-selector-attr">[11]</span>: tf<span class="hljs-selector-class">.sort</span>(a)<br>Out<span class="hljs-selector-attr">[11]</span>:<br>&lt;tf<span class="hljs-selector-class">.Tensor</span>: shape=(<span class="hljs-number">3</span>, <span class="hljs-number">3</span>), dtype=int32, numpy=<br><span class="hljs-built_in">array</span>(<span class="hljs-selector-attr">[[0, 8, 8]</span>,<br>       <span class="hljs-selector-attr">[2, 8, 9]</span>,<br>       <span class="hljs-selector-attr">[2, 4, 9]</span>], dtype=int32)&gt;<br>       <br>In <span class="hljs-selector-attr">[12]</span>: tf<span class="hljs-selector-class">.argsort</span>(a)<br>Out<span class="hljs-selector-attr">[12]</span>:<br>&lt;tf<span class="hljs-selector-class">.Tensor</span>: shape=(<span class="hljs-number">3</span>, <span class="hljs-number">3</span>), dtype=int32, numpy=<br><span class="hljs-built_in">array</span>(<span class="hljs-selector-attr">[[1, 0, 2]</span>,<br>       <span class="hljs-selector-attr">[1, 2, 0]</span>,<br>       <span class="hljs-selector-attr">[0, 1, 2]</span>], dtype=int32)&gt;<br></code></pre></td></tr></table></figure><ul><li>top_k</li></ul><p>最大的或最小的前几个</p><figure class="highlight stylus"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><code class="hljs stylus">In <span class="hljs-selector-attr">[13]</span>: <span class="hljs-selector-tag">a</span><br>Out<span class="hljs-selector-attr">[13]</span>:<br>&lt;tf<span class="hljs-selector-class">.Tensor</span>: shape=(<span class="hljs-number">3</span>, <span class="hljs-number">3</span>), dtype=int32, numpy=<br><span class="hljs-built_in">array</span>(<span class="hljs-selector-attr">[[8, 0, 8]</span>,<br>       <span class="hljs-selector-attr">[9, 2, 8]</span>,<br>       <span class="hljs-selector-attr">[2, 4, 9]</span>], dtype=int32)&gt;<br><br>In <span class="hljs-selector-attr">[14]</span>: res = tf<span class="hljs-selector-class">.math</span><span class="hljs-selector-class">.top_k</span>(<span class="hljs-selector-tag">a</span>,<span class="hljs-number">2</span>)#返回一个tuple<br><br>In <span class="hljs-selector-attr">[15]</span>: res.indices<span class="hljs-selector-id">#argsort</span> 前<span class="hljs-number">2</span>个<br>Out<span class="hljs-selector-attr">[15]</span>:<br>&lt;tf<span class="hljs-selector-class">.Tensor</span>: shape=(<span class="hljs-number">3</span>, <span class="hljs-number">2</span>), dtype=int32, numpy=<br><span class="hljs-built_in">array</span>(<span class="hljs-selector-attr">[[0, 2]</span>,<br>       <span class="hljs-selector-attr">[0, 2]</span>,<br>       <span class="hljs-selector-attr">[2, 1]</span>], dtype=int32)&gt;<br>In <span class="hljs-selector-attr">[16]</span>: res.values<span class="hljs-selector-id">#sort</span> 前<span class="hljs-number">2</span>个<br>Out<span class="hljs-selector-attr">[16]</span>:<br>&lt;tf<span class="hljs-selector-class">.Tensor</span>: shape=(<span class="hljs-number">3</span>, <span class="hljs-number">2</span>), dtype=int32, numpy=<br><span class="hljs-built_in">array</span>(<span class="hljs-selector-attr">[[8, 8]</span>,<br>       <span class="hljs-selector-attr">[9, 8]</span>,<br>       <span class="hljs-selector-attr">[9, 4]</span>], dtype=int32)&gt;<br></code></pre></td></tr></table></figure><ul><li>Top-k Accuracy</li></ul><p>在前k中有匹配的就算为正确，也可以检验模型的好坏</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><code class="hljs python"><span class="hljs-comment">#topk=(1,2,3) 返回top1,2,3这三个的topAccuracy output[b,N],target[b]</span><br><span class="hljs-keyword">def</span> <span class="hljs-title function_">accuracy</span>(<span class="hljs-params">output,target,topk=(<span class="hljs-params"><span class="hljs-number">1</span>,</span>)</span>):<br>maxk = <span class="hljs-built_in">max</span> (topk)<br>batch_size = target.shape[<span class="hljs-number">0</span>]<br><br>pred = tf.math.top_k(output,maxk).indices<br>pred = tf.transpose(pred,prem=[<span class="hljs-number">1</span>,<span class="hljs-number">0</span>])<span class="hljs-comment"># 转置</span><br>target_ = tf.broadcast_to(target,pred.shape)<br>correct = tf.equal(pred, target_)<br><br>res = []<br><span class="hljs-keyword">for</span> k <span class="hljs-keyword">in</span> topk:<br>correct_k = tf.cast(tf.reshape(correct[:k],[-<span class="hljs-number">1</span>]),dtype = tf.float32)<br>correct_k = tf.reduce_sum(correct_k)<br>acc = <span class="hljs-built_in">float</span>(correct_k/batch_size)<br>res.append(acc)<br><span class="hljs-keyword">return</span> res<br></code></pre></td></tr></table></figure><h2 id="数据填充、复制"><a href="#数据填充、复制" class="headerlink" title="数据填充、复制"></a>数据填充、复制</h2><h3 id="填充-pad"><a href="#填充-pad" class="headerlink" title="填充 pad"></a>填充 pad</h3><ul><li>一维 [3] -&gt;前补充1位，后补充2位-&gt;一维[6]（[[1,2]]意思为：一维前补1后补2）</li><li>二维[2,2]-&gt;行：前不补，后补1行；列：前补1列，后补1列-&gt;[3,4]（[[0,1],[1,1]]意思为：二维，第一维前补0后补1，第二维前补1后补1）</li><li>默认补0</li></ul><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><code class="hljs python">In [<span class="hljs-number">21</span>]: a = tf.reshape(tf.<span class="hljs-built_in">range</span>(<span class="hljs-number">4</span>),[<span class="hljs-number">2</span>,<span class="hljs-number">2</span>])<br><br>In [<span class="hljs-number">22</span>]: tf.pad(a,[[<span class="hljs-number">0</span>,<span class="hljs-number">1</span>],[<span class="hljs-number">1</span>,<span class="hljs-number">1</span>]])<br>Out[<span class="hljs-number">22</span>]:<br>&lt;tf.Tensor: shape=(<span class="hljs-number">3</span>, <span class="hljs-number">4</span>), dtype=int32, numpy=<br>array([[<span class="hljs-number">0</span>, <span class="hljs-number">0</span>, <span class="hljs-number">1</span>, <span class="hljs-number">0</span>],<br>       [<span class="hljs-number">0</span>, <span class="hljs-number">2</span>, <span class="hljs-number">3</span>, <span class="hljs-number">0</span>],<br>       [<span class="hljs-number">0</span>, <span class="hljs-number">0</span>, <span class="hljs-number">0</span>, <span class="hljs-number">0</span>]], dtype=int32)&gt;<br></code></pre></td></tr></table></figure><h3 id="复制-tile"><a href="#复制-tile" class="headerlink" title="复制 tile"></a>复制 tile</h3><ul><li>[a,b] 代表第一个维度复制a次，第二个维度复制b次</li></ul><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br></pre></td><td class="code"><pre><code class="hljs python">In [<span class="hljs-number">24</span>]: tf.tile(a,[<span class="hljs-number">1</span>,<span class="hljs-number">2</span>])<br>Out[<span class="hljs-number">24</span>]:<br>&lt;tf.Tensor: shape=(<span class="hljs-number">2</span>, <span class="hljs-number">4</span>), dtype=int32, numpy=<br>array([[<span class="hljs-number">0</span>, <span class="hljs-number">1</span>, <span class="hljs-number">0</span>, <span class="hljs-number">1</span>],<br>       [<span class="hljs-number">2</span>, <span class="hljs-number">3</span>, <span class="hljs-number">2</span>, <span class="hljs-number">3</span>]], dtype=int32)&gt;<br><br>In [<span class="hljs-number">25</span>]: tf.tile(a,[<span class="hljs-number">2</span>,<span class="hljs-number">2</span>])<br>Out[<span class="hljs-number">25</span>]:<br>&lt;tf.Tensor: shape=(<span class="hljs-number">4</span>, <span class="hljs-number">4</span>), dtype=int32, numpy=<br>array([[<span class="hljs-number">0</span>, <span class="hljs-number">1</span>, <span class="hljs-number">0</span>, <span class="hljs-number">1</span>],<br>       [<span class="hljs-number">2</span>, <span class="hljs-number">3</span>, <span class="hljs-number">2</span>, <span class="hljs-number">3</span>],<br>       [<span class="hljs-number">0</span>, <span class="hljs-number">1</span>, <span class="hljs-number">0</span>, <span class="hljs-number">1</span>],<br>       [<span class="hljs-number">2</span>, <span class="hljs-number">3</span>, <span class="hljs-number">2</span>, <span class="hljs-number">3</span>]], dtype=int32)&gt;<br><br>In [<span class="hljs-number">26</span>]: tf.tile(a,[<span class="hljs-number">3</span>,<span class="hljs-number">2</span>])<br>Out[<span class="hljs-number">26</span>]:<br>&lt;tf.Tensor: shape=(<span class="hljs-number">6</span>, <span class="hljs-number">4</span>), dtype=int32, numpy=<br>array([[<span class="hljs-number">0</span>, <span class="hljs-number">1</span>, <span class="hljs-number">0</span>, <span class="hljs-number">1</span>],<br>       [<span class="hljs-number">2</span>, <span class="hljs-number">3</span>, <span class="hljs-number">2</span>, <span class="hljs-number">3</span>],<br>       [<span class="hljs-number">0</span>, <span class="hljs-number">1</span>, <span class="hljs-number">0</span>, <span class="hljs-number">1</span>],<br>       [<span class="hljs-number">2</span>, <span class="hljs-number">3</span>, <span class="hljs-number">2</span>, <span class="hljs-number">3</span>],<br>       [<span class="hljs-number">0</span>, <span class="hljs-number">1</span>, <span class="hljs-number">0</span>, <span class="hljs-number">1</span>],<br>       [<span class="hljs-number">2</span>, <span class="hljs-number">3</span>, <span class="hljs-number">2</span>, <span class="hljs-number">3</span>]], dtype=int32)&gt;<br>       <br>In [<span class="hljs-number">27</span>]: tf.tile(a,[<span class="hljs-number">1</span>,<span class="hljs-number">1</span>])<br>Out[<span class="hljs-number">27</span>]:<br>&lt;tf.Tensor: shape=(<span class="hljs-number">2</span>, <span class="hljs-number">2</span>), dtype=int32, numpy=<br>array([[<span class="hljs-number">0</span>, <span class="hljs-number">1</span>],<br>       [<span class="hljs-number">2</span>, <span class="hljs-number">3</span>]], dtype=int32)&gt;<br></code></pre></td></tr></table></figure><h2 id="张量限幅"><a href="#张量限幅" class="headerlink" title="张量限幅"></a>张量限幅</h2><ul><li>maximum 若值小于a 则使该值&#x3D;a</li><li>minimum 若值大于b 则使该值&#x3D;b</li><li>clip_by_value 若值小于a 则使该值&#x3D;a,若值大于b 则使该值&#x3D;b(限制数据在a与b之间)</li></ul><figure class="highlight stylus"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><code class="hljs stylus">In <span class="hljs-selector-attr">[3]</span>: <span class="hljs-selector-tag">a</span><br>Out<span class="hljs-selector-attr">[3]</span>: &lt;tf<span class="hljs-selector-class">.Tensor</span>: shape=(<span class="hljs-number">10</span>,), dtype=int32, numpy=<span class="hljs-built_in">array</span>(<span class="hljs-selector-attr">[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]</span>, dtype=int32)&gt;<br><br>In <span class="hljs-selector-attr">[4]</span>: tf<span class="hljs-selector-class">.maximum</span>(<span class="hljs-selector-tag">a</span>,<span class="hljs-number">2</span>)  <br>Out<span class="hljs-selector-attr">[4]</span>: &lt;tf<span class="hljs-selector-class">.Tensor</span>: shape=(<span class="hljs-number">10</span>,), dtype=int32, numpy=<span class="hljs-built_in">array</span>(<span class="hljs-selector-attr">[2, 2, 2, 3, 4, 5, 6, 7, 8, 9]</span>, dtype=int32)&gt;<br><br>In <span class="hljs-selector-attr">[5]</span>: tf<span class="hljs-selector-class">.minimum</span>(<span class="hljs-selector-tag">a</span>,<span class="hljs-number">8</span>)<br>Out<span class="hljs-selector-attr">[5]</span>: &lt;tf<span class="hljs-selector-class">.Tensor</span>: shape=(<span class="hljs-number">10</span>,), dtype=int32, numpy=<span class="hljs-built_in">array</span>(<span class="hljs-selector-attr">[0, 1, 2, 3, 4, 5, 6, 7, 8, 8]</span>, dtype=int32)&gt;<br><br>In <span class="hljs-selector-attr">[6]</span>: tf<span class="hljs-selector-class">.clip_by_value</span>(<span class="hljs-selector-tag">a</span>,<span class="hljs-number">2</span>,<span class="hljs-number">8</span>) #同tf<span class="hljs-selector-class">.minimum</span>(tf<span class="hljs-selector-class">.maximum</span>(<span class="hljs-selector-tag">a</span>,<span class="hljs-number">2</span>),<span class="hljs-number">8</span>)<br>Out<span class="hljs-selector-attr">[6]</span>: &lt;tf<span class="hljs-selector-class">.Tensor</span>: shape=(<span class="hljs-number">10</span>,), dtype=int32, numpy=<span class="hljs-built_in">array</span>(<span class="hljs-selector-attr">[2, 2, 2, 3, 4, 5, 6, 7, 8, 8]</span>, dtype=int32)&gt;<br></code></pre></td></tr></table></figure><p>relu函数max(0,x)</p><figure class="highlight stylus"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><code class="hljs stylus">In <span class="hljs-selector-attr">[9]</span>: <span class="hljs-selector-tag">a</span><br>Out<span class="hljs-selector-attr">[9]</span>: &lt;tf<span class="hljs-selector-class">.Tensor</span>: shape=(<span class="hljs-number">10</span>,), dtype=int32, numpy=<span class="hljs-built_in">array</span>(<span class="hljs-selector-attr">[-5, -4, -3, -2, -1,  0,  1,  2,  3,  4]</span>, dtype=int32)&gt;<br><br>In <span class="hljs-selector-attr">[10]</span>: tf<span class="hljs-selector-class">.nn</span><span class="hljs-selector-class">.relu</span>(a)<br>Out<span class="hljs-selector-attr">[10]</span>: &lt;tf<span class="hljs-selector-class">.Tensor</span>: shape=(<span class="hljs-number">10</span>,), dtype=int32, numpy=<span class="hljs-built_in">array</span>(<span class="hljs-selector-attr">[0, 0, 0, 0, 0, 0, 1, 2, 3, 4]</span>, dtype=int32)&gt;<br><br>In <span class="hljs-selector-attr">[11]</span>: tf<span class="hljs-selector-class">.maximum</span>(<span class="hljs-selector-tag">a</span>,<span class="hljs-number">0</span>)<br>Out<span class="hljs-selector-attr">[11]</span>: &lt;tf<span class="hljs-selector-class">.Tensor</span>: shape=(<span class="hljs-number">10</span>,), dtype=int32, numpy=<span class="hljs-built_in">array</span>(<span class="hljs-selector-attr">[0, 0, 0, 0, 0, 0, 1, 2, 3, 4]</span>, dtype=int32)&gt;<br><br></code></pre></td></tr></table></figure><ul><li>clip_by_norm</li></ul><p>在clipping时，如果只根据值裁剪的话gradient的方向会发生变化，不利于找到最优解，使用范数限幅可以进行等比例放缩解决这样的问题</p><figure class="highlight stylus"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><code class="hljs stylus">In <span class="hljs-selector-attr">[14]</span>: <span class="hljs-selector-tag">a</span> = tf<span class="hljs-selector-class">.random</span><span class="hljs-selector-class">.normal</span>(<span class="hljs-selector-attr">[2,2]</span>,mean=<span class="hljs-number">10</span>)<br>&lt;tf<span class="hljs-selector-class">.Tensor</span>: shape=(<span class="hljs-number">2</span>, <span class="hljs-number">2</span>), dtype=float32, numpy=<br><span class="hljs-built_in">array</span>(<span class="hljs-selector-attr">[[12.561244,  9.496627]</span>,<br>       <span class="hljs-selector-attr">[10.774074, 10.137045]</span>], dtype=float32)&gt;<br>       <br>In <span class="hljs-selector-attr">[16]</span>: tf<span class="hljs-selector-class">.norm</span>(a)<br>Out<span class="hljs-selector-attr">[16]</span>: &lt;tf<span class="hljs-selector-class">.Tensor</span>: shape=(), dtype=float32, numpy=<span class="hljs-number">21.605812</span>&gt;<br><br>In <span class="hljs-selector-attr">[17]</span>: aa = tf<span class="hljs-selector-class">.clip_by_norm</span>(<span class="hljs-selector-tag">a</span>,<span class="hljs-number">15</span>)<br>&lt;tf<span class="hljs-selector-class">.Tensor</span>: shape=(<span class="hljs-number">2</span>, <span class="hljs-number">2</span>), dtype=float32, numpy=<br><span class="hljs-built_in">array</span>(<span class="hljs-selector-attr">[[8.720739, 6.593106]</span>,<br>       <span class="hljs-selector-attr">[7.479983, 7.037721]</span>], dtype=float32)&gt;<br>       <br>In <span class="hljs-selector-attr">[20]</span>: tf<span class="hljs-selector-class">.norm</span>(aa)<br>Out<span class="hljs-selector-attr">[20]</span>: &lt;tf<span class="hljs-selector-class">.Tensor</span>: shape=(), dtype=float32, numpy=<span class="hljs-number">15.0</span>&gt;<br></code></pre></td></tr></table></figure><ul><li>Grandient clipping</li></ul><p>new_grads,total_norm &#x3D; tf.clip_by_global_norm(grad,25) 一组grad的范数裁剪，返回裁剪后的grad和原始总范数</p><h2 id="其他操作"><a href="#其他操作" class="headerlink" title="其他操作"></a>其他操作</h2><h3 id="where"><a href="#where" class="headerlink" title="where"></a>where</h3><ul><li>where(tensor) 只接受一个参数是一个bool型的tensor，会返回一系列坐标 (True)</li></ul><figure class="highlight routeros"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br></pre></td><td class="code"><pre><code class="hljs routeros"><span class="hljs-keyword">In</span> [23]: a<br>&lt;tf.Tensor: shape=(3, 3), <span class="hljs-attribute">dtype</span>=float32, numpy=<br>array([[ 1.7502894 ,  0.42312455, -0.05275195],<br>       [-1.2338606 ,  0.21349485,  1.2465866 ],<br>       [ 0.11755344, -0.45547193,  1.792042  ]], <span class="hljs-attribute">dtype</span>=float32)&gt;<br><br><span class="hljs-keyword">In</span> [24]: mask = a &gt; 0<br>&lt;tf.Tensor: shape=(3, 3), <span class="hljs-attribute">dtype</span>=bool, numpy=<br>array([[ <span class="hljs-literal">True</span>,  <span class="hljs-literal">True</span>, <span class="hljs-literal">False</span>],<br>       [<span class="hljs-literal">False</span>,  <span class="hljs-literal">True</span>,  <span class="hljs-literal">True</span>],<br>       [ <span class="hljs-literal">True</span>, <span class="hljs-literal">False</span>,  <span class="hljs-literal">True</span>]])&gt;<br><br><span class="hljs-keyword">In</span> [26]: tf.boolean_mask(a,mask)<br>Out[26]:<br>&lt;tf.Tensor: shape=(6,), <span class="hljs-attribute">dtype</span>=float32, numpy=<br>array([1.7502894 , 0.42312455, 0.21349485, 1.2465866 , 0.11755344,<br>       1.792042  ], <span class="hljs-attribute">dtype</span>=float32)&gt;<br><br><span class="hljs-keyword">In</span> [27]: indices = tf.where(mask)<br>&lt;tf.Tensor: shape=(6, 2), <span class="hljs-attribute">dtype</span>=int64, numpy=<br>array([[0, 0],<br>       [0, 1],<br>       [1, 1],<br>       [1, 2],<br>       [2, 0],<br>       [2, 2]])&gt;<br><br><span class="hljs-keyword">In</span> [29]: tf.gather_nd(a,indices)<br>Out[29]:<br>&lt;tf.Tensor: shape=(6,), <span class="hljs-attribute">dtype</span>=float32, numpy=<br>array([1.7502894 , 0.42312455, 0.21349485, 1.2465866 , 0.11755344,<br>       1.792042  ], <span class="hljs-attribute">dtype</span>=float32)&gt;<br></code></pre></td></tr></table></figure><ul><li>where(cond,A,B) cond 为True的地方取A cond为False的地方取B</li></ul><figure class="highlight stylus"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><code class="hljs stylus">In <span class="hljs-selector-attr">[30]</span>: <span class="hljs-selector-tag">mask</span><br>Out<span class="hljs-selector-attr">[30]</span>:<br>&lt;tf<span class="hljs-selector-class">.Tensor</span>: shape=(<span class="hljs-number">3</span>, <span class="hljs-number">3</span>), dtype=bool, numpy=<br><span class="hljs-built_in">array</span>(<span class="hljs-selector-attr">[[ True,  True, False]</span>,<br>       <span class="hljs-selector-attr">[False,  True,  True]</span>,<br>       <span class="hljs-selector-attr">[ True, False,  True]</span>])&gt;<br><br>In <span class="hljs-selector-attr">[31]</span>: A=tf<span class="hljs-selector-class">.ones</span>(<span class="hljs-selector-attr">[3,3]</span>)<br><br>In <span class="hljs-selector-attr">[32]</span>: B=tf<span class="hljs-selector-class">.zeros</span>(<span class="hljs-selector-attr">[3,3]</span>)<br><br>In <span class="hljs-selector-attr">[33]</span>: tf<span class="hljs-selector-class">.where</span>(<span class="hljs-selector-tag">mask</span>,A,B)<br>Out<span class="hljs-selector-attr">[33]</span>:<br>&lt;tf<span class="hljs-selector-class">.Tensor</span>: shape=(<span class="hljs-number">3</span>, <span class="hljs-number">3</span>), dtype=float32, numpy=<br><span class="hljs-built_in">array</span>(<span class="hljs-selector-attr">[[1., 1., 0.]</span>,<br>       <span class="hljs-selector-attr">[0., 1., 1.]</span>,<br>       <span class="hljs-selector-attr">[1., 0., 1.]</span>], dtype=float32)&gt;<br></code></pre></td></tr></table></figure><h3 id="scatter-nd"><a href="#scatter-nd" class="headerlink" title="scatter_nd"></a>scatter_nd</h3><p>根据坐标有目的性的更新 根据indices指出的位置，将updates当中的数据按照indices顺序与指出的位置放在，shape形状的Tensor上</p><p>只能在全0底板上更新</p> <figure class="highlight stylus"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><code class="hljs stylus">In <span class="hljs-selector-attr">[34]</span>: indices = tf<span class="hljs-selector-class">.constant</span>(<span class="hljs-selector-attr">[[4]</span>,<span class="hljs-selector-attr">[3]</span>,<span class="hljs-selector-attr">[1]</span>,<span class="hljs-selector-attr">[7]</span>])<br>In <span class="hljs-selector-attr">[35]</span>: updates = tf<span class="hljs-selector-class">.constant</span>(<span class="hljs-selector-attr">[9,10,11,12]</span>)<br>In <span class="hljs-selector-attr">[36]</span>: shape = tf<span class="hljs-selector-class">.constant</span>(<span class="hljs-selector-attr">[8]</span>)<br><br>In <span class="hljs-selector-attr">[38]</span>: tf<span class="hljs-selector-class">.scatter_nd</span>(indices,updates,shape)<br>Out<span class="hljs-selector-attr">[38]</span>: &lt;tf<span class="hljs-selector-class">.Tensor</span>: shape=(<span class="hljs-number">8</span>,), dtype=int32, numpy=<span class="hljs-built_in">array</span>(<span class="hljs-selector-attr">[ 0, 11,  0, 10,  9,  0,  0, 12]</span>, dtype=int32)&gt;<br></code></pre></td></tr></table></figure><h3 id="meshgrid"><a href="#meshgrid" class="headerlink" title="meshgrid"></a>meshgrid</h3><ul><li>point 生成坐标</li></ul><figure class="highlight inform7"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br></pre></td><td class="code"><pre><code class="hljs inform7">In <span class="hljs-comment">[39]</span>: points = <span class="hljs-comment">[]</span><br><br>In <span class="hljs-comment">[40]</span>: import numpy as np<br>#-2到2 5个点 xy共25个点<br>In <span class="hljs-comment">[41]</span>: for y in np.linspace(-2,2,5):<br>    ...:     for x in np.linspace(-2,2,5):<br>    ...:         points.append(<span class="hljs-comment">[x,y]</span>)<br>    ...:<br><br>In <span class="hljs-comment">[42]</span>: points<br>Out<span class="hljs-comment">[42]</span>:<br><span class="hljs-comment">[<span class="hljs-comment">[-2.0, -2.0]</span>,</span><br><span class="hljs-comment"> <span class="hljs-comment">[-1.0, -2.0]</span>,</span><br><span class="hljs-comment"> <span class="hljs-comment">[0.0, -2.0]</span>,</span><br><span class="hljs-comment"> <span class="hljs-comment">[1.0, -2.0]</span>,</span><br><span class="hljs-comment"> <span class="hljs-comment">[2.0, -2.0]</span>,</span><br><span class="hljs-comment"> <span class="hljs-comment">[-2.0, -1.0]</span>,</span><br><span class="hljs-comment"> <span class="hljs-comment">[-1.0, -1.0]</span>,</span><br><span class="hljs-comment"> <span class="hljs-comment">[0.0, -1.0]</span>,</span><br><span class="hljs-comment"> <span class="hljs-comment">[1.0, -1.0]</span>,</span><br><span class="hljs-comment"> <span class="hljs-comment">[2.0, -1.0]</span>,</span><br><span class="hljs-comment"> <span class="hljs-comment">[-2.0, 0.0]</span>,</span><br><span class="hljs-comment"> <span class="hljs-comment">[-1.0, 0.0]</span>,</span><br><span class="hljs-comment"> <span class="hljs-comment">[0.0, 0.0]</span>,</span><br><span class="hljs-comment"> <span class="hljs-comment">[1.0, 0.0]</span>,</span><br><span class="hljs-comment"> <span class="hljs-comment">[2.0, 0.0]</span>,</span><br><span class="hljs-comment"> <span class="hljs-comment">[-2.0, 1.0]</span>,</span><br><span class="hljs-comment"> <span class="hljs-comment">[-1.0, 1.0]</span>,</span><br><span class="hljs-comment"> <span class="hljs-comment">[0.0, 1.0]</span>,</span><br><span class="hljs-comment"> <span class="hljs-comment">[1.0, 1.0]</span>,</span><br><span class="hljs-comment"> <span class="hljs-comment">[2.0, 1.0]</span>,</span><br><span class="hljs-comment"> <span class="hljs-comment">[-2.0, 2.0]</span>,</span><br><span class="hljs-comment"> <span class="hljs-comment">[-1.0, 2.0]</span>,</span><br><span class="hljs-comment"> <span class="hljs-comment">[0.0, 2.0]</span>,</span><br><span class="hljs-comment"> <span class="hljs-comment">[1.0, 2.0]</span>,</span><br><span class="hljs-comment"> <span class="hljs-comment">[2.0, 2.0]</span>]</span><br></code></pre></td></tr></table></figure><ul><li>使用meshgrid</li></ul><figure class="highlight inform7"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br></pre></td><td class="code"><pre><code class="hljs inform7">In <span class="hljs-comment">[43]</span>:  y = tf.linspace(-2.,2,5)<br>Out<span class="hljs-comment">[44]</span>: &lt;tf.Tensor: shape=(5,), dtype=float32, numpy=array(<span class="hljs-comment">[-2., -1.,  0.,  1.,  2.]</span>, dtype=float32)&gt;<br><br>In <span class="hljs-comment">[45]</span>:  x = tf.linspace(-2.,2,5)<br>Out<span class="hljs-comment">[46]</span>: &lt;tf.Tensor: shape=(5,), dtype=float32, numpy=array(<span class="hljs-comment">[-2., -1.,  0.,  1.,  2.]</span>, dtype=float32)&gt;<br><br>In <span class="hljs-comment">[47]</span>: points_x,points_y = tf.meshgrid(x,y)<br><br>In <span class="hljs-comment">[49]</span>: points_x.shape<br>Out<span class="hljs-comment">[49]</span>: TensorShape(<span class="hljs-comment">[5, 5]</span>)<br><br>In <span class="hljs-comment">[50]</span>: points = tf.stack(<span class="hljs-comment">[points_x,points_y]</span>,axis = 2)<br>&lt;tf.Tensor: shape=(5, 5, 2), dtype=float32, numpy=<br>array(<span class="hljs-comment">[<span class="hljs-comment">[<span class="hljs-comment">[-2., -2.]</span>,</span></span><br><span class="hljs-comment"><span class="hljs-comment">        <span class="hljs-comment">[-1., -2.]</span>,</span></span><br><span class="hljs-comment"><span class="hljs-comment">        <span class="hljs-comment">[ 0., -2.]</span>,</span></span><br><span class="hljs-comment"><span class="hljs-comment">        <span class="hljs-comment">[ 1., -2.]</span>,</span></span><br><span class="hljs-comment"><span class="hljs-comment">        <span class="hljs-comment">[ 2., -2.]</span>]</span>,</span><br><span class="hljs-comment"></span><br><span class="hljs-comment">       <span class="hljs-comment">[<span class="hljs-comment">[-2., -1.]</span>,</span></span><br><span class="hljs-comment"><span class="hljs-comment">        <span class="hljs-comment">[-1., -1.]</span>,</span></span><br><span class="hljs-comment"><span class="hljs-comment">        <span class="hljs-comment">[ 0., -1.]</span>,</span></span><br><span class="hljs-comment"><span class="hljs-comment">        <span class="hljs-comment">[ 1., -1.]</span>,</span></span><br><span class="hljs-comment"><span class="hljs-comment">        <span class="hljs-comment">[ 2., -1.]</span>]</span>,</span><br><span class="hljs-comment">        ...</span><br></code></pre></td></tr></table></figure><p>绘制函数等高线</p><p>z &#x3D; sinx+siny</p><figure class="highlight scss"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br></pre></td><td class="code"><pre><code class="hljs scss">import tensorflow as tf<br><br>import matplotlib<span class="hljs-selector-class">.pyplot</span> as plt<br><br><br>def <span class="hljs-built_in">func</span>(x):<br>    # z = sinx + siny<br>    z = tf.math.<span class="hljs-built_in">sin</span>(x[...,<span class="hljs-number">0</span>]) + tf.math.<span class="hljs-built_in">sin</span>(x[...,<span class="hljs-number">1</span>])<br><br>    return z<br><br><br>x = tf.<span class="hljs-built_in">linspace</span>(<span class="hljs-number">0</span>., <span class="hljs-number">2</span>*<span class="hljs-number">3.14</span>, <span class="hljs-number">500</span>)<br>y = tf.<span class="hljs-built_in">linspace</span>(<span class="hljs-number">0</span>., <span class="hljs-number">2</span>*<span class="hljs-number">3.14</span>, <span class="hljs-number">500</span>)<br># [<span class="hljs-number">500</span>, <span class="hljs-number">500</span>]<br>point_x, point_y = tf.<span class="hljs-built_in">meshgrid</span>(x, y)<br># [<span class="hljs-number">500</span>, <span class="hljs-number">500</span>, <span class="hljs-number">2</span>]<br>points = tf.<span class="hljs-built_in">stack</span>([point_x, point_y], axis=<span class="hljs-number">2</span>)<br># points = tf.<span class="hljs-built_in">reshape</span>(points, [-<span class="hljs-number">1</span>, <span class="hljs-number">2</span>])<br><span class="hljs-built_in">print</span>(<span class="hljs-string">&#x27;points:&#x27;</span>, points.shape)<br>z = <span class="hljs-built_in">func</span>(points)<br><span class="hljs-built_in">print</span>(<span class="hljs-string">&#x27;z:&#x27;</span>, z.shape)<br><br>plt.<span class="hljs-built_in">figure</span>(<span class="hljs-string">&#x27;plot 2d func value&#x27;</span>)<br>plt.<span class="hljs-built_in">imshow</span>(z, origin=<span class="hljs-string">&#x27;lower&#x27;</span>, interpolation=<span class="hljs-string">&#x27;none&#x27;</span>)<br>plt.<span class="hljs-built_in">colorbar</span>()<br><br>plt.<span class="hljs-built_in">figure</span>(<span class="hljs-string">&#x27;plot 2d func contour&#x27;</span>)<br>plt.<span class="hljs-built_in">contour</span>(point_x, point_y, z)<br>plt.<span class="hljs-built_in">colorbar</span>()<br>plt.<span class="hljs-built_in">show</span>()<br></code></pre></td></tr></table></figure><img width="250" src="/2020/03/22/Tensor操作/img4.png"><img width="250" src="/2020/03/22/Tensor操作/img5.png">]]>
    </content>
    <id>https://www.wakli.com/2020/03/22/Tensor%E6%93%8D%E4%BD%9C/</id>
    <link href="https://www.wakli.com/2020/03/22/Tensor%E6%93%8D%E4%BD%9C/"/>
    <published>2020-03-22T04:45:22.000Z</published>
    <summary>
      <![CDATA[<h2 id="合并与分割"><a href="#合并与分割" class="headerlink" title="合并与分割"></a>合并与分割</h2><h3 id="concat-拼接"><a href="#concat-拼接" class="headerlink" title="concat 拼接"></a>concat 拼接</h3><p>axis&#x3D;? 合并某一个维度的数据</p>
<p>要求除了要拼接的维度外的所有维度都相等</p>
<figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><code class="hljs python">In [<span class="hljs-number">2</span>]: a = tf.ones([<span class="hljs-number">4</span>,<span class="hljs-number">35</span>,<span class="hljs-number">8</span>])<br>In [<span class="hljs-number">3</span>]: b = tf.zeros([<span class="hljs-number">2</span>,<span class="hljs-number">35</span>,<span class="hljs-number">8</span>])<br>In [<span class="hljs-number">4</span>]: c = tf.concat([a,b],axis = <span class="hljs-number">0</span>)<br>TensorShape([<span class="hljs-number">6</span>, <span class="hljs-number">35</span>, <span class="hljs-number">8</span>])<br>In [<span class="hljs-number">6</span>]: b = tf.zeros([<span class="hljs-number">4</span>,<span class="hljs-number">3</span>,<span class="hljs-number">8</span>])<br>In [<span class="hljs-number">7</span>]: c = tf.concat([a,b],axis = <span class="hljs-number">1</span>)<br>TensorShape([<span class="hljs-number">4</span>, <span class="hljs-number">38</span>, <span class="hljs-number">8</span>])<br><br>In [<span class="hljs-number">10</span>]: a = tf.ones([<span class="hljs-number">4</span>,<span class="hljs-number">3</span>])<br>In [<span class="hljs-number">11</span>]: b = tf.zeros([<span class="hljs-number">4</span>,<span class="hljs-number">4</span>])<br>In [<span class="hljs-number">13</span>]: c = tf.concat([a,b],axis = <span class="hljs-number">1</span>)<br>&lt;tf.Tensor: shape=(<span class="hljs-number">4</span>, <span class="hljs-number">7</span>), dtype=float32, numpy=<br>array([[<span class="hljs-number">1.</span>, <span class="hljs-number">1.</span>, <span class="hljs-number">1.</span>, <span class="hljs-number">0.</span>, <span class="hljs-number">0.</span>, <span class="hljs-number">0.</span>, <span class="hljs-number">0.</span>],<br>       [<span class="hljs-number">1.</span>, <span class="hljs-number">1.</span>, <span class="hljs-number">1.</span>, <span class="hljs-number">0.</span>, <span class="hljs-number">0.</span>, <span class="hljs-number">0.</span>, <span class="hljs-number">0.</span>],<br>       [<span class="hljs-number">1.</span>, <span class="hljs-number">1.</span>, <span class="hljs-number">1.</span>, <span class="hljs-number">0.</span>, <span class="hljs-number">0.</span>, <span class="hljs-number">0.</span>, <span class="hljs-number">0.</span>],<br>       [<span class="hljs-number">1.</span>, <span class="hljs-number">1.</span>, <span class="hljs-number">1.</span>, <span class="hljs-number">0.</span>, <span class="hljs-number">0.</span>, <span class="hljs-number">0.</span>, <span class="hljs-number">0.</span>]], dtype=float32)&gt;<br></code></pre></td></tr></table></figure>

<h3 id="stack-创建新的维度"><a href="#stack-创建新的维度" class="headerlink" title="stack 创建新的维度"></a>stack 创建新的维度</h3>]]>
    </summary>
    <title>Tensor操作</title>
    <updated>2020-03-31T14:11:52.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>王康力</name>
    </author>
    <content>
      <![CDATA[<h3 id="前向传播"><a href="#前向传播" class="headerlink" title="前向传播"></a>前向传播</h3><ul><li><p>out &#x3D; relu{relu{relu[X@W1+b1]@W2+b2}@W3+b3}</p></li><li><p>pred &#x3D; argmax(out)</p></li><li><p>loss&#x3D;MSE(out,label)</p></li><li><p>minimize loss 优化[W1’,b1’,W2’,b2’,W3’,b3’,]</p><span id="more"></span></li></ul><h4 id="构建数据集"><a href="#构建数据集" class="headerlink" title="构建数据集"></a>构建数据集</h4><figure class="highlight routeros"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br></pre></td><td class="code"><pre><code class="hljs routeros">import  tensorflow as tf<br><span class="hljs-keyword">from</span>    tensorflow import keras<br><span class="hljs-keyword">from</span>    tensorflow.keras import datasets<br>import  os<br><br>os.environ[<span class="hljs-string">&#x27;TF_CPP_MIN_LOG_LEVEL&#x27;</span>] = <span class="hljs-string">&#x27;2&#x27;</span><br><br><span class="hljs-comment"># x: [60k, 28, 28],</span><br><span class="hljs-comment"># y: [60k]</span><br>(x, y), _ = datasets.mnist.load_data()<br><span class="hljs-comment"># x: [0~255] =&gt; [0~1.]</span><br>x = tf.convert_to_tensor(x, <span class="hljs-attribute">dtype</span>=tf.float32) / 255.<br>y = tf.convert_to_tensor(y, <span class="hljs-attribute">dtype</span>=tf.int32)<br><br><span class="hljs-built_in">print</span>(x.shape, y.shape, x.dtype, y.dtype)<br><span class="hljs-built_in">print</span>(tf.reduce_min(x), tf.reduce_max(x))<br><span class="hljs-built_in">print</span>(tf.reduce_min(y), tf.reduce_max(y))<br><br><span class="hljs-comment">#创建数据集</span><br>train_db = tf.data.Dataset.from_tensor_slices((x,y)).batch(128)<br>train_iter = iter(train_db)#迭代器 可以对train做next<br>sample = next(train_iter)<br><span class="hljs-built_in">print</span>(<span class="hljs-string">&#x27;batch:&#x27;</span>, sample[0].shape, sample[1].shape)<br><span class="hljs-built_in">print</span>(sample)<br><br></code></pre></td></tr></table></figure><figure class="highlight prolog"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br></pre></td><td class="code"><pre><code class="hljs prolog"># [b, <span class="hljs-number">784</span>] =&gt; [b, <span class="hljs-number">256</span>] =&gt; [b, <span class="hljs-number">128</span>] =&gt; [b, <span class="hljs-number">10</span>]<br># [dim_in, dim_out], [dim_out]<br>#这里使用<span class="hljs-symbol">Variable</span>包装是因为tape.gradient只追踪<span class="hljs-symbol">Variable</span>类型<br>w1 = tf.<span class="hljs-symbol">Variable</span>(tf.random.truncated_normal([<span class="hljs-number">784</span>, <span class="hljs-number">256</span>], stddev=<span class="hljs-number">0.1</span>))<br>b1 = tf.<span class="hljs-symbol">Variable</span>(tf.zeros([<span class="hljs-number">256</span>]))<br>w2 = tf.<span class="hljs-symbol">Variable</span>(tf.random.truncated_normal([<span class="hljs-number">256</span>, <span class="hljs-number">128</span>], stddev=<span class="hljs-number">0.1</span>))<br>b2 = tf.<span class="hljs-symbol">Variable</span>(tf.zeros([<span class="hljs-number">128</span>]))<br>w3 = tf.<span class="hljs-symbol">Variable</span>(tf.random.truncated_normal([<span class="hljs-number">128</span>, <span class="hljs-number">10</span>], stddev=<span class="hljs-number">0.1</span>))<br>b3 = tf.<span class="hljs-symbol">Variable</span>(tf.zeros([<span class="hljs-number">10</span>]))<br><br>lr = <span class="hljs-number">1e-3</span><br><br>for epoch in range(<span class="hljs-number">10</span>): # iterate db for <span class="hljs-number">10</span><br>    for step, (x, y) in enumerate(train_db): # for every batch<br>        # x:[<span class="hljs-number">128</span>, <span class="hljs-number">28</span>, <span class="hljs-number">28</span>]<br>        # y: [<span class="hljs-number">128</span>]<br><br>        # [b, <span class="hljs-number">28</span>, <span class="hljs-number">28</span>] =&gt; [b, <span class="hljs-number">28</span>*<span class="hljs-number">28</span>]<br>        x = tf.reshape(x, [<span class="hljs-number">-1</span>, <span class="hljs-number">28</span>*<span class="hljs-number">28</span>])<br>        #自动求导的过程 放在<span class="hljs-symbol">Gradient</span>里面<br>        with tf.<span class="hljs-symbol">GradientTape</span>() as tape: # tf.<span class="hljs-symbol">Variable</span><br>            # x: [b, <span class="hljs-number">28</span>*<span class="hljs-number">28</span>]<br>            # h1 = x@w1 + b1<br>            # [b, <span class="hljs-number">784</span>]@[<span class="hljs-number">784</span>, <span class="hljs-number">256</span>] + [<span class="hljs-number">256</span>] =&gt; [b, <span class="hljs-number">256</span>] + [<span class="hljs-number">256</span>] =&gt; [b, <span class="hljs-number">256</span>] + [b, <span class="hljs-number">256</span>]<br>            h1 = x@w1 + tf.broadcast_to(b1, [x.shape[<span class="hljs-number">0</span>], <span class="hljs-number">256</span>])<br>            h1 = tf.nn.relu(h1)<br>            # [b, <span class="hljs-number">256</span>] =&gt; [b, <span class="hljs-number">128</span>]<br>            h2 = h1@w2 + b2<br>            h2 = tf.nn.relu(h2)<br>            # [b, <span class="hljs-number">128</span>] =&gt; [b, <span class="hljs-number">10</span>]<br>            out = h2@w3 + b3<br><br>            # compute loss<br>            # out: [b, <span class="hljs-number">10</span>]<br>            # y: [b] =&gt; [b, <span class="hljs-number">10</span>]<br>            y_onehot = tf.one_hot(y, depth=<span class="hljs-number">10</span>)<br><br>            # mse = mean(sum(y-out)^<span class="hljs-number">2</span>)<br>            # [b, <span class="hljs-number">10</span>]<br>            loss = tf.square(y_onehot - out)<br>            # mean: scalar<br>            loss = tf.reduce_mean(loss)<br><br>        # compute gradients 需要求解梯度的元素 //默认只会跟踪tf.<span class="hljs-symbol">Variable</span>类型<br>        grads = tape.gradient(loss, [w1, b1, w2, b2, w3, b3])<br>        #print(grads)<br>        # w1 = w1 - lr * w1_grad<br>        # w1 = w1 - lr * grads[<span class="hljs-number">0</span>] 经过相减运算后会返回tf.tensor类型而不是<span class="hljs-symbol">Variable</span>类型，<br>        w1.assign_sub(lr * grads[<span class="hljs-number">0</span>])#原地更新，不改变类型 如果还是想使用上面的操作，可以在每次 进入自动求导运算时将类型转变为<span class="hljs-symbol">Variable</span>类型<br>        b1.assign_sub(lr * grads[<span class="hljs-number">1</span>])<br>        w2.assign_sub(lr * grads[<span class="hljs-number">2</span>])<br>        b2.assign_sub(lr * grads[<span class="hljs-number">3</span>])<br>        w3.assign_sub(lr * grads[<span class="hljs-number">4</span>])<br>        b3.assign_sub(lr * grads[<span class="hljs-number">5</span>])<br><br><br>        if step <span class="hljs-comment">% 100 == 0:</span><br>            print(epoch, step, <span class="hljs-string">&#x27;loss:&#x27;</span>, float(loss))<br></code></pre></td></tr></table></figure>]]>
    </content>
    <id>https://www.wakli.com/2020/03/22/%E5%89%8D%E5%90%91%E4%BC%A0%E6%92%AD/</id>
    <link href="https://www.wakli.com/2020/03/22/%E5%89%8D%E5%90%91%E4%BC%A0%E6%92%AD/"/>
    <published>2020-03-22T03:08:25.000Z</published>
    <summary>
      <![CDATA[<h3 id="前向传播"><a href="#前向传播" class="headerlink" title="前向传播"></a>前向传播</h3><ul>
<li><p>out &#x3D; relu{relu{relu[X@W1+b1]@W2+b2}@W3+b3}</p>
</li>
<li><p>pred &#x3D; argmax(out)</p>
</li>
<li><p>loss&#x3D;MSE(out,label)</p>
</li>
<li><p>minimize loss 优化[W1’,b1’,W2’,b2’,W3’,b3’,]</p>]]>
    </summary>
    <title>前向传播简单实践</title>
    <updated>2020-03-22T07:04:04.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>王康力</name>
    </author>
    <category term="机器学习" scheme="https://www.wakli.com/categories/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0/"/>
    <category term="Tensorflow" scheme="https://www.wakli.com/categories/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0/Tensorflow/"/>
    <category term="索引" scheme="https://www.wakli.com/tags/%E7%B4%A2%E5%BC%95/"/>
    <category term="切片" scheme="https://www.wakli.com/tags/%E5%88%87%E7%89%87/"/>
    <content>
      <![CDATA[<p>索引与切片：获取Tensor中的一部分数据</p><span id="more"></span><h3 id="Basic-indexing"><a href="#Basic-indexing" class="headerlink" title="Basic indexing"></a>Basic indexing</h3><p>最基础的索引方式，索引方式比较单一，只能取具体某个</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><code class="hljs python">In [<span class="hljs-number">2</span>]: a = tf.ones([<span class="hljs-number">1</span>,<span class="hljs-number">5</span>,<span class="hljs-number">5</span>,<span class="hljs-number">3</span>])<br>   ...: a[<span class="hljs-number">0</span>][<span class="hljs-number">0</span>]<br>Out[<span class="hljs-number">2</span>]:<br>&lt;tf.Tensor: shape=(<span class="hljs-number">5</span>, <span class="hljs-number">3</span>), dtype=float32, numpy=<br>array([[<span class="hljs-number">1.</span>, <span class="hljs-number">1.</span>, <span class="hljs-number">1.</span>],<br>       [<span class="hljs-number">1.</span>, <span class="hljs-number">1.</span>, <span class="hljs-number">1.</span>],<br>       [<span class="hljs-number">1.</span>, <span class="hljs-number">1.</span>, <span class="hljs-number">1.</span>],<br>       [<span class="hljs-number">1.</span>, <span class="hljs-number">1.</span>, <span class="hljs-number">1.</span>],<br>       [<span class="hljs-number">1.</span>, <span class="hljs-number">1.</span>, <span class="hljs-number">1.</span>]], dtype=float32)&gt;<br><br>In [<span class="hljs-number">4</span>]: a[<span class="hljs-number">0</span>][<span class="hljs-number">0</span>][<span class="hljs-number">0</span>]<br>Out[<span class="hljs-number">4</span>]: &lt;tf.Tensor: shape=(<span class="hljs-number">3</span>,), dtype=float32, numpy=array([<span class="hljs-number">1.</span>, <span class="hljs-number">1.</span>, <span class="hljs-number">1.</span>], dtype=float32)&gt;<br>        <br>In [<span class="hljs-number">5</span>]: a[<span class="hljs-number">0</span>][<span class="hljs-number">0</span>][<span class="hljs-number">0</span>][<span class="hljs-number">2</span>]<br>Out[<span class="hljs-number">5</span>]: &lt;tf.Tensor: shape=(), dtype=float32, numpy=<span class="hljs-number">1.0</span>&gt;<br></code></pre></td></tr></table></figure><h3 id="Numpy-indexing"><a href="#Numpy-indexing" class="headerlink" title="Numpy indexing"></a>Numpy indexing</h3><figure class="highlight stylus"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><code class="hljs stylus">In <span class="hljs-selector-attr">[6]</span>: a= tf<span class="hljs-selector-class">.random</span><span class="hljs-selector-class">.normal</span>(<span class="hljs-selector-attr">[4,28,28,3]</span>)<br>In <span class="hljs-selector-attr">[8]</span>: <span class="hljs-selector-tag">a</span><span class="hljs-selector-attr">[1]</span><span class="hljs-selector-class">.shape</span><br>Out<span class="hljs-selector-attr">[8]</span>: <span class="hljs-built_in">TensorShape</span>(<span class="hljs-selector-attr">[28, 28, 3]</span>)<br><br>In <span class="hljs-selector-attr">[10]</span>: <span class="hljs-selector-tag">a</span><span class="hljs-selector-attr">[1,2,3,2]</span><span class="hljs-selector-class">.shape</span><br>Out<span class="hljs-selector-attr">[10]</span>: <span class="hljs-built_in">TensorShape</span>(<span class="hljs-selector-attr">[]</span>)<br></code></pre></td></tr></table></figure><h3 id="切片-start-end"><a href="#切片-start-end" class="headerlink" title="切片[start:end]"></a>切片[start:end]</h3><p>[start:end) 不包含左边的</p><figure class="highlight stylus"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><code class="hljs stylus">In <span class="hljs-selector-attr">[11]</span>: <span class="hljs-selector-tag">a</span> = tf<span class="hljs-selector-class">.range</span>(<span class="hljs-number">10</span>)<br><br>In <span class="hljs-selector-attr">[13]</span>: <span class="hljs-selector-tag">a</span><span class="hljs-selector-attr">[-1:]</span><br>Out<span class="hljs-selector-attr">[13]</span>: &lt;tf<span class="hljs-selector-class">.Tensor</span>: shape=(<span class="hljs-number">1</span>,), dtype=int32, numpy=<span class="hljs-built_in">array</span>(<span class="hljs-selector-attr">[9]</span>, dtype=int32)&gt;<br>In <span class="hljs-selector-attr">[14]</span>: <span class="hljs-selector-tag">a</span><span class="hljs-selector-attr">[-2:]</span><br>Out<span class="hljs-selector-attr">[14]</span>: &lt;tf<span class="hljs-selector-class">.Tensor</span>: shape=(<span class="hljs-number">2</span>,), dtype=int32, numpy=<span class="hljs-built_in">array</span>(<span class="hljs-selector-attr">[8, 9]</span>, dtype=int32)&gt;<br>In <span class="hljs-selector-attr">[15]</span>: <span class="hljs-selector-tag">a</span><span class="hljs-selector-attr">[:2]</span><br>Out<span class="hljs-selector-attr">[15]</span>: &lt;tf<span class="hljs-selector-class">.Tensor</span>: shape=(<span class="hljs-number">2</span>,), dtype=int32, numpy=<span class="hljs-built_in">array</span>(<span class="hljs-selector-attr">[0, 1]</span>, dtype=int32)&gt;<br>In <span class="hljs-selector-attr">[16]</span>: <span class="hljs-selector-tag">a</span><span class="hljs-selector-attr">[2:-1]</span><br>Out<span class="hljs-selector-attr">[16]</span>: &lt;tf<span class="hljs-selector-class">.Tensor</span>: shape=(<span class="hljs-number">7</span>,), dtype=int32, numpy=<span class="hljs-built_in">array</span>(<span class="hljs-selector-attr">[2, 3, 4, 5, 6, 7, 8]</span>, dtype=int32)&gt;<br></code></pre></td></tr></table></figure><figure class="highlight stylus"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><code class="hljs stylus">a= tf<span class="hljs-selector-class">.random</span><span class="hljs-selector-class">.normal</span>(<span class="hljs-selector-attr">[4,28,28,3]</span>)<br><br>In <span class="hljs-selector-attr">[20]</span>: <span class="hljs-selector-tag">a</span><span class="hljs-selector-attr">[0,:,:,:]</span><span class="hljs-selector-class">.shape</span><br>Out<span class="hljs-selector-attr">[20]</span>: <span class="hljs-built_in">TensorShape</span>(<span class="hljs-selector-attr">[28, 28, 3]</span>)<br>In <span class="hljs-selector-attr">[21]</span>: <span class="hljs-selector-tag">a</span><span class="hljs-selector-attr">[0,1,:,:]</span><span class="hljs-selector-class">.shape</span><br>Out<span class="hljs-selector-attr">[21]</span>: <span class="hljs-built_in">TensorShape</span>(<span class="hljs-selector-attr">[28, 3]</span>)<br>In <span class="hljs-selector-attr">[23]</span>: <span class="hljs-selector-tag">a</span><span class="hljs-selector-attr">[:,:,:,2]</span><span class="hljs-selector-class">.shape</span> #取所有图片的的B通道<br>Out<span class="hljs-selector-attr">[23]</span>: <span class="hljs-built_in">TensorShape</span>(<span class="hljs-selector-attr">[4, 28, 28]</span>)<br>In <span class="hljs-selector-attr">[24]</span>: <span class="hljs-selector-tag">a</span><span class="hljs-selector-attr">[:,0,:,:]</span><span class="hljs-selector-class">.shape</span> #取所有照片第<span class="hljs-number">0</span>行所有列的RGB三通道<br>Out<span class="hljs-selector-attr">[24]</span>: <span class="hljs-built_in">TensorShape</span>(<span class="hljs-selector-attr">[4, 28, 3]</span>)<br></code></pre></td></tr></table></figure><h3 id="间隔切片"><a href="#间隔切片" class="headerlink" title="间隔切片 [::]"></a>间隔切片 [::]</h3><figure class="highlight stylus"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><code class="hljs stylus">In <span class="hljs-selector-attr">[25]</span>: <span class="hljs-selector-tag">a</span><span class="hljs-selector-attr">[0:2,:,:,:]</span><span class="hljs-selector-class">.shape</span> #取<span class="hljs-number">0</span>和<span class="hljs-number">1</span>两张图片<br>Out<span class="hljs-selector-attr">[25]</span>: <span class="hljs-built_in">TensorShape</span>(<span class="hljs-selector-attr">[2, 28, 28, 3]</span>)<br><br>In <span class="hljs-selector-attr">[26]</span>: <span class="hljs-selector-tag">a</span><span class="hljs-selector-attr">[:,0:28:2,0:28:2,:]</span><span class="hljs-selector-class">.shape</span> #间隔取<br>Out<span class="hljs-selector-attr">[26]</span>: <span class="hljs-built_in">TensorShape</span>(<span class="hljs-selector-attr">[4, 14, 14, 3]</span>)<br><br>In <span class="hljs-selector-attr">[28]</span>: <span class="hljs-selector-tag">a</span><span class="hljs-selector-attr">[:,14:,14:,:]</span><span class="hljs-selector-class">.shape</span>#取<span class="hljs-number">14</span>之后<br>Out<span class="hljs-selector-attr">[28]</span>: <span class="hljs-built_in">TensorShape</span>(<span class="hljs-selector-attr">[4, 14, 14, 3]</span>)<br><br>In <span class="hljs-selector-attr">[29]</span>: <span class="hljs-selector-tag">a</span><span class="hljs-selector-attr">[:,::2,::2,:]</span><span class="hljs-selector-class">.shape</span>#间隔取<br>Out<span class="hljs-selector-attr">[29]</span>: <span class="hljs-built_in">TensorShape</span>(<span class="hljs-selector-attr">[4, 14, 14, 3]</span>)<br><br>In <span class="hljs-selector-attr">[30]</span>: <span class="hljs-selector-tag">a</span><span class="hljs-selector-attr">[:,2:26:2,2:26:2,:]</span><span class="hljs-selector-class">.shape</span><br>Out<span class="hljs-selector-attr">[30]</span>: <span class="hljs-built_in">TensorShape</span>(<span class="hljs-selector-attr">[4, 12, 12, 3]</span>)<br></code></pre></td></tr></table></figure><h3 id="倒序"><a href="#倒序" class="headerlink" title="倒序"></a>倒序</h3><p>注意，倒序中start是要开始倒叙的第一个</p><figure class="highlight routeros"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><code class="hljs routeros"><span class="hljs-keyword">In</span> [31]: <span class="hljs-attribute">b</span>=tf.range(4)<br><br><span class="hljs-keyword">In</span> [32]: b[::-1]<br>Out[32]: &lt;tf.Tensor: shape=(4,), <span class="hljs-attribute">dtype</span>=int32, <span class="hljs-attribute">numpy</span>=array([3, 2, 1, 0], <span class="hljs-attribute">dtype</span>=int32)&gt;<br><span class="hljs-keyword">In</span> [33]: b[::-2]<br>Out[33]: &lt;tf.Tensor: shape=(2,), <span class="hljs-attribute">dtype</span>=int32, <span class="hljs-attribute">numpy</span>=array([3, 1], <span class="hljs-attribute">dtype</span>=int32)&gt;<br><span class="hljs-keyword">In</span> [36]: b[2::-2] # 从第2个开始往前走<br>Out[36]: &lt;tf.Tensor: shape=(2,), <span class="hljs-attribute">dtype</span>=int32, <span class="hljs-attribute">numpy</span>=array([2, 0], <span class="hljs-attribute">dtype</span>=int32)&gt;<br><span class="hljs-keyword">In</span> [37]: b[3:1:-1] #从第3个开始往前走<br>Out[37]: &lt;tf.Tensor: shape=(2,), <span class="hljs-attribute">dtype</span>=int32, <span class="hljs-attribute">numpy</span>=array([3, 2], <span class="hljs-attribute">dtype</span>=int32)&gt;<br></code></pre></td></tr></table></figure><h3 id="…-采样"><a href="#…-采样" class="headerlink" title="… 采样"></a>… 采样</h3><figure class="highlight stylus"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><code class="hljs stylus">In <span class="hljs-selector-attr">[40]</span>: a= tf<span class="hljs-selector-class">.random</span><span class="hljs-selector-class">.normal</span>(<span class="hljs-selector-attr">[2,4,28,28,3]</span>)<br><br>In <span class="hljs-selector-attr">[44]</span>: <span class="hljs-selector-tag">a</span><span class="hljs-selector-attr">[...,0]</span><span class="hljs-selector-class">.shape</span><br>Out<span class="hljs-selector-attr">[44]</span>: <span class="hljs-built_in">TensorShape</span>(<span class="hljs-selector-attr">[2, 4, 28, 28]</span>)<br>In <span class="hljs-selector-attr">[45]</span>: <span class="hljs-selector-tag">a</span><span class="hljs-selector-attr">[1,2,...,0]</span><span class="hljs-selector-class">.shape</span><br>Out<span class="hljs-selector-attr">[45]</span>: <span class="hljs-built_in">TensorShape</span>(<span class="hljs-selector-attr">[28, 28]</span>)<br></code></pre></td></tr></table></figure><h3 id="Selective-indexing"><a href="#Selective-indexing" class="headerlink" title="Selective indexing"></a>Selective indexing</h3><p>例如a[4,28,28,3] -&gt;取每张图片的3，27，9，13行中所有列的三通道 -&gt;[4,4,28,3]</p><h4 id="tf-gather"><a href="#tf-gather" class="headerlink" title="tf.gather"></a>tf.gather</h4><ul><li>Data:[classes,student,subject]  -&gt;[4,35,8]</li></ul><figure class="highlight stylus"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><code class="hljs stylus">In <span class="hljs-selector-attr">[55]</span>: a= tf<span class="hljs-selector-class">.random</span><span class="hljs-selector-class">.normal</span>(<span class="hljs-selector-attr">[4,35,8]</span>,mean=<span class="hljs-number">70</span>,stddev =<span class="hljs-number">10</span>,dtype=tf.float32)<br><br>#Tensor为a，维度是<span class="hljs-number">1</span>，索引号为<span class="hljs-number">2</span>和<span class="hljs-number">3</span>的班级全部学生成绩<br>In <span class="hljs-selector-attr">[56]</span>: tf<span class="hljs-selector-class">.gather</span>(<span class="hljs-selector-tag">a</span>,axis=<span class="hljs-number">0</span>,indices=<span class="hljs-selector-attr">[2,3]</span>)<span class="hljs-selector-class">.shape</span> <br>Out<span class="hljs-selector-attr">[56]</span>: <span class="hljs-built_in">TensorShape</span>(<span class="hljs-selector-attr">[2, 35, 8]</span>)<br>#按照<span class="hljs-number">2</span>，<span class="hljs-number">1</span>，<span class="hljs-number">3</span>，<span class="hljs-number">0</span>的顺序<br>In <span class="hljs-selector-attr">[59]</span>: tf<span class="hljs-selector-class">.gather</span>(<span class="hljs-selector-tag">a</span>,axis=<span class="hljs-number">0</span>,indices=<span class="hljs-selector-attr">[2,1,3,0]</span>)<span class="hljs-selector-class">.shape</span><br>Out<span class="hljs-selector-attr">[59]</span>: <span class="hljs-built_in">TensorShape</span>(<span class="hljs-selector-attr">[4, 35, 8]</span>)<br>#抽取所有班级学号为<span class="hljs-number">2</span>，<span class="hljs-number">3</span>，<span class="hljs-number">7</span>，<span class="hljs-number">9</span>，<span class="hljs-number">16</span>的学生<br>In <span class="hljs-selector-attr">[61]</span>: tf<span class="hljs-selector-class">.gather</span>(<span class="hljs-selector-tag">a</span>,axis=<span class="hljs-number">1</span>,indices=<span class="hljs-selector-attr">[2,3,7,9,16]</span>)<span class="hljs-selector-class">.shape</span><br>Out<span class="hljs-selector-attr">[61]</span>: <span class="hljs-built_in">TensorShape</span>(<span class="hljs-selector-attr">[4, 5, 8]</span>)<br></code></pre></td></tr></table></figure><h4 id="tf-gather-nd"><a href="#tf-gather-nd" class="headerlink" title="tf.gather_nd"></a>tf.gather_nd</h4><ul><li>获取不同班级的某些不同学生的成绩</li></ul><figure class="highlight stylus"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><code class="hljs stylus">#<span class="hljs-number">0</span>号班级所有科目成绩 <span class="hljs-selector-attr">[0]</span>理解为<span class="hljs-selector-attr">[[0]</span>,<span class="hljs-selector-attr">[]</span>,<span class="hljs-selector-attr">[]</span>]联合索引的index组合<br>In <span class="hljs-selector-attr">[62]</span>: tf<span class="hljs-selector-class">.gather_nd</span>(<span class="hljs-selector-tag">a</span>,<span class="hljs-selector-attr">[0]</span>)<span class="hljs-selector-class">.shape</span><br>Out<span class="hljs-selector-attr">[62]</span>: <span class="hljs-built_in">TensorShape</span>(<span class="hljs-selector-attr">[35, 8]</span>)<br>#<span class="hljs-number">0</span>班<span class="hljs-number">1</span>号<br>In <span class="hljs-selector-attr">[63]</span>: tf<span class="hljs-selector-class">.gather_nd</span>(<span class="hljs-selector-tag">a</span>,<span class="hljs-selector-attr">[0,1]</span>)<span class="hljs-selector-class">.shape</span><br>Out<span class="hljs-selector-attr">[63]</span>: <span class="hljs-built_in">TensorShape</span>(<span class="hljs-selector-attr">[8]</span>)<br>#<span class="hljs-number">0</span>班<span class="hljs-number">30</span>号<span class="hljs-number">7</span>课<br>In <span class="hljs-selector-attr">[64]</span>: tf<span class="hljs-selector-class">.gather_nd</span>(<span class="hljs-selector-tag">a</span>,<span class="hljs-selector-attr">[0,30,7]</span>)<span class="hljs-selector-class">.shape</span><br>Out<span class="hljs-selector-attr">[64]</span>: <span class="hljs-built_in">TensorShape</span>(<span class="hljs-selector-attr">[]</span>)<br>#返回具体科目成绩但是一维的<br>In <span class="hljs-selector-attr">[65]</span>: tf<span class="hljs-selector-class">.gather_nd</span>(<span class="hljs-selector-tag">a</span>,<span class="hljs-selector-attr">[[0,30,7]</span>])<span class="hljs-selector-class">.shape</span><br>Out<span class="hljs-selector-attr">[65]</span>: <span class="hljs-built_in">TensorShape</span>(<span class="hljs-selector-attr">[1]</span>)<br><br>#<span class="hljs-number">0</span>班<span class="hljs-number">0</span>号和<span class="hljs-number">1</span>班<span class="hljs-number">1</span>号<br>In <span class="hljs-selector-attr">[76]</span>: tf<span class="hljs-selector-class">.gather_nd</span>(<span class="hljs-selector-tag">a</span>, <span class="hljs-selector-attr">[[0,0]</span>,<span class="hljs-selector-attr">[1,1]</span>])<span class="hljs-selector-class">.shape</span><br>Out<span class="hljs-selector-attr">[76]</span>: <span class="hljs-built_in">TensorShape</span>(<span class="hljs-selector-attr">[2, 8]</span>)<br>In <span class="hljs-selector-attr">[80]</span>: tf<span class="hljs-selector-class">.gather_nd</span>(<span class="hljs-selector-tag">a</span>, <span class="hljs-selector-attr">[[0,0,2]</span>,<span class="hljs-selector-attr">[1,2,3]</span>])<span class="hljs-selector-class">.shape</span><br>Out<span class="hljs-selector-attr">[80]</span>: <span class="hljs-built_in">TensorShape</span>(<span class="hljs-selector-attr">[2]</span>)<br>In <span class="hljs-selector-attr">[81]</span>: tf<span class="hljs-selector-class">.gather_nd</span>(<span class="hljs-selector-tag">a</span>, <span class="hljs-selector-attr">[[[0,0,2]</span>,<span class="hljs-selector-attr">[1,2,3]</span>]])<span class="hljs-selector-class">.shape</span><br>Out<span class="hljs-selector-attr">[81]</span>: <span class="hljs-built_in">TensorShape</span>(<span class="hljs-selector-attr">[1, 2]</span>)<br></code></pre></td></tr></table></figure><h4 id="tf-boolean-mask"><a href="#tf-boolean-mask" class="headerlink" title="tf.boolean_mask"></a>tf.boolean_mask</h4><p>选True的位置</p><figure class="highlight mathematica"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><code class="hljs mathematica"><span class="hljs-built_in">In</span> <span class="hljs-punctuation">[</span><span class="hljs-number">88</span><span class="hljs-punctuation">]</span><span class="hljs-operator">:</span> <span class="hljs-variable">tf</span><span class="hljs-operator">.</span><span class="hljs-type">boolean_mask</span><span class="hljs-punctuation">(</span><span class="hljs-variable">a</span><span class="hljs-operator">,</span><span class="hljs-variable">mask</span><span class="hljs-operator">=</span><span class="hljs-punctuation">[</span><span class="hljs-built_in">True</span><span class="hljs-operator">,</span><span class="hljs-built_in">True</span><span class="hljs-operator">,</span><span class="hljs-built_in">False</span><span class="hljs-operator">,</span><span class="hljs-built_in">False</span><span class="hljs-punctuation">]</span><span class="hljs-operator">,</span><span class="hljs-variable">axis</span><span class="hljs-operator">=</span><span class="hljs-number">0</span><span class="hljs-punctuation">)</span><span class="hljs-operator">.</span><span class="hljs-variable">shape</span><br><span class="hljs-built_in">Out</span><span class="hljs-punctuation">[</span><span class="hljs-number">88</span><span class="hljs-punctuation">]</span><span class="hljs-operator">:</span> <span class="hljs-variable">TensorShape</span><span class="hljs-punctuation">(</span><span class="hljs-punctuation">[</span><span class="hljs-number">2</span><span class="hljs-operator">,</span> <span class="hljs-number">28</span><span class="hljs-operator">,</span> <span class="hljs-number">28</span><span class="hljs-operator">,</span> <span class="hljs-number">3</span><span class="hljs-punctuation">]</span><span class="hljs-punctuation">)</span><br><br><span class="hljs-built_in">In</span> <span class="hljs-punctuation">[</span><span class="hljs-number">89</span><span class="hljs-punctuation">]</span><span class="hljs-operator">:</span> <span class="hljs-variable">tf</span><span class="hljs-operator">.</span><span class="hljs-type">boolean_mask</span><span class="hljs-punctuation">(</span><span class="hljs-variable">a</span><span class="hljs-operator">,</span><span class="hljs-variable">mask</span><span class="hljs-operator">=</span><span class="hljs-punctuation">[</span><span class="hljs-built_in">True</span><span class="hljs-operator">,</span><span class="hljs-built_in">True</span><span class="hljs-operator">,</span><span class="hljs-built_in">False</span><span class="hljs-punctuation">]</span><span class="hljs-operator">,</span><span class="hljs-variable">axis</span><span class="hljs-operator">=</span><span class="hljs-number">3</span><span class="hljs-punctuation">)</span><span class="hljs-operator">.</span><span class="hljs-variable">shape</span><br><span class="hljs-built_in">Out</span><span class="hljs-punctuation">[</span><span class="hljs-number">89</span><span class="hljs-punctuation">]</span><span class="hljs-operator">:</span> <span class="hljs-variable">TensorShape</span><span class="hljs-punctuation">(</span><span class="hljs-punctuation">[</span><span class="hljs-number">4</span><span class="hljs-operator">,</span> <span class="hljs-number">28</span><span class="hljs-operator">,</span> <span class="hljs-number">28</span><span class="hljs-operator">,</span> <span class="hljs-number">2</span><span class="hljs-punctuation">]</span><span class="hljs-punctuation">)</span><br></code></pre></td></tr></table></figure><figure class="highlight stylus"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><code class="hljs stylus">In <span class="hljs-selector-attr">[90]</span>: <span class="hljs-selector-tag">a</span> = tf<span class="hljs-selector-class">.ones</span>(<span class="hljs-selector-attr">[2,3,4]</span>)<br>In <span class="hljs-selector-attr">[94]</span>: tf<span class="hljs-selector-class">.boolean_mask</span>(<span class="hljs-selector-tag">a</span>,<span class="hljs-attribute">mask</span>=[[True,True,False],[False,True,True]])<br>Out<span class="hljs-selector-attr">[94]</span>:<br>&lt;tf<span class="hljs-selector-class">.Tensor</span>: shape=(<span class="hljs-number">4</span>, <span class="hljs-number">4</span>), dtype=float32, numpy=<br><span class="hljs-built_in">array</span>(<span class="hljs-selector-attr">[[1., 1., 1., 1.]</span>,<br>       <span class="hljs-selector-attr">[1., 1., 1., 1.]</span>,<br>       <span class="hljs-selector-attr">[1., 1., 1., 1.]</span>,<br>       <span class="hljs-selector-attr">[1., 1., 1., 1.]</span>], dtype=float32)&gt;<br></code></pre></td></tr></table></figure>]]>
    </content>
    <id>https://www.wakli.com/2020/03/21/Tensor%E7%B4%A2%E5%BC%95%E5%88%87%E7%89%87/</id>
    <link href="https://www.wakli.com/2020/03/21/Tensor%E7%B4%A2%E5%BC%95%E5%88%87%E7%89%87/"/>
    <published>2020-03-21T13:44:45.000Z</published>
    <summary>
      <![CDATA[<p>索引与切片：获取Tensor中的一部分数据</p>]]>
    </summary>
    <title>Tensor索引切片</title>
    <updated>2020-03-21T16:34:10.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>王康力</name>
    </author>
    <category term="机器学习" scheme="https://www.wakli.com/categories/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0/"/>
    <category term="Tensorflow" scheme="https://www.wakli.com/categories/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0/Tensorflow/"/>
    <category term="Tensorflow" scheme="https://www.wakli.com/tags/Tensorflow/"/>
    <content>
      <![CDATA[<h3 id="数据载体"><a href="#数据载体" class="headerlink" title="数据载体"></a>数据载体</h3><ul><li>list: 一个非常灵活的数据载体，可以添加任何类型数据类型，随意的添加删除管理 但是对于图片型数据消耗内存空间过大，且读取写入效率低</li><li>np.array: 专门用于解决同类型数据的运算例如同样大小的图片[64,32,32,3]</li><li>tf.tensor: 在神经网络上的功能比numpy更优秀。</li></ul><span id="more"></span><h3 id="Tensor"><a href="#Tensor" class="headerlink" title="Tensor"></a>Tensor</h3><p>scalar 标量 : 1.1</p><p>vecter 向量 : [1.1]、[1.1,2.2,…]</p><p>matrix : [[1.1,2.2],[5.5,6.6]]    (1.1,2.2为一行)</p><p>tensor : rank &gt; 2 几乎代表神经网络当中所有的数据类型</p><h3 id="Tensorflow中基本数据类型"><a href="#Tensorflow中基本数据类型" class="headerlink" title="Tensorflow中基本数据类型"></a>Tensorflow中基本数据类型</h3><p>int，float，double，bool，string</p><p>数据类型变量的创建，叫constant是因为在前期版本是常量，但现在它是变量</p><figure class="highlight stylus"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><code class="hljs stylus">In <span class="hljs-selector-attr">[4]</span>: tf<span class="hljs-selector-class">.constant</span>(<span class="hljs-number">1</span>)<br>Out<span class="hljs-selector-attr">[4]</span>: &lt;tf<span class="hljs-selector-class">.Tensor</span>: shape=(), dtype=int32, numpy=<span class="hljs-number">1</span>&gt;<br><br>In <span class="hljs-selector-attr">[5]</span>: tf<span class="hljs-selector-class">.constant</span>(<span class="hljs-number">1.1</span>)<br>Out<span class="hljs-selector-attr">[5]</span>: &lt;tf<span class="hljs-selector-class">.Tensor</span>: shape=(), dtype=float32, numpy=<span class="hljs-number">1.1</span>&gt;<br><br>In <span class="hljs-selector-attr">[6]</span>: tf<span class="hljs-selector-class">.constant</span>(<span class="hljs-number">2.2</span>,dtype = tf.int32)<br>TypeError: Cannot convert <span class="hljs-number">2.2</span> to EagerTensor of dtype int32<br><br>In <span class="hljs-selector-attr">[7]</span>: tf<span class="hljs-selector-class">.constant</span>(<span class="hljs-number">2</span>.,dtype = tf.double)<br>Out<span class="hljs-selector-attr">[7]</span>: &lt;tf<span class="hljs-selector-class">.Tensor</span>: shape=(), dtype=float64, numpy=<span class="hljs-number">2.0</span>&gt;<br><br>In <span class="hljs-selector-attr">[8]</span>: tf<span class="hljs-selector-class">.constant</span>(<span class="hljs-selector-attr">[True,False]</span>)<br>Out<span class="hljs-selector-attr">[8]</span>: &lt;tf<span class="hljs-selector-class">.Tensor</span>: shape=(<span class="hljs-number">2</span>,), dtype=bool, numpy=<span class="hljs-built_in">array</span>(<span class="hljs-selector-attr">[ True, False]</span>)&gt;<br><br>In <span class="hljs-selector-attr">[9]</span>: tf<span class="hljs-selector-class">.constant</span>(<span class="hljs-string">&#x27;hello&#x27;</span>)<br>Out<span class="hljs-selector-attr">[9]</span>: &lt;tf<span class="hljs-selector-class">.Tensor</span>: shape=(), dtype=string, numpy=b<span class="hljs-string">&#x27;hello&#x27;</span>&gt;<br></code></pre></td></tr></table></figure><h3 id="Tensor属性"><a href="#Tensor属性" class="headerlink" title="Tensor属性"></a>Tensor属性</h3><h4 id="device属性"><a href="#device属性" class="headerlink" title="device属性"></a>device属性</h4><p>查看当前Tensor所在设备的名字</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><code class="hljs python">In [<span class="hljs-number">2</span>]: <span class="hljs-keyword">with</span> tf.device(<span class="hljs-string">&quot;cpu&quot;</span>): <span class="hljs-comment">#通过cpu创建</span><br>   ...:a = tf.constant([<span class="hljs-number">1</span>])<br>In [<span class="hljs-number">3</span>]: a.device<br>Out[<span class="hljs-number">3</span>]: <span class="hljs-string">&#x27;/job:localhost/replica:0/task:0/device:CPU:0&#x27;</span>   <br></code></pre></td></tr></table></figure><p>将Tensor在cpu转移至gpu 只需要 aa &#x3D; a.gpu() aa就在gpu上</p><p>两个Tensor在不同设备上不能顺利进行运算</p><h4 id="Tensor-numpy"><a href="#Tensor-numpy" class="headerlink" title="Tensor-&gt;numpy"></a>Tensor-&gt;numpy</h4><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs python">In [<span class="hljs-number">8</span>]: b = tf.<span class="hljs-built_in">range</span>(<span class="hljs-number">4</span>)<br>In [<span class="hljs-number">9</span>]: b.numpy()<br>Out[<span class="hljs-number">9</span>]: array([<span class="hljs-number">0</span>, <span class="hljs-number">1</span>, <span class="hljs-number">2</span>, <span class="hljs-number">3</span>], dtype=int32)<br></code></pre></td></tr></table></figure><h4 id="Tensor维度-ndim"><a href="#Tensor维度-ndim" class="headerlink" title="Tensor维度 ndim"></a>Tensor维度 ndim</h4> <figure class="highlight stylus"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><code class="hljs stylus">In <span class="hljs-selector-attr">[12]</span>: c= tf<span class="hljs-selector-class">.constant</span>(<span class="hljs-selector-attr">[[1,2]</span>,<span class="hljs-selector-attr">[3,4]</span>])<br>In <span class="hljs-selector-attr">[13]</span>: c<span class="hljs-selector-class">.ndim</span><br>Out<span class="hljs-selector-attr">[13]</span>: <span class="hljs-number">2</span>  #返回数字<br><br>In <span class="hljs-selector-attr">[14]</span>: tf<span class="hljs-selector-class">.rank</span>(c)<br>Out<span class="hljs-selector-attr">[14]</span>: &lt;tf<span class="hljs-selector-class">.Tensor</span>: shape=(), dtype=int32, numpy=<span class="hljs-number">2</span>&gt; #返回Tensor<br></code></pre></td></tr></table></figure><h4 id="TensorShape"><a href="#TensorShape" class="headerlink" title="TensorShape"></a>TensorShape</h4><figure class="highlight stylus"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs stylus">In <span class="hljs-selector-attr">[19]</span>: c<span class="hljs-selector-class">.shape</span><br>Out<span class="hljs-selector-attr">[19]</span>: <span class="hljs-built_in">TensorShape</span>(<span class="hljs-selector-attr">[2, 2]</span>)<br></code></pre></td></tr></table></figure><h4 id="确认是否为Tensor"><a href="#确认是否为Tensor" class="headerlink" title="确认是否为Tensor"></a>确认是否为Tensor</h4><figure class="highlight mathematica"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><code class="hljs mathematica"><span class="hljs-built_in">In</span> <span class="hljs-punctuation">[</span><span class="hljs-number">20</span><span class="hljs-punctuation">]</span><span class="hljs-operator">:</span> <span class="hljs-variable">tf</span><span class="hljs-operator">.</span><span class="hljs-type">is_tensor</span><span class="hljs-punctuation">(</span><span class="hljs-variable">c</span><span class="hljs-punctuation">)</span> <span class="hljs-type">#</span>一般使用这种方法<br><span class="hljs-built_in">Out</span><span class="hljs-punctuation">[</span><span class="hljs-number">20</span><span class="hljs-punctuation">]</span><span class="hljs-operator">:</span> <span class="hljs-built_in">True</span><br><br><span class="hljs-built_in">In</span> <span class="hljs-punctuation">[</span><span class="hljs-number">29</span><span class="hljs-punctuation">]</span><span class="hljs-operator">:</span> <span class="hljs-variable">isinstance</span><span class="hljs-punctuation">(</span><span class="hljs-variable">c</span><span class="hljs-operator">,</span><span class="hljs-variable">tf</span><span class="hljs-operator">.</span><span class="hljs-variable">Tensor</span><span class="hljs-punctuation">)</span><br><span class="hljs-built_in">Out</span><span class="hljs-punctuation">[</span><span class="hljs-number">29</span><span class="hljs-punctuation">]</span><span class="hljs-operator">:</span> <span class="hljs-built_in">True</span><br></code></pre></td></tr></table></figure><h4 id="查看类型"><a href="#查看类型" class="headerlink" title="查看类型"></a>查看类型</h4><figure class="highlight stylus"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><code class="hljs stylus">In <span class="hljs-selector-attr">[24]</span>: <span class="hljs-selector-tag">a</span> = tf<span class="hljs-selector-class">.constant</span>(<span class="hljs-selector-attr">[1.]</span>)<br>In <span class="hljs-selector-attr">[25]</span>: <span class="hljs-selector-tag">b</span> = tf<span class="hljs-selector-class">.constant</span>(<span class="hljs-selector-attr">[True,False]</span>)<br>In <span class="hljs-selector-attr">[26]</span>: c = tf<span class="hljs-selector-class">.constant</span>(<span class="hljs-string">&#x27;hello&#x27;</span>)<br><br>In <span class="hljs-selector-attr">[30]</span>: <span class="hljs-selector-tag">a</span><span class="hljs-selector-class">.dtype</span>,<span class="hljs-selector-tag">b</span><span class="hljs-selector-class">.dtype</span>,c<span class="hljs-selector-class">.dtype</span><br>Out<span class="hljs-selector-attr">[30]</span>: (tf<span class="hljs-selector-class">.float32</span>, tf<span class="hljs-selector-class">.bool</span>, tf.string)<br></code></pre></td></tr></table></figure><h4 id="数字类型转换"><a href="#数字类型转换" class="headerlink" title="数字类型转换"></a>数字类型转换</h4><figure class="highlight stylus"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><code class="hljs stylus">In <span class="hljs-selector-attr">[4]</span>: <span class="hljs-selector-tag">a</span> = np<span class="hljs-selector-class">.arange</span>(<span class="hljs-number">5</span>)<br>In <span class="hljs-selector-attr">[5]</span>: <span class="hljs-selector-tag">a</span><span class="hljs-selector-class">.dtype</span><br>Out<span class="hljs-selector-attr">[5]</span>: <span class="hljs-built_in">dtype</span>(<span class="hljs-string">&#x27;int64&#x27;</span>)<br>In <span class="hljs-selector-attr">[6]</span>: aa = tf<span class="hljs-selector-class">.convert_to_tensor</span>(a)<br>#&lt;tf<span class="hljs-selector-class">.Tensor</span>: shape=(<span class="hljs-number">5</span>,), dtype=int64, numpy=<span class="hljs-built_in">array</span>(<span class="hljs-selector-attr">[0, 1, 2, 3, 4]</span>)&gt;<br>In <span class="hljs-selector-attr">[8]</span>: aa = tf<span class="hljs-selector-class">.convert_to_tensor</span>(<span class="hljs-selector-tag">a</span>,dtype=tf.int32)<br>#&lt;tf<span class="hljs-selector-class">.Tensor</span>: shape=(<span class="hljs-number">5</span>,), dtype=int32, numpy=<span class="hljs-built_in">array</span>(<span class="hljs-selector-attr">[0, 1, 2, 3, 4]</span>, dtype=int32)&gt;<br><br>In <span class="hljs-selector-attr">[10]</span>: tf<span class="hljs-selector-class">.cast</span>(aa,dtype = tf.float32) <span class="hljs-selector-id">#Tensor</span> aa 从整型转换为 float32<br>Out<span class="hljs-selector-attr">[10]</span>: &lt;tf<span class="hljs-selector-class">.Tensor</span>: shape=(<span class="hljs-number">5</span>,), dtype=float32, numpy=<span class="hljs-built_in">array</span>(<span class="hljs-selector-attr">[0., 1., 2., 3., 4.]</span>, dtype=float32)&gt;<br><br>In <span class="hljs-selector-attr">[13]</span>: aaa = tf<span class="hljs-selector-class">.cast</span>(aa,dtype = tf.double)<br>#&lt;tf<span class="hljs-selector-class">.Tensor</span>: shape=(<span class="hljs-number">5</span>,), dtype=float64, numpy=<span class="hljs-built_in">array</span>(<span class="hljs-selector-attr">[0., 1., 2., 3., 4.]</span>)&gt;<br><br>In <span class="hljs-selector-attr">[15]</span>: tf<span class="hljs-selector-class">.cast</span>(aaa,dtype = tf.int32)<br>Out<span class="hljs-selector-attr">[15]</span>: &lt;tf<span class="hljs-selector-class">.Tensor</span>: shape=(<span class="hljs-number">5</span>,), dtype=int32, numpy=<span class="hljs-built_in">array</span>(<span class="hljs-selector-attr">[0, 1, 2, 3, 4]</span>, dtype=int32)&gt;<br></code></pre></td></tr></table></figure><h4 id="bool类型转换"><a href="#bool类型转换" class="headerlink" title="bool类型转换"></a>bool类型转换</h4><figure class="highlight stylus"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><code class="hljs stylus">In <span class="hljs-selector-attr">[16]</span>: <span class="hljs-selector-tag">b</span> = tf<span class="hljs-selector-class">.constant</span>(<span class="hljs-selector-attr">[0,1]</span>)<br>In <span class="hljs-selector-attr">[17]</span>: tf<span class="hljs-selector-class">.cast</span>(<span class="hljs-selector-tag">b</span>,dtype=tf.bool)<br>Out<span class="hljs-selector-attr">[17]</span>: &lt;tf<span class="hljs-selector-class">.Tensor</span>: shape=(<span class="hljs-number">2</span>,), dtype=bool, numpy=<span class="hljs-built_in">array</span>(<span class="hljs-selector-attr">[False,  True]</span>)&gt;<br><br>In <span class="hljs-selector-attr">[18]</span>: bb=tf<span class="hljs-selector-class">.cast</span>(<span class="hljs-selector-tag">b</span>,dtype = tf.int32)<br>#&lt;tf<span class="hljs-selector-class">.Tensor</span>: shape=(<span class="hljs-number">2</span>,), dtype=int32, numpy=<span class="hljs-built_in">array</span>(<span class="hljs-selector-attr">[0, 1]</span>, dtype=int32)&gt;<br></code></pre></td></tr></table></figure><h4 id="tf-Variable类型"><a href="#tf-Variable类型" class="headerlink" title="tf.Variable类型"></a>tf.Variable类型</h4><p>专门为神经网络设计的参数，针对可优化的参数，例如线性回归中的w和b，将Tensor包成Variable</p><figure class="highlight stylus"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><code class="hljs stylus">In <span class="hljs-selector-attr">[20]</span>: <span class="hljs-selector-tag">a</span> = tf<span class="hljs-selector-class">.range</span>(<span class="hljs-number">5</span>)<br>In <span class="hljs-selector-attr">[21]</span>: <span class="hljs-selector-tag">b</span> = tf<span class="hljs-selector-class">.Variable</span>(<span class="hljs-selector-tag">a</span>,name = <span class="hljs-string">&#x27;input_data&#x27;</span>)<br>In <span class="hljs-selector-attr">[22]</span>: <span class="hljs-selector-tag">b</span><span class="hljs-selector-class">.dtype</span><br>Out<span class="hljs-selector-attr">[22]</span>: tf<span class="hljs-selector-class">.int32</span><br>In <span class="hljs-selector-attr">[23]</span>: <span class="hljs-selector-tag">b</span><span class="hljs-selector-class">.name</span><br>Out<span class="hljs-selector-attr">[23]</span>: <span class="hljs-string">&#x27;input_data:0&#x27;</span><br>In <span class="hljs-selector-attr">[31]</span>: <span class="hljs-selector-tag">b</span><span class="hljs-selector-class">.trainable</span><br>Out<span class="hljs-selector-attr">[31]</span>: True<br><br>In <span class="hljs-selector-attr">[27]</span>: <span class="hljs-built_in">isinstance</span>(<span class="hljs-selector-tag">b</span>,tf.Tensor) #所以不推荐使用<br>Out<span class="hljs-selector-attr">[27]</span>: False<br>In <span class="hljs-selector-attr">[29]</span>: <span class="hljs-built_in">isinstance</span>(<span class="hljs-selector-tag">a</span>,tf.Tensor)<br>Out<span class="hljs-selector-attr">[29]</span>: True<br>In <span class="hljs-selector-attr">[30]</span>: tf<span class="hljs-selector-class">.is_tensor</span>(b)<br>Out<span class="hljs-selector-attr">[30]</span>: True<br></code></pre></td></tr></table></figure><p>在运行当中Tensor一般在GPU当中，但是如果要在cpu进行一些控制逻辑，则需要将Tensor转换为numpy类型</p>]]>
    </content>
    <id>https://www.wakli.com/2020/03/16/Tensorflow2%E6%95%B0%E6%8D%AE%E7%B1%BB%E5%9E%8B/</id>
    <link href="https://www.wakli.com/2020/03/16/Tensorflow2%E6%95%B0%E6%8D%AE%E7%B1%BB%E5%9E%8B/"/>
    <published>2020-03-16T05:35:15.000Z</published>
    <summary>
      <![CDATA[<h3 id="数据载体"><a href="#数据载体" class="headerlink" title="数据载体"></a>数据载体</h3><ul>
<li>list: 一个非常灵活的数据载体，可以添加任何类型数据类型，随意的添加删除管理 但是对于图片型数据消耗内存空间过大，且读取写入效率低</li>
<li>np.array: 专门用于解决同类型数据的运算例如同样大小的图片[64,32,32,3]</li>
<li>tf.tensor: 在神经网络上的功能比numpy更优秀。</li>
</ul>]]>
    </summary>
    <title>Tensorflow2-数据类型</title>
    <updated>2026-07-20T02:03:48.871Z</updated>
  </entry>
  <entry>
    <author>
      <name>王康力</name>
    </author>
    <category term="机器学习" scheme="https://www.wakli.com/categories/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0/"/>
    <category term="Tensorflow" scheme="https://www.wakli.com/categories/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0/Tensorflow/"/>
    <content>
      <![CDATA[<h2 id="MNIST手写数字识别问题"><a href="#MNIST手写数字识别问题" class="headerlink" title="MNIST手写数字识别问题"></a>MNIST手写数字识别问题</h2><h3 id="数据集"><a href="#数据集" class="headerlink" title="数据集"></a>数据集</h3><p>包含10种数字，每种数字7000张图片，60k进行训练，10k进行测试。</p><p>每张图片是大小为28*28的每一个像素点灰度值为0-255的灰度图片，每张图片存储为[28,28,1]。</p><p>将[28*28]-&gt; n行拼接在n-1行的末尾 -&gt; 一维的[784]</p><span id="more"></span><h3 id="输入和输出-Input-and-Output"><a href="#输入和输出-Input-and-Output" class="headerlink" title="输入和输出 Input and Output"></a>输入和输出 Input and Output</h3><ul><li>x:[b,784] b为图片数量</li><li>prediction：(独热编码输出结果)dog &#x3D; [1,0,0..],cat &#x3D; [0,1,0…],fish &#x3D; [0,0,1…]</li><li>独热编码 One-Hot：每一种类别拥有一个具体的节点输出，每一个节点输出一个值（归一化为0-1之间的值，值的意义为属于该类别的概率），所有节点输出值的和为1，最大概率理解为当前类别的置信度，取最大概率节点的分类作为当前物体识别的结果。</li></ul><h3 id="使用回归方法进行分类"><a href="#使用回归方法进行分类" class="headerlink" title="使用回归方法进行分类"></a>使用回归方法进行分类</h3><ul><li><p>Regression：y &#x3D; w*x +b  输出为实数范围 线性模型</p></li><li><p>Classification: out&#x3D; X@W + b  (矩阵乘法)   输出为向量</p></li><li><p>eg：4分类，输出为5维，长度为4的向量[0.1,0.8,0.02,0.08] 则预测类别为值为0.8节点所代表的类别</p></li></ul><h3 id="MINST具体问题"><a href="#MINST具体问题" class="headerlink" title="MINST具体问题"></a>MINST具体问题</h3><h4 id="线性模型方法-Linear"><a href="#线性模型方法-Linear" class="headerlink" title="线性模型方法 Linear"></a>线性模型方法 Linear</h4><ul><li><p>out  &#x3D;  X@W + b</p></li><li><p>X:[b,784]  W:[784,10]  b:[10]   -&gt;  out:[1,10]</p></li></ul><p>作为图片识别的的逻辑是非常复杂的，线性模型是不能完成手写数字识别这种复杂的任务。所以我们引入非线性因子，添加非线性的f函数，非线性函数才能引入非线性因子。</p><ul><li>out &#x3D; <font color = 'red'>f</font>(X@W + b) 我们称f函数为<font color = 'red'>激活函数</font></li><li>常见激活函数：ReLU（非常简单但非线性）</li></ul><img width=250 src="/2020/03/15/利用回归方法进行手写数字识别/img1.png" ><p>加入relu激活函数后对于图片数据集还是太简单，所以添加隐藏层</p><p>X,W,b1 -&gt; </p><p>h1 &#x3D; relu(X@W1+ b1) -&gt; </p><p>h2 &#x3D; relu(h1@W2 + b2) -&gt; </p><p>out &#x3D; relu(h2@W3 + b3) -&gt; out</p><h4 id="实际计算过程"><a href="#实际计算过程" class="headerlink" title="实际计算过程"></a>实际计算过程</h4><p>X &#x3D; [1,784]</p><p>h1 &#x3D; relu(X@W1+ b1)</p><p>W1:[784,512],b1:[1,512]  -&gt; h1:[1,512] 一个降维的过程</p><p>h2 &#x3D; relu(h1@W2 + b2)</p><p>W2:[512,256],b1[1,256] -&gt; h2:[1,256]</p><p>out &#x3D; relu(h2@W3 + b3)</p><p>W3:[256,10],b3[1,10] -&gt; out:[1,10]  eg:[0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.8]</p><h4 id="Loss-优化参数"><a href="#Loss-优化参数" class="headerlink" title="Loss 优化参数"></a>Loss 优化参数</h4><p>out:[1,10]</p><p>Y&#x2F;label:0~9 eg: 1-&gt; [0,1,0,0,0,0,0,0,0,0]  (one-hot 编码)</p><p>欧式距离 Euclidean Distance：out-&gt;lable </p><p>目的使out越来越接近y，使用均方误差MSE，或者说欧式距离</p><p>eg:[0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.8]-&gt; [0,0,0,0,0,0,0,0,0,1]</p><img width=150 src="/2020/03/15/利用回归方法进行手写数字识别/img2.png" ><h4 id="整体步骤"><a href="#整体步骤" class="headerlink" title="整体步骤"></a>整体步骤</h4><ol><li>计算 [h1,h2,out]</li><li>计算 Loss</li><li>计算梯度并优化[W1‘,b1’,W2’,b2’,W3’,b3’]</li><li>循环</li></ol><h3 id="使用Tensorflow进行代码测试"><a href="#使用Tensorflow进行代码测试" class="headerlink" title="使用Tensorflow进行代码测试"></a>使用Tensorflow进行代码测试</h3><h4 id="数据准备"><a href="#数据准备" class="headerlink" title="数据准备"></a>数据准备</h4><p>通过datasets可以直接获取mnist数据集，这里我们只获取(xs,ys)为前60000张图片</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><code class="hljs python"><span class="hljs-keyword">import</span> tensorflow <span class="hljs-keyword">as</span> tf<br><span class="hljs-keyword">from</span> tensorflow <span class="hljs-keyword">import</span> keras<br><span class="hljs-keyword">from</span> tensorflow.keras <span class="hljs-keyword">import</span> datasets, layers , optimizers<br><br>(xs, ys),_ = datasets.mnist.load_data() <span class="hljs-comment">#返回numpy格式</span><br><span class="hljs-built_in">print</span>(<span class="hljs-string">&#x27;datasets&#x27;</span>,xs.shape,ys.shape)<br><br>xs = tf.convert_to_tensor(xs ,dtype = tf.float32) / <span class="hljs-number">255</span><br>train_dataset = tf.data.Dataset.from_tensor_slices((xs,ys)) <span class="hljs-comment">#转换出dataset类型，为了一次完成多个样本:[b,784]</span><br><br><span class="hljs-keyword">for</span> step , (x,y) <span class="hljs-keyword">in</span> <span class="hljs-built_in">enumerate</span>(db):<span class="hljs-comment"># db默认一次返回一张图片[1,784]</span><br>    <span class="hljs-built_in">print</span>(step,x.shape,y,y.shape)<br></code></pre></td></tr></table></figure><p>输出：可以看到一次只返回出一个样本并且可以看到y的值以及y的shape为()，也就是1个数</p><figure class="highlight elm"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><code class="hljs elm"><span class="hljs-title">datasets</span> (<span class="hljs-number">60000</span>, <span class="hljs-number">28</span>, <span class="hljs-number">28</span>) (<span class="hljs-number">60000</span>,) #x的shape，y的shape<br><span class="hljs-number">0</span> (<span class="hljs-number">28</span>, <span class="hljs-number">28</span>) tf.<span class="hljs-type">Tensor</span>(<span class="hljs-number">5</span>, shape=(), d<span class="hljs-keyword">type</span>=uint8) ()<br><span class="hljs-number">1</span> (<span class="hljs-number">28</span>, <span class="hljs-number">28</span>) tf.<span class="hljs-type">Tensor</span>(<span class="hljs-number">0</span>, shape=(), d<span class="hljs-keyword">type</span>=uint8) ()<br><span class="hljs-number">2</span> (<span class="hljs-number">28</span>, <span class="hljs-number">28</span>) tf.<span class="hljs-type">Tensor</span>(<span class="hljs-number">4</span>, shape=(), d<span class="hljs-keyword">type</span>=uint8) ()<br>.....<br><span class="hljs-number">3839</span> (<span class="hljs-number">28</span>, <span class="hljs-number">28</span>) tf.<span class="hljs-type">Tensor</span>(<span class="hljs-number">5</span>, shape=(), d<span class="hljs-keyword">type</span>=uint8) ()<br><span class="hljs-number">3840</span> (<span class="hljs-number">28</span>, <span class="hljs-number">28</span>) tf.<span class="hljs-type">Tensor</span>(<span class="hljs-number">7</span>, shape=(), d<span class="hljs-keyword">type</span>=uint8) ()<br><span class="hljs-number">3841</span> (<span class="hljs-number">28</span>, <span class="hljs-number">28</span>) tf.<span class="hljs-type">Tensor</span>(<span class="hljs-number">6</span>, shape=(), d<span class="hljs-keyword">type</span>=uint8) ()<br>...<br></code></pre></td></tr></table></figure><p>引入batch操作，一次可以提取多个样本,在转换dataset类型是加入.batch()方法</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs python">db = tf.data.Dataset.from_tensor_slices((xs,ys)).batch(<span class="hljs-number">32</span>) <br></code></pre></td></tr></table></figure><p>输出为：可以看到y的shape为(32, )</p><figure class="highlight apache"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs apache"><span class="hljs-attribute">1866</span> (<span class="hljs-number">32</span>, <span class="hljs-number">28</span>, <span class="hljs-number">28</span>) tf.Tensor([<span class="hljs-number">0</span> <span class="hljs-number">1</span> <span class="hljs-number">2</span> <span class="hljs-number">3</span> <span class="hljs-number">4</span> <span class="hljs-number">7</span> <span class="hljs-number">8</span> <span class="hljs-number">9</span> <span class="hljs-number">2</span> <span class="hljs-number">2</span> <span class="hljs-number">4</span> <span class="hljs-number">0</span> <span class="hljs-number">7</span> <span class="hljs-number">3</span> <span class="hljs-number">5</span> <span class="hljs-number">4</span> <span class="hljs-number">1</span> <span class="hljs-number">8</span> <span class="hljs-number">0</span> <span class="hljs-number">5</span> <span class="hljs-number">2</span> <span class="hljs-number">7</span> <span class="hljs-number">2</span> <span class="hljs-number">3</span> <span class="hljs-number">6</span> <span class="hljs-number">2</span> <span class="hljs-number">1</span> <span class="hljs-number">7</span> <span class="hljs-number">7</span> <span class="hljs-number">9</span> <span class="hljs-number">2</span> <span class="hljs-number">4</span>], shape=(<span class="hljs-number">32</span>,), dtype=uint8) (<span class="hljs-number">32</span>,)<br></code></pre></td></tr></table></figure><h4 id="模型准备"><a href="#模型准备" class="headerlink" title="模型准备"></a>模型准备</h4><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><code class="hljs python">model = keras.Sequential(<br>    [<br>    layers.Dense(<span class="hljs-number">512</span>,activation = <span class="hljs-string">&#x27;relu&#x27;</span>), <span class="hljs-comment">#Dense 全连接</span><br>    layers.Dense(<span class="hljs-number">256</span>,activation = <span class="hljs-string">&#x27;relu&#x27;</span>),<br>    layers.Dense(<span class="hljs-number">10</span>)<br>    ]<br>)<br>optimizer = optimizers.SGD(learning_rate = <span class="hljs-number">0.001</span>) <span class="hljs-comment">#优化器 不需要人为对每一个参数设定更新规则</span><br></code></pre></td></tr></table></figure><h4 id="前向运算-计算h1、2、3"><a href="#前向运算-计算h1、2、3" class="headerlink" title="前向运算 计算h1、2、3"></a>前向运算 计算h1、2、3</h4><img width=150 src="/2020/03/15/利用回归方法进行手写数字识别/img3.png" ><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><code class="hljs python"><span class="hljs-keyword">with</span> tf.GradientTape() <span class="hljs-keyword">as</span> tape:<br>    x =tf.reshape(x,(-<span class="hljs-number">1</span>,<span class="hljs-number">28</span>*<span class="hljs-number">28</span>))<br>    out = model(x) <span class="hljs-comment">#进行运算[b,784]-&gt;[b,10]</span><br>    loss = tf.reduce_sum(tf.square(out - y))/x.shape[<span class="hljs-number">0</span>] <br></code></pre></td></tr></table></figure><h4 id="更新"><a href="#更新" class="headerlink" title="更新"></a>更新</h4><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><code class="hljs python"><span class="hljs-comment">#自动进行求偏导不用人为求导 输入为w1, w2, w3, b1, b2, b3 返回他们按照顺序求导结果</span><br>grads = tape.gradient(loss, model.trainable_variables)<br><span class="hljs-comment">#对所有参数进行更新</span><br>optimizer.apply_gradients(<span class="hljs-built_in">zip</span>(grads, model.trainable_variables))<br></code></pre></td></tr></table></figure><h4 id="循环"><a href="#循环" class="headerlink" title="循环"></a>循环</h4><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><code class="hljs python"><span class="hljs-keyword">def</span> <span class="hljs-title function_">train_epoch</span>(<span class="hljs-params">epoch</span>):<br>    <span class="hljs-keyword">for</span> step, (x, y) <span class="hljs-keyword">in</span> <span class="hljs-built_in">enumerate</span>(train_dataset):  <span class="hljs-comment">#32次</span><br>        <span class="hljs-built_in">print</span>(step, x.shape, y, y.shape)<br>        <span class="hljs-keyword">with</span> tf.GradientTape() <span class="hljs-keyword">as</span> tape:<br>            x =tf.reshape(x,(-<span class="hljs-number">1</span>,<span class="hljs-number">28</span>*<span class="hljs-number">28</span>))<br>            out = model(x) <span class="hljs-comment">#进行运算[b,784]-&gt;[b,10]</span><br>            loss = tf.reduce_sum(tf.square(out - y))/x.shape[<span class="hljs-number">0</span>]<br>        <span class="hljs-comment">#自动进行求偏导不用人为求导 输入为w1, w2, w3, b1, b2, b3 返回他们按照顺序求导结果</span><br>        grads = tape.gradient(loss, model.trainable_variables)<br>        <span class="hljs-comment">#把在loss中更新的梯度更新到权值当中去</span><br>        optimizer.apply_gradients(<span class="hljs-built_in">zip</span>(grads, model.trainable_variables))<br>        <span class="hljs-keyword">if</span> step %<span class="hljs-number">100</span> == <span class="hljs-number">0</span>:<br>            <span class="hljs-built_in">print</span>(epoch,step,loss.numpy())<br></code></pre></td></tr></table></figure><h3 id="完整结果"><a href="#完整结果" class="headerlink" title="完整结果"></a>完整结果</h3><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br></pre></td><td class="code"><pre><code class="hljs python"><span class="hljs-keyword">import</span> tensorflow <span class="hljs-keyword">as</span> tf<br><span class="hljs-keyword">from</span> tensorflow <span class="hljs-keyword">import</span> keras<br><span class="hljs-keyword">from</span> tensorflow.keras <span class="hljs-keyword">import</span> datasets, layers , optimizers<br><br>(x, y), (x_val, y_val) = datasets.mnist.load_data()  <span class="hljs-comment">#返回numpy格式</span><br>x = tf.convert_to_tensor(x, dtype=tf.float32) / <span class="hljs-number">255.</span><br>y = tf.convert_to_tensor(y, dtype=tf.int32)<br>y = tf.one_hot(y, depth=<span class="hljs-number">10</span>)<br><span class="hljs-built_in">print</span>(x.shape, y.shape)<br>train_dataset = tf.data.Dataset.from_tensor_slices((x, y))<br>train_dataset = train_dataset.batch(<span class="hljs-number">32</span>)<span class="hljs-comment">#转换出dataset类型，为了一次完成多个样本:[b,784]</span><br><br><span class="hljs-comment"># for step , (x,y) in enumerate(db):# db默认一次返回一张图片[1,784]</span><br><span class="hljs-comment">#     print(step,x.shape,y,y.shape)</span><br><br>model = keras.Sequential(<br>    [<br>    layers.Dense(<span class="hljs-number">512</span>,activation = <span class="hljs-string">&#x27;relu&#x27;</span>), <span class="hljs-comment">#Dense 全连接</span><br>    layers.Dense(<span class="hljs-number">256</span>,activation = <span class="hljs-string">&#x27;relu&#x27;</span>),<br>    layers.Dense(<span class="hljs-number">10</span>)<br>    ]<br>)<br>optimizer = optimizers.SGD(learning_rate = <span class="hljs-number">0.001</span>) <span class="hljs-comment">#优化器 不需要人为对每一个参数设定更新规则</span><br><br><span class="hljs-keyword">def</span> <span class="hljs-title function_">train_epoch</span>(<span class="hljs-params">epoch</span>):<br>    <span class="hljs-keyword">for</span> step, (x, y) <span class="hljs-keyword">in</span> <span class="hljs-built_in">enumerate</span>(train_dataset):  <span class="hljs-comment">#60000/32 次</span><br><br>        <span class="hljs-keyword">with</span> tf.GradientTape() <span class="hljs-keyword">as</span> tape:<br>            x =tf.reshape(x,(-<span class="hljs-number">1</span>,<span class="hljs-number">28</span>*<span class="hljs-number">28</span>))<br>            out = model(x) <span class="hljs-comment">#进行运算[b,784]-&gt;[b,10]</span><br>            loss = tf.reduce_sum(tf.square(out - y))/x.shape[<span class="hljs-number">0</span>]<br>        <span class="hljs-comment">#自动进行求偏导不用人为求导 输入为w1, w2, w3, b1, b2, b3 返回他们按照顺序求导结果</span><br>        grads = tape.gradient(loss, model.trainable_variables)<br>        <span class="hljs-comment">#把在loss中更新的梯度更新到权值当中去</span><br>        optimizer.apply_gradients(<span class="hljs-built_in">zip</span>(grads, model.trainable_variables))<br>        <span class="hljs-keyword">if</span> step %<span class="hljs-number">100</span> == <span class="hljs-number">0</span>:<br>            <span class="hljs-built_in">print</span>(epoch,step,loss.numpy())<br><br><span class="hljs-keyword">def</span> <span class="hljs-title function_">train</span>():<br><br>    <span class="hljs-keyword">for</span> epoch <span class="hljs-keyword">in</span> <span class="hljs-built_in">range</span>(<span class="hljs-number">30</span>):<br><br>        train_epoch(epoch)<br><br><span class="hljs-keyword">if</span> __name__ == <span class="hljs-string">&#x27;__main__&#x27;</span>:<br>    train()<br></code></pre></td></tr></table></figure><img width=300 src="/2020/03/15/利用回归方法进行手写数字识别/img4.png" >]]>
    </content>
    <id>https://www.wakli.com/2020/03/15/%E5%88%A9%E7%94%A8%E5%9B%9E%E5%BD%92%E6%96%B9%E6%B3%95%E8%BF%9B%E8%A1%8C%E6%89%8B%E5%86%99%E6%95%B0%E5%AD%97%E8%AF%86%E5%88%AB/</id>
    <link href="https://www.wakli.com/2020/03/15/%E5%88%A9%E7%94%A8%E5%9B%9E%E5%BD%92%E6%96%B9%E6%B3%95%E8%BF%9B%E8%A1%8C%E6%89%8B%E5%86%99%E6%95%B0%E5%AD%97%E8%AF%86%E5%88%AB/"/>
    <published>2020-03-15T06:17:12.000Z</published>
    <summary>
      <![CDATA[<h2 id="MNIST手写数字识别问题"><a href="#MNIST手写数字识别问题" class="headerlink" title="MNIST手写数字识别问题"></a>MNIST手写数字识别问题</h2><h3 id="数据集"><a href="#数据集" class="headerlink" title="数据集"></a>数据集</h3><p>包含10种数字，每种数字7000张图片，60k进行训练，10k进行测试。</p>
<p>每张图片是大小为28*28的每一个像素点灰度值为0-255的灰度图片，每张图片存储为[28,28,1]。</p>
<p>将[28*28]-&gt; n行拼接在n-1行的末尾 -&gt; 一维的[784]</p>]]>
    </summary>
    <title>利用回归方法进行手写数字识别</title>
    <updated>2026-07-20T02:03:48.871Z</updated>
  </entry>
  <entry>
    <author>
      <name>王康力</name>
    </author>
    <category term="机器学习" scheme="https://www.wakli.com/categories/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0/"/>
    <category term="梯度下降" scheme="https://www.wakli.com/tags/%E6%A2%AF%E5%BA%A6%E4%B8%8B%E9%99%8D/"/>
    <content>
      <![CDATA[<h2 id="梯度下降-Gradient-Descent"><a href="#梯度下降-Gradient-Descent" class="headerlink" title="梯度下降 Gradient Descent"></a>梯度下降 Gradient Descent</h2><img width=150 src="/2020/03/13/回归问题学习/img1.png" ><p>lr：learning rate 学习率</p><p>函数导数的方向指向的是函数变大的方向，函数向左增大，导数&gt;0，反之&lt;0，公式中减去导数即意味着寻找减小的方向，寻找最小值，lr作用防止导数过大导致越过最小值，一般取值很小。</p><h3 id="多点图-线性拟合-y-wx-b"><a href="#多点图-线性拟合-y-wx-b" class="headerlink" title="多点图 线性拟合 y&#x3D;wx+b"></a>多点图 线性拟合 y&#x3D;wx+b</h3><img width=230 src="/2020/03/13/回归问题学习/img2.png" ><span id="more"></span><img width=600 src="/2020/03/13/回归问题学习/img3.png" ><p> loss函数，也称为损失函数，易见loss函数取值越小，拟合程度越好</p><img width=300 src="/2020/03/13/回归问题学习/img4.png" ><h3 id="代码实现"><a href="#代码实现" class="headerlink" title="代码实现"></a>代码实现</h3><p><strong>求当前loss平均</strong></p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><code class="hljs [python]">def compute_loss_for_line_given_points(b,w,points): #b&amp;w为每次迭代之前的初始值，point100个点[100,2]<br>    totalLoss = 0<br>    for i in range(0,len(points)):<br>        x = points[i,0] #p[i][0]<br>        y = points[i,1]<br>        totalLoss += (y - (w*x +b)) **2<br>    return totalLoss/float(len(points)) #loss函数取平均<br></code></pre></td></tr></table></figure><p><strong>对loss函数求w与b偏导</strong></p><img width=500 src="/2020/03/13/回归问题学习/img5.png" ><img width=495 src="/2020/03/13/回归问题学习/img6.png" ><p><strong>进行一次梯度下降</strong></p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><code class="hljs python"><span class="hljs-keyword">def</span> <span class="hljs-title function_">step_gradient</span>(<span class="hljs-params">b_current, w_current, points, learningRate</span>):<br>    b_gradient = <span class="hljs-number">0</span><br>    w_gradient = <span class="hljs-number">0</span><br>    N = <span class="hljs-built_in">float</span>(<span class="hljs-built_in">len</span>(points))<br>    <span class="hljs-keyword">for</span> i <span class="hljs-keyword">in</span> <span class="hljs-built_in">range</span>(<span class="hljs-number">0</span>, <span class="hljs-built_in">len</span>(points)):<br>        x = points[i, <span class="hljs-number">0</span>]<br>        y = points[i, <span class="hljs-number">1</span>]<br>        <span class="hljs-comment"># grad_b = 2(wx+b-y)</span><br>        b_gradient += (<span class="hljs-number">2</span>/N) * ((w_current * x + b_current) - y)<br>        <span class="hljs-comment"># grad_w = 2(wx+b-y)*x</span><br>        w_gradient += (<span class="hljs-number">2</span>/N) * x * ((w_current * x + b_current) - y)<br>    <span class="hljs-comment"># update w&#x27;</span><br>    new_b = b_current - (learningRate * b_gradient)<br>    new_w = w_current - (learningRate * w_gradient)<br>    <span class="hljs-keyword">return</span> [new_b, new_w]<br></code></pre></td></tr></table></figure><p><strong>进行迭代</strong></p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><code class="hljs python"><span class="hljs-keyword">def</span> <span class="hljs-title function_">gradient_descent_runner</span>(<span class="hljs-params">points, starting_b, starting_w, learning_rate, num_iterations</span>):<br>    b = starting_b<br>    w = starting_w<br>    <span class="hljs-comment"># update for several times</span><br>    <span class="hljs-keyword">for</span> i <span class="hljs-keyword">in</span> <span class="hljs-built_in">range</span>(num_iterations):<br>        b, w = step_gradient(b, w, np.array(points), learning_rate)<br>        <span class="hljs-keyword">if</span> i&lt;<span class="hljs-number">10</span>  <span class="hljs-keyword">or</span> i % <span class="hljs-number">1000</span> ==<span class="hljs-number">0</span>:<br>            <span class="hljs-built_in">print</span>(<span class="hljs-string">&quot;After &#123;0&#125; iterations b = &#123;1&#125;, w = &#123;2&#125;, loss = &#123;3&#125;&quot;</span>.<span class="hljs-built_in">format</span>(i, b, w,compute_loss_for_line_given_points(b, w, points)))<br>            <span class="hljs-comment">#输出前10次迭代和每千次迭代loss值</span><br>    <span class="hljs-keyword">return</span> [b, w]<br></code></pre></td></tr></table></figure><p><strong>运行</strong></p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><code class="hljs python"><span class="hljs-keyword">import</span> numpy <span class="hljs-keyword">as</span> np<br><span class="hljs-keyword">def</span> <span class="hljs-title function_">run</span>():<br>    points = np.genfromtxt(<span class="hljs-string">&quot;data.csv&quot;</span>, delimiter=<span class="hljs-string">&quot;,&quot;</span>)<br>    learning_rate = <span class="hljs-number">0.0001</span><br>    initial_b = <span class="hljs-number">0</span>  <span class="hljs-comment"># initial y-intercept guess</span><br>    initial_w = <span class="hljs-number">0</span>  <span class="hljs-comment"># initial slope guess</span><br>    num_iterations = <span class="hljs-number">1000</span><br>    <span class="hljs-built_in">print</span>(<span class="hljs-string">&quot;Starting gradient descent at b = &#123;0&#125;, w = &#123;1&#125;, loss = &#123;2&#125;&quot;</span><br>          .<span class="hljs-built_in">format</span>(initial_b, initial_w,<br>                  compute_loss_for_line_given_points(initial_b, initial_w, points))<br>          )<br>    <span class="hljs-built_in">print</span>(<span class="hljs-string">&quot;Running...&quot;</span>)<br>    [b, w] = gradient_descent_runner(points, initial_b, initial_w, learning_rate, num_iterations)<br>    <span class="hljs-built_in">print</span>(<span class="hljs-string">&quot;After &#123;0&#125; iterations b = &#123;1&#125;, w = &#123;2&#125;, loss = &#123;3&#125;&quot;</span>.<br>          <span class="hljs-built_in">format</span>(num_iterations, b, w,<br>                 compute_loss_for_line_given_points(b, w, points))<br>          )<br><br><span class="hljs-keyword">if</span> __name__ == <span class="hljs-string">&#x27;__main__&#x27;</span>:<br>    run()<br></code></pre></td></tr></table></figure><p>运行结果</p><img width=600 src="/2020/03/13/回归问题学习/img7.png" ><p>可以明显看到loss值的下降和w与b的变化</p>]]>
    </content>
    <id>https://www.wakli.com/2020/03/13/%E5%9B%9E%E5%BD%92%E9%97%AE%E9%A2%98%E5%AD%A6%E4%B9%A0/</id>
    <link href="https://www.wakli.com/2020/03/13/%E5%9B%9E%E5%BD%92%E9%97%AE%E9%A2%98%E5%AD%A6%E4%B9%A0/"/>
    <published>2020-03-13T14:40:47.000Z</published>
    <summary>
      <![CDATA[<h2 id="梯度下降-Gradient-Descent"><a href="#梯度下降-Gradient-Descent" class="headerlink" title="梯度下降 Gradient Descent"></a>梯度下降 Gradient Descent</h2><img width=150 src="/2020/03/13/回归问题学习/img1.png" >

<p>lr：learning rate 学习率</p>
<p>函数导数的方向指向的是函数变大的方向，函数向左增大，导数&gt;0，反之&lt;0，公式中减去导数即意味着寻找减小的方向，寻找最小值，lr作用防止导数过大导致越过最小值，一般取值很小。</p>
<h3 id="多点图-线性拟合-y-wx-b"><a href="#多点图-线性拟合-y-wx-b" class="headerlink" title="多点图 线性拟合 y&#x3D;wx+b"></a>多点图 线性拟合 y&#x3D;wx+b</h3><img width=230 src="/2020/03/13/回归问题学习/img2.png" >]]>
    </summary>
    <title>回归问题学习</title>
    <updated>2026-07-20T02:03:48.870Z</updated>
  </entry>
  <entry>
    <author>
      <name>王康力</name>
    </author>
    <category term="server" scheme="https://www.wakli.com/categories/server/"/>
    <category term="ssh" scheme="https://www.wakli.com/tags/ssh/"/>
    <category term="mac" scheme="https://www.wakli.com/tags/mac/"/>
    <content>
      <![CDATA[<p>解决每次访问服务器或者git提交需要输入服务器用户密码的繁琐过程</p><span id="more"></span><h2 id="正常操作"><a href="#正常操作" class="headerlink" title="正常操作"></a>正常操作</h2><p>打开终端，在本机生成ssh密钥</p><figure class="highlight ebnf"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs ebnf"><span class="hljs-attribute">ssh-keygen</span><br></code></pre></td></tr></table></figure><p>显示如下</p><figure class="highlight gradle"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs gradle">Generating <span class="hljs-keyword">public</span>/<span class="hljs-keyword">private</span> rsa key pair.<br>Enter <span class="hljs-keyword">file</span> in which to save the key (<span class="hljs-regexp">/Users/y</span>ourname<span class="hljs-regexp">/.ssh/i</span>d_rsa):<br></code></pre></td></tr></table></figure><p>此时默认存放在括号中位置，直接回车可以存放在默认位置。如果你有多种类型ssh连接比如工作、私人，你也可以定义在自己想要的位置及名称，比如我输入了 &#x2F;Users&#x2F;yourname&#x2F;.ssh&#x2F;id_rsa_test.接下来两个可以定义密码，我选择默认回车不使用密码，再次回车确认。此时会在.ssh文件夹下生成id_rsa_test以及id_rsa_test.pub</p><p>接下来将公钥id_rsa_test.pub中的全部复制到服务器～&#x2F;.ssh中的authorized_keys中，没有的话自己创建</p><p>方法一</p><figure class="highlight dockerfile"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs dockerfile">ssh-<span class="hljs-keyword">copy</span><span class="language-bash">-<span class="hljs-built_in">id</span> -i ~/.ssh/id_rsa_test.pub name@IP</span><br></code></pre></td></tr></table></figure><p>方法二 </p><p>直接复制id_rsa_test.pub中的内容，进入服务器中粘贴即可</p><p>两种方法最后无论如何都要进入服务器</p><p>将authorized_keys权限设置为600 .ssh权限设置为700</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-built_in">chmod</span> 600 ~/.ssh/authorized_keys<br><span class="hljs-built_in">chmod</span> 700 ~/.ssh<br></code></pre></td></tr></table></figure><p>最后一步在本机.ssh文件夹中新建config文件</p><figure class="highlight crmsh"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><code class="hljs crmsh">Host Test <span class="hljs-comment">#你的服务器别名</span><br>  HostName <span class="hljs-number">115.115</span>.<span class="hljs-number">115.115</span> <span class="hljs-comment">#你的服务器ip</span><br>  <span class="hljs-keyword">User</span> <span class="hljs-title">test</span> 你的服务器用户名<br>  IdentityFile ~/.ssh/id_rsa_test <span class="hljs-comment">#你的私钥</span><br></code></pre></td></tr></table></figure><p>现在尝试ssh test 成功</p><h2 id="曾经配置过的不能免密登陆了"><a href="#曾经配置过的不能免密登陆了" class="headerlink" title="曾经配置过的不能免密登陆了"></a>曾经配置过的不能免密登陆了</h2><p>此时无法ssh到服务器 此时使用刚才的ssh-copy-id name@IP命令会报类似以下错误</p><figure class="highlight pgsql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs pgsql">/usr/bin/ssh-<span class="hljs-keyword">copy</span>-id: <span class="hljs-built_in">WARNING</span>: <span class="hljs-keyword">All</span> keys were skipped because they already exist <span class="hljs-keyword">on</span> the remote <span class="hljs-keyword">system</span>.<br></code></pre></td></tr></table></figure><p>我们此时删除主机上的authorized_keys，并在重新创建新的key</p><p>重复创建时的操作</p><h2 id="mac在finder中查看隐藏文件方法"><a href="#mac在finder中查看隐藏文件方法" class="headerlink" title="mac在finder中查看隐藏文件方法"></a>mac在finder中查看隐藏文件方法</h2><p>正常在终端中查看隐藏文件可以使用</p><figure class="highlight stata"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs stata"><span class="hljs-keyword">ls</span> -<span class="hljs-keyword">la</span><br></code></pre></td></tr></table></figure><p>但是如果想在Finder中查看隐藏文件需要如下命令</p><figure class="highlight applescript"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs applescript">defaults <span class="hljs-built_in">write</span> com.apple.finder AppleShowAllFiles -<span class="hljs-built_in">boolean</span> <span class="hljs-literal">true</span>;killall Finder<br></code></pre></td></tr></table></figure><p>不需要查看隐藏文件功能时将true变为false即可</p><figure class="highlight applescript"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs applescript">defaults <span class="hljs-built_in">write</span> com.apple.finder AppleShowAllFiles -<span class="hljs-built_in">boolean</span> <span class="hljs-literal">false</span>;killall Finder<br></code></pre></td></tr></table></figure>]]>
    </content>
    <id>https://www.wakli.com/2020/03/08/SSH%E5%85%8D%E5%AF%86%E8%BF%9E%E6%8E%A5/</id>
    <link href="https://www.wakli.com/2020/03/08/SSH%E5%85%8D%E5%AF%86%E8%BF%9E%E6%8E%A5/"/>
    <published>2020-03-08T13:06:58.000Z</published>
    <summary>
      <![CDATA[<p>解决每次访问服务器或者git提交需要输入服务器用户密码的繁琐过程</p>]]>
    </summary>
    <title>SSH免密连接</title>
    <updated>2020-03-12T16:14:42.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>王康力</name>
    </author>
    <category term="SIPC通知" scheme="https://www.wakli.com/categories/SIPC%E9%80%9A%E7%9F%A5/"/>
    <category term="SIPC" scheme="https://www.wakli.com/tags/SIPC/"/>
    <content>
      <![CDATA[<h1 id="实战项目：新生学生组织选择及后台统计系统"><a href="#实战项目：新生学生组织选择及后台统计系统" class="headerlink" title="实战项目：新生学生组织选择及后台统计系统"></a>实战项目：新生学生组织选择及后台统计系统</h1><h2 id="学生创新实践中心实战项目招募"><a href="#学生创新实践中心实战项目招募" class="headerlink" title="学生创新实践中心实战项目招募"></a>学生创新实践中心实战项目招募</h2><blockquote><p><strong>面向19级计算机科学与工程学院本科生全体</strong></p><p><strong>要求</strong> ：<font color=#dc143c >扎实的C语言编程基础</font>，热爱编程，有强烈的学习钻研精神，肯将自身时间投入到编程学习当中</p><p><strong>招募分组</strong>：根据兴趣在后端组与Android组中二选一。</p><p><strong>招募截止时间</strong>：2020年3月11日 17:00</p></blockquote><span id="more"></span><h2 id="实战目标"><a href="#实战目标" class="headerlink" title="实战目标"></a>实战目标</h2><p>主要任务为前端与后端，如果有对Android感兴趣的同学可以加入Android学习组，利用疫情期间延迟开学的时间，用网课直播+自主学习形式带领同学们，掌握简单的项目开发，提升同学们对编程的认识以及兴趣，通过简单项目的学习可以通过自己后期的拓展完成更大型项目S</p><h3 id="任务分配"><a href="#任务分配" class="headerlink" title="任务分配"></a>任务分配</h3><p>前端：由学生创新实践中心前端组主要负责，带领19级科技协会前端组成员</p><p>后端：由学生创新实践中心Java组主要负责，带领19级科技协会JavaWeb组+19级实战学习同学</p><p>Android（附加练习实战）：由学生创新实践中心Android组负责，带领19级科技协会Android组+19级对Android感兴趣同学</p><h3 id="实战任务介绍"><a href="#实战任务介绍" class="headerlink" title="实战任务介绍"></a>实战任务介绍</h3><p><strong>前端1：新生学生组织选择页面</strong></p><blockquote><ol><li><p>添加志愿选项：包括收集学生姓名、学号、专业、班级、联系方式、志愿一、志愿二、申请理由。</p></li><li><p>修改志愿选项：填写与添加时使用的相同的姓名学号联系方式，确定为本人修改后修改志愿以及申请理由</p></li><li><p>标注截止日期时间，遇到问题发送邮件至邮箱：<a href="mailto:&#88;&#x58;&#x58;&#64;&#88;&#x58;&#88;&#46;&#99;&#111;&#x6d;">XXX@XXX.com</a></p></li><li><p>修改志愿时间与添加志愿时间错开</p></li></ol></blockquote><p><strong>前端2:后台查询页面</strong></p><blockquote><ol><li><p>使用管理员账户密码进行登录</p></li><li><p>分为超级管理员以及普通管理员</p></li><li><p>超级管理员登录可根据要求搜索全部志愿信息</p></li><li><p>普通管理员只允许查看所属学生组织全部志愿信息</p></li><li><p>下载统计excel</p></li></ol></blockquote><p><strong>后端</strong></p><blockquote><p>使用Java语言 主要使用SpringBoot框架</p><p>按照前端提到的相关要求进行代码编写</p></blockquote><p><strong>Android</strong></p><blockquote><p>实现与前端类似的功能，附加练习实战</p></blockquote><h3 id="项目成果验收"><a href="#项目成果验收" class="headerlink" title="项目成果验收"></a>项目成果验收</h3><p>项目实战课程结束后进入最终成果完成阶段，最终阶段持续2-3周完善或增加自己喜欢的功能，也可联系前端组成员进行项目综合，将完整项目运行至服务器。所有阶段完成后举行项目成果提交和展示环节，由授课组进行评审，根据项目完成情况以及创新程度给予相应评价，由学院颁发奖项或证书。</p><h3 id="项目组联系方式"><a href="#项目组联系方式" class="headerlink" title="项目组联系方式"></a>项目组联系方式</h3><p>项目负责人：王康力   qq：2675234980</p><p>项目qq群号：945542510</p><p>有意愿加入的同学可以直接加入项目qq群，并根据选择的方向为Android或者Java修改备注姓名 eg：Java-张三</p>]]>
    </content>
    <id>https://www.wakli.com/2020/03/07/test/</id>
    <link href="https://www.wakli.com/2020/03/07/test/"/>
    <published>2020-03-07T05:13:18.000Z</published>
    <summary>
      <![CDATA[<h1 id="实战项目：新生学生组织选择及后台统计系统"><a href="#实战项目：新生学生组织选择及后台统计系统" class="headerlink" title="实战项目：新生学生组织选择及后台统计系统"></a>实战项目：新生学生组织选择及后台统计系统</h1><h2 id="学生创新实践中心实战项目招募"><a href="#学生创新实践中心实战项目招募" class="headerlink" title="学生创新实践中心实战项目招募"></a>学生创新实践中心实战项目招募</h2><blockquote>
<p><strong>面向19级计算机科学与工程学院本科生全体</strong></p>
<p><strong>要求</strong> ：<font color=#dc143c >扎实的C语言编程基础</font>，热爱编程，有强烈的学习钻研精神，肯将自身时间投入到编程学习当中</p>
<p><strong>招募分组</strong>：根据兴趣在后端组与Android组中二选一。</p>
<p><strong>招募截止时间</strong>：2020年3月11日 17:00</p>
</blockquote>]]>
    </summary>
    <title>SIPC实战项目</title>
    <updated>2020-03-09T01:02:56.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>王康力</name>
    </author>
    <category term="机器学习" scheme="https://www.wakli.com/categories/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0/"/>
    <category term="Tensorflow" scheme="https://www.wakli.com/categories/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0/Tensorflow/"/>
    <category term="Tensorflow" scheme="https://www.wakli.com/tags/Tensorflow/"/>
    <category term="数据集" scheme="https://www.wakli.com/tags/%E6%95%B0%E6%8D%AE%E9%9B%86/"/>
    <content>
      <![CDATA[<h2 id="引言"><a href="#引言" class="headerlink" title="引言"></a>引言</h2><p>作为一个初学者，在大家平常的学习中都会使用类似于mnist这种可以直接下载导入的数据集，但是当在本地有一组文件层级如下的数据集需要导入处理时，没有什么好的直接的库可以使用，我在一次机器学习的比赛中便遇到了这样的问题</p><figure class="highlight 1c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><code class="hljs 1c"><span class="hljs-string">|-imagess</span><br><span class="hljs-string">|-apple</span><br><span class="hljs-string">|-1.jpg</span><br><span class="hljs-string">|-2.jpg</span><br><span class="hljs-string">|-3.jpg</span><br><span class="hljs-string">|-4.jpg</span><br><span class="hljs-string">|-5.jpg</span><br>...<br><span class="hljs-string">|-banana</span><br><span class="hljs-string">|-1.jpg</span><br><span class="hljs-string">|-2.jpg</span><br><span class="hljs-string">|-3.jpg</span><br>...<br> <span class="hljs-string">|-orange</span><br> ....<br></code></pre></td></tr></table></figure><span id="more"></span><h2 id="直接上代码"><a href="#直接上代码" class="headerlink" title="直接上代码"></a>直接上代码</h2><ul><li>首先导包</li></ul><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs python"><span class="hljs-keyword">import</span> os, cv2<br><span class="hljs-keyword">import</span> numpy <span class="hljs-keyword">as</span> np<br><span class="hljs-keyword">import</span> tensorflow <span class="hljs-keyword">as</span> tf<br></code></pre></td></tr></table></figure><ul><li>第一步遍历最外层根目录，获得子目录</li></ul><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs python">data_dir = <span class="hljs-string">&#x27;imagess/&#x27;</span><br>contents = os.listdir(data_dir)<br>classes = [each <span class="hljs-keyword">for</span> each <span class="hljs-keyword">in</span> contents <span class="hljs-keyword">if</span> os.path.isdir(data_dir + each)]<br></code></pre></td></tr></table></figure><ul><li>第二步，我是要把所有数据整理为[224,224,3]，循环每一个文件夹，将图片数据放在inputfirst中 将标签放入labels 代码可能不太好看，但是至少完成了需求。</li></ul><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br></pre></td><td class="code"><pre><code class="hljs python">labels = []<br>inputfirst=tf.placeholder(tf.float32, [<span class="hljs-literal">None</span>, <span class="hljs-number">224</span>, <span class="hljs-number">224</span>, <span class="hljs-number">3</span>])<br>input_ = tf.placeholder(tf.float32, [<span class="hljs-literal">None</span>, <span class="hljs-number">224</span>, <span class="hljs-number">224</span>, <span class="hljs-number">3</span>])<br><span class="hljs-keyword">with</span> tf.Session() <span class="hljs-keyword">as</span> sess:<br>    <span class="hljs-keyword">for</span> i,each <span class="hljs-keyword">in</span> <span class="hljs-built_in">enumerate</span>(classes,<span class="hljs-number">1</span>):<br>        <span class="hljs-built_in">print</span>(<span class="hljs-string">&quot;Starting &#123;&#125; images&quot;</span>.<span class="hljs-built_in">format</span>(each))<br>        class_path = data_dir + each<br>        <span class="hljs-built_in">print</span>(class_path)<br>        files= os.listdir(class_path)<br>      <br>        <span class="hljs-keyword">for</span> ii , file <span class="hljs-keyword">in</span> <span class="hljs-built_in">enumerate</span>(files,<span class="hljs-number">1</span>):<br>            <span class="hljs-built_in">print</span>(os.path.basename(file))<br>            image_value = tf.read_file(os.path.join(class_path, file))<br><br><br>            img = tf.image.decode_jpeg(image_value, channels=<span class="hljs-number">3</span>)<br>            <br>            tf.global_variables_initializer()<br>           <br>            img= tf.image.resize_images(img, [<span class="hljs-number">224</span>,<span class="hljs-number">224</span>],method=<span class="hljs-number">0</span>)    <br>            <span class="hljs-built_in">print</span>(img)<br>            <br>            imgput= tf.reshape(img,[<span class="hljs-number">1</span>,<span class="hljs-number">224</span>,<span class="hljs-number">224</span>,<span class="hljs-number">3</span>])<br>            <span class="hljs-keyword">if</span> ((ii==<span class="hljs-number">1</span>)&amp;(i==<span class="hljs-number">1</span>)):<br>                inputfirst=imgput<br>            <span class="hljs-keyword">else</span>:<br>               <br>                inputfirst=tf.concat([inputfirst,imgput],axis=<span class="hljs-number">0</span>)<br>            labels.append(each)<br>            <br>    labels=tf.reshape(labels,[-<span class="hljs-number">1</span>])<br>    <span class="hljs-built_in">print</span>(inputfirst.shape)<br>    <span class="hljs-built_in">print</span>(labels.shape)<br></code></pre></td></tr></table></figure><p>最后inputfirst与labels的shape为</p><figure class="highlight clojure"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs clojure">(<span class="hljs-number">2742</span><span class="hljs-punctuation">,</span> <span class="hljs-number">224</span><span class="hljs-punctuation">,</span> <span class="hljs-number">224</span><span class="hljs-punctuation">,</span> <span class="hljs-number">3</span>)<br>(<span class="hljs-number">2742</span><span class="hljs-punctuation">,</span> <span class="hljs-number">1</span>)<br></code></pre></td></tr></table></figure>]]>
    </content>
    <id>https://www.wakli.com/2019/08/14/Tensorflow%E4%B8%AD%E5%B0%86%E6%9C%AC%E5%9C%B0%E4%BB%A5%E7%9B%AE%E5%BD%95%E5%90%8D%E4%BD%9C%E4%B8%BAlabel%E7%9A%84%E5%9B%BE%E7%89%87%E6%95%B0%E6%8D%AE%E9%9B%86%E5%AF%BC%E5%85%A5/</id>
    <link href="https://www.wakli.com/2019/08/14/Tensorflow%E4%B8%AD%E5%B0%86%E6%9C%AC%E5%9C%B0%E4%BB%A5%E7%9B%AE%E5%BD%95%E5%90%8D%E4%BD%9C%E4%B8%BAlabel%E7%9A%84%E5%9B%BE%E7%89%87%E6%95%B0%E6%8D%AE%E9%9B%86%E5%AF%BC%E5%85%A5/"/>
    <published>2019-08-14T15:50:43.000Z</published>
    <summary>
      <![CDATA[<h2 id="引言"><a href="#引言" class="headerlink" title="引言"></a>引言</h2><p>作为一个初学者，在大家平常的学习中都会使用类似于mnist这种可以直接下载导入的数据集，但是当在本地有一组文件层级如下的数据集需要导入处理时，没有什么好的直接的库可以使用，我在一次机器学习的比赛中便遇到了这样的问题</p>
<figure class="highlight 1c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><code class="hljs 1c"><span class="hljs-string">|-imagess</span><br>	<span class="hljs-string">|-apple</span><br>		<span class="hljs-string">|-1.jpg</span><br>		<span class="hljs-string">|-2.jpg</span><br>		<span class="hljs-string">|-3.jpg</span><br>		<span class="hljs-string">|-4.jpg</span><br>		<span class="hljs-string">|-5.jpg</span><br>		...<br>	<span class="hljs-string">|-banana</span><br>		<span class="hljs-string">|-1.jpg</span><br>		<span class="hljs-string">|-2.jpg</span><br>		<span class="hljs-string">|-3.jpg</span><br>		...<br> 	<span class="hljs-string">|-orange</span><br> 	....<br></code></pre></td></tr></table></figure>]]>
    </summary>
    <title>Tensorflow中将本地以目录名作为label的图片数据集导入</title>
    <updated>2020-03-21T17:18:54.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>王康力</name>
    </author>
    <category term="环境" scheme="https://www.wakli.com/categories/%E7%8E%AF%E5%A2%83/"/>
    <category term="anaconda" scheme="https://www.wakli.com/tags/anaconda/"/>
    <content>
      <![CDATA[<h3 id="anaconda"><a href="#anaconda" class="headerlink" title="anaconda"></a>anaconda</h3><p>到anaconda官网下载mac对应的版本，安装anaconda</p><p>到终端输入</p><figure class="highlight ada"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs ada">conda <span class="hljs-comment">--version</span><br></code></pre></td></tr></table></figure><p>发现 zsh: command not found: conda</p><p>到用户目录下，也就是～配置conda环境变量</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">vim ~/.zshrc<br></code></pre></td></tr></table></figure><span id="more"></span><p>加入一行 路径是你安装anaconda路径的bin目录，conda在里面，然后保存</p><figure class="highlight routeros"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs routeros"><span class="hljs-built_in">export</span> <span class="hljs-attribute">PATH</span>=/home/username/anaconda/bin:$PATH<br></code></pre></td></tr></table></figure><p>再之后</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-built_in">source</span> ~/.zshrc<br></code></pre></td></tr></table></figure><p>此时conda 命令可用version可显示版本</p><p>配置国内源</p><figure class="highlight awk"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs awk">conda config --add channels https:<span class="hljs-regexp">//mi</span>rrors.tuna.tsinghua.edu.cn<span class="hljs-regexp">/anaconda/</span>pkgs<span class="hljs-regexp">/free/</span><br>conda config --add channels https:<span class="hljs-regexp">//mi</span>rrors.tuna.tsinghua.edu.cn<span class="hljs-regexp">/anaconda/</span>pkgs<span class="hljs-regexp">/main/</span><br></code></pre></td></tr></table></figure><h3 id="tensorflow"><a href="#tensorflow" class="headerlink" title="tensorflow"></a>tensorflow</h3><p>mac都没有nvidia的显卡所以就先用cpu版本的吧，安装anaconda中虚拟环境</p><figure class="highlight apache"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs apache"><span class="hljs-attribute">conda</span> create -n tf2 python=<span class="hljs-number">3</span>.<span class="hljs-number">7</span><br><span class="hljs-attribute">conda</span> activate tf2<br></code></pre></td></tr></table></figure><p>查看已安装虚拟环境</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">conda <span class="hljs-built_in">env</span> list<br></code></pre></td></tr></table></figure><p>更换pip源，在用户目录查看是否有一个.pip目录，ls -a 没有的话创建 </p><figure class="highlight arduino"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs arduino">mkdir .pip<br></code></pre></td></tr></table></figure><p>在.pip 文件夹内新建一个文件 touch pip.conf 然后vim进行编辑，同样的使用清华源</p><figure class="highlight pgsql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><code class="hljs pgsql">[<span class="hljs-keyword">global</span>]<br><span class="hljs-keyword">index</span>-url = https://pypi.tuna.tsinghua.edu.cn/simple<br>[install]<br><span class="hljs-keyword">trusted</span>-host=pypi.tuna.tsinghua.edu.cn<br></code></pre></td></tr></table></figure><p>安装tensorflow</p><figure class="highlight cmake"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs cmake">pip <span class="hljs-keyword">install</span> tensorflow<br></code></pre></td></tr></table></figure><h3 id="PyCharm配置"><a href="#PyCharm配置" class="headerlink" title="PyCharm配置"></a>PyCharm配置</h3><p>下载安装后新建项目</p><img width=500 src="/2019/07/12/Mac中Tensorflow环境安装/img1.png" ><p>在红色位置选择所要用到python版本的安装位置，接下来我们要选择刚才安装anaconda中tf2环境中的python</p><img width=500 src="/2019/07/12/Mac中Tensorflow环境安装/img2.png" ><p>创建好项目后新建一个test.py进行测试</p><img width=500 src="/2019/07/12/Mac中Tensorflow环境安装/img3.png" ><p>成功</p>]]>
    </content>
    <id>https://www.wakli.com/2019/07/12/Mac%E4%B8%ADTensorflow%E7%8E%AF%E5%A2%83%E5%AE%89%E8%A3%85/</id>
    <link href="https://www.wakli.com/2019/07/12/Mac%E4%B8%ADTensorflow%E7%8E%AF%E5%A2%83%E5%AE%89%E8%A3%85/"/>
    <published>2019-07-12T14:00:48.000Z</published>
    <summary>
      <![CDATA[<h3 id="anaconda"><a href="#anaconda" class="headerlink" title="anaconda"></a>anaconda</h3><p>到anaconda官网下载mac对应的版本，安装anaconda</p>
<p>到终端输入</p>
<figure class="highlight ada"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs ada">conda <span class="hljs-comment">--version</span><br></code></pre></td></tr></table></figure>

<p>发现 zsh: command not found: conda</p>
<p>到用户目录下，也就是～配置conda环境变量</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">vim ~/.zshrc<br></code></pre></td></tr></table></figure>]]>
    </summary>
    <title>Mac中Tensorflow环境安装</title>
    <updated>2020-03-21T17:20:48.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>王康力</name>
    </author>
    <category term="C++" scheme="https://www.wakli.com/categories/C/"/>
    <category term="字符串数组" scheme="https://www.wakli.com/tags/%E5%AD%97%E7%AC%A6%E4%B8%B2%E6%95%B0%E7%BB%84/"/>
    <category term="指针" scheme="https://www.wakli.com/tags/%E6%8C%87%E9%92%88/"/>
    <content>
      <![CDATA[<p>利用指针访问多维字符串数组的问题，是一个有趣且重要的知识点，其实并不复杂只需要对指向指针的指针进行拆解分析即可，下面进入正文</p><p>首先我们定义一个多维字符串数组，然后利用4种方式进行输出</p><span id="more"></span><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><code class="hljs c++"><span class="hljs-meta">#<span class="hljs-keyword">include</span> <span class="hljs-string">&lt;iostream&gt;</span></span><br><span class="hljs-keyword">using</span> <span class="hljs-keyword">namespace</span> std;<br><span class="hljs-function"><span class="hljs-type">int</span> <span class="hljs-title">main</span><span class="hljs-params">()</span> </span>&#123;<br>    <span class="hljs-type">char</span> t[][<span class="hljs-number">3</span>][<span class="hljs-number">5</span>] = &#123;<span class="hljs-string">&quot;abcd&quot;</span>,<span class="hljs-string">&quot;efgh&quot;</span>,<span class="hljs-string">&quot;ijkl&quot;</span>,<span class="hljs-string">&quot;mnop&quot;</span>,<span class="hljs-string">&quot;qrst&quot;</span>,<span class="hljs-string">&quot;uvwx&quot;</span>&#125;;<br>    cout&lt;&lt;t[<span class="hljs-number">1</span>][<span class="hljs-number">2</span>][<span class="hljs-number">2</span>]&lt;&lt;<span class="hljs-string">&quot; &quot;</span><br>        &lt;&lt;*(t[<span class="hljs-number">1</span>][<span class="hljs-number">2</span>]<span class="hljs-number">+2</span>)&lt;&lt;<span class="hljs-string">&quot; &quot;</span><br>        &lt;&lt;*(*(t[<span class="hljs-number">1</span>]<span class="hljs-number">+2</span>)<span class="hljs-number">+2</span>)&lt;&lt;<span class="hljs-string">&quot; &quot;</span><br>        &lt;&lt;(*(*(t<span class="hljs-number">+1</span>)<span class="hljs-number">+2</span>)<span class="hljs-number">+2</span>)&lt;&lt;endl;<br>    <span class="hljs-keyword">return</span> <span class="hljs-number">0</span>;<br>&#125;<br><br><span class="hljs-comment">/*</span><br><span class="hljs-comment">输出结果</span><br><span class="hljs-comment">w w w wx</span><br><span class="hljs-comment">*/</span><br></code></pre></td></tr></table></figure><p>首先字符串数组会自动被分成三维数组 也可以简单想成两行三列的数组，只是每个元素都是一个字符串也就是字符型数组。接下来我们可以看到第4种的输出与其他的不同，接下来我们进行分析</p><img width="400" src="/2018/07/21/指针与多维字符串数组/img1.png"><p>首先我们要明确 数组名 是数组第一个元素的地址 利用如下代码进行理解</p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><code class="hljs c++"><span class="hljs-meta">#<span class="hljs-keyword">include</span> <span class="hljs-string">&lt;iostream&gt;</span></span><br><span class="hljs-keyword">using</span> <span class="hljs-keyword">namespace</span> std;<br><span class="hljs-function"><span class="hljs-type">int</span> <span class="hljs-title">main</span><span class="hljs-params">()</span> </span>&#123;<br>    <span class="hljs-type">int</span> a[]=&#123;<span class="hljs-number">1</span>,<span class="hljs-number">2</span>,<span class="hljs-number">3</span>,<span class="hljs-number">4</span>,<span class="hljs-number">5</span>,<span class="hljs-number">6</span>&#125;;<br>    cout&lt;&lt;a&lt;&lt;<span class="hljs-string">&quot; &quot;</span>&lt;&lt;*a&lt;&lt;<span class="hljs-string">&quot; &quot;</span>&lt;&lt;*(a<span class="hljs-number">+3</span>)&lt;&lt;endl;<br>    <span class="hljs-keyword">return</span> <span class="hljs-number">0</span>;<br>&#125;<br><span class="hljs-comment">/*</span><br><span class="hljs-comment">输出结果</span><br><span class="hljs-comment">0x7ffee2d57830 1 4</span><br><span class="hljs-comment">*/</span><br></code></pre></td></tr></table></figure><p>对四个输出分别进行分析</p><ol><li><p>最基本的多维数组通过数组下标进行访问，访问的是第一维下标为1 第二维下标为2 第三维 字符串中下标为2的第三个字母’w’。</p></li><li><p>首先我们要知道t[1][2]中的内容为”uvwx”这个字符串，字符串也是一个数组，也就意味着t[1][2]是一个指向”uvwx”这个字符串首位的指针。t[1][2]+2意味着将这个指针向后移2位，指向’w’ 。*(t[1][2]+2)获取这个指针当中的内容便取出w。可以使用如下代码进行理解</p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><code class="hljs c++"><span class="hljs-meta">#<span class="hljs-keyword">include</span> <span class="hljs-string">&lt;iostream&gt;</span></span><br><span class="hljs-keyword">using</span> <span class="hljs-keyword">namespace</span> std;<br><span class="hljs-function"><span class="hljs-type">int</span> <span class="hljs-title">main</span><span class="hljs-params">()</span> </span>&#123;<br>    <span class="hljs-type">char</span> t2[<span class="hljs-number">6</span>]=&#123;<span class="hljs-string">&#x27;a&#x27;</span>,<span class="hljs-string">&#x27;b&#x27;</span>,<span class="hljs-string">&#x27;c&#x27;</span>,<span class="hljs-string">&#x27;d&#x27;</span>,<span class="hljs-string">&#x27;e&#x27;</span>,<span class="hljs-string">&#x27;\0&#x27;</span>&#125;;<br>    cout&lt;&lt;t2&lt;&lt;<span class="hljs-string">&#x27; &#x27;</span>&lt;&lt;*t2&lt;&lt;<span class="hljs-string">&#x27; &#x27;</span>&lt;&lt;*(t2<span class="hljs-number">+2</span>)&lt;&lt;endl;<br>  <span class="hljs-keyword">return</span> <span class="hljs-number">0</span>;<br>&#125;<br><span class="hljs-comment">/*</span><br><span class="hljs-comment">输出结果</span><br><span class="hljs-comment">abcde a c</span><br><span class="hljs-comment">*/</span><br></code></pre></td></tr></table></figure></li><li><p>首先t[1]同样作为一个数组是一个包含三个指向字符串的指针。而将t[1]理解为数组名，它指向的地址空间中存放着一个指向”mnop”字符串的指针，t[1]+2 将指针向后移2位即为指向”uvwx”字符串的指针。*(t[1]+2)即为取得指向“uvwx”字符串的指针所指向地址空间中的内容，即为“uvwx”这个字符串。而 *(*(t[1]+2)+2)与第二个输出相类似，进行相同理解即可，所以输出w。</p></li><li><p>首先t可以近似理解成是一个存放着两个指针的数组，*(t+1)与t[1]意思相同，中间部分理解与第三输出类似，故不再进行赘述。而重点在最后部分，*(*(t+1)+2)是”uvwx”这个字符串，而其中要关键要注意的便是(“uvwx”+2)与*(“uvwx”+2)的区别。未加星号的意味着仅将指针向后移两位，输出时会按照字符串进行输出到’\0’停止，而加星号则是获取指针后移2后那一位地址空间中的内容。可以利用如下代码进行理解。</p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><code class="hljs c++"><span class="hljs-meta">#<span class="hljs-keyword">include</span> <span class="hljs-string">&lt;iostream&gt;</span></span><br><span class="hljs-keyword">using</span> <span class="hljs-keyword">namespace</span> std;<br><span class="hljs-function"><span class="hljs-type">int</span> <span class="hljs-title">main</span><span class="hljs-params">()</span> </span>&#123;<br>    cout&lt;&lt;<span class="hljs-string">&quot;abcde&quot;</span><span class="hljs-number">+2</span>&lt;&lt;endl;<br>    <span class="hljs-type">char</span> t2[<span class="hljs-number">6</span>]=&#123;<span class="hljs-string">&#x27;a&#x27;</span>,<span class="hljs-string">&#x27;b&#x27;</span>,<span class="hljs-string">&#x27;c&#x27;</span>,<span class="hljs-string">&#x27;d&#x27;</span>,<span class="hljs-string">&#x27;e&#x27;</span>,<span class="hljs-string">&#x27;\0&#x27;</span>&#125;;<br>    cout&lt;&lt;t2<span class="hljs-number">+2</span>&lt;&lt;<span class="hljs-string">&#x27; &#x27;</span>&lt;&lt;*(t2<span class="hljs-number">+2</span>)&lt;&lt;endl;<br>    <span class="hljs-keyword">return</span> <span class="hljs-number">0</span>;<br>&#125;<br><span class="hljs-comment">/*</span><br><span class="hljs-comment">输出结果</span><br><span class="hljs-comment">cde</span><br><span class="hljs-comment">cde c</span><br><span class="hljs-comment">*/</span><br></code></pre></td></tr></table></figure><p>以上均属于个人理解，如果有问题欢迎大家与我进行讨论。</p></li></ol>]]>
    </content>
    <id>https://www.wakli.com/2018/07/21/%E6%8C%87%E9%92%88%E4%B8%8E%E5%A4%9A%E7%BB%B4%E5%AD%97%E7%AC%A6%E4%B8%B2%E6%95%B0%E7%BB%84/</id>
    <link href="https://www.wakli.com/2018/07/21/%E6%8C%87%E9%92%88%E4%B8%8E%E5%A4%9A%E7%BB%B4%E5%AD%97%E7%AC%A6%E4%B8%B2%E6%95%B0%E7%BB%84/"/>
    <published>2018-07-21T02:28:24.000Z</published>
    <summary>
      <![CDATA[<p>利用指针访问多维字符串数组的问题，是一个有趣且重要的知识点，其实并不复杂只需要对指向指针的指针进行拆解分析即可，下面进入正文</p>
<p>首先我们定义一个多维字符串数组，然后利用4种方式进行输出</p>]]>
    </summary>
    <title>指针与多维字符串数组</title>
    <updated>2020-10-19T14:02:28.000Z</updated>
  </entry>
</feed>
