<?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>Posts on Xiangtao's log</title><link>https://www.xiaoxiangtao.cn/zh/posts/</link><description>Recent content in Posts 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/posts/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>国内电商平台支付方式对比</title><link>https://www.xiaoxiangtao.cn/zh/posts/comparison-of-payment-methods-on-domestic-e-commerce-platforms/</link><pubDate>Thu, 29 Jan 2026 00:00:00 +0000</pubDate><author>15989119660@163.com (Xiangtao XIAO)</author><guid isPermaLink="false">https://www.xiaoxiangtao.cn/zh/posts/comparison-of-payment-methods-on-domestic-e-commerce-platforms/</guid><description>&lt;h1 id="一主流支付方式对比"&gt;一、主流支付方式对比&lt;/h1&gt;
&lt;h2 id="1-公对公现金支付"&gt;1. 公对公现金支付&lt;/h2&gt;
&lt;p&gt;方式：柜台或网银主动转账、通过银行分账系统支付并获取回单&lt;/p&gt;
&lt;p&gt;限额：可大额转账，5万以上走人行大额支付系统周末和假期不开可能受影响（工作日是前天晚上20:30一直跑到当天17:15）&lt;/p&gt;
&lt;p&gt;到账时效：一般能及时到账&lt;/p&gt;
&lt;p&gt;电商平台核验收款成功：财务手工核查银行账户、通过识别汇款备注里与订单关联的唯一代码自动核查、通过银行分账系统支付一般可实时确认&lt;/p&gt;
&lt;h2 id="2-网关支付"&gt;2. 网关支付&lt;/h2&gt;
&lt;p&gt;前往第三方支付公司或银行提供的统一收银台，跳转指定银行网银支付&lt;/p&gt;
&lt;p&gt;限额：取决于支付卡类型及安全等级&lt;/p&gt;
&lt;p&gt;支持银行：取决于统一收银台的服务提供方的合作银行数量&lt;/p&gt;
&lt;h2 id="3-聚合码扫码支付"&gt;3. 聚合码/扫码支付&lt;/h2&gt;
&lt;p&gt;分主扫（客户手机APP唤起摄像头扫描商家二维码）和被扫（客户出示支付码给商家），电商网页用主扫的方案。&lt;/p&gt;
&lt;p&gt;由聚合支付服务提供商提供的聚合码一般支持多个支付方式（比如微信、支付宝等），接入聚合码对商户更加方便。&lt;/p&gt;
&lt;p&gt;由支付公司提供的单一渠道比如微信收款码、支付宝收款码只能支持指定APP扫码支付，好处是服务更稳定，体验更好。&lt;/p&gt;
&lt;h2 id="4-第三方app支付"&gt;4. 第三方APP支付&lt;/h2&gt;
&lt;p&gt;唤起第三方APP付款，国内头部的三家是微信、支付宝、云闪付，其中微信在线下场景覆盖广，支付宝依托淘宝生态、碰一碰支付创新持续和微信抢占市场，云闪付作为国家队，目前依托消费补贴、一站式银行卡管理功能也有一定流量且铺的比较广。其他的比如京东支付、连连支付等，体量和前三有一定差距，在特定场景有自身优势。&lt;/p&gt;
&lt;p&gt;支持银行：基本齐全，且都支持余额、信用支付等方式。微信目前侧重个人支付，不支持绑定公账，支付宝可以创建企业账户绑定公账支付。&lt;/p&gt;
&lt;h2 id="5-移动快捷支付"&gt;5. 移动快捷支付&lt;/h2&gt;
&lt;p&gt;打开支付渠道H5页面绑定银行卡付款，目前用的较少，主流支付公司都有该形式，但H5页面安全风险相较APP支付更高，且用户体验较差（需重复登录）。&lt;/p&gt;
&lt;h2 id="6-银行卡快捷支付"&gt;6. 银行卡快捷支付&lt;/h2&gt;
&lt;p&gt;通过和支付公司合作，平台对接支付公司，用户在平台绑卡后选卡支付。&lt;/p&gt;
&lt;p&gt;部分渠道可以免密支付，平台需承担部分风控责任，但用户体验好，支付速度快。&lt;/p&gt;
&lt;p&gt;支持银行：取决于服务提供方的合作银行数量。&lt;/p&gt;
&lt;h2 id="7-账户余额支付"&gt;7. 账户余额支付&lt;/h2&gt;
&lt;p&gt;购买支付牌照或通过和第三方支付公司合作提供钱包功能，支持用户充值余额支付。&lt;/p&gt;
&lt;p&gt;平台需要针对充值、支付、提现做一定风控措施。该方式对用户体验好，且有助于提高用户粘性。&lt;/p&gt;
&lt;h2 id="8-金融白条支付"&gt;8. 金融白条支付&lt;/h2&gt;
&lt;p&gt;比较知名的有花呗、京东白条、美团月付等，通过金融机构授信一定额度给用户支付，C端大部分有一个月的平台贴息。该方式可以大幅提升用户粘性，特别是一些B端客户对现金流比较重视，提供账期可以建立紧密合作关系，但这对信用评估和风控有较高要求。&lt;/p&gt;
&lt;h2 id="9-月结"&gt;9. 月结&lt;/h2&gt;
&lt;p&gt;由商家针对指定客户允许其赊账或签订月结的协议，商家自行记账并要求客户定期还款，平台如果有自营业务，也会考虑设计相关功能。该方式交易不受第三方担保，可以不经过电商平台，通常是商家与合作紧密熟悉的客户采用该方式。&lt;/p&gt;
&lt;h2 id="10-数字人民币"&gt;10. 数字人民币&lt;/h2&gt;
&lt;p&gt;等同于现金支付，目前支付APP和扫码支付，使用量较低。&lt;/p&gt;
&lt;h2 id="11-代付"&gt;11. 代付&lt;/h2&gt;
&lt;p&gt;生成订单并将代付收银台分享给其他用户进行支付。代付收银台页面提供的支付方式需要考虑代付用户的身份，设备环境等因素。&lt;/p&gt;
&lt;h2 id="12-先用后付"&gt;12. 先用后付&lt;/h2&gt;
&lt;p&gt;授信门槛低，通常额度小，不计入央行征信，由平台担保并向商家收取交易服务费，C端通常用户要开通了绑定银行卡代扣支付方式，个人认为该方式可以降低用户的下单决策成本，同时不像花呗等信用支付方式那么重。&lt;/p&gt;</description></item><item><title>初步体验：用扣子生成一个雅思口语练习网页</title><link>https://www.xiaoxiangtao.cn/zh/posts/preliminary-experience-generate-an-ielts-speaking-practice-webpage-using-buttons/</link><pubDate>Wed, 28 Jan 2026 00:00:00 +0000</pubDate><author>15989119660@163.com (Xiangtao XIAO)</author><guid isPermaLink="false">https://www.xiaoxiangtao.cn/zh/posts/preliminary-experience-generate-an-ielts-speaking-practice-webpage-using-buttons/</guid><description>&lt;p&gt;3.15更新：&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.xiaoxiangtao.cn/zh/"&gt;//3pvtkwzwrm.coze.site&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;coze生产环境的参数是部署时系统自动赋值的，不需要自己填API key之类的参数。重新做了一个在生产环境就跑通了，具体方法是让AI基于前一个应用生成一个详细的提示词包含功能点、技术架构等内容，感觉提示词专业的话对于编码还是有帮助的，但是依然会出现细节上的bug，需要进行两三次修复。功能出了问题好排查，配置或者网络等细节出了问题不是程序员的话真的不太好排查，也许是我对一些技术细节还不够了解。&lt;/p&gt;
&lt;p&gt;&lt;img loading="lazy" src="https://www.xiaoxiangtao.cn/posts/preliminary-experience-generate-an-ielts-speaking-practice-webpage-using-buttons/2026031512591560-designaxt-1024x876.png"&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;最近正好考虑雅思，新东方的雅思小程序推出了一个AI练真题的功能，参考这个试了下能否用扣子直接生成一个类似的功能。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;功能介绍：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;根据选择的题型随机生成题目，点击开始录音可以根据题型限制录音时长。录音结束后进行语音识别，并通过AI对识别结果进行分析，给出评分、改进建议和AI扩写的答案。&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/preliminary-experience-generate-an-ielts-speaking-practice-webpage-using-buttons/2026012814413133-designaxt-1024x680.png"&gt;&lt;/p&gt;
&lt;p&gt;这里题目下方的灰色提示是AI自动补全的功能，prompt并未做要求，同时录音时间的文字提示也是AI补全的，页面也是响应式，交互总体比较友好。我也没有对UI风格做要求，感觉AI味比较浓（非贬义），第一遍生成的字体较小做了一次调整。&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/preliminary-experience-generate-an-ielts-speaking-practice-webpage-using-buttons/202601281501356-designaxt-1024x827.png"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading="lazy" src="https://www.xiaoxiangtao.cn/posts/preliminary-experience-generate-an-ielts-speaking-practice-webpage-using-buttons/2026012815015559-designaxt-895x1024.png"&gt;&lt;/p&gt;
&lt;p&gt;在扣子上直接部署后可能是api的原因，生成环境语音识别功能没有跑通，但是在测试环境实现了完整的功能。&lt;/p&gt;
&lt;p&gt;整个过程大概用了两个小时，修复bug的过程比较顺畅，会进行自测基本功能问题提了都可以修复。但是涉及到接口调用，环境部署等导致的问题时，修复bug的技术要求就直线上升了，需要你能够发现比较具体的问题并准确描述，否则的话只是基于前端的报错，AI可能无法定位到准确问题，对无开发背景的人来说还是有难度。&lt;/p&gt;
&lt;p&gt;&lt;img loading="lazy" src="https://www.xiaoxiangtao.cn/posts/preliminary-experience-generate-an-ielts-speaking-practice-webpage-using-buttons/2026012815044317-designaxt-1024x183.png"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading="lazy" src="https://www.xiaoxiangtao.cn/posts/preliminary-experience-generate-an-ielts-speaking-practice-webpage-using-buttons/2026012815041617-designaxt-1024x991.png"&gt;&lt;/p&gt;</description></item><item><title>反电信诈骗洗钱与风控</title><link>https://www.xiaoxiangtao.cn/zh/posts/anti-telecom-fraud-money-laundering-and-risk-control/</link><pubDate>Sun, 22 Oct 2023 00:00:00 +0000</pubDate><author>15989119660@163.com (Xiangtao XIAO)</author><guid isPermaLink="false">https://www.xiaoxiangtao.cn/zh/posts/anti-telecom-fraud-money-laundering-and-risk-control/</guid><description>&lt;p&gt;最近接触到了一些关于反诈骗洗钱的工作，对电信诈骗洗钱等有了比较直观的认知。电商平台很容易被犯罪份子利用，作为产品经理，设计产品时一定要有风险意识，否则产品上出现犯罪情况，轻则有自责感、负罪感，重则接受行政处罚，双罚制实施后上至平台下至负责人均会受罚，打击犯罪，人人有责。&lt;/p&gt;
&lt;h3 id="相关资料"&gt;相关资料&lt;/h3&gt;
&lt;p&gt;充值提现平台，缘何沦为诈骗犯“洗钱工具”？ &lt;a href="//zhuanlan.zhihu.com/p/151289531"&gt;//zhuanlan.zhihu.com/p/151289531&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;中华人民共和国反电信网络诈骗法（全文） &lt;a href="//zhuanlan.zhihu.com/p/560714960"&gt;//zhuanlan.zhihu.com/p/560714960&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="风控系统设计"&gt;风控系统设计&lt;/h3&gt;
&lt;p&gt;对于电商平台的账户系统，一般会有开户、储值、交易、提现几个主要功能。在设计之初，每个功能都需要针对业务场景做限制，功能上线后，需要考虑可能被利用或存在风险的场景，对用户数据做监控，及时识别异常用户行为，做对应的限制、告警、以及拦截。&lt;/p&gt;
&lt;p&gt;开户环节，要充分落实KYC，非目标用户无需开放开户入口，如果账户权限有多种类别，则对用户也要严格分类对应，满足指定条件用户可开对应账户。不要为了后期功能改造的灵活性，或者为了业务的快速扩张，而放松限制，设计时务必要在业务和安全方面做好衡量，追求业务指标而忽视安全可能导致严重后果。&lt;/p&gt;
&lt;p&gt;储值环节，要考虑支持哪些支付渠道储值，一般来说信用卡支付要禁止，公私账支付也要根据平台虚拟账户性质做对应处理。另外，用户是否有储值的需要？一般需要储值多少额度？用户一般在什么时间操作储值？这些特征都需要研究并做对应风控，比如限制储值额度，禁止部分用户储值，禁止部分业务使用余额支付，异常时间储值告警等。&lt;/p&gt;
&lt;p&gt;交易的监控是电商平台的核心工作之一，一般来说平台对用户和商家入驻已经做了限制和审核，平台仅需要核对买卖双方的交易真实性即可。从分账系统的角度看，交易的概念更为广泛，从A账户到B账户的转账，即是一笔交易，在用户购买商品行为之外，其他业务场景也可能出现交易。这里我们需要检查交易的合理性，不仅针对正常的用户购买行为，还需检查用户账户之间和商家账户之间可能的转账行为。对于特殊业务场景导致的和购买行为不对应的交易，应该做严格限制，最低程度的满足业务场景需求即可，超出此场景的交易一律禁止。对于用户购买产生的交易，则要检查其购买频次、金额，以避免用户和商家串通，伪造交易利用平台洗钱，必要时需要校验付款用户身份以防范盗号、卖号等情况。&lt;/p&gt;
&lt;p&gt;原路退款一般没有风险，提现是用户账户出金的唯二路径（不含平台转账扣费等），不管前面出现了哪些问题，最后一道防火墙如果拦住了，就可以避免资金损失。提现本身需要做安全校验，另外提现还需要严格限制资金去向。对于提现金额、笔数、到账时效都需要做风控，如果是提现次数不多的B端平台，交给人工审核也是个好主意。&lt;/p&gt;
&lt;p&gt;总的来说，风控既要防竞对，又要防内鬼，还要防未知的犯罪份子，设计产品时不能只想到一方，不同坏人做坏事，手段会有所区别，做产品的，对于本身存在较大风险的业务，能不做尽量别做，一定要做的话，还是想想清楚什么方案风险最小。&lt;/p&gt;</description></item><item><title>和美术馆（HEM）</title><link>https://www.xiaoxiangtao.cn/zh/posts/and-the-art-museum-hem/</link><pubDate>Sun, 04 Jun 2023 00:00:00 +0000</pubDate><author>15989119660@163.com (Xiangtao XIAO)</author><guid isPermaLink="false">https://www.xiaoxiangtao.cn/zh/posts/and-the-art-museum-hem/</guid><description>&lt;p&gt;&lt;img loading="lazy" src="https://www.xiaoxiangtao.cn/posts/and-the-art-museum-hem/2023060413581778-designaxt-1024x683.jpg"&gt;&lt;/p&gt;
&lt;p&gt;和美术馆由普利兹克获奖建筑师安藤忠雄担任建筑设计。建筑理念融入“天圆地方”的中原正朔文化元素，主体由圆弧形与方形的几何结构组成。正中心的圆形逐渐变换重心、比例、高度，交错重叠，从内到外、从建筑到城市，慢慢扩展延伸。和美术馆的“和”既是“协和”，也是“混和”，象征空间融合境界的理念。&lt;/p&gt;
&lt;p&gt;馆藏有部分国画精品，包括张大千、吴冠中、黄宾虹等画家作品。&lt;/p&gt;
&lt;p&gt;此外不定期有国内外艺术家作品展。这次去的时候有极简艺术家夏纳•霍维兹作品展：交织的韵律。作品特点大致是在方格纸上按数学规律重复基础图案、线条、色彩，形成有韵律感的画作。没有看到大型作品，有启发但不是很感兴趣。&lt;/p&gt;
&lt;p&gt;&lt;img loading="lazy" src="https://www.xiaoxiangtao.cn/posts/and-the-art-museum-hem/2023060414562710-designaxt-909x1024.png"&gt;&lt;/p&gt;
&lt;p&gt;在4楼可以参观艺术品修复工作，有点像三星堆博物馆的参观形式。但是隔着透明玻璃一直看着里边工作人员其实感觉有些尴尬。&lt;/p&gt;
&lt;p&gt;&lt;img loading="lazy" src="https://www.xiaoxiangtao.cn/posts/and-the-art-museum-hem/2023060413543989-designaxt-1024x683.jpg"&gt;&lt;/p&gt;</description></item><item><title>初识跨境支付</title><link>https://www.xiaoxiangtao.cn/zh/posts/introduction-to-cross-border-payment/</link><pubDate>Fri, 05 May 2023 00:00:00 +0000</pubDate><author>15989119660@163.com (Xiangtao XIAO)</author><guid isPermaLink="false">https://www.xiaoxiangtao.cn/zh/posts/introduction-to-cross-border-payment/</guid><description>&lt;p&gt;从《跨境电子商务支付与结算》一书出发，了解跨境支付领域。&lt;/p&gt;
&lt;h2 id="跨境支付的几个基本概念"&gt;跨境支付的几个基本概念&lt;/h2&gt;
&lt;h3 id="汇外汇"&gt;汇（外汇）&lt;/h3&gt;
&lt;p&gt;外汇，英文名是Foreign currency，是货币行政当局（ &lt;a href="//baike.baidu.com/item/E4%5CxB8%5CxAD%5CxE5%5CxA4%5CxAE%5CxE9%5Cx93%5CxB6%5CxE8%5CxA1%5Cx8C/1441284?fromModule=lemma_inlink"&gt;中央银行&lt;/a&gt;、货币管理机构、 &lt;a href="//baike.baidu.com/item/E5%5CxA4%5Cx96%5CxE6%5CxB1%5Cx87%5CxE5%5CxB9%5CxB3%5CxE5%5Cx87%5Cx86%5CxE5%5Cx9F%5CxBA%5CxE9%5Cx87%5Cx91/1999077?fromModule=lemma_inlink"&gt;外汇平准基金&lt;/a&gt; 及财政部）以 &lt;a href="//baike.baidu.com/item/E9%5Cx93%5CxB6%5CxE8%5CxA1%5Cx8C%5CxE5%5CxAD%5Cx98%5CxE6%5CxAC%5CxBE/10010786?fromModule=lemma_inlink"&gt;银行存款&lt;/a&gt;、财政部库券、长短期政府证券等形式保有的在 &lt;a href="//baike.baidu.com/item/E5%5Cx9B%5CxBD%5CxE9%5Cx99%5Cx85%5CxE6%5Cx94%5CxB6%5CxE6%5Cx94%5CxAF%5CxE9%5Cx80%5Cx86%5CxE5%5CxB7%5CxAE/9873053?fromModule=lemma_inlink"&gt;国际收支逆差&lt;/a&gt; 时可以使用的债权。包括外国货币、外币存款、外币有价证券（政府公债、国库券、公司债券、股票等）、 &lt;a href="//baike.baidu.com/item/E5%5CxA4%5Cx96%5CxE5%5CxB8%5Cx81%5CxE6%5Cx94%5CxAF%5CxE4%5CxBB%5Cx98%5CxE5%5Cx87%5CxAD%5CxE8%5CxAF%5Cx81/202040?fromModule=lemma_inlink"&gt;外币支付凭证&lt;/a&gt;（票据、银行存款凭证、邮政储蓄凭证等）。&lt;/p&gt;
&lt;h4 id="广义"&gt;广义&lt;/h4&gt;
&lt;p&gt;一国拥有的一切以外币表示的资产。是指货币在各国间的流动以及把一个国家的 &lt;a href="//baike.baidu.com/item/E8%5CxB4%5CxA7%5CxE5%5CxB8%5Cx81%5CxE5%5Cx85%5Cx91%5CxE6%5Cx8D%5CxA2?fromModule=lemma_inlink"&gt;货币兑换&lt;/a&gt; 成另一个国家的货币，借以清偿国际间债权、债务关系的一种专门性的经营活动。实际上就是货币行政当局（ &lt;a href="//baike.baidu.com/item/E4%5CxB8%5CxAD%5CxE5%5CxA4%5CxAE%5CxE9%5Cx93%5CxB6%5CxE8%5CxA1%5Cx8C?fromModule=lemma_inlink"&gt;中央银行&lt;/a&gt;、货币管理机构、外汇平准基金及财政部）以银行存款、 &lt;a href="//baike.baidu.com/item/E8%5CxB4%5CxA2%5CxE6%5Cx94%5CxBF%5CxE9%5Cx83%5CxA8?fromModule=lemma_inlink"&gt;财政部&lt;/a&gt; 库券、长短期政府债券等形式所保有的在 &lt;a href="//baike.baidu.com/item/E5%5Cx9B%5CxBD%5CxE9%5Cx99%5Cx85%5CxE6%5Cx94%5CxB6%5CxE6%5Cx94%5CxAF%5CxE9%5Cx80%5Cx86%5CxE5%5CxB7%5CxAE?fromModule=lemma_inlink"&gt;国际收支逆差&lt;/a&gt; 时可以使用的债权。&lt;/p&gt;
&lt;h4 id="狭义"&gt;狭义&lt;/h4&gt;
&lt;p&gt;以外国货币表示的，为各国普遍接受的，可用于国际间债权债务结算的各种支付手段。必须具备三个特点：可支付性（必须以外国货币表示的资产）、可获得性（必须是在国外能够得到补偿的债权）和可换性（必须是可以自由兑换为其他支付手段的外币资产）。&lt;/p&gt;
&lt;h3 id="浮动汇率制度"&gt;浮动汇率制度&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;法郎的汇率水平，并非由投机者或贸易平衡，甚至不是 &lt;a href="https://www.xiaoxiangtao.cn/zh/search/?q=%5cxE9%5cxB2%5cx81%5cxE5%5cxB0%5cx94%5cxE5%5cx8C%5cxBA&amp;amp;search_source=Entity&amp;amp;hybrid_search_source=Entity&amp;amp;hybrid_search_extra=%5cx7B%5cx22sourceType%5cx22%5cx3A%5cx22answer%5cx22%5cx2C%5cx22sourceId%5cx22%5cx3A%5cx2222965187%5cx22%5cx7D"&gt;鲁尔区&lt;/a&gt; 的冒险行为所决定的，而是法国的纳税人愿意拿出多少自己的收入，去支付给法国的食利者们。——凯恩斯&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;汇率的一个基本来源是维持购买力平价，比如在我国买一个鸡蛋1元，在美国买一个鸡蛋0.2美元，则1rmb就应该对0.2usd。如果没有汇率而是1:1兑换，那么1元人民在国内可以买一个蛋，换成美元在美国可以买几个蛋，国内的人就会把人民币换成美元买美国的蛋，导致人民币流向美国，美国的蛋流向中国。这样一来市场就对国内的蛋商失去信心，国内商品价格没有竞争力，资金都往国外跑，而美国的蛋则变得供小于求，物价飞升，美国百姓买不起蛋，中国用钞票轻松换走了美国的蛋，这么一看中美都不乐意了，为了维持国内市场的稳定和国际贸易的公平，需要有汇率来换算双方货币。&lt;/p&gt;
&lt;p&gt;当然现实是反过来的，过去我们可以用黄金来作为衡量的基准，后来美国称霸世界美元取代了黄金，国际结算都用美元，美国可以印钞票从全世界买蛋。1973年，以美元为中心的固定汇率制完全解体，各国（或地区）纷纷实行浮动汇率制。实际情况下汇率还会受到贸易保护、金融市场、政治等因素的影响，为了摆脱美元霸权，我们开始推行人民币结算，另外我们也制定了更为稳定可靠的汇率制度。&lt;/p&gt;
&lt;p&gt;我国实施以市场供求为基础、 &lt;a href="https://www.xiaoxiangtao.cn/zh/search/?q=%5cxE5%5cx8F%5cx82%5cxE8%5cx80%5cx83%5cxE4%5cxB8%5cx80%5cxE7%5cxAF%5cxAE%5cxE5%5cxAD%5cx90%5cxE8%5cxB4%5cxA7%5cxE5%5cxB8%5cx81&amp;amp;search_source=Entity&amp;amp;hybrid_search_source=Entity&amp;amp;hybrid_search_extra=%5cx7B%5cx22sourceType%5cx22%5cx3A%5cx22answer%5cx22%5cx2C%5cx22sourceId%5cx22%5cx3A%5cx2268768295%5cx22%5cx7D"&gt;参考一篮子货币&lt;/a&gt;， &lt;a href="https://www.xiaoxiangtao.cn/zh/search/?q=%5cxE6%5cx9C%5cx89%5cxE7%5cxAE%5cxA1%5cxE7%5cx90%5cx86%5cxE7%5cx9A%5cx84%5cxE6%5cxB5%5cxAE%5cxE5%5cx8A%5cxA8%5cxE6%5cxB1%5cx87%5cxE7%5cx8E%5cx87%5cxE5%5cx88%5cxB6%5cxE5%5cxBA%5cxA6&amp;amp;search_source=Entity&amp;amp;hybrid_search_source=Entity&amp;amp;hybrid_search_extra=%5cx7B%5cx22sourceType%5cx22%5cx3A%5cx22answer%5cx22%5cx2C%5cx22sourceId%5cx22%5cx3A%5cx2268768295%5cx22%5cx7D"&gt;有管理的浮动汇率制度&lt;/a&gt;。中国人民银行根据前一日 &lt;a href="https://www.xiaoxiangtao.cn/zh/search/?q=%5cxE9%5cx93%5cxB6%5cxE8%5cxA1%5cx8C%5cxE9%5cx97%5cxB4%5cxE5%5cxA4%5cx96%5cxE6%5cxB1%5cx87%5cxE5%5cxB8%5cx82%5cxE5%5cx9C%5cxBA&amp;amp;search_source=Entity&amp;amp;hybrid_search_source=Entity&amp;amp;hybrid_search_extra=%5cx7B%5cx22sourceType%5cx22%5cx3A%5cx22answer%5cx22%5cx2C%5cx22sourceId%5cx22%5cx3A%5cx22107412890%5cx22%5cx7D"&gt;银行间外汇市场&lt;/a&gt; 形成的价格，公布人民币对美元等主要货币的汇率，各银行以此为依据，在中国人民银行规定的浮动幅度内自行挂牌。人行本身是银行间外汇市场的重要参与者，可以根据货币政策买卖外汇，调整汇率。&lt;/p&gt;
&lt;h3 id="传统跨境支付方式"&gt;传统跨境支付方式&lt;/h3&gt;
&lt;h4 id="汇付remittance即汇款"&gt;汇付（Remittance，即汇款）&lt;/h4&gt;
&lt;p&gt;汇付属于商业信用，银行只是接受委托提供服务，是否支付取决于买方遵守合同约定。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;信汇：汇出行寄信汇委托书给汇入行，解付金额给收款方&lt;/li&gt;
&lt;li&gt;电汇：汇出行拍发加压电报、电传给汇入行，解付金额&lt;/li&gt;
&lt;li&gt;票汇：付款方使用汇票、本票、支票等工具主动支付给收款方&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 id="托收"&gt;托收&lt;/h4&gt;
&lt;p&gt;托收属于逆汇，即单据流向与资金流相反，卖房（出口方）开具以进口方为汇款人的汇票，委托出口方银行通过其在进口方的分行或代理行向进口方收款的一种结算方式。&lt;/p&gt;
&lt;p&gt;托收同样属于商业信用，银行完全根据卖房指示收款，是否付款取决于买房的信用。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;光票托收：一般是小额、预付款、分期或者收取贸易从属费用等，金融单据不跟随商业票据&lt;/li&gt;
&lt;li&gt;跟单托收：金融票据跟随商业票据&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 id="信用证letter-of-creditlc"&gt;信用证（Letter of Credit，L/C）&lt;/h4&gt;
&lt;p&gt;信用证属于银行信用。信用证不依赖于买卖商业合同（自足文件，self-sufficient instrument)，不和货物关联（纯单据业务），开证银行有首要付款责任。&lt;/p&gt;
&lt;p&gt;&lt;img loading="lazy" src="https://www.xiaoxiangtao.cn/posts/introduction-to-cross-border-payment/2023100402013367-designaxt-1024x739.png"&gt;&lt;/p&gt;
&lt;h3 id="新型跨境支付方式"&gt;新型跨境支付方式&lt;/h3&gt;
&lt;p&gt;传统的跨境支付贸易主要为B2B大额贸易，支付手段多依靠银行完成。伴随着互联网的发展与普及，B2B、C2C跨境电子商务以及小额B2B贸易市场不断发展，涌现了许多新型跨境支付方式，就国内来说，这些支付方式多为持有支付业务许可证（央行颁发）和外汇管理局准许开展跨境电子商务外汇支付业务试点的批复文件的第三方支付机构所开发。&lt;/p&gt;
&lt;p&gt;以下列举了主流的新型跨境支付方式：&lt;/p&gt;
&lt;p&gt;国内：支付宝、微信支付、连连支付、pingPong&lt;/p&gt;
&lt;p&gt;国外：Paypal、Western Union、WebMoney（在俄语系国家、日本、欧美使用较多）&lt;/p&gt;
&lt;p&gt;以上支付机构的主要收入来源为支付手续费和支付解决方案。另外还有汇率差等非常规性收入。&lt;/p&gt;
&lt;p&gt;相较传统的跨境支付方式，新型跨境支付具有：手续费低、付款简单、到账时间快、能应对平台高并发交易场景等优势。&lt;/p&gt;
&lt;h5 id="第三方机构的支付实现"&gt;第三方机构的支付实现&lt;/h5&gt;
&lt;p&gt;跨境电子商务平台一般会接入多个支付通道并进行路由，和境内支付类似。&lt;/p&gt;
&lt;h3 id="税务"&gt;税务&lt;/h3&gt;
&lt;h3 id="金融及风险应对"&gt;金融及风险应对&lt;/h3&gt;
&lt;h3 id="有关技术"&gt;有关技术&lt;/h3&gt;</description></item><item><title>关于提现功能的一点思考</title><link>https://www.xiaoxiangtao.cn/zh/posts/thoughts-on-withdrawal-function/</link><pubDate>Tue, 28 Dec 2021 00:00:00 +0000</pubDate><author>15989119660@163.com (Xiangtao XIAO)</author><guid isPermaLink="false">https://www.xiaoxiangtao.cn/zh/posts/thoughts-on-withdrawal-function/</guid><description>&lt;p&gt;众所周知，微信零钱的提现会收取千分之一的手续费，有人在使用中专门注意过这个手续费是怎么收的吗？说来惭愧，作为产品经理的我并没有好好研究过这个功能，直到这次碰到要做平台用户账户的提现功能，研究后才发现习以为常的微信零钱提现，也是有些小设计在的。&lt;/p&gt;
&lt;p&gt;Q：假设你要提现1万元，现在钱包里有两万，微信会怎么扣款呢？&lt;/p&gt;
&lt;p&gt;A：你的银行卡会到账1万元，但是钱包会有两条流水：1万元提现，以及10元的服务费，钱包里还剩下9990元。&lt;/p&gt;
&lt;p&gt;Q：假设你还是要提现1万元，现在钱包里正好有1万元，微信又是怎么处理的呢？&lt;/p&gt;
&lt;p&gt;A：此时自不能再扣除10010元了，钱包里只有1万，那从1万里扣10元手续费，银行卡到账9990元不就好了，真是如此吗？实际上，此时微信计算的手续费为9.99元，银行卡到账9990.01元。&lt;/p&gt;
&lt;p&gt;为什么是9.99？因为你会发现，第一种情况手续费比例可以算作 10/（10000+10），在第二种情况下，手续费比例则算做了 10/10000，当用户想把钱包里的钱全部提走，手续费变相的变高了，这是不合理的，遇到深究的用户，可能有法律风险。可是要避开第二种手续费情况，如何处理比较合适呢？此时用户输入的提现金额就是钱包余额，要扣除手续费，到账金额已经不可能与用户输入的提现金额相等了。&lt;/p&gt;
&lt;p&gt;微信的方案是计算出了一个区分情况1和情况2的提现金额，即 情况1下 到账金额加上手续费正好等于钱包余额对应的提现金额。输入的提现金额再大，就会变成情况2，这时系统自动把提现金额改为临界值，不管输入多大的提现金额，实际提现始终是 到账 + 手续费 = 全部余额 的情况。比如上述例子里，9990.01就是这个分界线，9990.01～10000元输入此间任意提现金额，到账金额都是9990.01，手续费都是9.99元。&lt;/p&gt;</description></item><item><title>印象｜长坪沟</title><link>https://www.xiaoxiangtao.cn/zh/posts/impression-of-changping-ditch/</link><pubDate>Sun, 17 Oct 2021 00:00:00 +0000</pubDate><author>15989119660@163.com (Xiangtao XIAO)</author><guid isPermaLink="false">https://www.xiaoxiangtao.cn/zh/posts/impression-of-changping-ditch/</guid><description>&lt;p&gt;&lt;img alt="蓝天下的雪峰与山脚森林" loading="lazy" src="https://www.xiaoxiangtao.cn/posts/impression-of-changping-ditch/2021101708192256-designaxt.webp"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="云层下的山谷草地与疏林" loading="lazy" src="https://www.xiaoxiangtao.cn/posts/impression-of-changping-ditch/2021101708194882-designaxt.webp"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="山谷中的秋色树林与远处山峰" loading="lazy" src="https://www.xiaoxiangtao.cn/posts/impression-of-changping-ditch/2021101708205490-designaxt.webp"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="山峰下流经树林的溪水" loading="lazy" src="https://www.xiaoxiangtao.cn/posts/impression-of-changping-ditch/2021101708215864-designaxt.webp"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="蓝天下的山脊与雪峰" loading="lazy" src="https://www.xiaoxiangtao.cn/posts/impression-of-changping-ditch/2021101708225716-designaxt.webp"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="阳光穿过森林照亮林间小径" loading="lazy" src="https://www.xiaoxiangtao.cn/posts/impression-of-changping-ditch/2021101708232741-designaxt.webp"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="清澈水流下的沙石纹理" loading="lazy" src="https://www.xiaoxiangtao.cn/posts/impression-of-changping-ditch/2021101708245257-designaxt.webp"&gt;&lt;/p&gt;
&lt;p&gt;国庆期间想要避开人潮，就只有走的够高够远了吧。像天堂一般的地方，希望下次来可以露营。&lt;/p&gt;</description></item><item><title>新人产品经理入职总结</title><link>https://www.xiaoxiangtao.cn/zh/posts/new-product-manager-induction-summary/</link><pubDate>Fri, 30 Jul 2021 00:00:00 +0000</pubDate><author>15989119660@163.com (Xiangtao XIAO)</author><guid isPermaLink="false">https://www.xiaoxiangtao.cn/zh/posts/new-product-manager-induction-summary/</guid><description>&lt;p&gt;总结一下新入职要做哪些准备，踩过的坑加深印象。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1.软件安装&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;了解公司常用的软件，如果有现成安装好的更好，把必备软件安装好并准备好账号。如果是陌生的软件，有空的话最好学一下使用方式，找同事问。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2.工作模式了解&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;了解公司的组织架构，一般的工作流程，产品开发是使用内部系统，还是使用文档，或者使用第三方软件等，公司部门如何协作。&lt;/p&gt;
&lt;p&gt;对公司技术部门的情况有一个大概的了解，条件允许的话了解下大概技术水平，主要技术路线等。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3.认识同事&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;同事不用急于熟络，也不可能一下子记住所有人，这个环节更重要的是让对方认识你。但是要记住接下来和你合作会比较密切的同事，留下好印象。&lt;/p&gt;
&lt;p&gt;感受一下部门氛围与工作节奏，了解自己上级的工作风格。&lt;/p&gt;
&lt;p&gt;有机会请同事或上级吃个饭，进一步请教了解公司的情况以及对自己的要求。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;4.熟悉业务*&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;几个需要背下来的：公司的基本业务板块、公司价值观、公司内部常用术语、公司主要业绩指标数值、公司主要竞争对手、市场行情与政府政策。一般公司会有一份介绍文档或PPT，一些额外信息需要向相关同事请教。&lt;/p&gt;
&lt;p&gt;需要熟悉的产品：对于自己所在部门的产品，主要流程都走一遍，用一用，最好能用思维导图做个归纳思路会清晰很多。主要竞品也要用一用，了解异同。&lt;/p&gt;
&lt;p&gt;对于自己负责接手的产品，要整个用一便，每个功能，每个状态都要试用，并画出对应的流程图，对于不清晰的地方找对接同事确认清楚。对于自己感到疑惑或者功能比较复杂的，如果公司需求文档有保留，看一下以前的需求文档，顺便了解一下公司对需求文档的要求，以及写作规范。&lt;/p&gt;
&lt;p&gt;对于自己负责产品涉及到的业务，最好能够亲自体验，至少基本了解业务的情况：现有缺陷，发展目标，核心竞争力/价值，商业模式等。&lt;/p&gt;
&lt;p&gt;要具备对数据的敏感性，拿到相关埋点数据与统计数据做分析，做到心中有数。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;5.需求文档撰写基本要求&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;工作很忙，不要重复造轮子，如果已有成熟的相关产品，或者网络上有相关介绍文档，务必了解，也能应对其他人后续对产品的挑战。&lt;/p&gt;
&lt;p&gt;写清楚需求的背景——开发更容易理解，也证明自己不是乱提需求。&lt;/p&gt;
&lt;p&gt;写清楚功能的入口——开发可能也是新接手，未必了解清楚。&lt;/p&gt;
&lt;p&gt;写清楚不同状态、交互的流转——技术在实现时可能不会注意到这些，即便是显而易见的逻辑，也要写清楚。&lt;/p&gt;
&lt;p&gt;涉及到数字或选项等，写清楚：极值、默认值、格式要求、格式要求的实现形式——基本要求。&lt;/p&gt;
&lt;p&gt;写清楚异常情况处理——对于能够预见的异常情况，写清楚如何避免或处理。每一步都必须要考虑可能存在的异常情况。&lt;/p&gt;
&lt;p&gt;很重要的——一定要给图。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;6.行事准则&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;低调谦虚，对同事和开发有礼貌。对于日常遇到的问题，要换位思考，请对方办事注意措辞和时间，大家工作都很忙。&lt;/p&gt;
&lt;p&gt;需求要一定要和开发和测试同事确认清楚，确保开发和测试知情。不能写完就完事。&lt;/p&gt;
&lt;p&gt;开发完成后，一定要亲自测试，上线后要亲自确认效果无误。&lt;/p&gt;</description></item><item><title>产品需求分析与管理笔记</title><link>https://www.xiaoxiangtao.cn/zh/posts/learning-notes-on-product-requirement-analysis-and-management/</link><pubDate>Tue, 30 Mar 2021 00:00:00 +0000</pubDate><author>15989119660@163.com (Xiangtao XIAO)</author><guid isPermaLink="false">https://www.xiaoxiangtao.cn/zh/posts/learning-notes-on-product-requirement-analysis-and-management/</guid><description>&lt;p&gt;在发掘用户需求时，用户需求未必是具体而明确的，比如老生常谈的福特的‘用户不会想要一辆汽车’，但到了实际开发产品的阶段，针对发掘的用户需求还是需要落到实处，要通过产品的具体功能来满足用户需求。因此在这里的产品需求分析与管理，是指分析表面需求后得出深层次需求，对应需求评估后给出特定的解决方案，被交给开发人员和设计师实现最终呈现为实际产品。另外toB和toC产品有所不同。&lt;/p&gt;
&lt;p&gt;软件需求可以简单分为功能性需求以及非功能性需求，功能性需求指需要软件实现的具体功能，比如注册，回滚操作等，非功能性需求指对软件的稳定性、应对用户高并发的能力等的需求。软件需求是具有优先级并且定量化的。重要的需求要优先被满足，同时要量化需求：比如我们应该告诉开发人员一个具体的系统相应速度要求，而不是说把系统做快一点。&lt;/p&gt;
&lt;h2 id="1-需求分析"&gt;1 需求分析&lt;/h2&gt;
&lt;h3 id="11-需求过程中的角色"&gt;1.1 需求过程中的角色&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;用户&lt;/strong&gt;直接操作软件的人员&lt;strong&gt;客户&lt;/strong&gt;委托公司开发软件产品的人员&lt;strong&gt;市场分析人员&lt;/strong&gt;市场分析人员根据市场的需要，对实际客户进行模拟&lt;strong&gt;高层&lt;/strong&gt;相关下达指示领导&lt;/p&gt;
&lt;h3 id="12-需求变更"&gt;1.2 需求变更&lt;/h3&gt;
&lt;p&gt;由于需求分析的失误，客户环境和业务流程的改变，市场趋势的变化，难以避免会出现需求变更的情况。合理的需求变更未必是坏事，虽然意味着工作量的增加，但也有助于产品不断发展。应对需求变更，一方面，当需求发生变化，需要经过需求评审、比较分析后才能实施，而不是随意的根据客户要求或者想法简单变更，对于异想天开的想法应该据理力争尽量避免无谓的工作；另一方面，在编写需求文档时，要了解业务细节全盘考虑，要有模块化思想和发展的思维，提前想好产品的框架，尽量预设各种正面和负面的可能性，预留修改的空间。前期考虑全面有助于后期工作开展的顺利，比如注册功能，除了注册成功，注册失败的各种情况包括一些恶意注册的行为都应当考虑在内，比如账号已存在，密码不安全，注册项未填，账号密码格式或内容不合规，防止机器人，验证码验证邮件未收到，邮件链接无法打开等各种情况。&lt;/p&gt;
&lt;h3 id="13-需求来源"&gt;1.3 需求来源&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;高层意志&lt;/strong&gt;：公司高层下达的目标，产品经理的职责需要对目标进行评估分析，对于确认的目标分解划分优先级。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;行业知识&lt;/strong&gt;：产品经理需要及时跟进行业动向，新技术新概念的产生与运用会带来新的需求，或者与已有需求矛盾，这需要产品经理依靠行业知识来判断。比如AI技术的火热会造成产品需要提供一些相关的新功能或者对已有功能提供的服务进行升级，如果竞品率先运用某优势技术并广泛宣传，则可能对本公司产品造成竞争威胁。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;用户群体&lt;/strong&gt;：用户直接提出的需求或者分析用户得到的需求。产品的用户群体常常是成分复杂的，不同用户角色，不同用户文化，组织结构差异会产生不同的需求，需要仔细辨别，做接地气的产品。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;运行环境&lt;/strong&gt;：用户规模的变化，地域基础建设的情况比如网络性能等会要求产品做出适应变化。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;组织环境&lt;/strong&gt;：一些toB产品，相关政策，企业文化，企业工作流程与组织结构等会对产品产生定制需求。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="14-需求获取"&gt;1.4 需求获取&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;亲自体验&lt;/strong&gt; 亲自参加业务工作、亲自体验产品。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;调查会&lt;/strong&gt; 邀请相关人士开会，提前设计好讨论流程和问题，并做好记录。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;询问专业人士&lt;/strong&gt; 询问该领域的专业人士，比如某业务的主管。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;头脑风暴&lt;/strong&gt; 一对一或一对多，集思广益，最后对提出的需求进行归纳整理，取有用的。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;问卷调查&lt;/strong&gt; 向用户发放问卷。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;查阅资料&lt;/strong&gt; 查看公司资料数据等，从资料中了解发现需求&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="15-需求分析模型"&gt;1.5 需求分析模型&lt;/h3&gt;
&lt;h4 id="151-卡诺kano模型"&gt;1.5.1 卡诺(KANO)模型&lt;/h4&gt;
&lt;p&gt;&lt;img loading="lazy" src="https://www.xiaoxiangtao.cn/posts/learning-notes-on-product-requirement-analysis-and-management/2021033016532789-designaxt.png"&gt;&lt;/p&gt;
&lt;p&gt;卡诺模型将需求分为5个层次：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;基本需求&lt;/strong&gt;：用户认为必须要有的基本功能，没有此功能用户满意度大幅降低，优化此功能用户满意度提升不明显。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;期望需求&lt;/strong&gt;：用户期望的功能，有则用户满意，无则用户不满。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;兴奋需求&lt;/strong&gt;：用户预料之外的功能，很好的满足的某个需求，有则用户惊喜，满意度提升，没有满意度不会下降。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;无差异需求&lt;/strong&gt;：用户感知不强，有无对满意度影响都不大。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;反向需求&lt;/strong&gt;：普遍用户没有该需求，提供后用户感到不满，比如在CCTV播耽美剧必然导致用户不满，也不可能。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;在对需求划分优先级时，应该遵照优先满足基本需求，其后开发期望需求、兴奋需求，避免无差异需求及反向需求。一些情况下需要开发一些无差异需求对应的功能，以使产品丰满另甲方满意。&lt;br&gt;
用户调研过程中，用户常常提出期望需求，而基本需求和兴奋需求则需要我们去挖掘归纳，因为这些需要是用户认为理所当然或者意向不到的。&lt;br&gt;
随着时间的推移，一些兴奋需求和期望需求会逐渐转变为基本需求，比如以前手机提供拍照功能用户觉得很惊艳，后来拍照功能逐渐成为各大厂商的卖点，旗舰手机拍照不行用户就无法接受了。&lt;/p&gt;
&lt;h4 id="152-马斯洛需求层次理论-y模型"&gt;1.5.2 马斯洛需求层次理论-Y模型&lt;/h4&gt;
&lt;p&gt;&lt;img loading="lazy" src="https://www.xiaoxiangtao.cn/posts/learning-notes-on-product-requirement-analysis-and-management/2021033016552660-designaxt-1024x548.jpg"&gt;&lt;/p&gt;
&lt;p&gt;马斯洛需求反应的是深层次的基本需求，当我们得到一个用户提出的需求，基于Y模型，我们可以分析这个需求对应的用户目标即用户实际要通过满足该需求达到什么目的，进一步挖掘该动机是基于马斯洛需求层次的什么需求，通过该人性需求去设计开发对应的产品功能。一般来讲，马斯洛层次底部的功能会更加基础，工具属性更强，比如地图，外卖app等，该层次的需求也应当被优先满足。&lt;/p&gt;
&lt;p&gt;&lt;img loading="lazy" src="https://www.xiaoxiangtao.cn/posts/learning-notes-on-product-requirement-analysis-and-management/2021033102074035-designaxt.jpg"&gt;&lt;/p&gt;
&lt;p&gt;①是代表用户需求场景，是起点，是表象，是需求的第一种深度，观点和行为，即在什么场景下什么目标用户的什么时间操作下的什么需求；&lt;br&gt;
②是代表用户需求背后的目标和动机，需求的第二种深度，用户为什么要提出这个需求，最底层的动机是什么？我们在思考用户目标时也要综合考虑公司、产品的目标；&lt;br&gt;
③是代表产品功能，是我们根据用户需求深度剖析得出的解决方案，是实施人员能看懂的描述；&lt;br&gt;
④是代表人性需求，即马斯洛需求，或者说是需求的第三种深度价值观，是人性的需求；&lt;/p&gt;
&lt;p&gt;运用Y模型的一个主要的好处在于它不能跳过流程②而直接从流程①到流程③，对用户的需求有更深层次的分析有助于：不被伪需求欺骗；能够解决需求冲突；能够发现更多用户目标；能够抓住恒定的人性；能够在成熟市场中找机会；&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href="//zhuanlan.zhihu.com/p/123364228"&gt;//zhuanlan.zhihu.com/p/123364228&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4 id="153-用户旅程图"&gt;1.5.3 用户旅程图&lt;/h4&gt;
&lt;p&gt;&lt;img loading="lazy" src="https://www.xiaoxiangtao.cn/posts/learning-notes-on-product-requirement-analysis-and-management/2021033016024262-designaxt-1024x725.jpg"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading="lazy" src="https://www.xiaoxiangtao.cn/posts/learning-notes-on-product-requirement-analysis-and-management/2021033016573351-designaxt.png"&gt;&lt;/p&gt;
&lt;p&gt;我们获取的需求往往是零散的，用户旅程图有助于将用户需求故事化以及可视化，将需求归纳总结起来，从而帮助形成完整的用户体验设计。用户旅程图上同时可以通过梳理用户体验过程，使需求易于发现，结合用户心情或者成本等地图，发现产品或者服务流程中的用户痛点。&lt;/p&gt;
&lt;p&gt;用户旅程图包含明确的用户，业务场景，操作、心态和情绪，接触点和通道（用户与产品或者服务交互的时间点以及渠道），见解和所有权（某个节点有什么问题，有哪些相关者）。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href="http://www.woshipm.com/user-research/1089015.html"&gt;http://www.woshipm.com/user-research/1089015.html&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>竞品分析学习笔记</title><link>https://www.xiaoxiangtao.cn/zh/posts/learning-notes-of-competitive-product-analysis/</link><pubDate>Sun, 28 Mar 2021 00:00:00 +0000</pubDate><author>15989119660@163.com (Xiangtao XIAO)</author><guid isPermaLink="false">https://www.xiaoxiangtao.cn/zh/posts/learning-notes-of-competitive-product-analysis/</guid><description>&lt;h2 id="1-为什么要做竞品分析"&gt;1 为什么要做竞品分析&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;1.帮助决策&lt;/strong&gt;：了解竞争对手的产品，帮助进行产品定位，避开强大的竞争对手，避免进入红海。降低决策风险。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2.学习借鉴&lt;/strong&gt;：充分了解对手产品的优点，竞争力，从而能够针对性的开发我们的产品，吸收对方的优点长处，提高竞争力。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3.预警避险&lt;/strong&gt;：及时了解竞争对手产品的产品发展，及时发现市面上出现的颠覆性替代品，新政策的出现等， 以便快速应对，规避风险。&lt;/p&gt;
&lt;h2 id="2-产品生命周期与竞品分析"&gt;2 产品生命周期与竞品分析&lt;/h2&gt;
&lt;p&gt;&lt;img loading="lazy" src="https://www.xiaoxiangtao.cn/posts/learning-notes-of-competitive-product-analysis/6435.png"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading="lazy" src="https://www.xiaoxiangtao.cn/posts/learning-notes-of-competitive-product-analysis/4376547.png"&gt;&lt;/p&gt;
&lt;h2 id="3-竞品分析的一般步骤"&gt;3 竞品分析的一般步骤&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;明确目标：为什么要做竞品分析&lt;/li&gt;
&lt;li&gt;选择竞品&lt;/li&gt;
&lt;li&gt;确定分析维度&lt;/li&gt;
&lt;li&gt;收集信息&lt;/li&gt;
&lt;li&gt;信息整理与分析&lt;/li&gt;
&lt;li&gt;总结报告&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img loading="lazy" src="https://www.xiaoxiangtao.cn/posts/learning-notes-of-competitive-product-analysis/ertyjn.png"&gt;&lt;/p&gt;
&lt;h3 id="31-明确目标"&gt;3.1 明确目标&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;为什么产品进行竞品分析？&lt;/li&gt;
&lt;li&gt;这个产品处于生命周期的哪个阶段？&lt;/li&gt;
&lt;li&gt;当前产品的主要问题与挑战是什么？可否通过竞品分析予以解决？&lt;/li&gt;
&lt;li&gt;做竞品分析的目的是什么？&lt;/li&gt;
&lt;li&gt;做竞品分析的目标是什么？（通过达成多个具体的目标来达到最终的目的）：&lt;br&gt;
目标可以包含：决策支持、市场预警、学习借鉴&lt;br&gt;
比如是要判断这个产品有没有前途，有没有做的必要，怎么做能挣钱&lt;br&gt;
人家成功的产品是怎么做的，我们也做个类似的，抢占市场份额&lt;br&gt;
定期追踪市场的情况，有没有要关注的风险，市场份额缩小是什么原因导致的，及时补救&lt;/li&gt;
&lt;li&gt;竞品分析的输出成果是什么？（独立的报告还是商业计划书或立项报告中的一部分）&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="32-选择竞品"&gt;3.2 选择竞品&lt;/h3&gt;
&lt;p&gt;&lt;img loading="lazy" src="https://www.xiaoxiangtao.cn/posts/learning-notes-of-competitive-product-analysis/ertuytre.png"&gt;&lt;/p&gt;
&lt;p&gt;根据竞品分析目的不同有不同的竞品选择原则：&lt;br&gt;
1.当目的是 &lt;strong&gt;决策支持 预警避险&lt;/strong&gt; 时，可以从品牌竞品，品类竞品，替代品中寻找竞品，具体原则根据竞品的市场份额、大公司背景、用户反馈、跨界替代品进行选择。&lt;br&gt;
2.当目的是 &lt;strong&gt;学习借鉴&lt;/strong&gt; 时，可以从品牌竞品、品类竞品、参照品中寻找竞品，具体原则根据市场份额，跨界参照品，产品鼻祖进行选择。&lt;/p&gt;
&lt;p&gt;在初步选择竞品后，要根据实际情况再次进行筛选，一般会选择3个左右进行具体分析，选择方法根据自身情况比如目的，自家产品的市场份额，所处市场的竞争情况，自家产品的发展阶段等进行判读。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;不可凭直觉来选择竞品，否则容易遗漏掉重要竞品。&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id="33-确定分析维度"&gt;3.3 确定分析维度&lt;/h3&gt;
&lt;p&gt;可以从产品和用户两个视角来进行产品分析。产品视角是从影响一个产品成败的因素进行分析，用户视角是从用户的角度看用户在选择产品时会关注哪些方面。举例来说，对于某类没有明显差距的产品，用户的角度可能关注的是产品的价格，而从产品角度则关注的是供应链和生产技术等问题，而这些是用户在选择产品时不会触及到的。从用户视角收集竞品信息可以采用问卷访谈等方法。&lt;/p&gt;
&lt;p&gt;对于分析维度的选择则要根据竞品分析的目标、产品类型、产品的关键成功要素来判断。即有针对性的去分析关键的维度，比如决定这个产品成功的是技术还是外观设计？这个产品的性质是2C还是2B的，两种产品显然要从不同的维度进行分析。比如要做一个企业财务管理系统，那么系统的外观设计一般就不用重点分析。&lt;/p&gt;
&lt;h3 id="34-收集竞品信息"&gt;3.4 收集竞品信息&lt;/h3&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/learning-notes-of-competitive-product-analysis/picture-1.png"&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;常用的数据来源包括：&lt;/strong&gt; &lt;a href="http://index.baidu.com"&gt;百度指数&lt;/a&gt; &lt;a href="http://compass.umeng.com"&gt;友盟&lt;/a&gt; &lt;a href="http://alizs.taobao.com"&gt;阿里指数&lt;/a&gt; &lt;a href="http://data.qq.com"&gt;腾讯大数据&lt;/a&gt; &lt;a href="http://www.analysys.cn"&gt;易观智库&lt;/a&gt; &lt;a href="http://www.iresearch.com.cn"&gt;艾瑞&lt;/a&gt; &lt;a href="http://www.cnnic.net.cn"&gt;CNNIC&lt;/a&gt; &lt;a href="https://www.xiaoxiangtao.cn/zh/"&gt;TalkingData&lt;/a&gt; &lt;a href="http://www.alexa.com"&gt;流量指数&lt;/a&gt; &lt;a href="https://www.xiaoxiangtao.cn/zh/"&gt;七麦数据&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;专利机构：&lt;/strong&gt; &lt;a href="http://www.pss-system.gov.cn/"&gt;专利检索及分析&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="35-信息整理与分析"&gt;3.5 信息整理与分析&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;不仅要收集信息，还要处理信息；不仅要罗列要点，还要加以分析。&lt;/strong&gt; 处理信息包括归纳、分类、组合、可靠性评估等。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;常用竞品信息分析方法：&lt;/strong&gt;&lt;/p&gt;
&lt;h4 id="351-比较法"&gt;3.5.1 比较法&lt;/h4&gt;
&lt;p&gt;打钩比较法，评分比较法，描述比较法 （ &lt;a href="http://www.woshipm.com/pmd/3542523.html"&gt;$APPEALS&lt;/a&gt;）&lt;/p&gt;
&lt;p&gt;&lt;img loading="lazy" src="https://www.xiaoxiangtao.cn/posts/learning-notes-of-competitive-product-analysis/picture-6.png"&gt;&lt;/p&gt;
&lt;h4 id="352-矩阵分析法"&gt;3.5.2 矩阵分析法&lt;/h4&gt;
&lt;p&gt;确定关键竞争要素，思考产品定位。&lt;/p&gt;
&lt;p&gt;&lt;img loading="lazy" src="https://www.xiaoxiangtao.cn/posts/learning-notes-of-competitive-product-analysis/picture-7.png"&gt;&lt;/p&gt;
&lt;h4 id="353-竞品跟踪矩阵"&gt;3.5.3 竞品跟踪矩阵&lt;/h4&gt;
&lt;p&gt;耗时长一般针对核心产品才分析，对于频繁快速迭代的产品合并小更新取大更新分析。&lt;/p&gt;</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>微信8.0感受</title><link>https://www.xiaoxiangtao.cn/zh/posts/wechat-8-0/</link><pubDate>Sat, 23 Jan 2021 00:00:00 +0000</pubDate><author>15989119660@163.com (Xiangtao XIAO)</author><guid isPermaLink="false">https://www.xiaoxiangtao.cn/zh/posts/wechat-8-0/</guid><description>&lt;p&gt;昨晚后知后觉微信更新了一个大版本，关于微信向视频、文章方向的发力与改变，我感知并不明显。曾经自己一度迷上短视频，后来感到太过消耗时间，且没什么营养，所以基本不看了，抖音也卸载了。在关注了一大堆公众号后，微信里的文章开始变的五花八门，看不过来，只有通勤时偶尔看一看，对于这些文章，看多了以后感到并没有很迫切需要看的需求。当然，这也是因为自己没有养成持续关注阅读一些优秀公众号的良好习惯吧，我想对于有坚持看文章的人来说，这次更新可以较好的改善体验。&lt;/p&gt;
&lt;p&gt;说回视频方向的发力，我深感创作的乐趣要大于观看的乐趣，明明自己对别人的视频毫无兴趣，却希望自己的视频被广泛的观看点赞，作为社交的需要，也要给别人点赞，孤独感和虚荣心被充分利用了。朋友圈里的自制视频没有什么质量可言，应该是没上年纪又或许性子孤僻吧，对于别人发的视频没有多大的兴趣。在外面看视频总让我感到非常不适，尤其是地铁等人多的地方，图像比文字清晰的多，隔了很远也可以分辨出来，虽然大多数人不会偷窥你的屏幕，但我仍然会感到不自在，我不希望有陌生人从我的手机屏幕上获取到信息，即使是毫不相干的信息，这真是个奇怪的感觉，也许是我不够自信，缺乏安全感所致。对于微信来说，我想让用户积极发视频也是很关键的，当用户发了视频，他就有了看视频的动力。&lt;/p&gt;
&lt;p&gt;微信有建成一个大生态系统的目的，似乎一切都可以在微信上完成，可所谓的生态不也是一种垄断吗？一切似乎都被微信统治了，比如这次表情的升级，即使自己不喜欢，也没有选择的余地。表情的UI统一了，这是合理的，但也毫无疑问低龄化了，比如[敲打]的锤头变成了平底锅，毫无疑问这套UI更现代，我猜想微信考量年轻一代的消费水平更高，也更高频的使用各种表情，而年长一代对表情并不那么敏感，换了也不是很在乎，通过之前加入的少部分新表情进行测试后，大的更新也就顺理成章了。不得不承认我自己也使用新表情比较多，但是老表情的直接下架依然让人感到不那么愉快。&lt;/p&gt;
&lt;p&gt;当这个app成为一个国民级应用后，各种用户都被迫使用它，但它势必无法迎合所有用户群体，悲伤之处就在于，那些不被迎合的用户没有别的选择。微信的产品确实很有水准，说说UI吧，这次更新的欢迎页，确实是微信的风格，很文艺，但是当一个社交应用说出‘我看见你，我看见你看见的’时候，文艺的背后，又有一种裸露在网络空间中的感觉，包括这次的状态栏，我想自己也许不会经常设置自己的状态吧。庆幸的是微信巧妙地把附加的功能隐藏了起来，因此常规使用的界面依然简洁，日常使用体验没有很大改变。&lt;/p&gt;</description></item><item><title>读书|《浓缩睡眠》</title><link>https://www.xiaoxiangtao.cn/zh/posts/concentrated-sleep/</link><pubDate>Mon, 04 Jan 2021 00:00:00 +0000</pubDate><author>15989119660@163.com (Xiangtao XIAO)</author><guid isPermaLink="false">https://www.xiaoxiangtao.cn/zh/posts/concentrated-sleep/</guid><description>&lt;h2 id="简介"&gt;简介&lt;/h2&gt;
&lt;p&gt;摆脱传统的每天要睡8小时的陈旧规则，通过高质量的睡眠来缩短睡眠时间（即30分钟内进入深度睡眠）。作者号称每天只睡3小时，从而快乐工作，并获得了额外的娱乐时间。总之，睡多久取决于个人情况，8小时不是必要的。（商务精英都是4、5点起床emm？）&lt;/p&gt;
&lt;h2 id="归纳"&gt;归纳&lt;/h2&gt;
&lt;h3 id="三个方法"&gt;三个方法&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;消除脑疲劳&lt;/li&gt;
&lt;li&gt;改善血液循环&lt;/li&gt;
&lt;li&gt;调整睡眠环境&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;书里每个方法都介绍了几种具体方式，但是对我这种懒人来说，一些方式太繁琐了，所以只挑几个自己应该能做到的记录总结，&lt;/p&gt;
&lt;h4 id="消除脑疲劳"&gt;消除脑疲劳&lt;/h4&gt;
&lt;h5 id="日常做眼保健操即可"&gt;&lt;strong&gt;日常做眼保健操即可&lt;/strong&gt;&lt;/h5&gt;
&lt;p&gt;作者认为眼睛与大脑相连，是第二大脑，让眼睛休息即可舒缓大脑。以前做眼保健操确实会很放松，做完精神会更好。&lt;/p&gt;
&lt;h5 id="按摩头部"&gt;&lt;strong&gt;按摩头部&lt;/strong&gt;&lt;/h5&gt;
&lt;ol&gt;
&lt;li&gt;两耳上方 2 cm 处，手掌根部画圈按压&lt;/li&gt;
&lt;li&gt;在侧头部（第一步往上挪），4根手指按摩&lt;/li&gt;
&lt;li&gt;5根手指在头顶画圈同时按压松开&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;5分钟重复6-10次，考虑到发型问题这个晚上回家做比较好&lt;/p&gt;
&lt;h5 id="总结复盘并列次日计划"&gt;&lt;strong&gt;总结复盘并列次日计划&lt;/strong&gt;&lt;/h5&gt;
&lt;p&gt;把做的不好的写下来，担心的事写下来，完成的事写下来，希望发生的事写下来，计划也写下来。&lt;/p&gt;
&lt;p&gt;作者认为把心事写出来可以缓解压力，写出来以后就安心了，之后睡觉就可以不去想它（类似于用笔咆哮，吼几句就舒服了）&lt;/p&gt;
&lt;p&gt;写论文期间写过类似的日志，亲测管用。&lt;/p&gt;
&lt;h5 id="多笑-多笑-多笑"&gt;&lt;strong&gt;多笑 多笑 多笑&lt;/strong&gt;&lt;/h5&gt;
&lt;p&gt;笑总是没坏处的，多笑笑，运气好，办事也顺利。。。&lt;/p&gt;
&lt;p&gt;作者表示心理学上，心情的愉悦可以带动肌肉做出微笑的表情，那反过来也行得通&lt;/p&gt;
&lt;h4 id="改善血液循环"&gt;改善血液循环&lt;/h4&gt;
&lt;h5 id="泡澡或泡脚或边泡脚边洗澡"&gt;&lt;strong&gt;泡澡或泡脚或边泡脚边洗澡&lt;/strong&gt;&lt;/h5&gt;
&lt;p&gt;理由不解释，但是时间不要超过10分钟，温度不宜过高&lt;/p&gt;
&lt;h5 id="挺胸抬头"&gt;&lt;strong&gt;挺胸抬头&lt;/strong&gt;&lt;/h5&gt;
&lt;p&gt;驼背导致呼吸不畅会影响血液循环，这个倒是有意思。具体办法就是做转肩运动、背部拉伸、扩胸等。&lt;/p&gt;
&lt;p&gt;&lt;em&gt;通过运动来改善体态，而不是每天日常刻意挺胸，这样用处不大&lt;/em&gt;&lt;/p&gt;
&lt;h5 id="运动"&gt;&lt;strong&gt;运动&lt;/strong&gt;&lt;/h5&gt;
&lt;p&gt;不用剧烈运动，挺胸走一走，做几组深蹲即可。剧烈运动反而导致脑疲劳，影响睡眠。&lt;/p&gt;
&lt;h5 id="按摩小腿肚"&gt;&lt;strong&gt;按摩小腿肚&lt;/strong&gt;&lt;/h5&gt;
&lt;p&gt;小腿肚号称第二心脏，按摩也有助于改善血液循环。&lt;/p&gt;
&lt;h4 id="调整睡眠环境"&gt;调整睡眠环境&lt;/h4&gt;
&lt;h5 id="床是用来睡的"&gt;&lt;strong&gt;床是用来睡的&lt;/strong&gt;&lt;/h5&gt;
&lt;p&gt;上床就睡觉，醒了就起床。在床上做别的事情就会影响睡眠。凡不是睡觉的事就不要在床上进行。&lt;/p&gt;
&lt;p&gt;如果房间小，必须要坐在床上，就在床上盖一块布，睡觉的时候才掀掉。&lt;/p&gt;
&lt;h5 id="搞好卫生很重要"&gt;&lt;strong&gt;搞好卫生很重要&lt;/strong&gt;&lt;/h5&gt;
&lt;p&gt;房间里的灰尘会严重影响睡眠质量，所以要搞卫生，把被子，床底下等等地方的灰清理干净。&lt;/p&gt;
&lt;h5 id="合适的温湿度"&gt;&lt;strong&gt;合适的温湿度&lt;/strong&gt;&lt;/h5&gt;
&lt;p&gt;温度太高不利于入睡，太干燥也不行，所以夏天开空调，冬天加湿器，空气质量不好还要空气净化器。保持一个凉爽的状态才能更快入睡。&lt;/p&gt;
&lt;h5 id="脑袋-脖子-脊柱-睡觉一条直线"&gt;&lt;strong&gt;脑袋 脖子 脊柱 睡觉一条直线&lt;/strong&gt;&lt;/h5&gt;
&lt;p&gt;买合适的枕头和床垫，还要透气，不能潮湿，5年换一次emm。&lt;/p&gt;
&lt;h5 id="精油"&gt;&lt;strong&gt;精油&lt;/strong&gt;&lt;/h5&gt;
&lt;p&gt;乳香味改善呼吸&lt;/p&gt;
&lt;p&gt;薰衣草帮助镇静安眠&lt;/p&gt;
&lt;h3 id="其他tips"&gt;其他tips&lt;/h3&gt;
&lt;h5 id="早起"&gt;&lt;strong&gt;早起&lt;/strong&gt;&lt;/h5&gt;
&lt;p&gt;早起来调节自己的生物钟。具体方法包括：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;早起晒太阳，要充足的光线&lt;/li&gt;
&lt;li&gt;早起一杯水，因为水分在睡觉时流失严重&lt;/li&gt;
&lt;li&gt;早起大声说话与咀嚼早餐，帮助激活大脑，唤醒精神&lt;/li&gt;
&lt;li&gt;周末也要和平时一样起床，不能晚睡晚起否则扰乱生物钟&lt;/li&gt;
&lt;li&gt;安排早晨活动，读书会或者简单运动，更有成就感&lt;/li&gt;
&lt;li&gt;安排早餐计划，按规律行事&lt;/li&gt;
&lt;/ol&gt;
&lt;h5 id="午睡"&gt;&lt;strong&gt;午睡&lt;/strong&gt;&lt;/h5&gt;
&lt;ol&gt;
&lt;li&gt;不要超过30分钟，否则进入正式的睡眠，难以清醒&lt;/li&gt;
&lt;li&gt;不一定要躺着睡，条件不好坐着闭眼即可。&lt;/li&gt;
&lt;li&gt;睡不着可以用冥想（正念呼吸）代替&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;em&gt;咖啡睡眠法：&lt;/em&gt; 睡前一杯咖啡，睡20分钟起来后咖啡因生效，精神特别好。&lt;/p&gt;
&lt;h5 id="晚上不作死"&gt;&lt;strong&gt;晚上不作死&lt;/strong&gt;&lt;/h5&gt;
&lt;ol&gt;
&lt;li&gt;睡前不喝咖啡和酒&lt;/li&gt;
&lt;li&gt;睡前90分钟洗澡，不要洗完立刻上床，要等身体降温冷却&lt;/li&gt;
&lt;li&gt;睡前不要看手机等，看书就好&lt;/li&gt;
&lt;li&gt;睡前不要吃东西（尤其是不易消化的），让肠道进入休息状态&lt;/li&gt;
&lt;/ol&gt;
&lt;h5 id="用app检测记录睡眠情况"&gt;&lt;strong&gt;用app检测记录睡眠情况&lt;/strong&gt;&lt;/h5&gt;
&lt;p&gt;养成习惯，防止反弹，增强成就感&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>设计杂志类网站</title><link>https://www.xiaoxiangtao.cn/zh/posts/core77-industrial-design-magazine/</link><pubDate>Fri, 03 Jul 2020 00:00:00 +0000</pubDate><author>15989119660@163.com (Xiangtao XIAO)</author><guid isPermaLink="false">https://www.xiaoxiangtao.cn/zh/posts/core77-industrial-design-magazine/</guid><description>&lt;h2 id="core77--industrial-design-magazine"&gt;Core77 / Industrial Design Magazine&lt;/h2&gt;
&lt;p&gt;&lt;img loading="lazy" src="https://www.xiaoxiangtao.cn/posts/core77-industrial-design-magazine/core77-1024x655.jpg"&gt;&lt;/p&gt;
&lt;p&gt;关于工业设计的新闻、点子、访谈等各种内容，网站很好看，访问不是很快。&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.xiaoxiangtao.cn/zh/"&gt;点此前往&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;不断更新ing&amp;hellip;&lt;/p&gt;</description></item><item><title>摄影技术分享网站</title><link>https://www.xiaoxiangtao.cn/zh/posts/photography-technology-sharing-website/</link><pubDate>Fri, 03 Jul 2020 00:00:00 +0000</pubDate><author>15989119660@163.com (Xiangtao XIAO)</author><guid isPermaLink="false">https://www.xiaoxiangtao.cn/zh/posts/photography-technology-sharing-website/</guid><description>&lt;h2 id="fuji-x-weekly"&gt;Fuji X Weekly&lt;/h2&gt;
&lt;p&gt;&lt;img loading="lazy" src="https://www.xiaoxiangtao.cn/posts/photography-technology-sharing-website/fujixweekly-1024x723.jpg"&gt;&lt;/p&gt;
&lt;p&gt;关于富士x系列的博客，提供富士胶片模拟参数设置教程，各种胶片风格模拟，图片质量很不错。&lt;/p&gt;
&lt;p&gt;&lt;a href="//fujixweekly.com/recipes/"&gt;点此前往&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="150胶片模拟参数表"&gt;150胶片模拟参数表&lt;/h2&gt;
&lt;p&gt;&lt;img loading="lazy" src="https://www.xiaoxiangtao.cn/posts/photography-technology-sharing-website/150fujifilm-1024x510.jpg"&gt;&lt;/p&gt;
&lt;p&gt;摄影师David收集并整理，谷歌文档。&lt;/p&gt;
&lt;p&gt;&lt;a href="//docs.google.com/spreadsheets/d/1R7Zau2LIoy5vd5sPXrIGmtGbrSGlj_fPYPPG2rsWMFg/htmlview?fbclid=IwAR0OIBC8MAG8CyeZIU5-YOI_S_vaovETn5iUzTEKLFN__Glf6owWuUDyuxA"&gt;查看&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="f16click"&gt;f16.click&lt;/h2&gt;
&lt;p&gt;&lt;img loading="lazy" src="https://www.xiaoxiangtao.cn/posts/photography-technology-sharing-website/f16click-1024x558.jpg"&gt;&lt;/p&gt;
&lt;p&gt;富士官方X摄影师，有许多关于富士相机的体验与使用经验。提供了一组适用X70与XF10的胶片模拟参数。其中 黑白+红色滤镜 的设置效果是我比较喜欢的。&lt;/p&gt;
&lt;p&gt;&lt;a href="//www.f16.click/blog/gear/fujifilm-x70-settings.html"&gt;点此前往&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="知乎胶片模拟参数设置回答"&gt;知乎胶片模拟参数设置回答&lt;/h2&gt;
&lt;p&gt;&lt;img loading="lazy" src="https://www.xiaoxiangtao.cn/posts/photography-technology-sharing-website/v2-a8146ea48b7970255f8d69580e210041_r.jpg"&gt;&lt;/p&gt;
&lt;p&gt;提供了一个日系参数设置感觉效果还不错。&lt;/p&gt;
&lt;p&gt;FILM:ASTIA　DR:400%　WB:AUTO　HIGHLIGHT:-2　SHADOW:-2　COLOR:+1　SHARP:-2　NR:0&lt;/p&gt;
&lt;p&gt;&lt;a href="//www.zhihu.com/question/40105658/answer/363818752"&gt;点此前往&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;持续更新ing&amp;hellip;&lt;/p&gt;</description></item><item><title>Fujifilm XF10 对比 Panasonic LX10</title><link>https://www.xiaoxiangtao.cn/zh/posts/fujifilm-xf10-vs-panasonic-lx10/</link><pubDate>Wed, 01 Jul 2020 00:00:00 +0000</pubDate><author>15989119660@163.com (Xiangtao XIAO)</author><guid isPermaLink="false">https://www.xiaoxiangtao.cn/zh/posts/fujifilm-xf10-vs-panasonic-lx10/</guid><description>&lt;p&gt;大学伊始，买了全画幅canon 6D + 24-105套头，玩了四年，让我从一个摄影小白逐步了解了摄影的各种技术，也见识了全画幅的威力——扛着一个红圈大单反出门好不威风，旅游的时候路人看到我在拍什么，常常也跟上来到同样的位置看看；同学老师们也乐意让我拍拍。尽管如此，四年下来，我对这台笨重的相机却有些厌倦了，它实在太重，加上三脚架，如果不是有重要活动，实在不想再扛着到处跑。&lt;/p&gt;
&lt;p&gt;&lt;img loading="lazy" src="https://www.xiaoxiangtao.cn/posts/fujifilm-xf10-vs-panasonic-lx10/20170811-IMG_3437-2-1024x320.jpg"&gt;&lt;/p&gt;
&lt;p&gt;6D我用的其实并不多，主要用来拍了学校班级的活动以及难得出去旅游用用，现在随着对摄影的了解更加深入，逐步意识到自己在技术和审美上还存在不足，要多拍才行——我需要一个能随身带着的可以到处拍的玩意儿来提高自己的拍摄频率。那么手机不行吗？不行，手机可玩性太低，参数调整远不如相机的拨盘来的方便，目前大多数手机画质也不及相机，用手机拍照着实差了点感觉，学摄影还得相机。&lt;/p&gt;
&lt;p&gt;预算2000元以下的卡片机，二手基本就是在XF10和LX10之间做选择。在网上看了一些测评，键盘摄影师太多 ，还是自己都买来尝试一下吧。&lt;/p&gt;
&lt;p&gt;先说结论：我留下了XF10，根本原因在于画质与可玩性：&lt;/p&gt;
&lt;h2 id="画质"&gt;画质&lt;/h2&gt;
&lt;p&gt;我的目的是为了提升摄影技术，我有全幅了对变焦需求不大，定焦反而能让我专注构图拍照。XF10的APS-C画幅能与手机的画质拉开明显的差距，LX10的一英寸底则不能，特别是在手机摄影快速发展的今天，面对华为P40 pro+，即使光学变焦也不是一个很明显的优势。（说实话，华为的这款手机确实让人惊艳，也让我下定决心放弃了LX10），再过两年，把LX10的预算加在手机上买个拍照旗舰，日常拍摄发朋友圈完全够用。对比6D，XF10，LX10，可以看到画质上还是有非常明显的区别，放大画面在细节的保留上底大一级压死人的定律非常明显。XF10对细节的反映以及画面锐度是手机无法比拟的，这台相机给我的感觉更加专业，而LX10则更像是一台家用产品。&lt;/p&gt;
&lt;p&gt;&lt;img loading="lazy" src="https://www.xiaoxiangtao.cn/posts/fujifilm-xf10-vs-panasonic-lx10/P1000929-1-1024x683.jpg"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading="lazy" src="https://www.xiaoxiangtao.cn/posts/fujifilm-xf10-vs-panasonic-lx10/DSCF0251-1024x683.jpg"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading="lazy" src="https://www.xiaoxiangtao.cn/posts/fujifilm-xf10-vs-panasonic-lx10/DSCF0458-2-1024x683.jpg"&gt;&lt;/p&gt;
&lt;h2 id="可玩性"&gt;可玩性&lt;/h2&gt;
&lt;p&gt;简单来说就是好不好折腾，我是喜欢折腾的，所以这些在我来看一些缺点也能当做优点。&lt;/p&gt;
&lt;h3 id="胶片模拟"&gt;胶片模拟&lt;/h3&gt;
&lt;p&gt;富士的胶片模拟可用性很高，XF10提供了11种胶片模拟，并可对高光阴影对比度降噪等做进一步调整，jpeg直出色彩确实不错，不过在锐化和降噪上稍显激进导致一些网友认为涂抹感太强，实际上用raw格式在富士提供的专业软件如capture one里可以精细调整，不存在这个问题，其raw格式后期空间大，色彩丰富，同时2420万像素给了后期很大的剪裁空间，基本可以当做3倍变焦来用。LX10的raw则稍显不足，色彩不够丰富，宽容度较低，细节有所损失，因此后期空间相对较小。&lt;/p&gt;
&lt;h3 id="快拍模式"&gt;快拍模式&lt;/h3&gt;
&lt;p&gt;XF10的快拍模式被许多人吐槽只有5m和2m两种模式并且不支持更改光圈，但是说实话2000元要啥自行车，和GR比完全没必要，另外在手动对焦模式下，XF10提供了对焦距离标尺，通过设置不同光圈及对焦距离，想要什么距离和景深的快拍都是可以做到的，无非是没有一个快捷键快速设置的功能，但我认为可用性也不错了（自己也不是很有街拍经验）。LX10则没有快拍模式，其开机时间也比较长（镜头要伸出来），不过考虑到对焦速度快，也是用其拍照的一种优势。&lt;/p&gt;
&lt;h3 id="重量"&gt;重量&lt;/h3&gt;
&lt;p&gt;在重量方面，XF10只有280g，而LX10有340g，同时LX10的镜头相较XF10凸起更加明显，就实际放在口袋里的感受来说，XF10要舒服的多，LX10会把口袋撑起来，并且让裤子有严重下坠感，在夏天，LX10放在口袋里出门并不是很方便。&lt;/p&gt;
&lt;h3 id="性能"&gt;性能&lt;/h3&gt;
&lt;p&gt;至于网上频繁吐槽的XF10的对焦性能与操控，坦白说个人使用绝没有网上说的那么夸张。LX10毫无疑问是完胜的，对焦迅速，触屏强大流畅，维纳斯芯片性能强劲处理速度快。XF10的对焦比较慢，但在较好光线的情况下速度不错，手动峰值对焦也可以接受，无非就是拍摄节奏比较慢。&lt;/p&gt;
&lt;p&gt;唯一让我诟病的就是XF10的芯片显然速度不行，拍raw+fine jpg格式的照片，每一张都要处理个三四秒，这是限制拍摄节奏与连拍的最大问题，因为在处理器处理照片时，相机的触屏将失效，也就是说如果你想触屏改变模式或者对焦点，你必须等几秒相机处理完上一张照片，很多时候让我以为相机失灵了，但一般情况下，只要掌握了节奏或者不拍这么大的照片（加起来50多M）就还好。&lt;/p&gt;
&lt;h2 id="lx10的优势"&gt;LX10的优势&lt;/h2&gt;
&lt;p&gt;选择XF10并不代表我不喜欢LX10，实际上这款相机在我看来是一款性价比极高的相机。一般提的比较多的就是它的翻转屏，4K录制功能，5轴防抖等，这些都是XF10没有的，如果是喜欢录制视频的朋友，LX10性价比极高值得尝试。&lt;/p&gt;
&lt;p&gt;我要着重赞美一下LX10的操控，松下的菜单以及操控实在是极其清晰简单，上手非常快，我认为这款相机很适合新手入门，去学习熟练控制光圈、快门以及感光度。并且其支持步进变焦，可以在35mm，50mm，75mm间进行切换，对熟悉焦段很有帮助。LX10在明亮环境下色彩还原度较高，用来旅行或者办公记录，都会是不错的选择。&lt;/p&gt;</description></item><item><title>2019巴塞尔艺术展（香港）</title><link>https://www.xiaoxiangtao.cn/zh/posts/art-basel-2019-hong-kong/</link><pubDate>Wed, 03 Jun 2020 00:00:00 +0000</pubDate><author>15989119660@163.com (Xiangtao XIAO)</author><guid isPermaLink="false">https://www.xiaoxiangtao.cn/zh/posts/art-basel-2019-hong-kong/</guid><description>&lt;h2 id="简介"&gt;简介&lt;/h2&gt;
&lt;p&gt;2019年3月末于香港国际会展中心，持续3天，在咸鱼花了600买到学生3天通票，顺便在会展4楼看了免费的佳士得拍卖会展览。都可以买学生票，实际上检票人员并不会查学生证只要你不要看着太不像学生&amp;hellip;整个展会看得快1天实际就够了，但是是比较累的，规模真的很大。&lt;/p&gt;
&lt;p&gt;其实我觉得免费的佳士得拍卖展更好看，都是大名鼎鼎的艺术家的作品，还有很多古迹，不用隔着玻璃罩一次性看过瘾。很可惜香港现在搞事情又闹疫情，今年的展会变成线上了。&lt;/p&gt;
&lt;p&gt;挑了几十张，大部分都是很有名的，没事儿留着翻一翻。&lt;/p&gt;
&lt;h2 id="图片"&gt;图片&lt;/h2&gt;
&lt;div class="gallery gallery-cols-1"&gt;&lt;img loading="lazy" src="https://www.xiaoxiangtao.cn/posts/art-basel-2019-hong-kong/IMG_7343.JPG-1024x768.jpg"&gt;&lt;br&gt;
&lt;img loading="lazy" src="https://www.xiaoxiangtao.cn/posts/art-basel-2019-hong-kong/IMG_7342.JPG-1024x768.jpg"&gt;&lt;br&gt;
&lt;img loading="lazy" src="https://www.xiaoxiangtao.cn/posts/art-basel-2019-hong-kong/IMG_7329.JPG-768x1024.jpg"&gt;&lt;br&gt;
&lt;img loading="lazy" src="https://www.xiaoxiangtao.cn/posts/art-basel-2019-hong-kong/IMG_7328.JPG-768x1024.jpg"&gt;&lt;br&gt;
&lt;img loading="lazy" src="https://www.xiaoxiangtao.cn/posts/art-basel-2019-hong-kong/IMG_7327.JPG-768x1024.jpg"&gt;&lt;br&gt;
&lt;img loading="lazy" src="https://www.xiaoxiangtao.cn/posts/art-basel-2019-hong-kong/IMG_7326.JPG-768x1024.jpg"&gt;&lt;br&gt;
&lt;img loading="lazy" src="https://www.xiaoxiangtao.cn/posts/art-basel-2019-hong-kong/IMG_7325.JPG-768x1024.jpg"&gt;&lt;br&gt;
&lt;img loading="lazy" src="https://www.xiaoxiangtao.cn/posts/art-basel-2019-hong-kong/IMG_7324.JPG-768x1024.jpg"&gt;&lt;br&gt;
&lt;img loading="lazy" src="https://www.xiaoxiangtao.cn/posts/art-basel-2019-hong-kong/IMG_7322.JPG-768x1024.jpg"&gt;&lt;br&gt;
&lt;img loading="lazy" src="https://www.xiaoxiangtao.cn/posts/art-basel-2019-hong-kong/IMG_7319.JPG-768x1024.jpg"&gt;&lt;br&gt;
&lt;img loading="lazy" src="https://www.xiaoxiangtao.cn/posts/art-basel-2019-hong-kong/IMG_7318.JPG-scaled-e1591186093967-1024x543.jpg"&gt;&lt;br&gt;
&lt;img loading="lazy" src="https://www.xiaoxiangtao.cn/posts/art-basel-2019-hong-kong/IMG_7317.JPG-768x1024.jpg"&gt;&lt;br&gt;
&lt;img loading="lazy" src="https://www.xiaoxiangtao.cn/posts/art-basel-2019-hong-kong/IMG_7316.JPG-768x1024.jpg"&gt;&lt;br&gt;
&lt;img loading="lazy" src="https://www.xiaoxiangtao.cn/posts/art-basel-2019-hong-kong/IMG_7315.JPG-768x1024.jpg"&gt;&lt;br&gt;
&lt;img loading="lazy" src="https://www.xiaoxiangtao.cn/posts/art-basel-2019-hong-kong/IMG_7314.JPG-768x1024.jpg"&gt;&lt;br&gt;
&lt;img loading="lazy" src="https://www.xiaoxiangtao.cn/posts/art-basel-2019-hong-kong/IMG_7313.JPG-768x1024.jpg"&gt;&lt;br&gt;
&lt;img loading="lazy" src="https://www.xiaoxiangtao.cn/posts/art-basel-2019-hong-kong/IMG_7312.JPG-768x1024.jpg"&gt;&lt;br&gt;
&lt;img loading="lazy" src="https://www.xiaoxiangtao.cn/posts/art-basel-2019-hong-kong/IMG_7311.JPG-768x1024.jpg"&gt;&lt;br&gt;
&lt;img loading="lazy" src="https://www.xiaoxiangtao.cn/posts/art-basel-2019-hong-kong/IMG_7310.JPG-1024x768.jpg"&gt;&lt;br&gt;
&lt;img loading="lazy" src="https://www.xiaoxiangtao.cn/posts/art-basel-2019-hong-kong/IMG_7308.JPG-768x1024.jpg"&gt;&lt;br&gt;
&lt;img loading="lazy" src="https://www.xiaoxiangtao.cn/posts/art-basel-2019-hong-kong/IMG_7307.JPG-768x1024.jpg"&gt;&lt;br&gt;
&lt;img loading="lazy" src="https://www.xiaoxiangtao.cn/posts/art-basel-2019-hong-kong/IMG_7306.JPG-768x1024.jpg"&gt;&lt;br&gt;
&lt;img loading="lazy" src="https://www.xiaoxiangtao.cn/posts/art-basel-2019-hong-kong/IMG_7304.JPG-1024x768.jpg"&gt;&lt;br&gt;
&lt;img loading="lazy" src="https://www.xiaoxiangtao.cn/posts/art-basel-2019-hong-kong/IMG_7303.JPG-1024x768.jpg"&gt;&lt;br&gt;
&lt;img loading="lazy" src="https://www.xiaoxiangtao.cn/posts/art-basel-2019-hong-kong/IMG_7302.JPG-1024x768.jpg"&gt;&lt;br&gt;
&lt;img loading="lazy" src="https://www.xiaoxiangtao.cn/posts/art-basel-2019-hong-kong/IMG_7301.JPG-1024x768.jpg"&gt;&lt;br&gt;
&lt;img loading="lazy" src="https://www.xiaoxiangtao.cn/posts/art-basel-2019-hong-kong/IMG_7298.JPG-1024x768.jpg"&gt;&lt;br&gt;
&lt;img loading="lazy" src="https://www.xiaoxiangtao.cn/posts/art-basel-2019-hong-kong/IMG_7291.JPG-768x1024.jpg"&gt;&lt;br&gt;
&lt;img loading="lazy" src="https://www.xiaoxiangtao.cn/posts/art-basel-2019-hong-kong/IMG_7289.JPG-1024x768.jpg"&gt;&lt;br&gt;
&lt;img loading="lazy" src="https://www.xiaoxiangtao.cn/posts/art-basel-2019-hong-kong/IMG_7288.JPG-1024x768.jpg"&gt;&lt;br&gt;
&lt;img loading="lazy" src="https://www.xiaoxiangtao.cn/posts/art-basel-2019-hong-kong/IMG_7284.JPG-768x1024.jpg"&gt;&lt;br&gt;
&lt;img loading="lazy" src="https://www.xiaoxiangtao.cn/posts/art-basel-2019-hong-kong/IMG_7270.JPG-1024x768.jpg"&gt;&lt;br&gt;
&lt;img loading="lazy" src="https://www.xiaoxiangtao.cn/posts/art-basel-2019-hong-kong/IMG_7269.JPG-768x1024.jpg"&gt;&lt;br&gt;
&lt;img loading="lazy" src="https://www.xiaoxiangtao.cn/posts/art-basel-2019-hong-kong/IMG_7268.JPG-1024x768.jpg"&gt;&lt;br&gt;
&lt;img loading="lazy" src="https://www.xiaoxiangtao.cn/posts/art-basel-2019-hong-kong/IMG_7267.JPG-768x1024.jpg"&gt;&lt;br&gt;
&lt;img loading="lazy" src="https://www.xiaoxiangtao.cn/posts/art-basel-2019-hong-kong/IMG_7266.JPG-1024x768.jpg"&gt;&lt;br&gt;
&lt;img loading="lazy" src="https://www.xiaoxiangtao.cn/posts/art-basel-2019-hong-kong/IMG_7265.JPG-768x1024.jpg"&gt;&lt;br&gt;
&lt;img loading="lazy" src="https://www.xiaoxiangtao.cn/posts/art-basel-2019-hong-kong/IMG_7264.JPG-768x1024.jpg"&gt;&lt;br&gt;
&lt;img loading="lazy" src="https://www.xiaoxiangtao.cn/posts/art-basel-2019-hong-kong/IMG_7262.JPG-768x1024.jpg"&gt;&lt;br&gt;
&lt;img loading="lazy" src="https://www.xiaoxiangtao.cn/posts/art-basel-2019-hong-kong/IMG_7259.JPG-1024x768.jpg"&gt;&lt;br&gt;
&lt;img loading="lazy" src="https://www.xiaoxiangtao.cn/posts/art-basel-2019-hong-kong/IMG_7189.JPG-768x1024.jpg"&gt;&lt;br&gt;
&lt;img loading="lazy" src="https://www.xiaoxiangtao.cn/posts/art-basel-2019-hong-kong/IMG_7257.JPG-1024x768.jpg"&gt;&lt;br&gt;
&lt;img loading="lazy" src="https://www.xiaoxiangtao.cn/posts/art-basel-2019-hong-kong/IMG_7254.JPG-1024x768.jpg"&gt;&lt;br&gt;
&lt;img loading="lazy" src="https://www.xiaoxiangtao.cn/posts/art-basel-2019-hong-kong/IMG_7253.JPG-768x1024.jpg"&gt;&lt;br&gt;
&lt;img loading="lazy" src="https://www.xiaoxiangtao.cn/posts/art-basel-2019-hong-kong/IMG_7246.JPG-1024x768.jpg"&gt;&lt;br&gt;
&lt;img loading="lazy" src="https://www.xiaoxiangtao.cn/posts/art-basel-2019-hong-kong/IMG_7237.JPG-1024x768.jpg"&gt;&lt;br&gt;
&lt;img loading="lazy" src="https://www.xiaoxiangtao.cn/posts/art-basel-2019-hong-kong/IMG_7236.JPG-768x1024.jpg"&gt;&lt;br&gt;
&lt;img loading="lazy" src="https://www.xiaoxiangtao.cn/posts/art-basel-2019-hong-kong/IMG_7217.JPG-768x1024.jpg"&gt;&lt;br&gt;
&lt;img loading="lazy" src="https://www.xiaoxiangtao.cn/posts/art-basel-2019-hong-kong/IMG_7211.JPG-768x1024.jpg"&gt;&lt;br&gt;
&lt;img loading="lazy" src="https://www.xiaoxiangtao.cn/posts/art-basel-2019-hong-kong/IMG_7205.JPG-1024x768.jpg"&gt;&lt;br&gt;
&lt;img loading="lazy" src="https://www.xiaoxiangtao.cn/posts/art-basel-2019-hong-kong/IMG_7204.JPG-1024x768.jpg"&gt;&lt;br&gt;
&lt;img loading="lazy" src="https://www.xiaoxiangtao.cn/posts/art-basel-2019-hong-kong/IMG_7199.JPG-768x1024.jpg"&gt;&lt;br&gt;
&lt;img loading="lazy" src="https://www.xiaoxiangtao.cn/posts/art-basel-2019-hong-kong/IMG_7195.JPG-768x1024.jpg"&gt;&lt;/div&gt;</description></item><item><title>王璜生：边界/空间——感观的释放与媒材的突破</title><link>https://www.xiaoxiangtao.cn/zh/posts/wang-huangsheng-boundary-space-release-of-sense-and/</link><pubDate>Wed, 03 Jun 2020 00:00:00 +0000</pubDate><author>15989119660@163.com (Xiangtao XIAO)</author><guid isPermaLink="false">https://www.xiaoxiangtao.cn/zh/posts/wang-huangsheng-boundary-space-release-of-sense-and/</guid><description>&lt;h2 id="简介"&gt;简介&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;人物&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;王璜生&lt;/p&gt;
&lt;p&gt;美术学博士，中央美术学院教授，博士生导师，中央美院美术馆馆长，全国美术馆专业委员会副主任，文化部“国家当代艺术研究中心”专家委员会委员。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;关键字&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;偷渡 战争 伤害 疗愈 救赎 挣扎 自由 天堂 束缚 生命&amp;hellip;&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;strong&gt;形式&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;水墨 拓印 摄影 装置影像&lt;/p&gt;
&lt;h2 id="图片"&gt;图片&lt;/h2&gt;
&lt;p&gt;&lt;img loading="lazy" src="https://www.xiaoxiangtao.cn/posts/wang-huangsheng-boundary-space-release-of-sense-and/20180415-IMG_5653-1024x766.jpg"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading="lazy" src="https://www.xiaoxiangtao.cn/posts/wang-huangsheng-boundary-space-release-of-sense-and/20180415-IMG_5656-683x1024.jpg"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading="lazy" src="https://www.xiaoxiangtao.cn/posts/wang-huangsheng-boundary-space-release-of-sense-and/20180415-IMG_5657-1024x683.jpg"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading="lazy" src="https://www.xiaoxiangtao.cn/posts/wang-huangsheng-boundary-space-release-of-sense-and/20180415-IMG_5665-571x1024.jpg"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading="lazy" src="https://www.xiaoxiangtao.cn/posts/wang-huangsheng-boundary-space-release-of-sense-and/20180415-IMG_5667-1024x653.jpg"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading="lazy" src="https://www.xiaoxiangtao.cn/posts/wang-huangsheng-boundary-space-release-of-sense-and/20180415-IMG_5684-1024x902.jpg"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading="lazy" src="https://www.xiaoxiangtao.cn/posts/wang-huangsheng-boundary-space-release-of-sense-and/20180415-IMG_5690-1024x503.jpg"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading="lazy" src="https://www.xiaoxiangtao.cn/posts/wang-huangsheng-boundary-space-release-of-sense-and/20180415-IMG_5696-1024x829.jpg"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading="lazy" src="https://www.xiaoxiangtao.cn/posts/wang-huangsheng-boundary-space-release-of-sense-and/20180415-IMG_5705-1024x531.jpg"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading="lazy" src="https://www.xiaoxiangtao.cn/posts/wang-huangsheng-boundary-space-release-of-sense-and/20180415-IMG_5713-1024x1015.jpg"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading="lazy" src="https://www.xiaoxiangtao.cn/posts/wang-huangsheng-boundary-space-release-of-sense-and/20180415-IMG_5718-1024x763.jpg"&gt;&lt;/p&gt;
&lt;h2 id="感受"&gt;感受&lt;/h2&gt;
&lt;p&gt;有的作品名字忘记了，在现场看感觉挺好的，引人深思，至于照片就没啥好看的，我也不觉得这些东西好看。&lt;/p&gt;
&lt;p&gt;大概思想就是与战争，偷渡等概念相关，所以很压抑，以前刚看完写了很多感想，现在回过头来看索然无味，没有相关经历其实看得没什么意思。&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>空间/色彩构成简介</title><link>https://www.xiaoxiangtao.cn/zh/posts/kongjian-secaigouchengjianjie/</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/kongjian-secaigouchengjianjie/</guid><description>&lt;p&gt;&lt;img loading="lazy" src="https://www.xiaoxiangtao.cn/posts/kongjian-secaigouchengjianjie/0ea4b6181cb5326fcce98ae7b4018818.jpg"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading="lazy" src="https://www.xiaoxiangtao.cn/posts/kongjian-secaigouchengjianjie/03335300b5144b0cdefab37330a194f9.jpg"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading="lazy" src="https://www.xiaoxiangtao.cn/posts/kongjian-secaigouchengjianjie/13bd94ded55b1ced978015321b9d289e.jpg"&gt;&lt;/p&gt;
&lt;h2 id="空间构成的方法"&gt;空间构成的方法&lt;/h2&gt;
&lt;p&gt;图形重叠 大小变化 倾斜变化 弯曲变化 投影效果 透视效果 面的链接 疏密变化&lt;/p&gt;
&lt;h2 id="色彩构成基本原理与法则"&gt;色彩构成基本原理与法则&lt;/h2&gt;
&lt;h3 id="曼塞尔色环"&gt;曼塞尔色环&lt;/h3&gt;
&lt;h3 id="色彩概念"&gt;色彩概念&lt;/h3&gt;
&lt;p&gt;基于纸上绘画的体系，是色彩颜料调色为准的显色系。&lt;/p&gt;
&lt;p&gt;色相：不同的颜色，红色对应绿色，蓝色对应黄色等。&lt;/p&gt;
&lt;p&gt;明度：由黑到白，明度最高为白色，明度最低为黑色，对于同一色相的颜色，明度越高颜色给人感觉越亮，反之则暗，接近黑色。&lt;/p&gt;
&lt;p&gt;纯度：色彩的纯度越低越接近灰色，最终纯度最低就是灰色。&lt;/p&gt;
&lt;p&gt;&lt;img loading="lazy" src="https://www.xiaoxiangtao.cn/posts/kongjian-secaigouchengjianjie/c1e18aab0491905f5a197bc79c021449-1.jpg"&gt;&lt;/p&gt;
&lt;h3 id="基本配色法则"&gt;基本配色法则&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;色彩对比构成：&lt;br&gt;
    将颜色分为主色、搭配色和点缀色，注意三者之间的比例关系&lt;/li&gt;
