<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title></title>
    <description>duimu.github.io</description>
    <link>http://www.morecheck.cn/</link>
    <atom:link href="http://www.morecheck.cn/feed.xml" rel="self" type="application/rss+xml"/>
    <pubDate>Sun, 26 Apr 2026 05:29:27 +0000</pubDate>
    <lastBuildDate>Sun, 26 Apr 2026 05:29:27 +0000</lastBuildDate>
    <generator>Jekyll v3.10.0</generator>
    
      <item>
        <title>解决github访问慢的问题 </title>
        <description>&lt;h1 id=&quot;解决github访问慢的问题---掘金&quot;&gt;解决GitHub访问慢的问题 - 掘金&lt;/h1&gt;

&lt;h1 id=&quot;解决github访问慢的问题&quot;&gt;解决GitHub访问慢的问题&lt;br /&gt;&lt;/h1&gt;

&lt;p&gt;&lt;a href=&quot;https://juejin.cn/user/1697301686663549&quot;&gt;![4ba54259554e820325a62faf1a63277a~300x300.image][568d897c9c96fb458ebb03151d1e940c]&lt;/a&gt; 
&lt;a href=&quot;https://juejin.cn/user/1697301686663549&quot;&gt;工作事小摸鱼事大&lt;br /&gt;     ![f597b88d22ce5370bd94495780459040.png][169ce008b713e75e35dff389d47f26ac]&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;2021年10月16日 23:20&lt;br /&gt;                                       ·  阅读 3710&lt;br /&gt;
 &lt;img src=&quot;data:image/webp;base64,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&quot; alt=&quot;734.webp&quot; /&gt;
小知识，大挑战！本文正在参与“&lt;a href=&quot;https://juejin.cn/post/7008476801634680869&quot; title=&quot;https://juejin.cn/post/7008476801634680869&quot;&gt;程序员必备小知识&lt;/a&gt;”创作活动&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;经常在github上找一些好玩的学习项目，但是经常出现github页面打开速度很慢甚至无法打开的情况，往往导致计划被打乱，瞬间不想学习了。今天就来总结一下解决github访问慢的方法。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;GitHub访问慢或者无法访问一般是由以下问题引起的：&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;本地网络访问慢，科学上网速度很快&lt;/li&gt;
  &lt;li&gt;本地网络无法访问（响应时间过长导致无法访问）&lt;/li&gt;
  &lt;li&gt;由于github的加速分发CDN域名assets-cdn.github.com遭到DNS污染，无法访问&lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&quot;1-修改本地hosts映射&quot;&gt;1. 修改本地hosts映射&lt;/h2&gt;

&lt;blockquote&gt;
  &lt;p&gt;域名解析直接指向GitHub的IP地址，以此来绕过DNS解析&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3 id=&quot;11-查看最新github-的最新ip地址&quot;&gt;1.1 查看最新GitHub 的最新ip地址&lt;/h3&gt;

&lt;p&gt;在 &lt;a href=&quot;https://link.juejin.cn/?target=www.ipaddress.com&quot; title=&quot;www.ipaddress.com&quot;&gt;ip地址查询&lt;/a&gt; 网站中查询GitHub相关的网站对应的最新IP地址&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;github.com&lt;/li&gt;
  &lt;li&gt;github.global.ssl.fastly.net&lt;/li&gt;
  &lt;li&gt;assets-cdn.github.com&lt;/li&gt;
  &lt;li&gt;codeload.github.com&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;在当前网站中查询指定网站ip地址还可以使用另外方法:&lt;/p&gt;

&lt;p&gt;①直接将网站作为参数进行请求，省略点击查询的步骤：&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://link.juejin.cn/?target=https%3A%2F%2Fwebsites.ipaddress.com%2Fgithub.global.ssl.fastly.net&quot; title=&quot;https://websites.ipaddress.com/github.global.ssl.fastly.net&quot;&gt;websites.ipaddress.com/github.glob…&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://link.juejin.cn/?target=https%3A%2F%2Fwebsites.ipaddress.com%2Fgithub.com&quot; title=&quot;https://websites.ipaddress.com/github.com&quot;&gt;websites.ipaddress.com/github.com&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://link.juejin.cn/?target=https%3A%2F%2Fwebsites.ipaddress.com%2Fassets-cdn.github.com&quot; title=&quot;https://websites.ipaddress.com/assets-cdn.github.com&quot;&gt;websites.ipaddress.com/assets-cdn.…&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://link.juejin.cn/?target=https%3A%2F%2Fwebsites.ipaddress.com%2Fcodeload.github.com&quot; title=&quot;https://websites.ipaddress.com/codeload.github.com&quot;&gt;websites.ipaddress.com/codeload.gi…&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;②将ip查询网站拼接在之后进行查询&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://link.juejin.cn/?target=http%3A%2F%2Fgithub.global.ssl.fastly.net.ipaddress.com%2F&quot; title=&quot;http://github.global.ssl.fastly.net.ipaddress.com/&quot;&gt;github.global.ssl.fastly.net.ipaddress.com/&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://link.juejin.cn/?target=https%3A%2F%2Fgithub.com.ipaddress.com%2F&quot; title=&quot;https://github.com.ipaddress.com/&quot;&gt;github.com.ipaddress.com/&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://link.juejin.cn/?target=https%3A%2F%2Fassets-cdn.github.com.ipaddress.com%2F&quot; title=&quot;https://assets-cdn.github.com.ipaddress.com/&quot;&gt;assets-cdn.github.com.ipaddress.com/&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://link.juejin.cn/?target=https%3A%2F%2Fcodeload.github.com.ipaddress.com%2F&quot; title=&quot;https://codeload.github.com.ipaddress.com/&quot;&gt;codeload.github.com.ipaddress.com/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;12-本地hosts文件映射ip地址&quot;&gt;1.2 本地hosts文件映射ip地址&lt;/h3&gt;

&lt;p&gt;找到对应的IP地址后，将IP地址与网站地址进行对应，并将对应关系写入本地hosts文件中。&lt;/p&gt;

&lt;p&gt;在windows系统中的&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;c:/Windows/System32/drivers/etc&lt;/code&gt; 下找到hosts文件，编辑打开，将四个网站的IP地址和网站地址对应写入进入，作为DNS的映射。&lt;/p&gt;

&lt;p&gt;hosts文件直接编辑修改时可能没有权限，可以通过以下方法完成修改：&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;修改当前文件权限，右键hosts文件 -&amp;gt; 属性 -&amp;gt; 安全 -&amp;gt; 编辑 -&amp;gt; Users -&amp;gt; Users的权限后加入写权限&lt;/li&gt;
  &lt;li&gt;将当前文件复制到别的盘中，修改文件后复制回来覆盖原来文件&lt;/li&gt;
&lt;/ol&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;#github dns映射 格式如：  [ip]: [domainName]
199.232.69.194 github.global.ssl.Fastly.net
140.82.114.4 GitHub.com
185.199.108.153 assets-cdn.Github.com
140.82.114.9 codeload.Github.com
复制代码
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;13-刷新dns缓存来访问新的映射&quot;&gt;1.3 刷新DNS缓存来访问新的映射&lt;/h3&gt;

&lt;p&gt;hosts文件内容更新成功后，还需要刷新windows系统的DNS才可以生效。&lt;/p&gt;

&lt;p&gt;使用 win+R ，打开cmd命令行，输入 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ipconfig/flushdns&lt;/code&gt; 刷新DNS缓存即可。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;data:image/webp;base64,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&quot; alt=&quot;0.webp&quot; /&gt;&lt;/p&gt;

&lt;p&gt;刷新完成后，再次打开github网站时速度会明显提升，需要注意的是以上github网站的ip经常发生变化，如果访问再次变慢可以重新更新映射信息。&lt;/p&gt;

&lt;h2 id=&quot;2-一键更新&quot;&gt;2. 一键更新&lt;/h2&gt;

&lt;p&gt;手动更新本地hosts文件的方式比较繁琐，我们可以编写程序来代替手动操作，实现需要时hosts文件内容的一键更新。&lt;/p&gt;

&lt;p&gt;推荐一个github开源项目：&lt;a href=&quot;https://link.juejin.cn/?target=https%3A%2F%2Fgithub.com%2Fisevenluo%2Fgithub-hosts&quot; title=&quot;https://github.com/isevenluo/github-hosts&quot;&gt;更新hosts&lt;/a&gt; ，&lt;a href=&quot;https://link.juejin.cn/?target=https%3A%2F%2Fgitee.com%2Fisevenluo%2Fgithub-hosts&quot; title=&quot;https://gitee.com/isevenluo/github-hosts&quot;&gt;国内git地址&lt;/a&gt;，作者会每日提供最新的相关ip地址映射信息，我们可以直接复制使用或者使用其中的程序进行一键更新操作。&lt;/p&gt;

&lt;p&gt;作为一个coder，我们也可以自己去实现一个脚本程序。&lt;/p&gt;

&lt;h2 id=&quot;3-chrome插件&quot;&gt;3. Chrome插件&lt;/h2&gt;

&lt;p&gt;chrome插件如github加速等，可以实现在访问和下载项目是使用镜像加速，提升访问速度。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;data:image/webp;base64,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&quot; alt=&quot;0.webp&quot; /&gt;&lt;/p&gt;

&lt;p&gt;如果无法访问chrome下载插件，推荐一个好用的chrome插件下载网站：&lt;a href=&quot;https://link.juejin.cn/?target=https%3A%2F%2Fwww.extfans.com%2F&quot; title=&quot;https://www.extfans.com/&quot;&gt;Extfans&lt;/a&gt; ，下载后使用开发者模式安装插件即可使用。&lt;/p&gt;

&lt;h2 id=&quot;4-镜像网站&quot;&gt;4. 镜像网站&lt;/h2&gt;

&lt;p&gt;github访问速度慢，我们还可以使用镜像网站来代替github&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://link.juejin.cn/?target=https%3A%2F%2Fgithub.com.cnpmjs.org&quot; title=&quot;https://github.com.cnpmjs.org&quot;&gt;github.com.cnpmjs.org&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://link.juejin.cn/?target=https%3A%2F%2Fhub.fastgit.org&quot; title=&quot;https://hub.fastgit.org&quot;&gt;hub.fastgit.org&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;以上两个网站作为镜像网站，基本包含了github上已有的项目信息，并且可以查看和下载相关项目，速度还不错，可以作为备用网站使用。&lt;/p&gt;

