<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>计算机 on Xiangtao's log</title><link>https://www.xiaoxiangtao.cn/zh/tags/%E8%AE%A1%E7%AE%97%E6%9C%BA/</link><description>Recent content in 计算机 on Xiangtao's log</description><generator>Hugo</generator><language>zh-Hans</language><managingEditor>15989119660@163.com (Xiangtao XIAO)</managingEditor><webMaster>15989119660@163.com (Xiangtao XIAO)</webMaster><lastBuildDate>Tue, 29 Sep 2026 00:00:00 +0800</lastBuildDate><atom:link href="https://www.xiaoxiangtao.cn/zh/tags/%E8%AE%A1%E7%AE%97%E6%9C%BA/feed.xml" rel="self" type="application/rss+xml"/><item><title>DesktopPet：我给自己做的一个英文学习桌宠</title><link>https://www.xiaoxiangtao.cn/zh/posts/desktop-pet/</link><pubDate>Tue, 29 Sep 2026 00:00:00 +0800</pubDate><author>15989119660@163.com (Xiangtao XIAO)</author><guid isPermaLink="false">https://www.xiaoxiangtao.cn/zh/posts/desktop-pet/</guid><description>一个常驻 macOS 桌面的学习入口，可以聊天、划词查词、显示实时字幕并在课后整理笔记。这里记录了做这个项目时的需求取舍、模型对比和一些体会。</description></item><item><title>OpenClaw部署与应用</title><link>https://www.xiaoxiangtao.cn/zh/posts/openclaw-deployment-and-application/</link><pubDate>Sat, 11 Apr 2026 00:00:00 +0000</pubDate><author>15989119660@163.com (Xiangtao XIAO)</author><guid isPermaLink="false">https://www.xiaoxiangtao.cn/zh/posts/openclaw-deployment-and-application/</guid><description>&lt;p&gt;&lt;a href="https://docs.openclaw.ai/concepts/multi-agent"&gt;https://docs.openclaw.ai/&lt;/a&gt;&lt;/p&gt;
&lt;h1 id="openclaw部署"&gt;OpenClaw部署&lt;/h1&gt;
&lt;h2 id="服务器与系统环境"&gt;服务器与系统环境&lt;/h2&gt;
&lt;p&gt;腾讯云轻量应用服务器 4核CPU，4GB内存，70G系统盘&lt;/p&gt;
&lt;p&gt;ubuntu 22.04.5 LTS 64bit，根据chatGPT推荐兼容性最好&lt;/p&gt;
&lt;h2 id="安装openclaw"&gt;安装OpenClaw&lt;/h2&gt;
&lt;h3 id="更新系统并下载依赖"&gt;更新系统并下载依赖&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 更新系统&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt update &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; sudo apt upgrade -y
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 安装基础依赖&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt install -y git curl wget unzip build-essential
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 安装nvm&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh &lt;span class="p"&gt;|&lt;/span&gt; bash
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;source&lt;/span&gt; ~/.bashrc
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 安装node.js&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;nvm install --lts
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;nvm use --lts
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 验证安装成功，查看版本号&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;node -v
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npm -v
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="下载openclaw"&gt;下载OpenClaw&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npm install -g openclaw@latest
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="启动openclaw"&gt;启动OpenClaw&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 初始化配置并安装&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;openclaw onboard --install-daemon
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# install-daemon 自动将 OpenClaw 的 Gateway 服务安装为后台守护进程，静默运行，&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 开机自动启动及崩溃自动重启&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;from chatGPT&lt;/p&gt;</description></item><item><title>AI Agent（从 Chatbot 到生产级 Agent）</title><link>https://www.xiaoxiangtao.cn/zh/posts/learning-notes-of-ai-agent/</link><pubDate>Sat, 14 Mar 2026 00:00:00 +0000</pubDate><author>15989119660@163.com (Xiangtao XIAO)</author><guid isPermaLink="false">https://www.xiaoxiangtao.cn/zh/posts/learning-notes-of-ai-agent/</guid><description>&lt;h1 id="ai-agent从-chatbot-到生产级-agent"&gt;AI Agent（从 Chatbot 到生产级 Agent）&lt;/h1&gt;
&lt;p&gt;AI Agent是LLM应用的高级形态，能够自主规划、执行任务并与环境交互。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;经典论文：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Yao, S., et al. (2022). &amp;ldquo;ReAct: Synergizing Reasoning and Acting in Language Models.&amp;rdquo; ICLR. [&lt;a href="https://arxiv.org/abs/2210.01691"&gt;论文链接&lt;/a&gt;] - ReAct框架，Agent核心范式&lt;/li&gt;
&lt;li&gt;Wei, J., et al. (2022). &amp;ldquo;Chain-of-Thought Prompting Elicits Reasoning in Large Language Models.&amp;rdquo; NeurIPS. [&lt;a href="https://arxiv.org/abs/2201.11903"&gt;论文链接&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;Wang, G., et al. (2024). &amp;ldquo;A Survey on Large Language Model based Autonomous Agents.&amp;rdquo; arXiv. [&lt;a href="https://arxiv.org/abs/2308.11432"&gt;论文链接&lt;/a&gt;] - Agent综述&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="一整体演进路径"&gt;一、整体演进路径&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Chatbot → Tool Use → Agent → Production Agent（工业级）
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;演进说明：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Chatbot&lt;/strong&gt;: 仅能对话，无法执行外部操作&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tool Use&lt;/strong&gt;: 能调用单一工具&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Agent&lt;/strong&gt;: 能自主规划并执行多步骤任务&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Production Agent&lt;/strong&gt;: 工业级，具备错误处理、权限控制、监控等能力&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="二核心概念拆解"&gt;二、核心概念拆解&lt;/h2&gt;
&lt;h3 id="1-chatbot"&gt;1️⃣ Chatbot&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;LLM + Prompt&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Prompt Engineering</title><link>https://www.xiaoxiangtao.cn/zh/posts/learning-notes-of-prompt-engineering/</link><pubDate>Thu, 12 Mar 2026 00:00:00 +0000</pubDate><author>15989119660@163.com (Xiangtao XIAO)</author><guid isPermaLink="false">https://www.xiaoxiangtao.cn/zh/posts/learning-notes-of-prompt-engineering/</guid><description>&lt;h1 id="prompt-engineering"&gt;Prompt Engineering&lt;/h1&gt;
&lt;p&gt;&lt;a href="https://www.coursera.org/learn/chatgpt-prompt-engineering-for-developers-project/home/welcome"&gt;https://www.coursera.org/learn/chatgpt-prompt-engineering-for-developers-project/home/welcome&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Prompt Engineering（提示工程）是设计和优化输入提示（prompts）以引导大语言模型生成期望输出的技术。这一领域随着GPT-3的发布而兴起，是连接用户意图与模型能力的关键桥梁。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;经典论文：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Brown, T. B., et al. (2020). &amp;ldquo;Language Models are Few-Shot Learners.&amp;rdquo; NeurIPS. [&lt;a href="https://arxiv.org/abs/2005.14165"&gt;论文链接&lt;/a&gt;] - GPT-3论文，首次系统展示了prompt engineering的潜力&lt;/li&gt;
&lt;li&gt;Wei, J., et al. (2022). &amp;ldquo;Chain-of-Thought Prompting Elicits Reasoning in Large Language Models.&amp;rdquo; NeurIPS. [&lt;a href="https://arxiv.org/abs/2201.11903"&gt;论文链接&lt;/a&gt;]&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="1-prompting-principles提示原则"&gt;1. Prompting Principles（提示原则）&lt;/h2&gt;
&lt;h3 id="principle-1-write-clear-and-specific-instructions编写清晰具体的指令"&gt;Principle 1: Write clear and specific instructions（编写清晰具体的指令）&lt;/h3&gt;
&lt;p&gt;清晰性（Clarity）和具体性（Specificity）是prompt设计的核心原则。研究表明，模糊的指令会导致模型输出不确定性增加，而具体的指令能显著提升输出质量。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Tactic 1: Use delimiters to clearly indicate distinct parts of the input&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;分隔符（如 ```、&amp;quot;&amp;quot;&amp;quot;、&amp;mdash;、&amp;lt;&amp;gt;）能帮助模型识别输入的不同部分，避免混淆。这在处理包含多段文本或代码的任务时尤为重要。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Tactic 2: Ask for a structured output&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;要求结构化输出（如JSON、HTML、Markdown表格）便于后续程序处理，是构建AI应用的最佳实践。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Tactic 3: Ask the model to check whether conditions are satisfied&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;让模型先验证条件再执行任务，可以减少错误输出。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Tactic 4: &amp;ldquo;Few-shot&amp;rdquo; prompting - give examples&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Few-shot prompting通过提供少量示例来引导模型理解任务格式和期望输出。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;经典论文：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Brown, T. B., et al. (2020). &amp;ldquo;Language Models are Few-Shot Learners.&amp;rdquo; NeurIPS. [&lt;a href="https://arxiv.org/abs/2005.14165"&gt;论文链接&lt;/a&gt;] - 首次提出few-shot learning概念&lt;/li&gt;
&lt;li&gt;Min, S., et al. (2022). &amp;ldquo;Rethinking the Role of Demonstrations: What Makes In-Context Learning Work?&amp;rdquo; EMNLP. [&lt;a href="https://arxiv.org/abs/2202.12837"&gt;论文链接&lt;/a&gt;]&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>RAG (Retrieval-Augmented Generation)</title><link>https://www.xiaoxiangtao.cn/zh/posts/learning-notes-of-rag/</link><pubDate>Sun, 08 Mar 2026 00:00:00 +0000</pubDate><author>15989119660@163.com (Xiangtao XIAO)</author><guid isPermaLink="false">https://www.xiaoxiangtao.cn/zh/posts/learning-notes-of-rag/</guid><description>&lt;h1 id="rag"&gt;RAG&lt;/h1&gt;
&lt;p&gt;RAG (Retrieval-Augmented Generation) 是一种结合信息检索与文本生成的AI架构，通过检索外部知识库来增强LLM的回答能力。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;经典论文：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Lewis, P., et al. (2020). &amp;ldquo;Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks.&amp;rdquo; NeurIPS. [&lt;a href="https://arxiv.org/abs/2005.11401"&gt;论文链接&lt;/a&gt;] - RAG开山之作&lt;/li&gt;
&lt;li&gt;Guu, K., et al. (2020). &amp;ldquo;REALM: Retrieval-Augmented Language Model Pre-Training.&amp;rdquo; ICML. [&lt;a href="https://arxiv.org/abs/2002.08909"&gt;论文链接&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;Izacard, G., &amp;amp; Grave, É. (2021). &amp;ldquo;Leveraging Passage Retrieval with Generative Models for Open Domain Question Answering.&amp;rdquo; EACL. [&lt;a href="https://arxiv.org/abs/2007.01282"&gt;论文链接&lt;/a&gt;] - RAG的另一种实现&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="1-context-window上下文窗口"&gt;1. Context Window（上下文窗口）&lt;/h2&gt;
&lt;h3 id="概念"&gt;概念&lt;/h3&gt;
&lt;p&gt;Context Window 指的是 &lt;strong&gt;大语言模型在一次推理时能够读取和理解的最大文本长度&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;经典论文：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Dai, Z., et al. (2019). &amp;ldquo;Transformer-XL: Attentive Language Models Beyond a Fixed-Length Context.&amp;rdquo; ACL. [&lt;a href="https://arxiv.org/abs/1901.02860"&gt;论文链接&lt;/a&gt;] - 突破固定上下文长度的开创性工作&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;通常包含：&lt;/p&gt;</description></item><item><title>Transformer概念与理解</title><link>https://www.xiaoxiangtao.cn/zh/posts/learning-notes-of-transformer/</link><pubDate>Fri, 20 Feb 2026 00:00:00 +0000</pubDate><author>15989119660@163.com (Xiangtao XIAO)</author><guid isPermaLink="false">https://www.xiaoxiangtao.cn/zh/posts/learning-notes-of-transformer/</guid><description>Transformer模型彻底改变了自然语言处理领域，成为现代大语言模型的基石。本文从产品视角深入解析Transformer的核心概念。</description></item><item><title>bitwarden_rs+nginx反向代理配置记录</title><link>https://www.xiaoxiangtao.cn/zh/posts/bitwarden_-rs-nginx-reverse-proxy-configuration-record/</link><pubDate>Wed, 10 Mar 2021 00:00:00 +0000</pubDate><author>15989119660@163.com (Xiangtao XIAO)</author><guid isPermaLink="false">https://www.xiaoxiangtao.cn/zh/posts/bitwarden_-rs-nginx-reverse-proxy-configuration-record/</guid><description>&lt;p&gt;bitwarden是一个开源的密码管理器，可以部署在私有服务器上。官方的bitwarden对服务器配置要求较高，网友开发了bitwardenrs适用于小用户，对配置要求低不怎么占内存。本次采用安装docker后在docker上安装bitwardenrs和nginx，通过nginx反向代理实现HTTPS加密访问bitwarden的方法。&lt;/p&gt;
&lt;p&gt;服务器配置：Tencent Hong Kong centOS 7.6 1C1G 25GSSD 30M峰值带宽&lt;/p&gt;
&lt;p&gt;服务器上已经运行bitnami wordpress堆栈，因此80和443端口都被apache占用，挂了个人博客。网络上大部分blog都采用nginx做反向代理，由于不懂技术因此也用nginx照做。&lt;/p&gt;
&lt;h3 id="安装docker"&gt;安装Docker&lt;/h3&gt;
&lt;p&gt;docker是一个虚拟机，他打包了多个不同主流应用，可以很方便的安装这些应用，并且每个应用都是以容器的形式存在，与宿主机的环境是隔离的，这些应用的配置与运行可以干净的删除不会对宿主机造成影响。&lt;/p&gt;
&lt;p&gt;docker中有images 镜像和container 容器，比如我可以在宿主机下载一个nginx镜像，然后我制作两个容器：nginx_1 和 nginx_2，两个容器中都可以通过镜像安装nginx应用，两个nginx是分开的，可以各自用于不同用途，方便管理。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;yum install -y docker #安装docker
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;systemctl docker #启动docker
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="安装bitwarden_rs"&gt;安装bitwarden_rs&lt;/h3&gt;
&lt;p&gt;docker有几个需要事先理解的概念，比如 &lt;strong&gt;目录映射&lt;/strong&gt;。我们可以让容器的目录去映射一个宿主机的目录，简单来讲就是用一个宿主机的目录当做容器应用的目录，这样要修改应用配置或者上传文件只要动宿主机的目录就可以。&lt;/p&gt;
&lt;p&gt;我们在run 应用的时候添加以下形式的配置：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;-v /library:/library #&amp;#39;:&amp;#39;前是要映射的宿主机目录，后面是容器应用的实际目录
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;端口映射&lt;/strong&gt;：容器是一个虚拟环境，比如nginx监听的80和443端口，在我的宿主机中这两个端口被Apache占用了，因此我可以分配另外两个端口与容器的80端口和443端口进行映射。&lt;/p&gt;
&lt;p&gt;这样一来避免了端口冲突，比如访问//domain:4444实际上就会通过容器的443端口被nginx监听到。需要注意的是通过这种方式要在防火墙打开4444端口，否则浏览器还是无法访问的。&lt;/p&gt;
&lt;p&gt;&lt;img loading="lazy" src="https://www.xiaoxiangtao.cn/posts/bitwarden_-rs-nginx-reverse-proxy-configuration-record/%E5%9B%BE%E7%89%87-1024x227.png"&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;-p 8088:80/tcp 4444:443/tcp #8088映射到80 4444映射到443 映射端口根据需要选择空闲端口即可
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mkdir /data/bitwarden #建立宿主机映射目录
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker run -d \
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --rm \
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --name bitwarden \
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -p 8085:80 \
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -p 3012:3012 \
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -e SIGNUPS_ALLOWED=true \
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -e WEB_VAULT_ENABLED=true \
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -e DOMAIN=//mydomain.cn \
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -v /data/bitwarden:/data \
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; bitwardenrs/server:latest
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;上面命令的各个参数含义如下：
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;-d 在后台运行
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;--rm 容器停止运行后，自动删除容器文件
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;--name bitwarden容器的名字为bitwarden
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;-p 8085:80 容器的端口80映射到8085，在Nginx配置
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;-p 3012:3012 容器的端口3012映射到3012
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;-e SIGNUPS_ALLOWED=true 设置环境变量SIGNUPS_ALLOWED=true允许用户注册
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;-e WBE_VAULT_ENABLE=true 设置环境变量WBE_VAULT_ENABLE=true
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;-e DOMAIN=//mydomain.cn设置域名,需要替换成自己申请的域名
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;-v /data/bitwarden:/data 容器的/data/目录映射到宿主机的/data/bitwarden目录
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="安装nginx"&gt;安装nginx&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mkdir /data/nginx #建立宿主机映射目录
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# 安装nginx
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker run \
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --rm \
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --name nginx \
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -d \
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -p 8088:80/tcp \
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -p 2443:443/tcp \
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; nginx
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# 由于不知道nginx目录下的内容，我们将容器的目录复制到宿主机目录/data下
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker cp nginx:/etc/nginx /data
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# 创建用于存放ssl证书的文件夹，将申请到的.cert和.key证书文件上传到这个文件夹
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mkdir /data/nginx/certs
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;修改/data/nginx/conf.d/default.conf文件添加以下内容，启用https访问并对bitwarden进行反向代理&lt;/p&gt;</description></item><item><title>wordpress配置问题记录</title><link>https://www.xiaoxiangtao.cn/zh/posts/wordpress-configuration-problem-record/</link><pubDate>Thu, 15 Oct 2020 00:00:00 +0000</pubDate><author>15989119660@163.com (Xiangtao XIAO)</author><guid isPermaLink="false">https://www.xiaoxiangtao.cn/zh/posts/wordpress-configuration-problem-record/</guid><description>&lt;h2 id="linux基本语法"&gt;Linux基本语法&lt;/h2&gt;
&lt;p&gt;复制 cp 要复制的文件路径 目标路径 cp -r 递归复制整个目录&lt;/p&gt;
&lt;p&gt;删除 rm -f 强制删除 -r 递归删除目录&lt;/p&gt;
&lt;p&gt;改名 mv 原文件 新文件名&lt;/p&gt;
&lt;p&gt;更改文件权限 chmod 777（完全写入权限） 要更改的目录或文件&lt;/p&gt;
&lt;p&gt;vim编辑器显示行号：输入指令：set number&lt;/p&gt;
&lt;p&gt;跳转到制定行：输入指令：n（要跳转的行号）&lt;/p&gt;
&lt;h2 id="wp-super-cache问题解决"&gt;WP-Super-Cache问题解决&lt;/h2&gt;
&lt;p&gt;将插件wp-super-cache中的wp-cache-config.php与advanced-cache.php复制到wp-content目录下。&lt;/p&gt;
&lt;p&gt;临时更改wp-content权限为777&lt;/p&gt;
&lt;p&gt;在wp-config.php中增加以下内容：1.在require_once(ABSPATH.’wp-settings.php’);前增加define(&amp;lsquo;WP_CACHE&amp;rsquo;, true); 2.增加define(&amp;lsquo;WPCACHEHOME&amp;rsquo;, &amp;lsquo;插件wp-super-cache绝对路径&amp;rsquo;);&lt;/p&gt;
&lt;p&gt;修改完成后应该可以进入设置界面，在专家模式下更新设置如果出现要求更新Mod_write规则则按要求进行更新。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;对于采用bitnami的wordpress堆栈环境，由于其对文件访问权限的安全设置较严，安装时同样会弹出以上情况的警告。无需理会，连接到服务器执行以下指令：（事实上应当优先采用这种更改权限的做法，未生效再尝试上方操作）&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo chmod g+w /YOURADRESS/apps/wordpress/htdocs/wp-config.php
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;之后禁用插件并重新激活即可。完事以后要将文件权限复原，执行：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo chmod g-w /YOURADRESS/apps/wordpress/htdocs/wp-config.php
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;更多内容，在bitnami.com官方文档的trouble shooting部分有详细介绍。&lt;/p&gt;</description></item><item><title>交互装置入门基础知识</title><link>https://www.xiaoxiangtao.cn/zh/posts/basic-knowledge-of-interactive-devices/</link><pubDate>Thu, 15 Oct 2020 00:00:00 +0000</pubDate><author>15989119660@163.com (Xiangtao XIAO)</author><guid isPermaLink="false">https://www.xiaoxiangtao.cn/zh/posts/basic-knowledge-of-interactive-devices/</guid><description>&lt;p&gt;&lt;strong&gt;欧姆定律&lt;/strong&gt; - I=U/R&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;面包板的用法&lt;/strong&gt; - 面包板通常指免焊面包板，板子上有很多小插孔，专为电子电路的无焊接实验设计制造。由于各种电子元器件可根据需要随意插入或拔出，免去了焊接，节省了电路的组装时间，而且元件可以重复使用，所以非常适合电子电路的组装、调试和训练。 &lt;a href="//baike.baidu.com/item/E9%5Cx9D%5CxA2%5CxE5%5Cx8C%5Cx85%5CxE6%5Cx9D%5CxBF/4703361?fr=aladdin"&gt;百度百科&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading="lazy" src="https://www.xiaoxiangtao.cn/posts/basic-knowledge-of-interactive-devices/08f790529822720e1fe8fb4c7bcb0a46f21fab65.gif"&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;上拉/下拉电阻&lt;/strong&gt; - 如果一个线路中的电压处于不确定的状态（例如一个引脚不和任何其它回路连通时），那我们就说它的电压是浮动的，他会随着时间不断变化，跳动，而且很容易受到外界环境的影响。处于这种不确定状态的电路会被随机解释为高或者低电平。 这种现象也叫电子噪声。为了让某个引脚保持高电平或者低电平，我们可以将该引脚接地或者接一个大阻值电阻（arduino的引脚内置了上拉电阻，如果需要外接上拉电阻，arduino建议的上拉电阻为10KΩ）。 &lt;a href="//blog.csdn.net/qianxuedegushi/article/details/82252077"&gt;参考&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;二极管&lt;/strong&gt; - 二极管是用半导体材料(硅、硒、锗等)制成的一种电子器件。它具有单向导电性能， 即给二极管阳极和阴极加上正向电压时，二极管导通。 当给阳极和阴极加上反向电压时，二极管截止。 因此，二极管的导通和截止，则相当于开关的接通与断开。其电路图如图所示。&lt;/p&gt;
&lt;p&gt;&lt;img loading="lazy" src="https://www.xiaoxiangtao.cn/posts/basic-knowledge-of-interactive-devices/500fd9f9d72a6059014ffd4b2b34349b033bba07.gif"&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;电容&lt;/strong&gt; - 两个相互靠近的导体，中间夹一层不导电的绝缘介质，这就构成了电容器。当电容器的两个极板之间加上电压时，电容器就会储存电荷。电容器的电容量在数值上等于一个导电极板上的电荷量与两个极板之间的电压之比。电容器的电容量的基本单位是法拉(F)。在电路图中通常用字母C表示电容元件。 &lt;a href="//baike.baidu.com/item/E7%5Cx94%5CxB5%5CxE5%5CxAE%5CxB9%5CxE5%5Cx99%5CxA8/1087619?fromtitle=%5cxE7%5cx94%5cxB5%5cxE5%5cxAE%5cxB9&amp;amp;fromid=12031635&amp;amp;fr=aladdin"&gt;百度百科&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading="lazy" src="https://www.xiaoxiangtao.cn/posts/basic-knowledge-of-interactive-devices/e1fe9925bc315c602ae227cd89b1cb1349547798.png"&gt;&lt;/p&gt;</description></item><item><title>Arduino 入门基础知识总结</title><link>https://www.xiaoxiangtao.cn/zh/posts/summary-of-basic-knowledge-of-arduino/</link><pubDate>Tue, 13 Oct 2020 00:00:00 +0000</pubDate><author>15989119660@163.com (Xiangtao XIAO)</author><guid isPermaLink="false">https://www.xiaoxiangtao.cn/zh/posts/summary-of-basic-knowledge-of-arduino/</guid><description>&lt;p&gt;根据arduino uno板子的接口进行解释，如图&lt;/p&gt;
&lt;p&gt;&lt;img loading="lazy" src="https://www.xiaoxiangtao.cn/posts/summary-of-basic-knowledge-of-arduino/1437476-af1157edc21babf9.jpg"&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;L指示灯&lt;/strong&gt; - 接13号引脚（13号引脚内置了电阻），arduino出厂烧录了闪烁程度，板子通电后L灯闪烁。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;TX/RX指示灯&lt;/strong&gt; - 串口通信时闪烁，分别在传输数据与接收数据时闪烁。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;上排0~13接口&lt;/strong&gt; - 数字I/O口，可以接受以及接受数字信号（二进制形式表示的信号），arduino用电平高低来表示0,1，低电平（-0.5&lt;del&gt;1.5V）表示0，高电平（3&lt;/del&gt;5.5V）表示1。用 pinMode(pin, mode) 函数来指定要用的引脚编号以及其配置模式（INPUT 输入0，OUTPUT 输出1，INPUT_PULLUP输入上拉模式）。在输入模式下，可以用 digitalRead(pin) 读取输入的数字信号；在输出模式下，用 digitalWrite(pin, value) 来指定引脚及输出的电平高低（LOW 0， HIGH 1）。&lt;/p&gt;
&lt;p&gt;？digitalRead()函数返回什么，！digitalRead()代表什么？如果代表true，则digitalRead（）返回一个false，人体热释电持续输出低电平，在检测到人时输出高电平（范围和持续时间可以用电位器来调节），则正常情况下！digitalRead是！低电平，其代表了什么，还是说没有输出值，做个试验检测。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;PWM Pulse Width Modulation 脉冲宽度调制 ~符号&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;- 模拟信号Output，模拟信号用连续变化的物理量来表示信息，上排接口中有 &lt;strong&gt;~&lt;/strong&gt; 标志的接口可用于输出模拟信号。Arduino用0&lt;del&gt;5V的电压来表示模拟信号，通过输出周期固定（约490HZ）的方波，通过改变高低电平在每个周期中的比例（占空比）来得到近似输出不同电压的效果。具体方法为调用analogWrite(pin, value)函数，pin为指定引脚，value是PWM的脉冲宽度，范围为0&lt;/del&gt;255（将5v电压模拟成255段进行调整，8位精度，255=11111111）。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;下排A0~A5&lt;/strong&gt; - 模拟信号输入引脚，用analogRead(pin)函数读取引脚上输入电压的大小。模拟输入引脚带有ADC（Analog-to-Digital Converter，模/数转换器）功能，arduino的模拟输入功能有10位精度，可以将读取到的0&lt;del&gt;5V电压转换为0&lt;/del&gt;1023（1023的二进制为1111111111）的整数形式表示。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;TX/RX引脚（1,0号）&lt;/strong&gt; - transmit/receive，用于串行通信，Arduino的USB口通过一个转换芯片（通常为ATmege16u2）与这两个串口的引脚连接。该转换芯片通过USB接口在计算机上虚拟出一个用于与arduino通信的串口。串行通信是相对于并行通信的概念，并行通信占用的I/O口较多，而arduino的I/O口资源较少，因此采用串行通信方式。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;下排左侧&lt;/strong&gt; - VCC表示电源，有3.5和5V两个接口，GND（阴极，接地）两个比较常用。&lt;/p&gt;</description></item><item><title>NameSilo Web hosting 云主机建站服务购买与使用体验</title><link>https://www.xiaoxiangtao.cn/zh/posts/namesilo-web-hosting-virtual-machine-station-building/</link><pubDate>Mon, 25 May 2020 00:00:00 +0000</pubDate><author>15989119660@163.com (Xiangtao XIAO)</author><guid isPermaLink="false">https://www.xiaoxiangtao.cn/zh/posts/namesilo-web-hosting-virtual-machine-station-building/</guid><description>&lt;p&gt;namesilo的域名在众多服务商里价格是比较实惠的，.com域名只要$8.99，近年新推出了web hosting服务，价格也比较实惠，最便宜的一个网站20G存储空间的套餐每月只要$2.39元（年套餐）。最近有一个做网站的需求，腾讯的学生优惠已经用过了，又不想备案，正好找到这个便宜的尝试一下。&lt;/p&gt;
&lt;h2 id="购买"&gt;购买&lt;/h2&gt;
&lt;p&gt;namesilo的hosting购买服务在namesilo新版网站，进入 &lt;a href="https://www.xiaoxiangtao.cn/zh/"&gt;namesilo.com&lt;/a&gt; 首页就能看见&lt;/p&gt;
&lt;p&gt;&lt;img loading="lazy" src="https://www.xiaoxiangtao.cn/posts/namesilo-web-hosting-virtual-machine-station-building/%E5%9B%BE%E7%89%87.png"&gt;&lt;/p&gt;
&lt;p&gt;总共有3个套餐，可以按年或者按月购买，按年购买会更便宜。购买过程非常简单，选择对应套餐点击Get Started。&lt;/p&gt;
&lt;p&gt;&lt;img loading="lazy" src="https://www.xiaoxiangtao.cn/posts/namesilo-web-hosting-virtual-machine-station-building/%E5%9B%BE%E7%89%87-1-1024x554.png"&gt;&lt;/p&gt;
&lt;p&gt;然后会让你选择域名，这一步也提供3种选择：&lt;/p&gt;
&lt;p&gt;1.如果你没有域名的话，可以直接搜索选择一个可注册的，然后和云主机套餐打包在namesilo购买；&lt;/p&gt;
&lt;p&gt;2.如果你在其他注册商处（比如腾讯云等）已经购买了域名，输入你购买的域名进行绑定即可，注意要输入你希望是主网站的域名比如www.test.com，namesilo会自动增加域名解析；&lt;/p&gt;
&lt;p&gt;3.你也可以选择将其他注册商处购买的域名转移至namesilo（不过注意如果你是新购买的域名通常有一个期限限制域名转出）。&lt;/p&gt;
&lt;p&gt;&lt;img loading="lazy" src="https://www.xiaoxiangtao.cn/posts/namesilo-web-hosting-virtual-machine-station-building/%E5%9B%BE%E7%89%87-2-1024x451.png"&gt;&lt;/p&gt;
&lt;p&gt;我选择了绑定我在腾讯云购买的域名，选择好域名后点击continue即跳转到确认订单页面（注意：确认订单页面在旧版网站，新旧网站功能混在一起确实比较容易让人迷惑），不用犹豫点击确认订单，然后在付款页面选择Alipay，输入你的支付宝账号然后扫二维码付款即可。&lt;/p&gt;
&lt;h2 id="域名解析"&gt;域名解析&lt;/h2&gt;
&lt;p&gt;！！！购买完成以后，在新版网站是找不到你购买的host的，这点很让人迷惑，在新版网站，你可以选择点击自己的账户信息来跳转到旧版网站，然后在侧边栏选择hosting manager，即可进入主机管理页面，在这里你会看到自己购买的主机，名称就是你之前绑定的域名。&lt;/p&gt;
&lt;p&gt;&lt;img loading="lazy" src="https://www.xiaoxiangtao.cn/posts/namesilo-web-hosting-virtual-machine-station-building/%E5%9B%BE%E7%89%87-3.png"&gt;&lt;/p&gt;
&lt;p&gt;点击链接图标，就进入了你的主机的cpanel管理面板。第一次登陆要设置账号密码邮箱配置等，cpanel支持中文（在偏好-更改语言处选择语言），可视化界面简单易懂，网上已经有很多介绍。&lt;/p&gt;
&lt;p&gt;&lt;img loading="lazy" src="https://www.xiaoxiangtao.cn/posts/namesilo-web-hosting-virtual-machine-station-building/%E5%9B%BE%E7%89%87-4.png"&gt;&lt;/p&gt;
&lt;p&gt;购买完成后就可以前往控制面板进行相关设置了，namesilo根据你在购买时绑定的域名已经自动为该域名添加了域名解析，包括test.com,www.test.com,ftp.test.com以及mail解析等，如果购买套餐时你选择在namesilo购买一个新域名，那么一切已经就绪，在cpanel面板选择安装wordpress即可开始建站。如果像我一样绑定了其他注册商处的域名，虽然namesilo已经添加了相关解析，但这些解析是基于namesilo自家DNS服务器才会生效的，这里有两种选择：&lt;/p&gt;
&lt;p&gt;1.到购买域名的域名注册商处将域名的DNS解析服务器地址改为namesilo的DNS服务器地址使解析生效：&lt;/p&gt;
&lt;p&gt;&lt;img loading="lazy" src="https://www.xiaoxiangtao.cn/posts/namesilo-web-hosting-virtual-machine-station-building/%E5%9B%BE%E7%89%87-5.png"&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;NS1.DNSOWL.COM&lt;/li&gt;
&lt;li&gt;NS2.DNSOWL.COM&lt;/li&gt;
&lt;li&gt;NS3.DNSOWL.COM&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;2.如果不希望更换DNS服务商，在cpanel面板的域名Zone找到自动添加的所有域名解析，然后将他们全部复制添加到自己的域名注册商处的域名解析中，同样可以让解析生效。&lt;/p&gt;
&lt;p&gt;做完这些，在cpanel面板安装好wordpress，在浏览器输入你的域名就可以看到wordpress主页了！&lt;/p&gt;
&lt;h2 id="ssl证书实现https"&gt;SSL证书实现HTTPS&lt;/h2&gt;
&lt;p&gt;购买的主机已经添加了自签名的SSL证书，但是自签名证书在用浏览器访问时会报不安全，一个第三方签名还是有必要的，namesilo自家在已购主机管理页面就有SSL证书购买服务，不过要花钱，有很多免费提供签名的第三方机构，我直接申请了腾讯云提供的TrustAsia 1年期免费证书（在云产品-SSL证书处申请即可）。&lt;/p&gt;
&lt;p&gt;申请下来后下载证书得到.key及.crt证书文件（host使用的是apache服务器，要选对版本），找到cpanel面板的：安全-SSL/TLS选项，删除已有自签名证书文件，上传自己的证书文件，然后选择[管理SSL主机]，选择证书对应的域名，点击按域自动填充，上传的证书会被自动选中填充，点击安装证书即可。&lt;/p&gt;
&lt;p&gt;&lt;img loading="lazy" src="https://www.xiaoxiangtao.cn/posts/namesilo-web-hosting-virtual-machine-station-building/%E5%9B%BE%E7%89%87-6.png"&gt;&lt;/p&gt;
&lt;p&gt;在cpanel面板的：域-域选项找到自己的域名，选择启用Force HTTPS Redirect，至此，网站即可安全的用HTTPS进行访问了。&lt;/p&gt;
&lt;p&gt;&lt;img loading="lazy" src="https://www.xiaoxiangtao.cn/posts/namesilo-web-hosting-virtual-machine-station-building/%E5%9B%BE%E7%89%87-7-1024x94.png"&gt;&lt;/p&gt;
&lt;h2 id="cloudflare-cdn加速"&gt;CloudFlare CDN加速&lt;/h2&gt;
&lt;p&gt;在cpanel安装好wordpress后，就是进入wordpress后台搭建网站，但是实测在中国境内网页的访问速度很慢，并且容易丢包。为了提高访问速度，需要将网页进行静态缓存以及CDN加速。&lt;/p&gt;
&lt;p&gt;类似七牛云等国内免费CDN服务要求你的主域名是备案了的，没有备案要选择海外CDN， &lt;a href="https://www.xiaoxiangtao.cn/zh/"&gt;CloudFlare&lt;/a&gt; 提供个人免费版CDN加速服务，推荐这个 &lt;a href="//zhuanlan.zhihu.com/p/29891330"&gt;教程&lt;/a&gt;，注意登录cloudflare的外国官网，中国网站注册是企业版的，注册完就有客服打电话给你谈业务了&amp;hellip;CloudFlare的CDN需要将DNS服务器地址转成他们家的，生效时间大概十分钟不到。&lt;/p&gt;
&lt;p&gt;在wordpress安装一个静态缓存插件，比如wp fast cache，在CDN选项选择cloudflare，需要输入API码，然后在cloudflare的Overview的侧边栏点击get your API token，选择global API，点击view，复制API代码到wordpress中即可，一路点击确认，cdn配置就完成了。&lt;/p&gt;
&lt;p&gt;&lt;img loading="lazy" src="https://www.xiaoxiangtao.cn/posts/namesilo-web-hosting-virtual-machine-station-building/%E5%9B%BE%E7%89%87-8.png"&gt;&lt;/p&gt;
&lt;p&gt;配置CDN及静态缓存后，网站的访问速度得到很明显的改善，访问变的更稳定，虽然相较国内的网站速度稍慢，但是对于像个人博客之类的小网站完全可以接受了。&lt;/p&gt;
&lt;h2 id="邮箱"&gt;邮箱&lt;/h2&gt;
&lt;p&gt;namesilo的host已经配置好了邮箱服务，发送邮件没问题，但是我用163发的邮件它却收不到，在wordpress设置中更换邮件地址，发现验证邮件也发不到我的邮箱上。因此使用了第三方的SMTP服务，下载了wp SMTP mail插件，SMTP服务用的是腾讯云的企业邮。&lt;/p&gt;
&lt;p&gt;将原本的地址解析中的邮件地址解析删掉，添加腾讯企业邮的地址进去，就可以使用腾讯企业邮箱的服务了，方法很简单，注册一个腾讯企业邮箱账号（免费的），然后按指导设置完成即可。增加一个业务邮箱账号，比如mail@designaxt.com，然后得到对应的邮箱密匙，在wp SMTP mail选择其他SMTP，输入密匙，腾讯企业邮的服务器地址及端口号，保存更改就可以用腾讯的服务发邮件了，其他家应该类似。&lt;/p&gt;</description></item><item><title>Gensim训练词向量与Embedding相关知识</title><link>https://www.xiaoxiangtao.cn/zh/posts/gensim-training-word-vector-and-embedding-related-knowledge/</link><pubDate>Fri, 22 May 2020 00:00:00 +0000</pubDate><author>15989119660@163.com (Xiangtao XIAO)</author><guid isPermaLink="false">https://www.xiaoxiangtao.cn/zh/posts/gensim-training-word-vector-and-embedding-related-knowledge/</guid><description>&lt;p&gt;在进行文本分类的时候，预处理我们可以自己做一个词向量模型，也可以采用预训练的模型。采用预训练的模型比如谷歌基于goole news训练的Word2vec模型，由于在大量文本数据中训练过，所以词的概率分布会比较准确，当自己的数据集比较小的时候，用预训练数据有利于提升模型的准确度。&lt;/p&gt;
&lt;p&gt;以下内容使用了tensorflow。&lt;/p&gt;
&lt;h2 id="训练文本生成word2vec模型"&gt;训练文本生成word2vec模型&lt;/h2&gt;
&lt;p&gt;自己训练模型一般有以下几步：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;处理数据集，首先gensim的Word2Vec()方法需要的输入是句子顺序的单词，比如 我 爱 你 而不是我爱你，所以要将文本数据分词处理，在这个过程中，我们可以去除停用词，英文全部小写，语法统一等处理，可能对词向量的训练比较有帮助。&lt;/li&gt;
&lt;li&gt;完成文本的处理以后，我们得到一个分词后的文本数据集，比如一个列表[&amp;lsquo;she&amp;rsquo;, &amp;lsquo;is&amp;rsquo;, &amp;lsquo;beautiful&amp;rsquo;]，在gensim模块中可以简单的使用model=gensim.models.word2vec.Word2Vec()得到训练的模型。&lt;br&gt;
该方法有一些参数：&lt;br&gt;
&lt;strong&gt;sentences&lt;/strong&gt;-即数据集；sg-设置训练算法，0代表CBOW，1代表skip-gram算法；&lt;br&gt;
&lt;strong&gt;size&lt;/strong&gt;-指特征向量的维度，默认为100，大的size需要更多数据，效果更好，但是过大则浪费资源，效果提升不明显；&lt;br&gt;
&lt;strong&gt;window&lt;/strong&gt;-当前词与预测词在一个句子中的最大距离，默认是5，比如 我 今天 成功 完成 工作，对于 成功，如果设置窗口为2，可能去预测的词就是我 今天 完成 和 工作，注意是最大值而不是一定选取四个词。最后模型输出的是一个概率分布，即一个词出现在其他词边的概率是多少，我们也就可以据此去发现相似的词。&lt;br&gt;
&lt;strong&gt;min_count&lt;/strong&gt;-去除词频小于min_count的词；&lt;br&gt;
&lt;strong&gt;hs&lt;/strong&gt;-1采用hierarchy softmax，0采用negative sample；&lt;br&gt;
&lt;strong&gt;iter&lt;/strong&gt;-迭代次数&lt;br&gt;
&lt;strong&gt;workers&lt;/strong&gt;-参数控制训练的并行数¨C9C    更多参考： &lt;a href="//www.cnblogs.com/kjkj/p/9825418.html"&gt;//www.cnblogs.com/kjkj/p/9825418.html&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;其他训练词向量有相似的方法和思路，网上有很多资料。&lt;/p&gt;
&lt;h2 id="使用预训练词向量"&gt;使用预训练词向量&lt;/h2&gt;
&lt;p&gt;首先加载获取到准备好的模型，然后我们的目标是得到一个embedding_metrics即词向量矩阵，词向量矩阵的shape为（vocab_size, embedding_dim），它是我们要用于训练的数据的每个词（更具体的说是词表中的词）在训练好的模型中的词向量组成的矩阵。&lt;/p&gt;
&lt;p&gt;接下来处理训练数据，即用tokenizer处理训练后的数据得到词表，然后将每条文本数据转变为用词表索引数字代替各单词表示的列表，这里给词编码的顺序是词频由高到低，再进行padding使句子输入变为定长，最后我们利用word_index和模型生成embedding_metrics，数据的准备就基本完成了。这些步骤使用tensorflow提供的api可以很简单的实现。&lt;/p&gt;
&lt;p&gt;生成代码及相关解释如下：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;embedding_matrix&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;zeros&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;word_index&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;word2vec&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;vector_size&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;#  len(word_index) + 1，加1是因为word_index的标记是从1开始而非0，这样词索引与词向量刚好对应，并且对于padding后为&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;#  0的填充位置可以有对应的映射。&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;word&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;index&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;word_index&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;items&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;        &lt;span class="n"&gt;embedding_vector&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;word2vec&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;wv&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;getitem&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;word&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;        &lt;span class="n"&gt;embedding_matrix&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;embedding_vector&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="ne"&gt;KeyError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;        &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;vector not found for word - &lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="n"&gt;word&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="embedding层做了什么"&gt;Embedding层做了什么？&lt;/h2&gt;
&lt;p&gt;Embedding层就是以one hot为输入、中间层节点为词向量维数的全连接层！而这个全连接层的参数，就是一个“词向量表”即我们的embedding_metrics，也就是说，其实onehot的作用就是查表，选择onehot表示的词对应的词向量，然后输出到下一层去。如果我们不用预处理的词向量，就是放一个空矩阵在embedding层（或者说是随机初始化参数），然后在训练网络过程中更新参数。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Embedding&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;vocab&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;embedding_dim&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;input_length&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;weights&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;embedding_matrix&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;trainable&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# (len(vocab) + 1, embedding_dim)与embedding_matrix的shape是一致的。&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;参考：&lt;/p&gt;</description></item><item><title>NLP分类效果衡量指标(F1/p/r)</title><link>https://www.xiaoxiangtao.cn/zh/posts/nlp-classification-effect-measurement-index-f1-p-r/</link><pubDate>Fri, 22 May 2020 00:00:00 +0000</pubDate><author>15989119660@163.com (Xiangtao XIAO)</author><guid isPermaLink="false">https://www.xiaoxiangtao.cn/zh/posts/nlp-classification-effect-measurement-index-f1-p-r/</guid><description>&lt;h2 id="概念"&gt;概念&lt;/h2&gt;
&lt;p&gt;为什么要计算F1：避免样本分布带来的偏差，综合考量分类效果，假如有100个样本，其中1个正样本，99个负样本，如果模型的预测只输出0，那么正确率是99%，这时候用正确率来衡量模型的好坏显然是不对的。&lt;/p&gt;
&lt;p&gt;真实 1真实 0预测 1True Positive(TP)False Positive(FP)预测 0False Negative(FN)True Negative(TN)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;查准率(precision)，预测正确的样本在所有预测为1的样本中的比例，该值反映有多少其他类被错误的归为该类。&lt;/li&gt;
&lt;li&gt;召回率(recall)，预测正确的样本在所有真实为1的样本中的比例，该值反映有多少该类被预测为其他类了。&lt;/li&gt;
&lt;li&gt;F1(F1-Score)， 精准率和召回率的调和平均数。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Micro-F1与Macro-F1&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;针对多标签分类而言衡量分类效果&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Micro-F1：直接计算所有类别的Precision和Recall，然后计算F1。（类别有权重，分到样本数多的类别有更大的影响力）&lt;/li&gt;
&lt;li&gt;Macro-F1：计算出每一个类的Precision和Recall并分别计算F1，最后将F1平均。（各类别的F1权重相同）&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="代码实现"&gt;&lt;strong&gt;代码实现&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;二分类&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;f1&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;y_hat&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y_true&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="s1"&gt;&amp;#39;&amp;#39;&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;    输入张量y_hat是输出层经过sigmoid激活的张量
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;    y_true是label{0,1}的集和
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;    model指的是如果是多任务分类，single会返回每个分类的f1分数，multi会返回所有类的平均f1分数（Marco-F1）
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;    如果只是单个二分类任务，则可以忽略model
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;    &amp;#39;&amp;#39;&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="n"&gt;epsilon&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;1e-7&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="n"&gt;y_hat&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tf&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;round&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;y_hat&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="c1"&gt;#将经过sigmoid激活的张量四舍五入变为0，1输出&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="c1"&gt;#  输入的数据是矩阵，标签为单行矩阵，预测值为单列矩阵，如果不是需要转换&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="n"&gt;tp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tf&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cast&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tf&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;matmul&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;y_true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;y_hat&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;float&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="c1"&gt;#tn = tf.sum(tf.cast((1-y_hat)&amp;lt;em&amp;gt;(1-y_true), &amp;#39;float&amp;#39;), axis=0)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="n"&gt;fp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tf&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cast&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tf&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;matmul&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;y_true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;y_hat&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;float&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="n"&gt;fn&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tf&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cast&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tf&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;matmul&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;y_true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;y_hat&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;float&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;tp: &amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;tp&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;numpy&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;fp: &amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="n"&gt;fp&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;numpy&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;fn: &amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="n"&gt;fn&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;numpy&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tp&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tp&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;fp&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;epsilon&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="c1"&gt;#epsilon的意义在于防止分母为0，否则当分母为0时python会报错&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tp&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tp&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;fn&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;epsilon&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="n"&gt;f1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="n"&gt;em&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;em&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;epsilon&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;f1&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;numpy&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;numpy&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;numpy&lt;/span&gt;&lt;span class="p"&gt;()]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;em&gt;多标签&lt;/em&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;import tensorflow as tf
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;def f1(y_hat, y_true, model=&amp;#39;multi&amp;#39;):
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &amp;#39;&amp;#39;&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    输入张量y_hat是输出层经过sigmoid激活的张量
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    y_true是label{0,1}的集和
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    model指的是如果是多任务分类，single会返回每个分类的f1分数，multi会返回所有类的平均f1分数（Marco-F1）
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    如果只是单个二分类任务，则可以忽略model
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &amp;#39;&amp;#39;&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    epsilon = 1e-7
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    y_hat = tf.round(y_hat)#将经过sigmoid激活的张量四舍五入变为0，1输出
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    #tf.cast()转换张量数据类型
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    tp = tf.reduce_sum(tf.cast(y_hat&amp;lt;/em&amp;gt;y_true, &amp;#39;float&amp;#39;), axis=0) #取axis维数据求和
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    #tn = tf.sum(tf.cast((1-y_hat)&amp;lt;em&amp;gt;(1-y_true), &amp;#39;float&amp;#39;), axis=0)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    fp = tf.reduce_sum(tf.cast((1-y_hat)&amp;lt;/em&amp;gt;y_true, &amp;#39;float&amp;#39;), axis=0)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    fn = tf.reduce_sum(tf.cast(y_hat&amp;lt;em&amp;gt;(1-y_true), &amp;#39;float&amp;#39;), axis=0)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    p = tp/(tp+fp+epsilon)#epsilon的意义在于防止分母为0，否则当分母为0时python会报错
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    r = tp/(tp+fn+epsilon)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    f1 = 2&amp;lt;/em&amp;gt;p*r/(p+r+epsilon)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    f1 = tf.where(tf.is_nan(f1), tf.zeros_like(f1), f1)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    if model == &amp;#39;single&amp;#39;:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;        return f1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    if model == &amp;#39;multi&amp;#39;:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;        return tf.reduce_mean(f1)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="参考"&gt;&lt;strong&gt;参考&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href="//blog.csdn.net/zjn295771349/article/details/84961596"&gt;//blog.csdn.net/zjn295771349/article/details/84961596&lt;/a&gt;&lt;/p&gt;</description></item><item><title>多标签分类(multi-label)分类方法笔记</title><link>https://www.xiaoxiangtao.cn/zh/posts/notes-on-multi-label-classification-method/</link><pubDate>Fri, 22 May 2020 00:00:00 +0000</pubDate><author>15989119660@163.com (Xiangtao XIAO)</author><guid isPermaLink="false">https://www.xiaoxiangtao.cn/zh/posts/notes-on-multi-label-classification-method/</guid><description>&lt;h2 id="概述"&gt;概述&lt;/h2&gt;
&lt;p&gt;multi-label是相较multi-class的概念，有关研究相对较少，multi-label指一个数据可以被分为多个类，一个输入对应多个输出，例如一篇新闻可以被同时打上娱乐、体育等多个类，类的数目也不确定；&lt;/p&gt;
&lt;p&gt;对于multi-label问题的处理，主要看到三种思路：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;当类别之间没有较强的联系时，将multi-label转化为多个二分类问题，对于每个类专门训练一个分类器，然后将多个分类器对同个样本进行分类输出结果达到多标签的效果。&lt;/li&gt;
&lt;li&gt;当类别之间有一定联系的时候，将multi-label转化为multi-class问题，比如用二进制编码表示三个类：[&amp;lsquo;人&amp;rsquo;, &amp;lsquo;猫&amp;rsquo;, &amp;lsquo;狗&amp;rsquo;]，0表示不是该类，1表示是，则对于多标签分类可能有[0, 1, 1]的情况比如一张图片上既有猫又有狗，那么我们可以将每一个向量作为一个类别，比如[0,  1, 1]作为一个类，将[1, 0, 1]作为一个类，这样一来我们得到一个23个类，对单一样本输出的结果一定在这个类别空间中，这样就是一个多分类问题了，总共8个类，可以用长度为8的独热编码表示。&lt;br&gt;
当然对于类别特别多(n个类)的数据集，这时候类别空间就是2n，显然类别太多了运算压力大，可以选择将类别输出的种类限制在训练集数据中存在的类别中，比如[1, 0, 0]在训练集中没有这个输出，就把他从类别中去除，当然这会影响模型的准确程度，因为它不再识别那些被踢出的可能性。&lt;/li&gt;
&lt;li&gt;最后一种就是改进算法使其能够直接处理多标签问题，输出多个类。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="多标签分类算法"&gt;多标签分类算法&lt;/h2&gt;
&lt;p&gt;对于神经网络，简单的做法是在最后输出层使用sigmoid激活函数，输出数目为类别数，每个输出都是一个概率，注意输出的多个类别的概率总和不再是1，因为是多标签问题，然后损失函数用binary_crossentrophy，相当于对每个输出分别判断属不属于该类，从而使每一个可能属于的类的概率都趋近1。&lt;/p&gt;
&lt;p&gt;在简单的单层CNN算法的实验上效果并不是很好，确实得到了多输出的结果，但是出现了某个类概率接近1，另一个所属类概率虽然也比较突出但数值偏小，比如0.5左右的样子，同时属于3个或4个类效果就更差些，可以通过修改阈值比如threshold=0.3，大于0.3就算做该类，但改善不明显。应该和数据集不同类对应存在的样本不同有关。&lt;/p&gt;</description></item><item><title>Natural Language Processing相关概念理解</title><link>https://www.xiaoxiangtao.cn/zh/posts/understanding-of-related-concepts-of-natural-language/</link><pubDate>Thu, 21 May 2020 00:00:00 +0000</pubDate><author>15989119660@163.com (Xiangtao XIAO)</author><guid isPermaLink="false">https://www.xiaoxiangtao.cn/zh/posts/understanding-of-related-concepts-of-natural-language/</guid><description>&lt;h2 id="nlp一般流程"&gt;NLP一般流程&lt;/h2&gt;
&lt;p&gt;文本预处理-&amp;gt;词向量与文本表示-&amp;gt;特征选择与特征抽取-&amp;gt;分类算法&lt;/p&gt;
&lt;h2 id="词向量与文本表示"&gt;词向量与文本表示&lt;/h2&gt;
&lt;h3 id="词袋模型bow"&gt;词袋模型（BOW）&lt;/h3&gt;
&lt;p&gt;将所有词汇放进一个袋子里，假设有n个词，则每个句子表示为一个长度为n的词频向量，词频即对应词在句子里出现的次数，如果没有出现就是0。这种方法句子里的语义信息被完全遗失了。&lt;/p&gt;
&lt;h3 id="word-based-encodings"&gt;word based encodings&lt;/h3&gt;
&lt;p&gt;另一种思路是表示句子，这样就可以把词在句子中的位置关系考虑进去，例如 “我 喜欢 猫”和 “我 喜欢 狗”分别表示为（0 1 2）和（0 1 3），这里的数字不再是词频，而是对应单词被分配的编码，如果词重复了，显然在数组中对应的数字也会重复。&lt;/p&gt;
&lt;h3 id="padding"&gt;padding&lt;/h3&gt;
&lt;p&gt;句子长度不同时，需要将他们转化为统一长度的向量输入到神经网络中训练，这时就要padding，设置一个长度n，如果句子长度小于n，就在数组左侧或右侧填充0，如果句子长了，就把左侧或右侧多余的部分忽略，具体方位由自己选择。&lt;/p&gt;
&lt;h3 id="词向量模型word-embedding"&gt;词向量模型（word embedding）&lt;/h3&gt;
&lt;p&gt;考虑词与词之间的位置关系。原本用随机分配的数字代表每一个词，词与词之间是完全独立的，而embedding使得每一个词成为了一个n维空间中的向量，如果两个词的含义相近，那么相应的向量距离也就进，这样就考虑到了词的含义。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;word2Vec ：&lt;/strong&gt; 底层采用基于CBOW和Skip-Gram算法的神经网络模型。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;CBOW模型：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;CBOW模型的训练输入是某一个特征词的上下文相关的词对应的词向量，而输出就是这特定的一个词的词向量。由于CBOW使用的是词袋模型，因此上下文的几个词都是平等的，也就是不考虑他们和我们关注的词之间的距离大小，只要在我们上下文之内即可。&lt;/p&gt;
&lt;p&gt;这样我们这个CBOW的例子里，我们的输入是上下文选定的词向量，输出是所有词的softmax概率（训练的目标是期望训练样本特定词对应的softmax概率最大），对应的CBOW神经网络模型输入层有4个神经元，输出层有词汇表大小个神经元。隐藏层的神经元个数我们可以自己指定。通过DNN的反向传播算法，我们可以求出DNN模型的参数，同时得到所有的词对应的词向量。这样当我们有新的需求，要求出某4个词对应的最可能的输出中心词时，我们可以通过一次DNN前向传播算法并通过softmax激活函数找到概率最大的词对应的神经元即可。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Skip-Gram模型：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Skip-Gram模型和CBOW的思路是反着来的，即输入是特定的一个词的词向量，而输出是特定词对应的上下文词向量。&lt;/p&gt;
&lt;p&gt;这样我们这个Skip-Gram的例子里，我们的输入是特定词， 输出是softmax概率排前几的词，对应的Skip-Gram神经网络模型输入层有1个神经元，输出层有词汇表大小个神经元。隐藏层的神经元个数我们可以自己指定。通过DNN的反向传播算法，我们可以求出DNN模型的参数，同时得到所有的词对应的词向量。这样当我们有新的需求，要求出某1个词对应的最可能的4个上下文词时，我们可以通过一次DNN前向传播算法得到概率大小排前4的softmax概率对应的神经元所对应的词即可。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;词向量模型突出特点：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;在词向量模型中，词向量与词向量之间有这非常特殊的特性。例如现在存在国王、男生、女人、皇后四个词向量，那么一个完善的词向量模型，就存在“国王-男人+女人=皇后”这样的关系。&lt;/p&gt;
&lt;p&gt;参考： &lt;a href="//www.cnblogs.com/chenyusheng0803/p/10978883.html"&gt;词袋模型（BOW，bag of words）和词向量模型（Word Embedding）概念介绍&lt;/a&gt;&lt;/p&gt;</description></item><item><title>NLP数据准备相关代码记录</title><link>https://www.xiaoxiangtao.cn/zh/posts/nlp-data-preparation-related-code-record/</link><pubDate>Thu, 21 May 2020 00:00:00 +0000</pubDate><author>15989119660@163.com (Xiangtao XIAO)</author><guid isPermaLink="false">https://www.xiaoxiangtao.cn/zh/posts/nlp-data-preparation-related-code-record/</guid><description>&lt;h2 id="csv文件"&gt;csv文件&lt;/h2&gt;
&lt;h3 id="什么是csv文件"&gt;什么是csv文件&lt;/h3&gt;
&lt;p&gt;csv既逗号分隔符文件，行数据用&amp;rsquo;,&amp;lsquo;分隔，列数据用换行符&amp;rsquo;\n&amp;rsquo;分隔&lt;/p&gt;
&lt;h3 id="读取与写入csv文件"&gt;读取与写入csv文件&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nb"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;filename&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;r&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;encoding&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;gbk&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;rf&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="n"&gt;reader&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;csv&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;reader&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rf&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dialect&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;csv&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;excel&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;#  按行读取，读取的是存储为excel可读格式的csv文件，这个文件可以用excel打开查看&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nb"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;clean_data\clean_data_0.5_no_repeat.csv&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;w&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;encoding&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;gbk&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;newline&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="n"&gt;writer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;csv&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;writer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dialect&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;csv&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;excel&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;delimiter&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;,&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;final_dataset&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;        &lt;span class="n"&gt;writer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;writerow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;#    按行写入，写入格式也是csv.excel，会把一个二维列表自动存储为表格，行列对应，存储的内容是原封不动的&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="csv文件存储格式与换行问题"&gt;csv文件存储格式与换行问题&lt;/h3&gt;
&lt;p&gt;用以上方法读取的csv文件每一行每一列取出的都是字符串&amp;rsquo;str&amp;rsquo;格式，对于字典要用eval()函数自动转回原本对应的格式，而int等也要用对应函数转换&lt;/p&gt;
&lt;p&gt;newline=&amp;rsquo;&amp;rsquo;&amp;ldquo;设置存储的行与行之间没有空行，否则会隔行存储。&lt;/p&gt;
&lt;h2 id="json格式"&gt;json格式&lt;/h2&gt;
&lt;h3 id="json格式文件特点"&gt;json格式文件特点&lt;/h3&gt;
&lt;p&gt;json格式文本对{对象:值}，例如： {&amp;ldquo;name&amp;rdquo;: &amp;ldquo;John Doe&amp;rdquo;, &amp;ldquo;age&amp;rdquo;: 18, &amp;ldquo;address&amp;rdquo;: {&amp;ldquo;country&amp;rdquo; : &amp;ldquo;china&amp;rdquo;, &amp;ldquo;zip-code&amp;rdquo;: &amp;ldquo;10000&amp;rdquo;}}，和字典有些相似，存储的值可以是字符串，数组，字典等，这个格式好处在于可以存储结构相对复杂的数据并且易于存取。&lt;/p&gt;
&lt;h3 id="json与strjson的读取"&gt;json与str，json的读取&lt;/h3&gt;
&lt;p&gt;在实际操作中似乎直接把json放在列表里就可以和其他数据一样存储到csv文件中，在使用csv.writer方法时，双引号的问题被自动解决了，取出以后和其他数据一样都是str，使用json.loads()方法即可转换为json格式数据，写入的时候可以用同样的方法转换。&lt;/p&gt;
&lt;p&gt;转换后的json格式数据按对象取值的方法与字典相似，即data[&amp;lsquo;对象名&amp;rsquo;]-&amp;gt;值&lt;/p&gt;
&lt;h2 id="python集合列表字典"&gt;python集合、列表、字典&lt;/h2&gt;
&lt;p&gt;在处理重复数据时（这里指字符串或数值的数据），可以采用集合进行存储，因为集合中元素不能重复，可以很简单的使用set()或list()方法将集合和列表相互转换，因此可以利用集合去重后在转换为list存储。&lt;/p&gt;
&lt;p&gt;要注意的是，创建空的集合要使用a = set()方法，如果是a={}则是一个空的字典。&lt;/p&gt;
&lt;p&gt;当存储集合时如果集合为空会存储一个空集，内容为set()。&lt;/p&gt;
&lt;p&gt;集合增加元素要用add()方法，集合没有列表的append()方法。&lt;/p&gt;
&lt;p&gt;在处理数据时，字典一个很大的用处在于给出的key是有语义的，这提高了代码的可读性，list[1]中的数据是什么我们是不知道的，而dict[&amp;lsquo;key&amp;rsquo;]则很好懂。&lt;/p&gt;
&lt;h2 id="tensorflow输入数据格式转化"&gt;tensorflow输入数据格式转化&lt;/h2&gt;
&lt;p&gt;constant方法生成张量，tensorflow搭建的算法输入数据都是相应格式的张量，而不是列表，因此如果采用csv.reader读取csv文件而不是tensorflow自带的方法读取csv文件的话，要用对应的tensorflow或者numpy方法将数据转化为张量，通常为[None,*]None为数据量比如有2000条训练文本，None就是2000，后面的就是处理后的数据格式，比如设置的padding，maxlen=500的embedding size=12后的文本数据，格式就是[None,500,12]，label数据格式也要与之相对应。&lt;/p&gt;
&lt;p&gt;tensorflow自带的读取csv文件的方法可以直接得到tensor格式的数据，但是由于我要处理的csv文件是文本文件并且包含json，这个时候还是先用csv的方法处理完比较好。&lt;/p&gt;</description></item><item><title>TensorFlow基础API</title><link>https://www.xiaoxiangtao.cn/zh/posts/tensorflow-basic-api/</link><pubDate>Thu, 21 May 2020 00:00:00 +0000</pubDate><author>15989119660@163.com (Xiangtao XIAO)</author><guid isPermaLink="false">https://www.xiaoxiangtao.cn/zh/posts/tensorflow-basic-api/</guid><description>&lt;p&gt;看网课视频老师讲的一些，实际上官方文档有非常详细的介绍&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;numpy&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nn"&gt;np&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;tensorflow&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nn"&gt;tf&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# tf基础api：常量&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tf&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;constant&lt;/span&gt;&lt;span class="p"&gt;([[&lt;/span&gt;&lt;span class="mf"&gt;1.&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;2.&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;3.&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;4.&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;5.&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;6.&lt;/span&gt;&lt;span class="p"&gt;]])&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# index索引操作&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;[:,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;:])&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;#%%&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# ops算数操作&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tf&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;square&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="o"&gt;@&lt;/span&gt; &lt;span class="n"&gt;tf&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;transpose&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="c1"&gt;# 乘转置&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;#%%&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# numpy conversion&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;numpy&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;square&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;np_t&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;array&lt;/span&gt;&lt;span class="p"&gt;([[&lt;/span&gt;&lt;span class="mf"&gt;1.&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;2.&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;3.&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;4.&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;5.&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;6.&lt;/span&gt;&lt;span class="p"&gt;]])&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tf&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;constant&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;np_t&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;#%%&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Scalars tensor可以使0维、1维...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tf&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;constant&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;2.718&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;numpy&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;shape&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;#%%&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# strings&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tf&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;constant&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;cafe&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tf&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;strings&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;length&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tf&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;strings&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;length&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;unit&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;UTF8_CHAR&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tf&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;strings&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;unicode_decode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;UTF8&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;#%%&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# string array&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tf&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;constant&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;cafe&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;coffee&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;咖啡&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tf&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;strings&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;length&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;unit&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;UTF8_CHAR&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tf&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;strings&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;unicode_decode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;UTF8&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;#%%&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# ragged tensor&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tf&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ragged&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;constant&lt;/span&gt;&lt;span class="p"&gt;([[&lt;/span&gt;&lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;21&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;22&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;23&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="p"&gt;[],&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;41&lt;/span&gt;&lt;span class="p"&gt;]])&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# index op&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;#%%&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# ops on ragged tensor&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;r2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tf&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ragged&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;constant&lt;/span&gt;&lt;span class="p"&gt;([[&lt;/span&gt;&lt;span class="mi"&gt;51&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;52&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="p"&gt;[],&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;71&lt;/span&gt;&lt;span class="p"&gt;]])&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tf&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;concat&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;r2&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;axis&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;r3&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tf&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ragged&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;constant&lt;/span&gt;&lt;span class="p"&gt;([[&lt;/span&gt;&lt;span class="mi"&gt;13&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;14&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="p"&gt;[],&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;41&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;42&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;43&lt;/span&gt;&lt;span class="p"&gt;]])&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tf&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;concat&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;r3&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;axis&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# ragged tensor 变成 普通tensor 空位用0补齐，注意0永远在正常值的后面&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;to_tensor&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;#%%&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# sparse tensor 0可以在正常值前面&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tf&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SparseTensor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;indices&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;]],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;values&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;1.&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;2.&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;3.&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;dense_shape&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tf&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sparse&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;to_dense&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="c1"&gt;# 稀疏矩阵转密集矩阵，这样的稀疏矩阵不能用ragged tensor来表示&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;#%%&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# ops on sparse tensors&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;s2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mf"&gt;2.0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;s3&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="ne"&gt;TypeError&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;ex&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ex&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;s4&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tf&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;constant&lt;/span&gt;&lt;span class="p"&gt;([[&lt;/span&gt;&lt;span class="mf"&gt;10.&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;20.&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;30.&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;40.&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;50.&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;60.&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;70.&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;80.&lt;/span&gt;&lt;span class="p"&gt;]])&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tf&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sparse&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sparse_dense_matmul&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;s4&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;#%%&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;s5&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tf&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SparseTensor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;indices&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;]],&lt;/span&gt; &lt;span class="c1"&gt;# 没有排好序的稀疏矩阵无法被转换为密集矩阵&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;values&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;1.&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;2.&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;3.&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;dense_shape&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;s6&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tf&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sparse&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;reorder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# 对s5进行排序&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tf&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sparse&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;to_dense&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s6&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;#%%&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Variable 变量&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;v&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tf&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Variable&lt;/span&gt;&lt;span class="p"&gt;([[&lt;/span&gt;&lt;span class="mf"&gt;1.&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;2.&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;3.&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;4.&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;5.&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;6.&lt;/span&gt;&lt;span class="p"&gt;]])&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;numpy&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;#%%&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# assign value 变量重新赋值&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;assign&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;numpy&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;assign&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;42&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;numpy&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;assign&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="mf"&gt;7.&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;8.&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;9.&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;numpy&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;#%%&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 不能用=号，只能用assign()重新赋值&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;7.&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;8.&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;9.&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="ne"&gt;TypeError&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;ex&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ex&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# &amp;#39;ResourceVariable&amp;#39; object does not support item assignment&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>卷积神经网络(CNN)理论与实现</title><link>https://www.xiaoxiangtao.cn/zh/posts/theory-and-implementation-of-convolutional-neural-network/</link><pubDate>Thu, 21 May 2020 00:00:00 +0000</pubDate><author>15989119660@163.com (Xiangtao XIAO)</author><guid isPermaLink="false">https://www.xiaoxiangtao.cn/zh/posts/theory-and-implementation-of-convolutional-neural-network/</guid><description>&lt;h2 id="一理论"&gt;一、理论&lt;/h2&gt;
&lt;p&gt;卷积神经网络结构：（卷积层+（可选）池化层）*N+全连接层*M（M&amp;gt;=0），卷积层的输入输出是矩阵，全连接层输入输出是向量，在卷积层的最后一层做一个展平。&lt;/p&gt;
&lt;p&gt;主要用于分类任务&lt;/p&gt;
&lt;p&gt;全卷积神经网络：（卷积层+（可选）池化层）*N+反卷积层*K，可以做物体分割类任务&lt;/p&gt;
&lt;h3 id="卷积操作"&gt;卷积操作&lt;/h3&gt;
&lt;p&gt;解决参数过多导致的计算资源不足，容易过拟合的问题。解决方法：局部连接（基于图像的区域性）、参数共享（基于图像特征与位置无关）&lt;/p&gt;
&lt;p&gt;卷积核是反向传播计算出的参数，卷积：卷积核与输入做点积乘法。步长：卷积核每次在输入上滑动的距离。padding：使输出size不变。&lt;/p&gt;
&lt;h3 id="池化操作"&gt;池化操作&lt;/h3&gt;
&lt;p&gt;类似卷积，计算方式不同，最大值池化：池化核滑动覆盖区域的最大值作为结果输出。&lt;/p&gt;
&lt;p&gt;特点：常使用不重叠（kernal-size=步长）、不补零的操作。参数即为步长和池化核大小。用于减少图像尺寸，从而减少计算量。一定程度平移鲁棒。损失了空间精度。&lt;/p&gt;
&lt;h2 id="二实现"&gt;二、实现&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;embedding_dim&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;16&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;batch_size&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;128&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;cnn_model&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;keras&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;models&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Sequential&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="n"&gt;keras&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;layers&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Embedding&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;vocab_size&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;embedding_dim&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;                &lt;span class="n"&gt;input_length&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;max_length&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="n"&gt;keras&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;layers&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Conv1D&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;filters&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;256&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;kernel_size&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;kernel_initializer&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;he_normal&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;              &lt;span class="n"&gt;strides&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;padding&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;SAME&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;activation&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;relu&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="n"&gt;keras&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;layers&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GlobalMaxPooling1D&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="n"&gt;keras&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;layers&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Dropout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rate&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.5&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="n"&gt;keras&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;layers&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Dense&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;activation&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;sigmoid&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;cnn_model&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;summary&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;cnn_model&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;compile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;optimizer&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;adam&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;loss&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;binary_crossentropy&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;metrics&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;accuracy&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="conv1d"&gt;Conv1D&lt;/h3&gt;
&lt;p&gt;在文本中，卷积的某一维大小往往为embedding长度，即在宽度上不需要窗口移动，宽度就是整个窗口，所以conv1d默认卷积的宽度就为embedding维度，长度通过kernel_size来指定的，此处为2，即卷积核的大小为2*embedding_size。strides为步长，此处为1，即卷积核每隔一个单词移动一次。filters是卷积核的个数，即输出的维度。padding有valid和same两种选择，valid在长度方向（宽度方向不padding）不进行padding，而same则在长度方向进行padding，保证输入句子长度和卷积后输出的句子长度一致。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href="//blog.csdn.net/bobobe/article/details/87923618"&gt;//blog.csdn.net/bobobe/article/details/87923618&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;tensorflow fit()方法：参考&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href="//blog.csdn.net/crazyman2010/article/details/103705318"&gt;//blog.csdn.net/crazyman2010/article/details/103705318&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="textcnn"&gt;TextCNN&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href="//blog.csdn.net/u014732537/article/details/79573174"&gt;//blog.csdn.net/u014732537/article/details/79573174&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>MNIST手写数字识别实践</title><link>https://www.xiaoxiangtao.cn/zh/posts/mnist-handwritten-digit-recognition-practice/</link><pubDate>Wed, 20 May 2020 00:00:00 +0000</pubDate><author>15989119660@163.com (Xiangtao XIAO)</author><guid isPermaLink="false">https://www.xiaoxiangtao.cn/zh/posts/mnist-handwritten-digit-recognition-practice/</guid><description>&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;__future__&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;absolute_import&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;division&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;print_function&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;unicode_literals&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;tensorflow&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nn"&gt;tf&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;mnist&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tf&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;keras&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;datasets&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;mnist&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x_train&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y_train&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x_test&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y_test&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;mnist&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;load_data&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 加载数据&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;x_train&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;x_test&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;x_train&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mf"&gt;255.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;x_test&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mf"&gt;255.0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# /255：将RGB数值归一化&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;#%%&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;y_train&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;shape&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;#%%&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;model&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tf&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;keras&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;models&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Sequential&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;tf&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;keras&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;layers&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Flatten&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;input_shape&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;28&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;28&lt;/span&gt;&lt;span class="p"&gt;)),&lt;/span&gt; &lt;span class="c1"&gt;# 张量扁平化，将28*28的图片矩阵转化为784的向量&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;tf&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;keras&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;layers&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Dense&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;128&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;activation&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;relu&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="c1"&gt;# 全连接层，128个神经元，激活函数为relu（The Rectified Linear Unit）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# y=max(0,x)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;tf&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;keras&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;layers&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Dropout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;0.2&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="c1"&gt;# 防止过拟合，drop out 80% of inputs，使用0.2*cell_size个神经元进行训练&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;tf&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;keras&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;layers&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Dense&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;activation&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;softmax&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# 全连接层输出 softmax激活函数&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;compile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;optimizer&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;adam&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;# 梯度下降策略 adam&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;loss&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;sparse_categorical_crossentropy&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;# 损失函数 sparse:y独热化编码 交叉熵&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;metrics&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;accuracy&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# metrics 列表，包含评估模型在训练和测试时的性能的指标，典型用法是metrics=[‘accuracy’]。&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 如果要在多输出模型中为不同的输出指定不同的指标，可向该参数传递一个字典，例如metrics={‘output_a’: ‘accuracy’}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;fit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x_train&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y_train&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;epochs&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# 训练5轮&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;evaluate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x_test&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y_test&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;verbose&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Verbosity mode. 0 = silent, 1 = progress bar.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# fit()用于使用给定输入训练模型.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# evaluate()用于评估已经训练过的模型.返回损失值&amp;amp;模型的度量值.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>TensorFlow2.0安装</title><link>https://www.xiaoxiangtao.cn/zh/posts/tensorflow2/</link><pubDate>Tue, 19 May 2020 00:00:00 +0000</pubDate><author>15989119660@163.com (Xiangtao XIAO)</author><guid isPermaLink="false">https://www.xiaoxiangtao.cn/zh/posts/tensorflow2/</guid><description>&lt;h2 id="清华镜像源安装"&gt;清华镜像源安装&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pip install tensorflow-gpu==1.12.0 -i //pypi.tuna.tsinghua.edu.cn/simple #可改成任意版本
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="cpu版本安装"&gt;CPU版本安装&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pip install tensorflow -i //pypi.tuna.tsinghua.edu.cn/simple
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="pycharm环境配置"&gt;Pycharm环境配置&lt;/h2&gt;
&lt;h3 id="一导入tensorflow模块测试"&gt;（一）导入TensorFlow模块测试&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;tensorflow&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nn"&gt;tf&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;hello&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tf&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;constant&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;sess&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tf&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Session&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;sess&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hello&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;结果如下：ModuleNotFoundError: No module named &amp;rsquo;tensorflow'&lt;/p&gt;
&lt;h3 id="二加入运行路径"&gt;（二）加入运行路径&lt;/h3&gt;
&lt;p&gt;&lt;img loading="lazy" src="https://www.xiaoxiangtao.cn/posts/tensorflow2/1582020554684026723.png"&gt;&lt;/p&gt;
&lt;p&gt;设置项目的编译器为python安装位置的python.exe，勾选导入所有的模块，显示如上图所示。再次运行出现同样的错误，查了一些资料应该是电脑的CPU太老了，我下载的tensorflow2.1.0版本不支持。&lt;/p&gt;
&lt;h3 id="三安装200版本并测试"&gt;（三）安装2.0.0版本并测试&lt;/h3&gt;
&lt;p&gt;运行代码： pip unintall tensorflow&lt;br&gt;
重新运行安装代码：pip install tensorflow==2.0.0 -i &lt;a href="//pypi.tuna.tsinghua.edu.cn/simple"&gt;//pypi.tuna.tsinghua.edu.cn/simple&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;再次测试成功！&lt;/p&gt;
&lt;p&gt;&lt;img loading="lazy" src="https://www.xiaoxiangtao.cn/posts/tensorflow2/1582032626532066694.png"&gt;&lt;/p&gt;
&lt;p&gt;由于笔记本没有英伟达显卡，配置较低，只安装了CPU版本，后续使用有较好配置的电脑尝试安装GPU版本。确实CPU版本速度比较慢。&lt;/p&gt;</description></item><item><title>机器学习入门基本概念理解</title><link>https://www.xiaoxiangtao.cn/zh/posts/basic-concept-understanding-of-machine-learning/</link><pubDate>Sat, 16 May 2020 00:00:00 +0000</pubDate><author>15989119660@163.com (Xiangtao XIAO)</author><guid isPermaLink="false">https://www.xiaoxiangtao.cn/zh/posts/basic-concept-understanding-of-machine-learning/</guid><description>&lt;h2 id="张量"&gt;张量&lt;/h2&gt;
&lt;p&gt;张量=容器&lt;/p&gt;
&lt;p&gt;张量是现代机器学习的基础。它的核心是一个数据容器，多数情况下，它包含数字，有时候它也包含字符串，但这种情况比较少。因此把它想象成一个数字的水桶。&lt;/p&gt;
&lt;p&gt;0维张量=数字；1维张量=向量；2维张量=矩阵；3维张量=公用数据存储在张量，彩色图片等&amp;hellip;&lt;/p&gt;
&lt;p&gt;&lt;img loading="lazy" src="https://www.xiaoxiangtao.cn/posts/basic-concept-understanding-of-machine-learning/1582001628415031481.jpg"&gt;&lt;/p&gt;
&lt;h2 id="one-hot-vector"&gt;one-hot vector&lt;/h2&gt;
&lt;p&gt;独热编码，用于分类标记。比如（猫，狗，鼠）对应（1,0,0）代表猫，（0,1,0）代表狗&amp;hellip;将离散型特征采用独热编码，会使得特征之间的距离计算更加合理。&lt;/p&gt;
&lt;h2 id="softmax函数"&gt;softmax函数&lt;/h2&gt;
&lt;p&gt;softmax函数的作用主要是：1.通过将模型的预测结果转化到指数函数上将预测结果转化为非负数；2.归一化处理，使各种结果概率之和等于1.&lt;/p&gt;
&lt;p&gt;&lt;img loading="lazy" src="https://www.xiaoxiangtao.cn/posts/basic-concept-understanding-of-machine-learning/1582001007247022548-1.png"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading="lazy" src="https://www.xiaoxiangtao.cn/posts/basic-concept-understanding-of-machine-learning/1582001209608023968-1024x764.png"&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href="//blog.csdn.net/lz_peter/article/details/84574716%5C%22"&gt;//blog.csdn.net/lz_peter/article/details/84574716&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="交叉熵"&gt;交叉熵&lt;/h2&gt;
&lt;p&gt;&lt;img loading="lazy" src="https://www.xiaoxiangtao.cn/posts/basic-concept-understanding-of-machine-learning/1582032638884051044.png"&gt;&lt;/p&gt;
&lt;p&gt;对于单标签多分类问题，p(x)表示是否为标记的类，如果用独热编码表示分类，则取值0或1；q(x)则是预测结果为该类的概率。用交叉熵做损失函数，值越小，表示模型预测结果与实际情况一致性越高。&lt;/p&gt;
&lt;p&gt;单标签多分类问题所有类别概率和为1，多标签二分类问题所有类别和不为1，交叉熵的计算针对的是单个类别（即二分类），然后单张样本计算多个二分类交叉熵的和。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href="//blog.csdn.net/tsyccnh/article/details/79163834"&gt;//blog.csdn.net/tsyccnh/article/details/79163834&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="欧式空间"&gt;欧式空间&lt;/h2&gt;
&lt;p&gt;欧几里得空间就是在对现实空间的规则抽象和推广（从n&amp;lt;=3推广到有限n维空间）。&lt;/p&gt;
&lt;p&gt;欧几里得几何就是中学学的平面几何、立体几何， &lt;strong&gt;在欧几里得几何中，平行线任何位置的间距相等&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;而中学学的几何空间一般是2维，3维（所以，我们讨论余弦值、点间的距离、内积都是在低纬空间总结的），如果将这些低维空间所总结的规律推广到有限的n维空间，那这些符合定义的空间则被统称为 &lt;strong&gt;欧几里得空间（欧式空间，Euclidean Space）&lt;/strong&gt;。而欧几里得空间主要是定义了 &lt;strong&gt;内积、距离、角&lt;/strong&gt;（没错，就是初中的那些定义），理解了这些再去理解数学定义就很明确了。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href="//www.zhihu.com/question/27903807/answer/699570097"&gt;//www.zhihu.com/question/27903807/answer/699570097&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="梯度弥散与梯度爆炸"&gt;梯度弥散与梯度爆炸&lt;/h2&gt;
&lt;p&gt;&lt;img loading="lazy" src="https://www.xiaoxiangtao.cn/posts/basic-concept-understanding-of-machine-learning/1081032-20170905101008960-1183527271.png"&gt;&lt;/p&gt;
&lt;p&gt;靠近输出层的hidden layer 梯度大，参数更新快，所以很快就会收敛；&lt;/p&gt;
&lt;p&gt;而靠近输入层的hidden layer 梯度小，参数更新慢，几乎就和初始状态一样，随机分布。&lt;/p&gt;
&lt;p&gt;在上面的四层隐藏层网络结构中，第一层比第四层慢了接近100倍！！&lt;/p&gt;
&lt;p&gt;这种现象就是梯度弥散（vanishing gradient problem）。而在另一种情况中，前面layer的梯度通过训练变大，而后面layer的梯度指数级增大，这种现象又叫做梯度爆炸(exploding gradient problem)。&lt;/p&gt;
&lt;p&gt;总的来说，就是在这个深度网络中，梯度相当不稳定(unstable)。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href="//www.cnblogs.com/yangmang/p/7477802.html"&gt;//www.cnblogs.com/yangmang/p/7477802.html&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="batch_size"&gt;batch_size&lt;/h2&gt;
&lt;p&gt;&lt;img loading="lazy" src="https://www.xiaoxiangtao.cn/posts/basic-concept-understanding-of-machine-learning/f5a6d3b5c4b5a91851f0f8b8735f162d_b.png"&gt;&lt;/p&gt;
&lt;p&gt;batch的选择首先决定的是下降的方向，batch_size越大，下降的方向越准确。&lt;/p&gt;
&lt;p&gt;综合考虑数据集的大小，数据集比较小的时候，用整个数据集作为batch_size就可以，这时候下降的方向也是最精准的，数据集比较大的时候，相对小的batch可以达到和用整个数据集相似的全局学习率，综合考量学习的效果以及电脑内存是否撑得住，目的是尽量让学习效果和效率同时最大化。&lt;/p&gt;
&lt;p&gt;在合理范围内，增大 Batch_Size 有何好处？&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;内存利用率提高了，大矩阵乘法的并行化效率提高。&lt;/li&gt;
&lt;li&gt;跑完一次 epoch（全数据集）所需的迭代次数减少，对于相同数据量的处理速度进一步加快。&lt;/li&gt;
&lt;li&gt;在一定范围内，一般来说 Batch_Size 越大，其确定的下降方向越准，引起训练震荡越小。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;batch_size增大到一定程度后，再增大则效率变差，下降方向也基本不再变化。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href="//blog.csdn.net/starzhou/article/details/53692248"&gt;//blog.csdn.net/starzhou/article/details/53692248&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="学习率"&gt;学习率&lt;/h2&gt;
&lt;p&gt;梯度下降的伪代码如下：&lt;/p&gt;
&lt;p&gt;重复已下过程，直到收敛为止{ωj=ωj-λF(ωj) /ωj}&lt;/p&gt;
&lt;p&gt;λ就是学习率，学习率过小，优化效率可能很低，学习率过大则有可能越过最优值，收敛到局部最优解。&lt;/p&gt;
&lt;p&gt;关于解决学习率的一些问题，如选择合适的学习率，动态调整学习率，归一化等参考：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href="//www.cnblogs.com/mazhujun/p/9633576.html"&gt;//www.cnblogs.com/mazhujun/p/9633576.html&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;如何通俗地解释欧氏空间？ - 知乎 &lt;a href="//www.zhihu.com/question/27903807/answer/699570097"&gt;//www.zhihu.com/question/27903807/answer/699570097&lt;/a&gt;&lt;/p&gt;</description></item><item><title>UEditor部署到个人站点</title><link>https://www.xiaoxiangtao.cn/zh/posts/ueditorbushudaogerenzhandian/</link><pubDate>Fri, 15 May 2020 00:00:00 +0000</pubDate><author>15989119660@163.com (Xiangtao XIAO)</author><guid isPermaLink="false">https://www.xiaoxiangtao.cn/zh/posts/ueditorbushudaogerenzhandian/</guid><description>&lt;h2 id="一下载ueditor"&gt;一、下载UEditor&lt;/h2&gt;
&lt;p&gt;&lt;a href="//ueditor.baidu.com/website/download.html"&gt;//ueditor.baidu.com/website/download.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;在以上链接下载，选择自己需要的语言版本，我用的是jsp，就下载jsp版本。将下载的压缩包解压，可以直接将解压的文件导入到Eclipse中自己的项目中，导入到文件夹WebContent中即可。&lt;/p&gt;
&lt;h2 id="二配置"&gt;二、配置&lt;/h2&gt;
&lt;p&gt;&lt;img loading="lazy" src="https://www.xiaoxiangtao.cn/posts/ueditorbushudaogerenzhandian/1563207389404033187.png"&gt;&lt;/p&gt;
&lt;p&gt;将jsp/lib中的jar包全部复制到WEB-INF/lib下&lt;/p&gt;
&lt;p&gt;修改输入字符数统计、上限，自定义工具栏可以参考官方说明文档，配置项可在ueditor.config.js中修改。&lt;/p&gt;
&lt;p&gt;修改图片上传路径等在官方说明文档中有详细的介绍。&lt;/p&gt;
&lt;p&gt;注：这里仅仅是在一个项目中使用UEditor，还用别的使用方法，也可以直接部署到tomcat中。&lt;/p&gt;
&lt;h2 id="三在页面中插入ueditor编辑器"&gt;三、在页面中插入Ueditor编辑器&lt;/h2&gt;
&lt;p&gt;首先要引用文件&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;link&lt;/span&gt; &lt;span class="na"&gt;rel&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;stylesheet&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;text/css&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;href&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&amp;lt;%= request.getContextPath() %&amp;gt;/thirdparts/utf8-jsp/themes/default/css/ueditor.change.css&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;script&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;text/javascript&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;charset&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;utf-8&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;src&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&amp;lt;%= request.getContextPath() %&amp;gt;/thirdparts/utf8-jsp/ueditor.config.js&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;script&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;script&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;text/javascript&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;charset&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;utf-8&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;src&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&amp;lt;%= request.getContextPath() %&amp;gt;/thirdparts/utf8-jsp/ueditor.all.min.js&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;script&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;script&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;text/javascript&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;charset&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;utf-8&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;src&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&amp;lt;%= request.getContextPath() %&amp;gt;/thirdparts/utf8-jsp/lang/zh-cn/zh-cn.js&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;script&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;接着在需要插入编辑器的位置插入以下代码&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;textarea&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;content&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;content&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;style&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;width:100%;height:500px&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;textarea&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;script&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;text/javascript&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;charset&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;utf-8&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;UE&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;getEditor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;content&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,{&lt;/span&gt;&lt;span class="nx"&gt;toolbars&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[[&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;fullscreen&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;source&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;|&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;undo&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;redo&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;|&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;bold&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;italic&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;underline&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;fontborder&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;strikethrough&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;superscript&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;subscript&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;removeformat&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;formatmatch&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;autotypeset&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;blockquote&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;pasteplain&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;|&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;forecolor&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;backcolor&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;insertorderedlist&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;insertunorderedlist&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;selectall&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;cleardoc&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]]});&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;script&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;toolbars控制工具栏显示哪些工具&lt;/p&gt;
&lt;p&gt;textarea是显示编辑器的容器，其id与UE.getEditor(&amp;lsquo;id&amp;rsquo;,{})要一致。&lt;/p&gt;
&lt;p&gt;不一定要是textarea，div等都可以，可以自己试一试，我没有深入研究，凑合着用了。&lt;/p&gt;</description></item><item><title>理解MVC模式</title><link>https://www.xiaoxiangtao.cn/zh/posts/lijiemvcmoshi/</link><pubDate>Fri, 15 May 2020 00:00:00 +0000</pubDate><author>15989119660@163.com (Xiangtao XIAO)</author><guid isPermaLink="false">https://www.xiaoxiangtao.cn/zh/posts/lijiemvcmoshi/</guid><description>&lt;p&gt;M：Model&lt;/p&gt;
&lt;p&gt;V：View&lt;/p&gt;
&lt;p&gt;C：Controller&lt;/p&gt;
&lt;p&gt;    在JSP开发中，JSP仅负责控制页面的显示内容，Javabean仅负责存储数据，在Javabean中，数据以设计好的格式存储着，这也是为什么他叫模型，JSP可以方便的从Javabean中取得数据进行显示，Servlet则负责从数据库中读取数据，向数据库存储数据，对数据进行逻辑处理，之后将数据存储在javabean中以供显示。&lt;/p&gt;
&lt;p&gt;    MVC与三层架构：界面、业务逻辑、数据库存取是不一样的。MVC要实现的目标是将软件用户界面和业务逻辑分离以使代码可扩展性、可复用性、可维护性、灵活性加强。&lt;/p&gt;
&lt;p&gt;    看到有另一种说法： &lt;a href="%5C%22//blog.csdn.net/zuiyingong6567/article/details/80150834%5C%22"&gt;//blog.csdn.net/zuiyingong6567/article/details/80150834&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;    同样是MVC，对于各层的理解有一些不同。尤其是对于数据库的连接，在PPT上看到的是C存取数据库，而网上一些资料显示是M存取数据库，而要求C尽量简单，仅仅负责在V与M间协调，大部分业务逻辑的处理，数据存取都放在Model中进行。&lt;/p&gt;</description></item></channel></rss>