&lt;li&gt;色彩的调和构成：&lt;br&gt;
    属性统一调和：即色相、明度或者纯度三者之一保持相同使画面和谐（但配色应当注意突出重点）&lt;br&gt;
    连贯统一调和：用黑色或白色勾边，将对比强烈的色彩贯穿起来&lt;/li&gt;
&lt;li&gt;建议使用低明度高纯度的色彩（应试）&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="色彩情感"&gt;色彩情感&lt;/h3&gt;
&lt;p&gt;通过不同的色彩搭配烘托氛围，给人以忧伤或者喜悦的感受。&lt;/p&gt;</description></item><item><title>平面构成方法总结</title><link>https://www.xiaoxiangtao.cn/zh/posts/pingmiangouchengfangfazongjie/</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/pingmiangouchengfangfazongjie/</guid><description>&lt;h2 id="平面构成的三大元素"&gt;平面构成的三大元素&lt;/h2&gt;
&lt;h3 id="构成题的基本要求"&gt;构成题的基本要求&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;完成度高&lt;/li&gt;
&lt;li&gt;画面丰富，层次感强&lt;/li&gt;
&lt;li&gt;笔触细腻&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;建议：配色明快，色彩明度高，纯度不要太高。&lt;/p&gt;
&lt;p&gt;&lt;img loading="lazy" src="https://www.xiaoxiangtao.cn/posts/pingmiangouchengfangfazongjie/af260516807bee01596b22dcc07ad863.jpg"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading="lazy" src="https://www.xiaoxiangtao.cn/posts/pingmiangouchengfangfazongjie/f141dae82dc57f959ffce2fb2c1d7a98.jpg"&gt;&lt;/p&gt;
&lt;h3 id="点"&gt;点&lt;/h3&gt;
&lt;p&gt;点的大小不固定：点的形态大小在于比较，没有比较，点的大小不确定，点也可以被看做面。&lt;/p&gt;
&lt;p&gt;点的形状不固定：点可以是任意形状，只要这个形态在画面上与其他元素的大小关系满足我们从感性的角度判断其为一点。&lt;/p&gt;
&lt;p&gt;点能够塑造空间感：点可以塑造空间的明暗和虚实关系。&lt;/p&gt;
&lt;p&gt;点能够作为肌理。&lt;/p&gt;
&lt;h3 id="线"&gt;线&lt;/h3&gt;
&lt;p&gt;线有多种类型，包括直线、曲线、虚线等。线的形态不固定。&lt;/p&gt;
&lt;p&gt;线有粗细变化，一般满足近实远虚、在转折处加粗的特点。&lt;/p&gt;
&lt;p&gt;线能够勾勒轮廓，闭合的线就形成了面。&lt;/p&gt;
&lt;p&gt;与点类似，线也可以塑造肌理和空间感。&lt;/p&gt;
&lt;p&gt;线能够表达情感：直线一般代表着坚定、硬朗、速度等，曲线代表着韵动、柔韧、感性等。&lt;/p&gt;
&lt;h3 id="面"&gt;面&lt;/h3&gt;
&lt;p&gt;面分为 几何面 与 自由面 ，自由面是不规律的，随意的面，或者边界不明确、随意，类似于水墨晕开形成的面。&lt;/p&gt;
&lt;p&gt;面也分为 虚面 与 实面 ，点和线构成的面便是虚面。&lt;/p&gt;
&lt;p&gt;面具有正负形态：面正负形产生的错视。也就是我们常说的图与底的关系。图，就是形，也叫正形，位于画面醒目的位置，表达主要思想的元素，底，就是背景，也叫负形，位于正形的后面，对正形起衬托装饰的作用，让人感觉正形的存在。任何的图形都由正形和负形两部分组成，正形靠负形来衬托，负形需正形来界定。图底分明的图像层次感鲜明，更容易吸引关注的目光。不仅如此，还有一种矛盾图形，比如说太极图，分辨不出图与底。&lt;/p&gt;
&lt;p&gt;面可以突出重点，增加对比效果。&lt;/p&gt;
&lt;p&gt;面与面有许多不同的结合方式：重叠、透叠、分离、相切、重合等。&lt;/p&gt;
&lt;h3 id="构成法则"&gt;构成法则&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;重复&lt;br&gt;
    有规律的进行排列组合。&lt;/li&gt;