&lt;p&gt;分类：
 &lt;a href=&quot;https://juejin.cn/backend&quot;&gt;后端&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;标签：&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://juejin.cn/tag/%E5%90%8E%E7%AB%AF&quot;&gt;后端&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;文章被收录于专栏：&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;data:image/webp;base64,UklGRjYCAABXRUJQVlA4ICoCAADQEQCdASp4AFoAPpFInEolpKKhp1i5SLASCWUG+OUBvg9kdAAe9PtztgJm0eGGnR78WFmAg6CbYVZdcC484gQEml4iGMF+Q6dzaaf+YlmNq7c12C1Nt7aDWbetRuAS2KrSjQtadDzJtyexig2Wjm5sXut0bS5Xlq9DbUacw88ea/Y7/JmzNfKkfuWrStkoe1QLzcc9zmUAAP6C5pA//kp/7d/7yuPf/i34g/YFz5lF1QpmkkQ38V5XLgdIaEcRO1KLHI6uVeSet7vlTyQIowJismrY3Vonex6/smQ+Sj9h9GthVZlKAwt8Uwq1wS0ogs0OFutkNrVUh43/c+XZ3DMsZNLkf64nILwK/Pj5WbKdhlIzhsj2JG2YRhM0PjW+tKfAVZ9s1AkiFGhOK6oBaMJYfD14ZIiim1OFxbcPOsOw72IVHQgLefkJ3Bc/5WMQEGixduoNBdhNu9VjICFwhpQhbgGRCEdpEWJZ5u0DYvRMCcX7oN/javf4H/KzzJi8Tw3E+FTVFJcsnN0uWdkuXLeQXtoINStIOjgSkD2FUnUqJQfFYZK0C5ojEo9TKIOtga7F/7p5ExeR1VjydcDxi30IBCt5rmM3CiCFIMVMCrGUakHZLgDeIo9xp8ptJG/ZTCIfHg0CvQcli3FaIKvcHUIS41/X8JSW5Fdkfc9KcCcuf3lxInLcNAUnlA839fG3F4Dkazjh8O1MZUYOr62e2Q8Qw4HcDfxtEXAAAA==&quot; alt=&quot;120.webp&quot; /&gt; 
日常问题&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;记录开发中常遇到的小问题&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://juejin.cn/extension/?utm_source=standalone&amp;amp;utm_medium=post&amp;amp;utm_campaign=extension_promotion&quot;&gt;安装掘金浏览器插件&lt;br /&gt;&lt;/a&gt; 
多内容聚合浏览、多引擎快捷搜索、多工具便捷提效、多模式随心畅享，你想要的，这里都有！
 &lt;a href=&quot;https://juejin.cn/extension/?utm_source=standalone&amp;amp;utm_medium=post&amp;amp;utm_campaign=extension_promotion&quot;&gt;前往安装&lt;/a&gt;&lt;/p&gt;

</description>
        <pubDate>Thu, 31 Mar 2022 00:00:00 +0000</pubDate>
        <link>http://www.morecheck.cn/2022/03/31/%E8%A7%A3%E5%86%B3GitHub%E8%AE%BF%E9%97%AE%E6%85%A2%E7%9A%84%E9%97%AE%E9%A2%98/</link>
        <guid isPermaLink="true">http://www.morecheck.cn/2022/03/31/%E8%A7%A3%E5%86%B3GitHub%E8%AE%BF%E9%97%AE%E6%85%A2%E7%9A%84%E9%97%AE%E9%A2%98/</guid>
        
        
      </item>
    
      <item>
        <title>2017 andrew ng deeplearning</title>
        <description>&lt;h2 id=&quot;素材来自于wwwai-startcom&quot;&gt;素材来自于www.ai-start.com&lt;/h2&gt;

&lt;h3 id=&quot;第一门课-神经网络和深度学习neural-networks-and-deep-learning&quot;&gt;第一门课 神经网络和深度学习(Neural Networks and Deep Learning)&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;https://www.pandadl.com/assets/DeepLearning/lesson1-week1.html&quot;&gt;第一周：深度学习引言(Introduction to Deep Learning)&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://www.pandadl.com/assets/DeepLearning/lesson1-week2.html&quot;&gt;第二周：神经网络的编程基础(Basics of Neural Network programming)&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://www.pandadl.com/assets/DeepLearning/lesson1-week3.html&quot;&gt;第三周：浅层神经网络(Shallow neural networks)&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://www.pandadl.com/assets/DeepLearning/lesson1-week4.html&quot;&gt;第四周：深层神经网络(Deep Neural Networks)&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;第二门课-改善深层神经网络超参数调试正则化以及优化improving-deep-neural-networkshyperparameter-tuning-regularization-and-optimization&quot;&gt;第二门课 改善深层神经网络：超参数调试、正则化以及优化(Improving Deep Neural Networks:Hyperparameter tuning, Regularization and Optimization)&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;https://www.pandadl.com/assets/DeepLearning/lesson2-week1.html&quot;&gt;第一周：深度学习的实践层面(Practical aspects of Deep Learning)&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://www.pandadl.com/assets/DeepLearning/lesson2-week2.html&quot;&gt;第二周：优化算法 (Optimization algorithms)&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://www.pandadl.com/assets/DeepLearning/lesson2-week3.html&quot;&gt;第三周 超参数调试、Batch正则化和程序框架（Hyperparameter tuning）&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;第三门课-结构化机器学习项目structuring-machine-learning-projects&quot;&gt;第三门课 结构化机器学习项目（Structuring Machine Learning Projects）&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;https://www.pandadl.com/assets/DeepLearning/lesson3-week1.html&quot;&gt;第一周 机器学习（ML）策略（1）（ML strategy（1））&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://www.pandadl.com/assets/DeepLearning/lesson3-week2.html&quot;&gt;第二周：机器学习策略（2）(ML Strategy (2))&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;第四门课-卷积神经网络convolutional-neural-networks&quot;&gt;第四门课 卷积神经网络（Convolutional Neural Networks）&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;https://www.pandadl.com/assets/DeepLearning/lesson4-week1.html&quot;&gt;第一周 卷积神经网络（Foundations of Convolutional Neural Networks）&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://www.pandadl.com/assets/DeepLearning/lesson4-week2.html&quot;&gt;第二周 深度卷积网络：实例探究（Deep convolutional models: case studies）&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://www.pandadl.com/assets/DeepLearning/lesson4-week3.html&quot;&gt;第三周 目标检测（Object detection）&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://www.pandadl.com/assets/DeepLearning/lesson4-week4.html&quot;&gt;第四周 特殊应用：人脸识别和神经风格转换（Special applications: Face recognition &amp;amp;Neural style transfer）&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;第五门课-序列模型sequence-models&quot;&gt;第五门课 序列模型(Sequence Models)&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;https://www.pandadl.com/assets/DeepLearning/lesson5-week1.html&quot;&gt;第一周 循环序列模型（Recurrent Neural Networks）&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://www.pandadl.com/assets/DeepLearning/lesson5-week2.html&quot;&gt;第二周 自然语言处理与词嵌入（Natural Language Processing and Word Embeddings）&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://www.pandadl.com/assets/DeepLearning/lesson5-week3.html&quot;&gt;第三周 序列模型和注意力机制（Sequence models &amp;amp; Attention mechanism）&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;附件&quot;&gt;附件&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;https://www.pandadl.com/assets/DeepLearning/interview.html&quot;&gt;榜样的力量-吴恩达采访人工智能大师实录&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://www.pandadl.com/assets/DeepLearning/notation.html&quot;&gt;深度学习符号指南（原课程翻译）&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://www.pandadl.com/assets/DeepLearning/math.html&quot;&gt;机器学习的数学基础&lt;/a&gt;&lt;/p&gt;

</description>
        <pubDate>Sat, 29 Feb 2020 14:12:00 +0000</pubDate>
        <link>http://www.morecheck.cn/2020/02/29/andrew-deeplearing/</link>
        <guid isPermaLink="true">http://www.morecheck.cn/2020/02/29/andrew-deeplearing/</guid>
        
        <category>deeplearning</category>
        
        
      </item>
    
      <item>
        <title>tensorflow_Step5_Test</title>
        <description>&lt;h2 id=&quot;流程&quot;&gt;流程:&lt;/h2&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;
# -*- coding: utf-8 -*-

&quot;&quot;&quot;
@from:www.linerect.com

@author:  duimu

@contact: duimu@qq.com

@Created on: 2019/12/4 9:12
&quot;&quot;&quot;
import tensorflow as tf
import numpy as np
import os
import cv2
from tensorflow.contrib import rnn
from Step1_getdatatxt import *
from Step2_WritetfRecord import *
from Step3_1_crnn_baseoperations import *


def Inference(image,modelpath):
    g_is_training=tf.cast(False, tf.bool)

    # inputs
    inputs = tf.placeholder(tf.float32, [1, g_image_height, g_image_width, 3], name=&quot;input&quot;)

    # cnn特征 lstm特征
    crnn_out_np = Getfeature(inputs)

    # The decoded answer
    decoded, log_prob = tf.nn.ctc_beam_search_decoder(
        crnn_out_np,
        g_seq_len * np.ones(1),
        merge_repeated=False
    )

    # 获取数据------------------------------------------------------------------------------------------
    init = tf.global_variables_initializer()

    with tf.Session() as sess:  # 开始一个会话
        sess.run(init)
        saver = tf.train.Saver(tf.global_variables(), max_to_keep=100)
        coord = tf.train.Coordinator()
        model_file = tf.train.latest_checkpoint(modelpath)
        saver.restore(sess, model_file)

        decodestring=sess.run(decoded[0],feed_dict={inputs:image})

        decodestring = decode_sparse_tensor(decodestring)
        return decodestring

if __name__ == &apos;__main__&apos;:
    image=cv2.imread(&apos;E:\\tensorflow\\char_image\\pro2\\11.jpg&apos;)
    image=cv2.resize(image,(g_image_width, g_image_height))
    image = np.asanyarray(image)
    image = image / 255.0
    images=[]
    images.append(image)
    ocrstring=Inference(images,&apos;F:\\0_dataset\\mjsynth\\model\\&apos;)
    print(ocrstring)






&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
</description>
        <pubDate>Sun, 01 Dec 2019 14:00:00 +0000</pubDate>
        <link>http://www.morecheck.cn/2019/12/01/CRNN_Step5_Test/</link>
        <guid isPermaLink="true">http://www.morecheck.cn/2019/12/01/CRNN_Step5_Test/</guid>
        
        <category>tensorflow</category>
        
        <category>CRNN</category>
        
        
      </item>
    
      <item>
        <title>tensorflow_Step4_train</title>
        <description>&lt;h2 id=&quot;流程&quot;&gt;流程:&lt;/h2&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;# -*- coding: utf-8 -*-

&quot;&quot;&quot;
@from:www.linerect.com

@author:  duimu

@contact: duimu@qq.com

@Created on: 2019/12/4 9:12
&quot;&quot;&quot;
import tensorflow as tf
import numpy as np
import os
import h5py
import cv2

from Step1_getdatatxt import *
from Step2_WritetfRecord import *
from Step3_1_crnn_baseoperations import *


def TrainCRNN(trainfile, valfile, batchsize, resize_height, resize_width, channels):
    g_is_training = tf.cast(True, tf.bool)

    # inputs
    inputs = tf.placeholder(tf.float32, [batchsize, resize_height, resize_width, channels], name=&quot;input&quot;)
    # labels
    labels = tf.sparse_placeholder(tf.int32, name=&quot;labels&quot;)

    # cnn特征 lstm特征
    crnn_out_np = Getfeature(inputs)

    # 计算loss
    # time_major=True(默认)时为：max_time_step  * batch_size * num_classes
    # 否则形状为：batch_size * max_time_step  * num_classes
    loss = tf.nn.ctc_loss(
        labels=labels, inputs=crnn_out_np,
        sequence_length=g_seq_len * np.ones(batchsize)
    )
    cost = tf.reduce_mean(loss)

    optimizer = tf.train.AdamOptimizer(learning_rate=0.0001).minimize(cost)

    # tf.train.MomentumOptimizer( learning_rate=0.0001, momentum=0.9).minimize(cost)
    # The decoded answer
    decoded, log_prob = tf.nn.ctc_beam_search_decoder(
        crnn_out_np,
        g_seq_len * np.ones(batchsize),
        merge_repeated=False
    )
    sequence_dist = tf.reduce_mean(
        tf.edit_distance(tf.cast(decoded[0], tf.int32), labels),
        name=&apos;train_edit_distance&apos;
    )
    # acc
    acc = tf.reduce_mean(tf.edit_distance(tf.cast(decoded[0], tf.int32), labels))
    # 获取数据------------------------------------------------------------------------------------------
    init = tf.global_variables_initializer()

    tf_image, tf_label= read_records(trainfile,
                                         resize_height,
                                         resize_width,
                                         channel=channels,
                                         type=&apos;normalization&apos;)

    tf_image_v, tf_label_v = read_records(valfile,
                                           resize_height,
                                           resize_width,
                                           channel=channels,
                                           type=&apos;normalization&apos;)

    with tf.Session() as sess:  # 开始一个会话
        sess.run(init)
        saver = tf.train.Saver(tf.global_variables(), max_to_keep=100)
        coord = tf.train.Coordinator()
        threads = tf.train.start_queue_runners(coord=coord)
        model_file = tf.train.latest_checkpoint(&apos;F:\\0_dataset\\mjsynth\\model\\&apos;)
        #saver.restore(sess, model_file)

        for nStep in range(1000):
            for n in range(10000):
                imagesbatch = np.zeros([batchsize, resize_height, resize_width, 3])
                lablesbatch = []
                # 获取数据
                for i in range(batchsize):
                    image, label = sess.run([tf_image, tf_label])  # 在会话中取出image和label
                    imagesbatch[i, :] = image
                    lablesbatch.append(list(label))
                lablesbatch = np.squeeze(lablesbatch, axis=1)
                lablesbatch = sparse_tuple_from(lablesbatch)
                # 训练集
                sess.run(optimizer, feed_dict={inputs: imagesbatch, labels: lablesbatch})
                costValue = sess.run(cost, feed_dict={inputs: imagesbatch, labels: lablesbatch})
                if n % 100 == 0:
                    print(&quot;epoch:%2d,step:%2d,cost:%.2f&quot; % (nStep, n, costValue))

            # 验证集
            imagesbatch_v = np.zeros([batchsize, resize_height, resize_width, 3])
            lablesbatch_v = []
            for i in range(batchsize):
                image_v, label_v = sess.run(
                    [tf_image_v, tf_label_v])  # 在会话中取出image和label
                imagesbatch_v[i, :] = image_v
                lablesbatch_v.append(list(label_v))

            lablesbatch_v = np.squeeze(lablesbatch_v, axis=1)
            lablesbatch_v = sparse_tuple_from(lablesbatch_v)

            accValue, decoded_v = sess.run([acc, decoded[0]], feed_dict={inputs: imagesbatch_v, labels: lablesbatch_v})
            print(&quot;epoch:%2d,cost:%.2f,dis:%.2f&quot; % (nStep, costValue, accValue))
            getaccuracy(decoded_v, lablesbatch_v)
            saver.save(sess, &apos;F:\\0_dataset\\mjsynth\\model\\OCR&apos;, write_meta_graph=True, global_step=nStep)
        # 停止所有线程
        coord.request_stop()
        coord.join(threads)



if __name__ == &apos;__main__&apos;:
    TrainCRNN(&apos;F:/0_dataset/mjsynth/train1.tfrecords&apos;,
              &apos;F:/0_dataset/mjsynth/val1.tfrecords&apos;,
              32,
              32,
              100,
              3)






&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
</description>
        <pubDate>Sun, 01 Dec 2019 14:00:00 +0000</pubDate>
        <link>http://www.morecheck.cn/2019/12/01/CRNN_Step4_train/</link>
        <guid isPermaLink="true">http://www.morecheck.cn/2019/12/01/CRNN_Step4_train/</guid>
        
        <category>tensorflow</category>
        
        <category>CRNN</category>
        
        
      </item>
    
      <item>
        <title>tensorflow_Step3_1_crnn_baseoperations</title>
        <description>&lt;h2 id=&quot;流程&quot;&gt;流程:&lt;/h2&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;
# -*- coding: utf-8 -*-

&quot;&quot;&quot;
@from:www.linerect.com

@author:  duimu

@contact: duimu@qq.com

@Created on: 2019/12/17 11:05
&quot;&quot;&quot;
import tensorflow as tf
import numpy as np

from tensorflow.contrib import rnn
from cnn_basenet import *
from Step1_getdatatxt import *
from Step0_CrnnDefines import *


def _conv_stage(inputdata, out_dims, name):
    &quot;&quot;&quot; Standard VGG convolutional stage: 2d conv, relu, and maxpool

    :param inputdata: 4D tensor batch x width x height x channels
    :param out_dims: number of output channels / filters
    :return: the maxpooled output of the stage
    &quot;&quot;&quot;
    with tf.variable_scope(name_or_scope=name):
        conv = CNNBaseModel.conv2d(
            inputdata=inputdata, out_channel=out_dims,
            kernel_size=3, stride=1, use_bias=True, name=&apos;conv&apos;
        )
        bn = CNNBaseModel.layerbn(
            inputdata=conv, is_training=g_is_training, name=&apos;bn&apos;
        )
        relu = CNNBaseModel.relu(
            inputdata=bn, name=&apos;relu&apos;
        )
        max_pool = CNNBaseModel.maxpooling(
            inputdata=relu, kernel_size=2, stride=2, name=&apos;max_pool&apos;
        )
    return max_pool


def dropout(inputdata, keep_prob, is_training, name, noise_shape=None):
    &quot;&quot;&quot;

    :param name:
    :param inputdata:
    :param keep_prob:
    :param is_training
    :param noise_shape:
    :return:
    &quot;&quot;&quot;

    return tf.cond(
        pred=is_training,
        true_fn=lambda: tf.nn.dropout(
            inputdata, keep_prob=keep_prob, noise_shape=noise_shape
        ),
        false_fn=lambda: inputdata,
        name=name
    )


def decode_a_seq(indexes, spars_tensor):
    decoded = []
    for m in indexes:
        str = g_dict[spars_tensor[1][m]]
        decoded.append(str)
    return decoded


# 稀疏矩阵转序列列表
def decode_sparse_tensor(sparse_tensor):
    decoded_indexes = list()
    current_i = 0
    current_seq = []
    for offset, i_and_index in enumerate(sparse_tensor[0]):
        i = i_and_index[0]
        if i != current_i:
            decoded_indexes.append(current_seq)
            current_i = i
            current_seq = list()
        current_seq.append(offset)
    decoded_indexes.append(current_seq)
    result = []
    for index in decoded_indexes:
        result.append(decode_a_seq(index, sparse_tensor))
    return result


# 转化一个序列列表为稀疏矩阵
def sparse_tuple_from(sequences, dtype=np.int32):
    &quot;&quot;&quot;    Create a sparse representention of x.
      Args:
        sequences: a list of lists of type dtype where each element is a sequence
    Returns:
        A tuple with (indices, values, shape)
    &quot;&quot;&quot;
    indices = []
    values = []

    for n, seq in enumerate(sequences):
        indices.extend(zip([n] * len(seq), range(len(seq))))
        values.extend(seq)

    indices = np.asarray(indices, dtype=np.int64)
    values = np.asarray(values, dtype=dtype)
    shape = np.asarray([len(sequences), np.asarray(indices).max(0)[1] + 1], dtype=np.int64)

    return indices, values, shape

#将稀疏矩阵转化为字符串比较准确率
def getaccuracy(decoded_list, test_targets):
    original_list = decode_sparse_tensor(test_targets)
    detected_list = decode_sparse_tensor(decoded_list)
    true_numer = 0
    if len(original_list) != len(detected_list):
        print(&quot;len(original_list)&quot;,
              len(original_list),
              &quot;len(detected_list)&quot;,
              len(detected_list),
              &quot; 长度不匹配&quot;)
        return
    print(&quot;T/F: original(length) &amp;lt;-------&amp;gt; detectcted(length)&quot;)
    for idx, number in enumerate(original_list):
        detect_number = detected_list[idx]
        hit = (number == detect_number)
        print(hit, number, &quot;(&quot;, len(number), &quot;) &amp;lt;-------&amp;gt; &quot;, detect_number, &quot;(&quot;, len(detect_number), &quot;)&quot;)
        if hit:
            true_numer = true_numer + 1
    print(&quot;精度:&quot;, true_numer * 1.0 / len(original_list))