&lt;li&gt;近似&lt;br&gt;
    确定基本形不变，基本形的内容与组成形式改变。&lt;/li&gt;
&lt;li&gt;特异&lt;br&gt;
    有规律的形态中进行小部分的变异，形成视觉中心点，使画面生动活泼。&lt;/li&gt;
&lt;li&gt;渐变&lt;br&gt;
    指基本形进行规律化的渐变处理：比如产品造型上有植物渐变到灯具。带来节奏感和韵律感（进行构图和构思比较耗时），渐变可以是九宫格的形式或者综合的形式。重点在于渐变过程的展现。&lt;/li&gt;
&lt;li&gt;发射&lt;br&gt;
    从画面的视觉中心点出发，带来空间感和动感，发射的基本形可以任意变化（不是非要直线）。&lt;/li&gt;
&lt;li&gt;对比&lt;br&gt;
    具有差异元素构成的作品，对比包括色彩、大小、虚实、曲直对比等。&lt;/li&gt;
&lt;li&gt;密集&lt;br&gt;
    疏密关系，画面具有节奏感。&lt;/li&gt;
&lt;li&gt;分割&lt;br&gt;
    可以以等形、等量、重复、自由等形式进行分割。参考毕加索的画作。&lt;/li&gt;
&lt;li&gt;异构（同构）&lt;br&gt;
    基本形局部元素图形变化，比如一个肺部形状，内容替换为西蓝花。一般变化的就是要表达的主题本身。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;一般在画面中会使用多种构成法则进行组合，综合体现效果。&lt;/p&gt;