#生成cnn特征
def CNN(inputdata):
    conv1 = _conv_stage(
        inputdata=inputdata, out_dims=64, name=&apos;conv1&apos;
    )
    conv2 = _conv_stage(
        inputdata=conv1, out_dims=128, name=&apos;conv2&apos;
    )
    conv3 = CNNBaseModel.conv2d(
        inputdata=conv2, out_channel=256, kernel_size=3, stride=1, use_bias=False, name=&apos;conv3&apos;
    )
    bn3 = CNNBaseModel.layerbn(
        inputdata=conv3, is_training=g_is_training, name=&apos;bn3&apos;
    )
    relu3 = CNNBaseModel.relu(
        inputdata=bn3, name=&apos;relu3&apos;
    )
    conv4 = CNNBaseModel.conv2d(
        inputdata=relu3, out_channel=256, kernel_size=3, stride=1, use_bias=False, name=&apos;conv4&apos;
    )
    bn4 = CNNBaseModel.layerbn(
        inputdata=conv4, is_training=g_is_training, name=&apos;bn4&apos;
    )
    relu4 = CNNBaseModel.relu(
        inputdata=bn4, name=&apos;relu4&apos;)
    max_pool4 = CNNBaseModel.maxpooling(
        inputdata=relu4, kernel_size=[2, 1], stride=[2, 1], padding=&apos;VALID&apos;, name=&apos;max_pool4&apos;
    )
    conv5 = CNNBaseModel.conv2d(
        inputdata=max_pool4, out_channel=512, kernel_size=3, stride=1, use_bias=False, name=&apos;conv5&apos;
    )
    bn5 = CNNBaseModel.layerbn(
        inputdata=conv5, is_training=g_is_training, name=&apos;bn5&apos;
    )
    relu5 = CNNBaseModel.relu(
        inputdata=bn5, name=&apos;bn5&apos;
    )
    conv6 = CNNBaseModel.conv2d(
        inputdata=relu5, out_channel=512, kernel_size=3, stride=1, use_bias=False, name=&apos;conv6&apos;
    )
    bn6 = CNNBaseModel.layerbn(
        inputdata=conv6, is_training=g_is_training, name=&apos;bn6&apos;
    )
    relu6 = CNNBaseModel.relu(
        inputdata=bn6, name=&apos;relu6&apos;
    )
    max_pool6 = CNNBaseModel.maxpooling(
        inputdata=relu6, kernel_size=[2, 1], stride=[2, 1], name=&apos;max_pool6&apos;
    )
    conv7 = CNNBaseModel.conv2d(
        inputdata=max_pool6, out_channel=512, kernel_size=2, stride=[2, 1], use_bias=False, name=&apos;conv7&apos;
    )
    bn7 = CNNBaseModel.layerbn(
        inputdata=conv7, is_training=g_is_training, name=&apos;bn7&apos;
    )
    relu7 = CNNBaseModel.relu(
        inputdata=bn7, name=&apos;bn7&apos;
    )
    return relu7


#转化lstm特征
def LSTM(inputs):
    # 定义LSTM网络
    _hidden_nums = g_num_hidden
    _layers_nums = g_num_layers
    fw_cell_list = [tf.nn.rnn_cell.LSTMCell(nh, forget_bias=1.0) for
                    nh in [_hidden_nums] * _layers_nums]
    # Backward direction cells
    bw_cell_list = [tf.nn.rnn_cell.LSTMCell(nh, forget_bias=1.0) for
                    nh in [_hidden_nums] * _layers_nums]

    stack_lstm_layer, _, _ = rnn.stack_bidirectional_dynamic_rnn(
        fw_cell_list,
        bw_cell_list,
        inputs,
        dtype=tf.float32
    )
    stack_lstm_layer = dropout(
        inputdata=stack_lstm_layer,
        keep_prob=0.5,
        is_training=g_is_training,
        name=&apos;sequence_drop_out&apos;
    )

    [batch_s, _, hidden_nums] = inputs.get_shape().as_list()  # [batch, width, 2*n_hidden]

    shape = tf.shape(stack_lstm_layer)

    rnn_reshaped = tf.reshape(stack_lstm_layer, [shape[0] * shape[1], shape[2]])

    return shape, hidden_nums, rnn_reshaped

#生成crnn特征
def Getfeature(inputs):
    # 获取cnn特征
    cnn_output = CNN(inputs)
    # 将4维转化为3维
    reshaped_cnn_output = tf.squeeze(cnn_output, [1])
    # 获取lstm特征
    shape, hidden_nums, outputs = LSTM(reshaped_cnn_output)
    # 定义w,b
    w = tf.Variable(
        tf.truncated_normal([hidden_nums, g_num_classes], stddev=0.1), name=&quot;W&quot;
    )
    b = tf.Variable(tf.constant(0.0, shape=[g_num_classes]), name=&quot;b&quot;)

    # Doing the affine projection
    logits = tf.matmul(outputs, w, name=&apos;logits&apos;)
    logits = tf.reshape(logits, [shape[0], shape[1], g_num_classes], name=&apos;logits_reshape&apos;)

    # 结果
    raw_pred = tf.argmax(tf.nn.softmax(logits), axis=2, name=&apos;raw_prediction&apos;)

    # Swap batch and batch axis
    # 将结果转为[timestamp, batch, n_classes]，便于计算ctc
    rnn_out = tf.transpose(logits, [1, 0, 2], name=&apos;transpose_time_major&apos;)

    return rnn_out





&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
</description>
        <pubDate>Sun, 01 Dec 2019 14:00:00 +0000</pubDate>
        <link>http://www.morecheck.cn/2019/12/01/CRNN_Step3_1_crnn_baseoperations/</link>
        <guid isPermaLink="true">http://www.morecheck.cn/2019/12/01/CRNN_Step3_1_crnn_baseoperations/</guid>
        
        <category>tensorflow</category>
        
        <category>CRNN</category>
        
        
      </item>
    
      <item>
        <title>tensorflow_Step3_0_cnn_basenet</title>
        <description>&lt;h2 id=&quot;流程&quot;&gt;流程:&lt;/h2&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 17-9-18 下午3:59
# @Author  : MaybeShewill-CV
# @Site    : https://github.com/MaybeShewill-CV/CRNN_Tensorflow
# @File    : Step3_0_cnn_basenet.py
# @IDE: PyCharm Community Edition
&quot;&quot;&quot;
The base convolution neural networks mainly implement some useful cnn functions
&quot;&quot;&quot;
import tensorflow as tf
from tensorflow.python.training import moving_averages
from tensorflow.contrib.framework import add_model_variable
import numpy as np


class CNNBaseModel(object):
    &quot;&quot;&quot;
    Base model for other specific cnn ctpn_models
    &quot;&quot;&quot;

    def __init__(self):
        pass

    @staticmethod
    def conv2d(inputdata, out_channel, kernel_size, padding=&apos;SAME&apos;,
               stride=1, w_init=None, b_init=None,
               split=1, use_bias=True, data_format=&apos;NHWC&apos;, name=None):
        &quot;&quot;&quot;
        Packing the tensorflow conv2d function.
        :param name: op name
        :param inputdata: A 4D tensorflow tensor which ust have known number of channels, but can have other
        unknown dimensions.
        :param out_channel: number of output channel.
        :param kernel_size: int so only support square kernel convolution
        :param padding: &apos;VALID&apos; or &apos;SAME&apos;
        :param stride: int so only support square stride
        :param w_init: initializer for convolution weights
        :param b_init: initializer for bias
        :param split: split channels as used in Alexnet mainly group for GPU memory save.
        :param use_bias:  whether to use bias.
        :param data_format: default set to NHWC according tensorflow
        :return: tf.Tensor named ``output``
        &quot;&quot;&quot;
        with tf.variable_scope(name):
            in_shape = inputdata.get_shape().as_list()
            channel_axis = 3 if data_format == &apos;NHWC&apos; else 1
            in_channel = in_shape[channel_axis]

            assert in_channel is not None, &quot;[Conv2D] Input cannot have unknown channel!&quot;
            assert in_channel % split == 0
            assert out_channel % split == 0

            padding = padding.upper()

            if isinstance(kernel_size, list):
                filter_shape = [kernel_size[0], kernel_size[1]] + [in_channel / split, out_channel]
            else:
                filter_shape = [kernel_size, kernel_size] + [in_channel / split, out_channel]

            if isinstance(stride, list):
                strides = [1, stride[0], stride[1], 1] if data_format == &apos;NHWC&apos; \
                    else [1, 1, stride[0], stride[1]]
            else:
                strides = [1, stride, stride, 1] if data_format == &apos;NHWC&apos; \
                    else [1, 1, stride, stride]

            if w_init is None:
                w_init = tf.contrib.layers.variance_scaling_initializer()
            if b_init is None:
                b_init = tf.constant_initializer()

            w = tf.get_variable(&apos;W&apos;, filter_shape, initializer=w_init)
            b = None

            if use_bias:
                b = tf.get_variable(&apos;b&apos;, [out_channel], initializer=b_init)

            if split == 1:
                conv = tf.nn.conv2d(inputdata, w, strides, padding, data_format=data_format)
            else:
                inputs = tf.split(inputdata, split, channel_axis)
                kernels = tf.split(w, split, 3)
                outputs = [tf.nn.conv2d(i, k, strides, padding, data_format=data_format)
                           for i, k in zip(inputs, kernels)]
                conv = tf.concat(outputs, channel_axis)

            ret = tf.identity(tf.nn.bias_add(conv, b, data_format=data_format)
                              if use_bias else conv, name=name)

        return ret

    @staticmethod
    def relu(inputdata, name=None):
        &quot;&quot;&quot;

        :param name:
        :param inputdata:
        :return:
        &quot;&quot;&quot;
        return tf.nn.relu(features=inputdata, name=name)

    @staticmethod
    def sigmoid(inputdata, name=None):
        &quot;&quot;&quot;

        :param name:
        :param inputdata:
        :return:
        &quot;&quot;&quot;
        return tf.nn.sigmoid(x=inputdata, name=name)

    @staticmethod
    def maxpooling(inputdata, kernel_size, stride=None, padding=&apos;VALID&apos;,
                   data_format=&apos;NHWC&apos;, name=None):
        &quot;&quot;&quot;

        :param name:
        :param inputdata:
        :param kernel_size:
        :param stride:
        :param padding:
        :param data_format:
        :return:
        &quot;&quot;&quot;
        padding = padding.upper()

        if stride is None:
            stride = kernel_size

        if isinstance(kernel_size, list):
            kernel = [1, kernel_size[0], kernel_size[1], 1] if data_format == &apos;NHWC&apos; else \
                [1, 1, kernel_size[0], kernel_size[1]]
        else:
            kernel = [1, kernel_size, kernel_size, 1] if data_format == &apos;NHWC&apos; \
                else [1, 1, kernel_size, kernel_size]

        if isinstance(stride, list):
            strides = [1, stride[0], stride[1], 1] if data_format == &apos;NHWC&apos; \
                else [1, 1, stride[0], stride[1]]
        else:
            strides = [1, stride, stride, 1] if data_format == &apos;NHWC&apos; \
                else [1, 1, stride, stride]

        return tf.nn.max_pool(value=inputdata, ksize=kernel, strides=strides, padding=padding,
                              data_format=data_format, name=name)

    @staticmethod
    def avgpooling(inputdata, kernel_size, stride=None, padding=&apos;VALID&apos;,
                   data_format=&apos;NHWC&apos;, name=None):
        &quot;&quot;&quot;

        :param name:
        :param inputdata:
        :param kernel_size:
        :param stride:
        :param padding:
        :param data_format:
        :return:
        &quot;&quot;&quot;
        if stride is None:
            stride = kernel_size

        kernel = [1, kernel_size, kernel_size, 1] if data_format == &apos;NHWC&apos; \
            else [1, 1, kernel_size, kernel_size]

        strides = [1, stride, stride, 1] if data_format == &apos;NHWC&apos; else [1, 1, stride, stride]

        return tf.nn.avg_pool(value=inputdata, ksize=kernel, strides=strides, padding=padding,
                              data_format=data_format, name=name)

    @staticmethod
    def globalavgpooling(inputdata, data_format=&apos;NHWC&apos;, name=None):
        &quot;&quot;&quot;

        :param name:
        :param inputdata:
        :param data_format:
        :return:
        &quot;&quot;&quot;
        assert inputdata.shape.ndims == 4
        assert data_format in [&apos;NHWC&apos;, &apos;NCHW&apos;]

        axis = [1, 2] if data_format == &apos;NHWC&apos; else [2, 3]

        return tf.reduce_mean(input_tensor=inputdata, axis=axis, name=name)

    @staticmethod
    def layernorm(inputdata, epsilon=1e-5, use_bias=True, use_scale=True,
                  data_format=&apos;NHWC&apos;, name=None):
        &quot;&quot;&quot;
        :param name:
        :param inputdata:
        :param epsilon: epsilon to avoid divide-by-zero.
        :param use_bias: whether to use the extra affine transformation or not.
        :param use_scale: whether to use the extra affine transformation or not.
        :param data_format:
        :return:
        &quot;&quot;&quot;
        shape = inputdata.get_shape().as_list()
        ndims = len(shape)
        assert ndims in [2, 4]

        mean, var = tf.nn.moments(inputdata, list(range(1, len(shape))), keep_dims=True)

        if data_format == &apos;NCHW&apos;:
            channnel = shape[1]
            new_shape = [1, channnel, 1, 1]
        else:
            channnel = shape[-1]
            new_shape = [1, 1, 1, channnel]
        if ndims == 2:
            new_shape = [1, channnel]

        if use_bias:
            beta = tf.get_variable(&apos;beta&apos;, [channnel], initializer=tf.constant_initializer())
            beta = tf.reshape(beta, new_shape)
        else:
            beta = tf.zeros([1] * ndims, name=&apos;beta&apos;)
        if use_scale:
            gamma = tf.get_variable(&apos;gamma&apos;, [channnel], initializer=tf.constant_initializer(1.0))
            gamma = tf.reshape(gamma, new_shape)
        else:
            gamma = tf.ones([1] * ndims, name=&apos;gamma&apos;)

        return tf.nn.batch_normalization(inputdata, mean, var, beta, gamma, epsilon, name=name)

    @staticmethod
    def instancenorm(inputdata, epsilon=1e-5, data_format=&apos;NHWC&apos;, use_affine=True, name=None):
        &quot;&quot;&quot;

        :param name:
        :param inputdata:
        :param epsilon:
        :param data_format:
        :param use_affine:
        :return:
        &quot;&quot;&quot;
        shape = inputdata.get_shape().as_list()
        if len(shape) != 4:
            raise ValueError(&quot;Input data of instancebn layer has to be 4D tensor&quot;)

        if data_format == &apos;NHWC&apos;:
            axis = [1, 2]
            ch = shape[3]
            new_shape = [1, 1, 1, ch]
        else:
            axis = [2, 3]
            ch = shape[1]
            new_shape = [1, ch, 1, 1]
        if ch is None:
            raise ValueError(&quot;Input of instancebn require known channel!&quot;)

        mean, var = tf.nn.moments(inputdata, axis, keep_dims=True)

        if not use_affine:
            return tf.divide(inputdata - mean, tf.sqrt(var + epsilon), name=&apos;output&apos;)

        beta = tf.get_variable(&apos;beta&apos;, [ch], initializer=tf.constant_initializer())
        beta = tf.reshape(beta, new_shape)
        gamma = tf.get_variable(&apos;gamma&apos;, [ch], initializer=tf.constant_initializer(1.0))
        gamma = tf.reshape(gamma, new_shape)
        return tf.nn.batch_normalization(inputdata, mean, var, beta, gamma, epsilon, name=name)

    @staticmethod
    def dropout(inputdata, keep_prob, is_training, name, noise_shape=None):
        &quot;&quot;&quot;

        :param name:
        :param inputdata:
        :param keep_prob:
        :param is_training
        :param noise_shape:
        :return:
        &quot;&quot;&quot;

        return tf.cond(
            pred=is_training,
            true_fn=lambda: tf.nn.dropout(
                inputdata, keep_prob=keep_prob, noise_shape=noise_shape
            ),
            false_fn=lambda: inputdata,
            name=name
        )

    @staticmethod
    def fullyconnect(inputdata, out_dim, w_init=None, b_init=None,
                     use_bias=True, name=None):
        &quot;&quot;&quot;
        Fully-Connected layer, takes a N&amp;gt;1D tensor and returns a 2D tensor.
        It is an equivalent of `tf.layers.dense` except for naming conventions.

        :param inputdata:  a tensor to be flattened except for the first dimension.
        :param out_dim: output dimension
        :param w_init: initializer for w. Defaults to `variance_scaling_initializer`.
        :param b_init: initializer for b. Defaults to zero
        :param use_bias: whether to use bias.
        :param name:
        :return: tf.Tensor: a NC tensor named ``output`` with attribute `variables`.
        &quot;&quot;&quot;
        shape = inputdata.get_shape().as_list()[1:]
        if None not in shape:
            inputdata = tf.reshape(inputdata, [-1, int(np.prod(shape))])
        else:
            inputdata = tf.reshape(inputdata, tf.stack([tf.shape(inputdata)[0], -1]))

        if w_init is None:
            w_init = tf.contrib.layers.variance_scaling_initializer()
        if b_init is None:
            b_init = tf.constant_initializer()

        ret = tf.layers.dense(inputs=inputdata, activation=lambda x: tf.identity(x, name=&apos;output&apos;),
                              use_bias=use_bias, name=name,
                              kernel_initializer=w_init,
                              bias_initializer=b_init,
                              trainable=True, units=out_dim)
        return ret

    @staticmethod
    def layerbn(inputdata, is_training, name, momentum=0.999, eps=1e-3):
        &quot;&quot;&quot;

        :param inputdata:
        :param is_training:
        :param name:
        :param momentum:
        :param eps:
        :return:
        &quot;&quot;&quot;

        return tf.layers.batch_normalization(
            inputs=inputdata, training=is_training, name=name, momentum=momentum, epsilon=eps)

    @staticmethod
    def layerbn_distributed(list_input, stats_mode, data_format=&apos;NHWC&apos;,
                            float_type=tf.float32, trainable=True,
                            use_gamma=True, use_beta=True, bn_epsilon=1e-5,
                            bn_ema=0.9, name=&apos;BatchNorm&apos;):
        &quot;&quot;&quot;
        Batch norm for distributed training process
        :param list_input:
        :param stats_mode:
        :param data_format:
        :param float_type:
        :param trainable:
        :param use_gamma:
        :param use_beta:
        :param bn_epsilon:
        :param bn_ema:
        :param name:
        :return:
        &quot;&quot;&quot;

        def _get_bn_variables(_n_out, _use_scale, _use_bias, _trainable, _float_type):

            if _use_bias:
                _beta = tf.get_variable(&apos;beta&apos;, [_n_out],
                                        initializer=tf.constant_initializer(),
                                        trainable=_trainable,
                                        dtype=_float_type)
            else:
                _beta = tf.zeros([_n_out], name=&apos;beta&apos;)
            if _use_scale:
                _gamma = tf.get_variable(&apos;gamma&apos;, [_n_out],
                                         initializer=tf.constant_initializer(1.0),
                                         trainable=_trainable,
                                         dtype=_float_type)
            else:
                _gamma = tf.ones([_n_out], name=&apos;gamma&apos;)

            _moving_mean = tf.get_variable(&apos;moving_mean&apos;, [_n_out],
                                           initializer=tf.constant_initializer(),
                                           trainable=False,
                                           dtype=_float_type)
            _moving_var = tf.get_variable(&apos;moving_variance&apos;, [_n_out],
                                          initializer=tf.constant_initializer(1),
                                          trainable=False,
                                          dtype=_float_type)
            return _beta, _gamma, _moving_mean, _moving_var

        def _update_bn_ema(_xn, _batch_mean, _batch_var, _moving_mean, _moving_var, _decay):

            _update_op1 = moving_averages.assign_moving_average(
                _moving_mean, _batch_mean, _decay, zero_debias=False,
                name=&apos;mean_ema_op&apos;)
            _update_op2 = moving_averages.assign_moving_average(
                _moving_var, _batch_var, _decay, zero_debias=False,
                name=&apos;var_ema_op&apos;)
            add_model_variable(moving_mean)
            add_model_variable(moving_var)

            # seems faster than delayed update, but might behave otherwise in distributed settings.
            with tf.control_dependencies([_update_op1, _update_op2]):
                return tf.identity(xn, name=&apos;output&apos;)

        # ======================== Checking valid values =========================
        if data_format not in [&apos;NHWC&apos;, &apos;NCHW&apos;]:
            raise TypeError(
                &quot;Only two data formats are supported at this moment: &apos;NHWC&apos; or &apos;NCHW&apos;, &quot;
                &quot;%s is an unknown data format.&quot; % data_format)
        assert type(list_input) == list

        # ======================== Setting default values =========================
        shape = list_input[0].get_shape().as_list()
        assert len(shape) in [2, 4]
        n_out = shape[-1]
        if data_format == &apos;NCHW&apos;:
            n_out = shape[1]

        # ======================== Main operations =============================
        means = []
        square_means = []
        for i in range(len(list_input)):
            with tf.device(&apos;/gpu:%d&apos; % i):
                batch_mean = tf.reduce_mean(list_input[i], [0, 1, 2])
                batch_square_mean = tf.reduce_mean(tf.square(list_input[i]), [0, 1, 2])
                means.append(batch_mean)
                square_means.append(batch_square_mean)

        # if your GPUs have NVLinks and you&apos;ve install NCCL2, you can change `/cpu:0` to `/gpu:0`
        with tf.device(&apos;/cpu:0&apos;):
            shape = tf.shape(list_input[0])
            num = shape[0] * shape[1] * shape[2] * len(list_input)
            mean = tf.reduce_mean(means, axis=0)
            var = tf.reduce_mean(square_means, axis=0) - tf.square(mean)
            var *= tf.cast(num, float_type) / tf.cast(num - 1, float_type)  # unbiased variance

        list_output = []
        for i in range(len(list_input)):
            with tf.device(&apos;/gpu:%d&apos; % i):
                with tf.variable_scope(name, reuse=i &amp;gt; 0):
                    beta, gamma, moving_mean, moving_var = _get_bn_variables(
                        n_out, use_gamma, use_beta, trainable, float_type)

                    if &apos;train&apos; in stats_mode:
                        xn = tf.nn.batch_normalization(
                            list_input[i], mean, var, beta, gamma, bn_epsilon)
                        if tf.get_variable_scope().reuse or &apos;gather&apos; not in stats_mode:
                            list_output.append(xn)
                        else:
                            # gather stats and it is the main gpu device.
                            xn = _update_bn_ema(xn, mean, var, moving_mean, moving_var, bn_ema)
                            list_output.append(xn)
                    else:
                        xn = tf.nn.batch_normalization(
                            list_input[i], moving_mean, moving_var, beta, gamma, bn_epsilon)
                        list_output.append(xn)

        return list_output

    @staticmethod
    def layergn(inputdata, name, group_size=32, esp=1e-5):
        &quot;&quot;&quot;

        :param inputdata:
        :param name:
        :param group_size:
        :param esp:
        :return:
        &quot;&quot;&quot;
        with tf.variable_scope(name):
            inputdata = tf.transpose(inputdata, [0, 3, 1, 2])
            n, c, h, w = inputdata.get_shape().as_list()
            group_size = min(group_size, c)
            inputdata = tf.reshape(inputdata, [-1, group_size, c // group_size, h, w])
            mean, var = tf.nn.moments(inputdata, [2, 3, 4], keep_dims=True)
            inputdata = (inputdata - mean) / tf.sqrt(var + esp)

            # 每个通道的gamma和beta
            gamma = tf.Variable(tf.constant(1.0, shape=[c]), dtype=tf.float32, name=&apos;gamma&apos;)
            beta = tf.Variable(tf.constant(0.0, shape=[c]), dtype=tf.float32, name=&apos;beta&apos;)
            gamma = tf.reshape(gamma, [1, c, 1, 1])
            beta = tf.reshape(beta, [1, c, 1, 1])

            # 根据论文进行转换 [n, c, h, w, c] 到 [n, h, w, c]
            output = tf.reshape(inputdata, [-1, c, h, w])
            output = output * gamma + beta
            output = tf.transpose(output, [0, 2, 3, 1])

        return output

    @staticmethod
    def squeeze(inputdata, axis=None, name=None):
        &quot;&quot;&quot;

        :param inputdata:
        :param axis:
        :param name:
        :return:
        &quot;&quot;&quot;
        return tf.squeeze(input=inputdata, axis=axis, name=name)

    @staticmethod
    def deconv2d(inputdata, out_channel, kernel_size, padding=&apos;SAME&apos;,
                 stride=1, w_init=None, b_init=None,
                 use_bias=True, activation=None, data_format=&apos;channels_last&apos;,
                 trainable=True, name=None):
        &quot;&quot;&quot;
        Packing the tensorflow conv2d function.
        :param name: op name
        :param inputdata: A 4D tensorflow tensor which ust have known number of channels, but can have other
        unknown dimensions.
        :param out_channel: number of output channel.
        :param kernel_size: int so only support square kernel convolution
        :param padding: &apos;VALID&apos; or &apos;SAME&apos;
        :param stride: int so only support square stride
        :param w_init: initializer for convolution weights
        :param b_init: initializer for bias
        :param activation: whether to apply a activation func to deconv result
        :param use_bias:  whether to use bias.
        :param data_format: default set to NHWC according tensorflow
        :param trainable:
        :return: tf.Tensor named ``output``
        &quot;&quot;&quot;
        with tf.variable_scope(name):
            in_shape = inputdata.get_shape().as_list()
            channel_axis = 3 if data_format == &apos;channels_last&apos; else 1
            in_channel = in_shape[channel_axis]
            assert in_channel is not None, &quot;[Deconv2D] Input cannot have unknown channel!&quot;

            padding = padding.upper()

            if w_init is None:
                w_init = tf.contrib.layers.variance_scaling_initializer()
            if b_init is None:
                b_init = tf.constant_initializer()

            ret = tf.layers.conv2d_transpose(inputs=inputdata, filters=out_channel,
                                             kernel_size=kernel_size,
                                             strides=stride, padding=padding,
                                             data_format=data_format,
                                             activation=activation, use_bias=use_bias,
                                             kernel_initializer=w_init,
                                             bias_initializer=b_init, trainable=trainable,
                                             name=name)
        return ret

    @staticmethod
    def dilation_conv(input_tensor, k_size, out_dims, rate, padding=&apos;SAME&apos;,
                      w_init=None, b_init=None, use_bias=False, name=None):
        &quot;&quot;&quot;

        :param input_tensor:
        :param k_size:
        :param out_dims:
        :param rate:
        :param padding:
        :param w_init:
        :param b_init:
        :param use_bias:
        :param name:
        :return:
        &quot;&quot;&quot;
        with tf.variable_scope(name):
            in_shape = input_tensor.get_shape().as_list()
            in_channel = in_shape[3]

            assert in_channel is not None, &quot;[Conv2D] Input cannot have unknown channel!&quot;

            padding = padding.upper()

            if isinstance(k_size, list):
                filter_shape = [k_size[0], k_size[1]] + [in_channel, out_dims]
            else:
                filter_shape = [k_size, k_size] + [in_channel, out_dims]

            if w_init is None:
                w_init = tf.contrib.layers.variance_scaling_initializer()
            if b_init is None:
                b_init = tf.constant_initializer()

            w = tf.get_variable(&apos;W&apos;, filter_shape, initializer=w_init)
            b = None

            if use_bias:
                b = tf.get_variable(&apos;b&apos;, [out_dims], initializer=b_init)

            conv = tf.nn.atrous_conv2d(value=input_tensor, filters=w, rate=rate,
                                       padding=padding, name=&apos;dilation_conv&apos;)

            if use_bias:
                ret = tf.add(conv, b)
            else:
                ret = conv

        return ret

    @staticmethod
    def spatial_dropout(input_tensor, keep_prob, is_training, name, seed=1234):
        &quot;&quot;&quot;
        空间dropout实现
        :param input_tensor:
        :param keep_prob:
        :param is_training:
        :param name:
        :param seed:
        :return:
        &quot;&quot;&quot;

        def f1():
            input_shape = input_tensor.get_shape().as_list()
            noise_shape = tf.constant(value=[input_shape[0], 1, 1, input_shape[3]])
            return tf.nn.dropout(input_tensor, keep_prob, noise_shape, seed=seed, name=&quot;spatial_dropout&quot;)

        def f2():
            return input_tensor

        with tf.variable_scope(name_or_scope=name):

            output = tf.cond(is_training, f1, f2)

            return output

    @staticmethod
    def lrelu(inputdata, name, alpha=0.2):
        &quot;&quot;&quot;

        :param inputdata:
        :param alpha:
        :param name:
        :return:
        &quot;&quot;&quot;
        with tf.variable_scope(name):
            return tf.nn.relu(inputdata) - alpha * tf.nn.relu(-inputdata)

    @staticmethod
    def pad(inputdata, paddings, name):
        &quot;&quot;&quot;

        :param inputdata:
        :param paddings:
        :return:
        &quot;&quot;&quot;
        with tf.variable_scope(name_or_scope=name):
            return tf.pad(tensor=inputdata, paddings=paddings)






&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
</description>
        <pubDate>Sun, 01 Dec 2019 14:00:00 +0000</pubDate>
        <link>http://www.morecheck.cn/2019/12/01/CRNN_Step3_0_cnn_basenet/</link>
        <guid isPermaLink="true">http://www.morecheck.cn/2019/12/01/CRNN_Step3_0_cnn_basenet/</guid>
        
        <category>tensorflow</category>
        
        <category>CRNN</category>
        
        
      </item>
    
      <item>
        <title>tensorflow_Step2_WritetfRecord</title>
        <description>&lt;h2 id=&quot;流程&quot;&gt;流程:&lt;/h2&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;# -*-coding: utf-8 -*-
&quot;&quot;&quot;
    @Project: create_tfrecord
    @File   : create_tf_record_multi_label.py
    @desc   : 将图片数据,多label,保存为单个tfrecord文件
&quot;&quot;&quot;

##########################################################################

import tensorflow as tf
import numpy as np
import os
import cv2
import matplotlib.pyplot as plt
import random
from Step1_getdatatxt  import *
from Step0_CrnnDefines import *
from PIL import Image


##########################################################################
def _int64_feature(value):
    return tf.train.Feature(int64_list=tf.train.Int64List(value=[value]))


def _float_feature(value):
    return tf.train.Feature(float_list=tf.train.FloatList(value=[value]))


# 生成字符串型的属性
def _bytes_feature(value):
    return tf.train.Feature(bytes_list=tf.train.BytesList(value=[value]))


# 生成实数型的属性
def float_list_feature(value):
    return tf.train.Feature(float_list=tf.train.FloatList(value=value))


def get_example_nums(tf_records_filenames):
    &apos;&apos;&apos;
    统计tf_records图像的个数(example)个数
    :param tf_records_filenames: tf_records文件路径
    :return:
    &apos;&apos;&apos;
    nums = 0
    for record in tf.python_io.tf_record_iterator(tf_records_filenames):
        nums += 1
    return nums


def show_image(title, image):
    &apos;&apos;&apos;
    显示图片
    :param title: 图像标题
    :param image: 图像的数据
    :return:
    &apos;&apos;&apos;
    # plt.figure(&quot;show_image&quot;)
    # print(image.dtype)

    plt.figure(1)
    plt.imshow(image)
    #plt.axis(&apos;on&apos;)  # 关掉坐标轴为 off
    plt.title(title)  # 图像题目
    plt.show()


def load_labels_file(filename, shuffle=False):
    &apos;&apos;&apos;
    载图txt文件，文件中每行为一个图片信息，且以空格隔开：图像路径 标签1 标签2，如：test_image/1.jpg 0 2
    :param filename:
    :param shuffle :是否打乱顺序
    :return:images type-&amp;gt;list
    :return:labels type-&amp;gt;list
    &apos;&apos;&apos;
    images = []
    labels = []
    with open(filename) as f:
        lines_list = f.readlines()
        if shuffle:
            random.shuffle(lines_list)

        for lines in lines_list:
            line = lines.rstrip().split(&apos; &apos;)
            label = []
            labels_num=len(line)-1
            if labels_num&amp;gt;g_MaxLableCount:
                labels_num=g_MaxLableCount
            for i in range(labels_num):
                label.append(line[i + 1])
            images.append(line[0])
            labels.append(label)
    return images, labels


def read_image(filename, resize_height, resize_width, normalization=False):
    &apos;&apos;&apos;
    读取图片数据,默认返回的是uint8,[0,255]
    :param filename:
    :param resize_height:
    :param resize_width:
    :param normalization:是否归一化到[0.,1.0]
    :return: 返回的图片数据
    &apos;&apos;&apos;

    image = cv2.imread(filename,cv2.IMREAD_UNCHANGED)
    if image is None:
        return None

    size = image.shape
    if size[0] &amp;gt; 0 and size[1] &amp;gt; 0:
        image = cv2.resize(image, (resize_width, resize_height))

    if image.shape[2]!=g_iamge_channels:
        print(&quot;channel dismatch&quot;, filename)
        if image.shape[2]==3 and g_iamge_channels==1:
            image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
        elif image.shape[2]==1 and g_iamge_channels==3:
            image = cv2.cvtColor(image, cv2.COLOR_GRAY2BGR)
        elif image.shape[2]!= g_iamge_channels:
            return None

    image = np.asanyarray(image)
    if normalization:
        image = image / 255.0
    return image


def get_batch_images(images, labels, batch_size, labels_nums, one_hot=False, shuffle=False, num_threads=1):
    &apos;&apos;&apos;
    :param images:图像
    :param labels:标签
    :param batch_size:
    :param labels_nums:标签个数
    :param one_hot:是否将labels转为one_hot的形式
    :param shuffle:是否打乱顺序,一般train时shuffle=True,验证时shuffle=False
    :return:返回batch的images和labels
    &apos;&apos;&apos;
    min_after_dequeue = 200
    capacity = min_after_dequeue + 3 * batch_size  # 保证capacity必须大于min_after_dequeue参数值
    if shuffle:
        images_batch, labels_batch = tf.train.shuffle_batch([images, labels],
                                                            batch_size=batch_size,
                                                            capacity=capacity,
                                                            min_after_dequeue=min_after_dequeue,
                                                            num_threads=num_threads)
    else:
        images_batch, labels_batch = tf.train.batch([images, labels],
                                                    batch_size=batch_size,
                                                    capacity=capacity,
                                                    num_threads=num_threads)
    if one_hot:
        labels_batch = tf.one_hot(labels_batch, labels_nums, 1, 0)
    return images_batch, labels_batch


def read_records(filename, resize_height, resize_width, type=None,channel=3):
    &apos;&apos;&apos;
    解析record文件:源文件的图像数据是RGB,uint8,[0,255],一般作为训练数据时,需要归一化到[0,1]
    :param filename:
    :param resize_height:
    :param resize_width:
    :param type:选择图像数据的返回类型
         None:默认将uint8-[0,255]转为float32-[0,255]
         normalization:归一化float32-[0,1]
         standardization:归一化float32-[0,1],再减均值中心化
    :return:
    &apos;&apos;&apos;
    # 创建文件队列,不限读取的数量
    filename_queue = tf.train.string_input_producer([filename])
    # create a reader from file queue
    reader = tf.TFRecordReader()
    # reader从文件队列中读入一个序列化的样本
    _, serialized_example = reader.read(filename_queue)
    # get feature from serialized example
    # 解析符号化的样本
    features = tf.parse_single_example(
        serialized_example,
        features={
            &apos;image_raw&apos;: tf.FixedLenFeature([], tf.string),
            &apos;height&apos;: tf.FixedLenFeature([], tf.int64),
            &apos;width&apos;: tf.FixedLenFeature([], tf.int64),
            &apos;depth&apos;: tf.FixedLenFeature([], tf.int64),
            &apos;labels&apos;: tf.FixedLenFeature([], tf.string)
        }
    )
    tf_image = tf.decode_raw(features[&apos;image_raw&apos;], tf.uint8)  # 获得图像原始的数据

    tf_height = features[&apos;height&apos;]
    tf_width = features[&apos;width&apos;]
    tf_depth = features[&apos;depth&apos;]
    # tf_label = tf.cast(features[&apos;labels&apos;], tf.float32)
    tf_label = tf.decode_raw(features[&apos;labels&apos;], tf.int32)

    # PS:恢复原始图像数据,reshape的大小必须与保存之前的图像shape一致,否则出错
    # tf_image=tf.reshape(tf_image, [-1])    # 转换为行向量
    tf_image = tf.reshape(tf_image, [resize_height, resize_width, channel])  # 设置图像的维度
    tf_label = tf.cast(tf_label, tf.float32)

    # 恢复数据后,才可以对图像进行resize_images:输入uint-&amp;gt;输出float32
    # tf_image=tf.image.resize_images(tf_image,[224, 224])

    # [3]数据类型处理
    # 存储的图像类型为uint8,tensorflow训练时数据必须是tf.float32
    if type is None:
        tf_image = tf.cast(tf_image, tf.float32)
    elif type == &apos;normalization&apos;:  # [1]若需要归一化请使用:
        # 仅当输入数据是uint8,才会归一化[0,255]
        # tf_image = tf.cast(tf_image, dtype=tf.uint8)
        # tf_image = tf.image.convert_image_dtype(tf_image, tf.float32)
        tf_image = tf.cast(tf_image, tf.float32) * (1. / 255.0)  # 归一化
    elif type == &apos;standardization&apos;:  # 标准化
        # tf_image = tf.cast(tf_image, dtype=tf.uint8)
        # tf_image = tf.image.per_image_standardization(tf_image)  # 标准化（减均值除方差）
        # 若需要归一化,且中心化,假设均值为0.5,请使用:
        tf_image = tf.cast(tf_image, tf.float32) * (1. / 255) - 0.5  # 中心化

    # 这里仅仅返回图像和标签
    # return tf_image, tf_height,tf_width,tf_depth,tf_label
    return tf_image, tf_label


def create_records(image_dir, file, output_record_dir, resize_height, resize_width, shuffle, log=5):
    &apos;&apos;&apos;
    实现将图像原始数据,label,长,宽等信息保存为record文件
    注意:读取的图像数据默认是uint8,再转为tf的字符串型BytesList保存,解析请需要根据需要转换类型
    :param image_dir:原始图像的目录
    :param file:输入保存图片信息的txt文件(image_dir+file构成图片的路径)
    :param output_record_dir:保存record文件的路径
    :param resize_height:
    :param resize_width:
    PS:当resize_height或者resize_width=0是,不执行resize
    :param shuffle:是否打乱顺序
    :param log:log信息打印间隔
    &apos;&apos;&apos;
    # 加载文件,仅获取一个label
    images_list, labels_list = load_labels_file(file, shuffle)

    writer = tf.python_io.TFRecordWriter(output_record_dir)
    for i, [image_name, labels] in enumerate(zip(images_list, labels_list)):
        image_path = os.path.join(image_dir, images_list[i])
        if not os.path.exists(image_path):
            print(&apos;Err:no image&apos;, image_path)
            continue
        image = read_image(image_path, resize_height, resize_width)
        if image is None:
            print(&apos;Err:Read image&apos;, image_path)
            continue
        image_raw = image.tostring()
        if i % log == 0 or i == len(images_list) - 1:
            print(&apos;------------processing:%d-th------------&apos; % (i))
            print(&apos;current image_path=%s&apos; % (image_path), &apos;shape:{}&apos;.format(image.shape), &apos;labels:{}&apos;.format(labels))

        labels_raw = np.asanyarray(labels, dtype=np.int32).tostring()

        example = tf.train.Example(features=tf.train.Features(feature={
            &apos;image_raw&apos;: _bytes_feature(image_raw),
            &apos;height&apos;: _int64_feature(image.shape[0]),
            &apos;width&apos;: _int64_feature(image.shape[1]),
            &apos;depth&apos;: _int64_feature(image.shape[2]),
            &apos;labels&apos;: _bytes_feature(labels_raw)
        }))
        writer.write(example.SerializeToString())
    writer.close()


def disp_records(record_file, resize_height, resize_width, show_nums=4):
    &apos;&apos;&apos;
    解析record文件，并显示show_nums张图片，主要用于验证生成record文件是否成功
    :param tfrecord_file: record文件路径
    :return:
    &apos;&apos;&apos;
    # 读取record函数
    tf_image, tf_label = read_records(record_file,
                                        resize_height,
                                        resize_width,
                                        channel=g_iamge_channels,
                                        type=&apos;normalization&apos;)
    # 显示前4个图片
    init_op = tf.global_variables_initializer()
    with tf.Session() as sess:
        sess.run(init_op)
        coord = tf.train.Coordinator()
        thread = tf.train.start_queue_runners(sess, coord)
        for i in range(show_nums):
            image, label = sess.run([tf_image, tf_label])  # 在会话中取出image和label
            # image = tf_image.eval()
            # 直接从record解析的image是一个向量,需要reshape显示
            # image = image.reshape([height,width,depth])
            print(&apos;shape:{},tpye:{},labels:{}&apos;.format
            (image.shape, image.dtype, label))
            show_image(&quot;image:{}&quot;.format(label), image)
        coord.request_stop()
        coord.join(thread)



def get_batch(record_file, resize_height, resize_width, batchSize=32):
    # 读取record函数
    tf_image, tf_label = read_records(record_file,
                                         resize_height,
                                         resize_width,
                                         channel=g_iamge_channels,
                                         type=&apos;normalization&apos;)
    # 显示前4个图片
    init_op = tf.global_variables_initializer()
    images=np.zeros([batchSize,resize_height,resize_width,g_iamge_channels])
    lables=[]
    with tf.Session() as sess:
        sess.run(init_op)
        coord = tf.train.Coordinator()
        thread = tf.train.start_queue_runners(sess, coord)
        for i in range(batchSize):
            image, label = sess.run([tf_image, tf_label])  # 在会话中取出image和label
            images[i,:]=image
            lables.append(list(label))
        coord.request_stop()
        coord.join(thread)
    return images,lables

def batch_test(record_file, resize_height, resize_width):
    iamges,labes=get_batch(record_file,resize_height,resize_width,g_batch_size)
    show_image(labes[11], iamges[11, :, :, :])




if __name__ == &apos;__main__&apos;:
    # 参数设置
    resize_height = 32  # 指定存储图片高度
    resize_width = 100  # 指定存储图片宽度
    shuffle = False
    log = 1000

    image_dir = &apos;F:/0_dataset/mjsynth/set&apos;

    #产生train record文件
    train_labels = &apos;F:/0_dataset/mjsynth/train.txt&apos;  # 图片路径
    train_record_output = &apos;F:/0_dataset/mjsynth/train1.tfrecords&apos;
    create_records(image_dir, train_labels, train_record_output, resize_height, resize_width, shuffle, log)

    # 产生val record文件
    val_labels = &apos;F:/0_dataset/mjsynth/val.txt&apos;  # 图片路径
    val_record_output = &apos;F:/0_dataset/mjsynth/val1.tfrecords&apos;
    create_records(image_dir, val_labels, val_record_output, resize_height, resize_width, shuffle, log)

    train_nums = get_example_nums(train_record_output)
    print(&quot;save train example nums={}&quot;.format(train_nums))

    val_nums = get_example_nums(val_record_output)
    print(&quot;save val example nums={}&quot;.format(val_nums))

    # 测试显示函数
    disp_records(train_record_output,g_image_height, g_image_width)
    batch_test(train_record_output, g_image_height, g_image_width)

    disp_records(val_record_output, g_image_height, g_image_width)
    batch_test(val_record_output, g_image_height, g_image_width)






&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
</description>
        <pubDate>Sun, 01 Dec 2019 14:00:00 +0000</pubDate>
        <link>http://www.morecheck.cn/2019/12/01/CRNN_Step2_WritetfRecord/</link>
        <guid isPermaLink="true">http://www.morecheck.cn/2019/12/01/CRNN_Step2_WritetfRecord/</guid>
        
        <category>tensorflow</category>
        
        <category>CRNN</category>
        
        
      </item>
    
      <item>
        <title>tensorflow_Step1_getdatatxt</title>
        <description>&lt;h2 id=&quot;流程&quot;&gt;流程:&lt;/h2&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;
# -*- coding: utf-8 -*-

&quot;&quot;&quot;
@from:www.linerect.com

@author:  duimu

@contact: duimu@qq.com

@Created on: 2019/12/17 10:34
本demo完全根据mjsynth 数据集进行测试，如果需要根据自己的图片生成，可以按照实例操作
第一步：
&quot;&quot;&quot;
import tensorflow as tf
import numpy as np
import os
from Step0_CrnnDefines import *

#根据图片生成所需要的txt文件，该txt文件用来生成tfrecords数据
#按照文件路径 lable的形式存储
def GetCharDic(picPath,writeTrainPath,writeValPath,radiu=0.2):
    &quot;&quot;&quot;
    :param picPath: 图片目录   eg: d:/dataset/images
    :param writeTrainPath: 生成train.txt的详细路径  eg: d:/dataset/train.txt
    :param writeValPath:   生成val.txt详细路径  eg: d:/dataset/val.txt
    :param radiu:  验证数据占所有数据中的比率
    :return:
    &quot;&quot;&quot;
    nameinfo=[]
    for root, dirs, files in os.walk(picPath):
        for f in files:
            info = os.path.join(root, f)
            info=info[len(picPath)+1:]
            f = f.split(&apos;_&apos;)
            info=info+&apos; &apos;
            for char in f[1]:
                if char &amp;gt;=&apos;a&apos;and char &amp;lt;=&apos;z&apos;:
                    char=str(ord(char)-ord(&apos;a&apos;)+1)
                elif  char &amp;gt;=&apos;A&apos;and char &amp;lt;=&apos;Z&apos;:
                    char = str(ord(char) - ord(&apos;A&apos;)+1)
                elif char &amp;gt;=&apos;0&apos;and char &amp;lt;=&apos;9&apos;:
                    char = str(ord(char) - ord(&apos;0&apos;)+27)
                else:
                    continue
                info=info+char+&apos; &apos;
            nameinfo.append(info)
            if len(nameinfo)%100==0:
                print(&apos;size:&apos;,len(nameinfo))

    trainfile = open(writeTrainPath, &apos;w&apos;)
    valfile= open(writeValPath, &apos;w&apos;)
    totalcount=len(nameinfo)
    count=0
    valCount=int(totalcount * (1.0 - radiu))
    for line in nameinfo:
        count=count+1
        if count&amp;lt;valCount:
            trainfile.write(line)
            trainfile.write(&apos;\n&apos;)
        elif count&amp;gt;=valCount:
            valfile.write(line)
            valfile.write(&apos;\n&apos;)
    trainfile.close()
    valfile.close()


if __name__ == &apos;__main__&apos;:
    GetCharDic(&apos;F:/0_dataset/mjsynth/set&apos;,
               &apos;F:/0_dataset/mjsynth/train1.txt&apos;,
               &apos;F:/0_dataset/mjsynth/val1.txt&apos;,
               0.2)





&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

</description>
        <pubDate>Sun, 01 Dec 2019 14:00:00 +0000</pubDate>
        <link>http://www.morecheck.cn/2019/12/01/CRNN_Step1_getdatatxt/</link>
        <guid isPermaLink="true">http://www.morecheck.cn/2019/12/01/CRNN_Step1_getdatatxt/</guid>
        
        <category>tensorflow</category>
        
        <category>CRNN</category>
        
        
      </item>
    
      <item>
        <title>tensorflow_Step0_CrnnDefines</title>
        <description>&lt;h2 id=&quot;流程&quot;&gt;流程:&lt;/h2&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;
# -*- coding: utf-8 -*-

&quot;&quot;&quot;
@from:www.linerect.com

@author:  duimu

@contact: duimu@qq.com

@Created on: 2019/12/17 11:10

全局定义

&quot;&quot;&quot;
import tensorflow as tf

#label中所有的字符类别
g_dict=&quot; ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789&quot;

#字典字符个数
g_num_classes = 37

#标签中字符最多的个数
g_MaxLableCount=10
&quot;&quot;&quot;
#可以使用此函数生成
def CreateDict():
    dict={&apos;blank&apos;:0}
    for index in range(0,26):
        char=chr(ord(&apos;A&apos;)+index)
        dict[char]=index +1

    for index in range(0,10):
        char=chr(ord(&apos;0&apos;)+index)
        dict[char] = index + 26

    return dict
&quot;&quot;&quot;

g_is_training = tf.cast(True, tf.bool)

#lstm 隐含层单元个数
g_num_hidden = 256

#lstm 隐含层个数
g_num_layers = 2

#读取字符串长度
g_seq_len=25

#字符图片resize后的高度
g_image_height=32

#字符图片resize后的宽度
g_image_width=100

#字符图片图像通道
g_iamge_channels=3

g_batch_size=32





&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
</description>
        <pubDate>Sun, 01 Dec 2019 14:00:00 +0000</pubDate>
        <link>http://www.morecheck.cn/2019/12/01/CRNN_Step0_CrnnDefines/</link>
        <guid isPermaLink="true">http://www.morecheck.cn/2019/12/01/CRNN_Step0_CrnnDefines/</guid>
        
        <category>tensorflow</category>
        
        <category>CRNN</category>
        
        
      </item>
    
      <item>
        <title>tensorflow_serving</title>
        <description>&lt;h2 id=&quot;介绍&quot;&gt;介绍:&lt;/h2&gt;

&lt;p&gt;TensorFlow Serving 运行一个 Docker 容器，这是一组组件，用于导出经过训练的 TensorFlow 模型，并使用标准的 tensorflow_model_server 来为实现的模型服务。TensorFlow Serving 服务器发掘出新的导出模型并使用 gRPC 来提供服务。&lt;/p&gt;

&lt;p&gt;我们将使用 Docker 并假定你熟悉该系统，可参考 &lt;a href=&quot;https://www.docker.com/&quot;&gt;https://www.docker.com/&lt;/a&gt; 了解 Docker 的相关知识并安装它。我们要做的是建立一个 TensorFlow Serving 版本。&lt;/p&gt;

&lt;h2 id=&quot;具体做法&quot;&gt;具体做法&lt;/h2&gt;

&lt;ol&gt;
  &lt;li&gt;
    &lt;p&gt;从网址&lt;a href=&quot;https://github.com/tensorflow/serving/blob/master/tensorflow_serving/tools/docker/Dockerfile.devel&quot;&gt;https://github.com/tensorflow/serving/blob/master/tensorflow_serving/tools/docker/Dockerfile.devel&lt;/a&gt;上下载Dockerfile.devel。&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;通过运行以下命令构建一个容器：&lt;/p&gt;

    &lt;p&gt;docker build–pull-t$USER/tensorflow-serving-devel-f Dockerfile.devel&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;运行容器：&lt;/p&gt;

    &lt;p&gt;docker run-it$USER/tensorflow-serving-devel&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;克隆TensorFlow Serving、配置和测试服务器：&lt;/p&gt;

    &lt;p&gt;&lt;img src=&quot;http://c.biancheng.net/uploads/allimg/190116/2-1Z116104G3I2.gif&quot; alt=&quot;img&quot; /&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;现在看一个保存模型的示例，以便服务器可以保存它。该例子是受一个示例启发得到的，构建 MNIST 训练器并为模型提供服务（&lt;/p&gt;

    &lt;p&gt;https://github.com/tensorflow/serving/blob/master/tensorflow_serving/example/mnist_saved_model.py&lt;/p&gt;

    &lt;p&gt;）。第一步是将构建器（builder）导入为 saved_model_builder，然后大部分的工作由 SavedModelBuilder() 来完成，它将被训练模型的 snapshot 保存到可靠的存储空间中。请注意，这里的 export_path 是 /tmp/mnist_model/&lt;/p&gt;

    &lt;p&gt;&lt;img src=&quot;http://c.biancheng.net/uploads/allimg/190116/2-1Z116104K04T.gif&quot; alt=&quot;img&quot; /&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;模型可以用一个简单的命令来执行：&lt;/p&gt;

    &lt;p&gt;&lt;img src=&quot;http://c.biancheng.net/uploads/allimg/190116/2-1Z116104PG47.gif&quot; alt=&quot;img&quot; /&gt;&lt;/p&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&quot;总结&quot;&gt;总结&lt;/h2&gt;

&lt;p&gt;2016 年 2 月谷歌发布&lt;/p&gt;

&lt;p&gt;TensorFlow Serving&lt;/p&gt;

&lt;p&gt;，是针对机器学习模型的一个高性能服务系统，用于生产环境。2017 年 8 月，谷歌在生产中已经有超过 800 个项目使用了 TensorFlow Serving。&lt;/p&gt;

&lt;p&gt;TensorFlow Serving 是一款非常灵活的软件，在这个案例中只是学习了它潜在用途的表面而已。如果你有兴趣了解更多的高级功能，如大批量运行或动态加载模型，推荐参考&lt;/p&gt;

&lt;p&gt;https://github.com/tensorflow/serving/blob/master/tensorflow_serving/g3doc/serving_advanced.md。&lt;/p&gt;

</description>
        <pubDate>Fri, 22 Nov 2019 14:00:00 +0000</pubDate>
        <link>http://www.morecheck.cn/2019/11/22/serving/</link>
        <guid isPermaLink="true">http://www.morecheck.cn/2019/11/22/serving/</guid>
        
        <category>tensorflow</category>
        
        <category>serving</category>
        
        
      </item>
    
  </channel>
</rss>