&lt;h2 id="平面构成的表现形式"&gt;平面构成的表现形式&lt;/h2&gt;
&lt;h3 id="概念"&gt;概念&lt;/h3&gt;
&lt;p&gt;元素：构成画面的基本形，由造型基本元素点线面组成。&lt;/p&gt;
&lt;p&gt;构成法则：对元素进行组合的一些规则。&lt;/p&gt;
&lt;p&gt;&lt;img loading="lazy" src="https://www.xiaoxiangtao.cn/posts/pingmiangouchengfangfazongjie/f8319a3430c40b127216254613efe173.jpg"&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>What is Generative Design?</title><link>https://www.xiaoxiangtao.cn/zh/posts/what-is-generative-design/</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/what-is-generative-design/</guid><description>&lt;p&gt;Generative design is an &lt;a href="%5C%22//en.wikipedia.org/wiki/Iteration%5C%22"&gt;iterative&lt;/a&gt; &lt;a href="%5C%22//en.wikipedia.org/wiki/Design%5C%22"&gt;design&lt;/a&gt; &lt;a href="%5C%22//en.wikipedia.org/wiki/Process_%28engineering%29%5C%22"&gt;process&lt;/a&gt; that involves a &lt;a href="%5C%22//en.wikipedia.org/wiki/Computer_program%5C%22"&gt;program&lt;/a&gt; that will &lt;a href="%5C%22//en.wikipedia.org/wiki/Generator_%28mathematics%29%5C%22"&gt;generate&lt;/a&gt; a certain number of &lt;a href="%5C%22//en.wikipedia.org/wiki/Output_%28computing%29%5C%22"&gt;outputs&lt;/a&gt; that meet certain &lt;a href="%5C%22//en.wikipedia.org/wiki/Constraint_%28mathematics%29%5C%22"&gt;constraints&lt;/a&gt;, and a &lt;a href="%5C%22//en.wikipedia.org/wiki/Designer%5C%22"&gt;designer&lt;/a&gt; that will fine tune the &lt;a href="%5C%22//en.wikipedia.org/wiki/Feasible_region%5C%22"&gt;feasible region&lt;/a&gt; by changing &lt;a href="%5C%22//en.wikipedia.org/wiki/Maxima_and_minima%5C%22"&gt;minimal and maximal&lt;/a&gt; values of an &lt;a href="%5C%22//en.wikipedia.org/wiki/Interval_%28mathematics%29%5C%22"&gt;interval&lt;/a&gt; in which a &lt;a href="%5C%22//en.wikipedia.org/wiki/Variable_%28mathematics%29%5C%22"&gt;variable&lt;/a&gt; of the program meets the &lt;a href="%5C%22//en.wikipedia.org/wiki/Set_%28mathematics%29%5C%22"&gt;set&lt;/a&gt; of constraints, in order to reduce or augment the number of outputs to &lt;a href="%5C%22//en.wikipedia.org/wiki/Choice%5C%22"&gt;choose&lt;/a&gt; from. The program doesn&amp;rsquo;t need to be run on a &lt;a href="%5C%22//en.wikipedia.org/wiki/Machine%5C%22"&gt;machine&lt;/a&gt; like a &lt;a href="%5C%22//en.wikipedia.org/wiki/Digital_computer%5C%22"&gt;digital computer&lt;/a&gt;, it can be run by a human for example with &lt;a href="%5C%22//en.wikipedia.org/wiki/Pen_and_paper%5C%22"&gt;pen and paper&lt;/a&gt;. &lt;a href="%5C%22//en.wikipedia.org/wiki/Generative_Design#cite_note-1%5C%22"&gt;[1]&lt;/a&gt; The designer doesn&amp;rsquo;t need to be a &lt;a href="%5C%22//en.wikipedia.org/wiki/Human%5C%22"&gt;human&lt;/a&gt;, it can be a &lt;a href="%5C%22//en.wikipedia.org/wiki/Test_%28assessment%29%5C%22"&gt;test&lt;/a&gt; program in a testing environment or an &lt;a href="%5C%22//en.wikipedia.org/wiki/Artificial_intelligence%5C%22"&gt;artificial intelligence&lt;/a&gt; (see for example &lt;a href="%5C%22//en.wikipedia.org/wiki/Generative_adversarial_network%5C%22"&gt;Generative adversarial networks&lt;/a&gt;). The designer &lt;a href="%5C%22//en.wikipedia.org/wiki/Learning%5C%22"&gt;learns&lt;/a&gt; to &lt;a href="%5C%22//en.wikipedia.org/wiki/Refinement_%28computing%29%5C%22"&gt;refine&lt;/a&gt; the program (usually involving &lt;a href="%5C%22//en.wikipedia.org/wiki/Algorithm%5C%22"&gt;algorithms&lt;/a&gt;) with each iteration as his design &lt;a href="%5C%22//en.wikipedia.org/wiki/Goal%5C%22"&gt;goals&lt;/a&gt; become better &lt;a href="%5C%22//en.wikipedia.org/wiki/Definition%5C%22"&gt;defined&lt;/a&gt; over time.&lt;/p&gt;</description></item><item><title>关于未来设计的一点想法</title><link>https://www.xiaoxiangtao.cn/zh/posts/guanyuweilaishejideyidianxiangfa/</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/guanyuweilaishejideyidianxiangfa/</guid><description>&lt;p&gt;&lt;img loading="lazy" src="https://www.xiaoxiangtao.cn/posts/guanyuweilaishejideyidianxiangfa/5736585.png"&gt;&lt;/p&gt;
&lt;p&gt;工业设计起源于工业革命，技术的革新带来了工业设计，带来了一系列人类工具的创新和不同的可能性，这些带来了设计的需求。那么工业设计是不是受限于技术呢？技术发展的停滞或速度趋缓是否导致设计变成了外观设计？&lt;/p&gt;
&lt;p&gt;当前看到的两个方向，一个是拥抱信息技术，既信息革命，最基本的就是交互设计领域，信息技术，媒体的革新给交互设计带来了巨大的发展空间，单一的屏幕由于内容可改变实际带来了无穷尽的显示空间，VR、AR带来的更是3维的现实空间，这里就会有很多的设计需求。&lt;/p&gt;
&lt;p&gt;另一个方向就是整合设计、社会设计、服务设计等设计方向，当技术发展放缓，人们可以基于预测技术进行设计，这就是超前的设计，或者将现有技术进行充分利用，对现有技术进行排列组合式的再创造，而服务设计、社会设计、系统设计一定程度上脱离了对实物的设计，实际上就是将设计的思想运用到各个领域去创造价值。超前的设计，各个领域全方位的设计对企业的战略和竞争力提升很有帮助。&lt;/p&gt;
&lt;p&gt;信息是降低不确定性的，它帮助人们做决定，那么设计呢？设计是解决问题的，它要解决的是什么问题？设计也面对着充满不确定性的世界，设计也降低不确定性吗？&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><item><title>什么是服务设计？</title><link>https://www.xiaoxiangtao.cn/zh/posts/shenmeshifuwusheji/</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/shenmeshifuwusheji/</guid><description>&lt;p&gt;服务是一种无形的经济活动，它以满足用户需求为基础，创造服务价值为目标，在服务提供者与服务接受者（用户）之间进行价值传递的互动行为。 &lt;strong&gt;服务设计是以用户为主要视角，协同多方利益相关者共创，通过人员、场所、产品、信息等要素创新的综合集成，实现服务提供、服务流程、服务触点的系统创新，从而提升服务体验、服务品质和服务价值的设计活动。[1]&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;服务设计强调：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;1.服务具备系统的特质：服务是一整个逻辑严密的流程，要从全局、整体的角度考虑，在各个环节都为客户创造良好的体验，在进行服务设计时，一个环节的服务失败会引发连锁反应导致后续环节出现一系列问题，用户有时会因为一个触点的糟糕体验而否定整个服务的提供，这也就是我们常说的服务周到，“周到”就是照顾到了方方面面，给用户带来了一个完整舒心的体验。&lt;/p&gt;
&lt;p&gt;2.服务设计的内容包括了 服务设施、服务产品、服务系统、服务规则、服务流程和服务政策等，服务设计将服务质量视为前提条件，特别关注服务介面和用户体验，重在设计整个使用流程中可以引发体验的不同触点。服务是被提供给用户的，从设计的角度看，设计服务的主要目的就是为用户提供良好的体验，而服务对企业效益、效率等的帮助，对企业品牌的打造等都建立在这个基础之上，无法给顾客提供良好的体验，其他都是空谈。&lt;/p&gt;
&lt;p&gt;3.服务设计强调用户视角，服务设计可以帮助企业全面的、共情的理解用户需求，探索用户旅程的不同接触点。和系统设计类似，服务设计要去了解用户需求，了解用户达到目的的流程，在此基础上进行优化，提供良好的服务满足用户需求。服务在给用户带来帮助的同时还需要给用户带来深刻的印象，提高用户的忠诚度。&lt;/p&gt;
&lt;p&gt;4.服务设计强调不同利益相关者的参与、协作与共创。服务是一个服务提供者与服务接受者交互的过程，服务通常不是单一组织或者个体提供的，而是不同利益相关者共同提供的，因此需要参与、协作、共创。举例来说，一个简单的服务：为客户提供一杯水，这个服务由递水的人（服务员或者与客户交谈的人），供应水的人（饮水机的购置、位置摆放），送饮用水的人共同完成，他们的工作都由这项服务产生并为此获得回报，任何一方的失误都导致服务的提供出现问题。&lt;/p&gt;
&lt;p&gt;5.强调服务设计的跨领域、跨学科。服务设计整合了设计、管理和过程工程中的多种技能和方法，实际产出系统、流程的设计旨在为客户提供全面的服务。&lt;/p&gt;
&lt;p&gt;相较其他学科对服务的研究，“用户视角”是设计学科服务研究的一个独特视角；“服务体验”是设计学科研究服务的重要关注点之一。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;理解服务设计定义：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;服务设计的原则：以用户为中心，协同多方利益相关者&lt;br&gt;
服务设计的内涵：对服务提供、流程、触点的全局优化和系统创新&lt;br&gt;
服务设计的外延：服务设计引导人员、环境、设施、信息等要素创新及其综合集成&lt;br&gt;
服务设计的作用：提升服务体验、效率和价值&lt;/p&gt;
&lt;h2 id="参考文献"&gt;参考文献&lt;/h2&gt;
&lt;p&gt;[1]胡飞,李顽强.定义“服务设计”[J].包装工程,2019,40(10):37-51.&lt;/p&gt;</description></item></channel></rss>