[{"content":" Your browser does not support the video element. DesktopPet 是一只常驻在 macOS 桌面上的猫，点一下它就可以打开对话框聊天，在任意 App 里划选一个英文单词可以直接看到释义并记进生词本，听英文课或者讲座的时候它能把声音实时转成字幕，下课后再把整场内容整理成一份中文笔记。项目已经开源在 GitHub，代码主要由 Claude Code 等 AI coding agent 协作完成，我负责的是需求和交互的定义、日常使用中的验收，以及各个环节的模型对比和选择。\n为什么要做这个 出国读书以后，课程、讲座和线上会议基本都是英文的，上课的时候经常要同时开好几个工具，听不清的时候要看字幕，遇到生词要去查词典，课后还要回看录播整理笔记。其实飞书妙记之类的产品已经有很成熟的方案，但这些功能分散在不同的窗口里，来回切换很打断注意力，另外我自己也想研究一下本地部署模型的实际效果。\n所以我想做的是一个常驻在桌面最上层、随时可以唤起的入口，把学习要用的几个功能集中在一起，形象用的是我以前养的一只银渐层，一个有陪伴感的小猫比一个工具面板更让人愿意一直开着。最开始提给 AI 的需求只有三条：一个置顶的桌面宠物，可以对话；输入或者划选英文单词时给出翻译并记录生词；播放英文视频时流式输出字幕。在动手之前，我先让它调研了有没有已经落地、容易改造的开源项目，再根据调研结果给方案。\n先把功能收窄 第一版是在一个开源的数字人项目上改的，这个项目本身带了很多东西，比如角色人设、语音合成、Live2D 模型和好几种窗口模式。我觉得桌宠既然是用来学习的，就不应该有太多和学习无关的表演功能分散注意力，所以把人设和语音合成都删掉了，只保留桌宠形态、对话和查词记词，字幕放到下一步再做。\n删人设的时候遇到了一个有意思的问题。原型里有一个照着配置模板写的人设，角色名叫「奶糖」，删掉之后对话里还是会时不时冒出这个名字。排查后发现原因出在我的助理记忆库上，里面其实混着两类内容，一类是带日期的事件记录，记的是当时发生了什么，保留下来没有问题；另一类是描述当前状态的档案，写进去的时候是对的，但之后没有跟着项目更新，里面还写着\u0026quot;当前使用奶糖人设\u0026quot;，每次检索的时候就会被重新召回。最后的处理办法是事件记录保留，状态档案更新。这件事让我意识到长期记忆里的\u0026quot;历史\u0026quot;和\u0026quot;现状\u0026quot;需要分开管理，历史记录放着不会出错，但现状如果不及时更新，过一段时间就会变成错误的信息。\n细节决定了它能不能一直开着 一个常驻桌面的工具，用起来舒不舒服很大程度上取决于焦点、输入法、气泡位置、屏幕边界和动画节奏这些细节，而不是功能有多少。实际用了一段时间之后，我提的修改基本都集中在这些地方，比如对话气泡要跟着猫移动，并且根据猫在屏幕的哪个角落自动翻转方向，始终留在屏幕里面；点猫打开或收起气泡，点别的地方自动收起；打开气泡时输入框直接获得焦点，去掉发送按钮只用回车发送，也去掉了关闭按钮；中文输入法的候选词不能被气泡挡住；猫可以拖到外接显示器上，但不能被拖到找不回来的位置，启动时默认出现在主屏幕上。\n点一下猫打开的对话框，输入框自动获得焦点，回车发送，下面是字幕、对话和生词本的入口\n猫的动作节奏我也按照真实的猫来设计：没人理的时候它在睡觉，点一下会爬起来 wink 一下再坐好，气泡收起后大约 5 秒会打个哈欠，再过一会儿就重新趴下睡觉。字幕的验收标准也是从阅读体验出发的，同一段视频里，字幕的停顿不能出现在一句话的中间。\n生词本，查过的单词都记在这里，可以随时回看和删除\n字幕：两个场景，按环节选模型 字幕是这个项目里花时间最多的部分，也让我对本地模型有了更具体的认识。\n做下来我发现这里其实有两个不同的场景。一个是在线会议和讲座的实时字幕，对实时性要求很高，模型必须支持流式输出；另一个是给已有的录音或视频加字幕，对实时性要求低一些，字幕晚一点出来也可以，但需要一次处理完整段内容，准确性更重要。\n最早的实现是把音频按固定时长切成小段交给 Whisper 转写，结果字幕大约每 6 秒才整段出来一次，读起来一顿一顿的。后来我用同一段课程录音对比了 macOS 自带的 SpeechAnalyzer 和 Whisper large-v3，SpeechAnalyzer 大约每秒就能刷新一次，速度快了 7 到 11 倍，但它为了速度牺牲了理解能力，缺少上下文语境，最多只能根据当前这句话来推测，专业术语的识别也更差，给它提供术语表实测也没有任何效果。\n所以最后我没有只选一个模型，而是按环节分工，下面是我自己日常在用的本地方案：\n环节 方案 选择依据 课上实时字幕 Apple SpeechAnalyzer，麦克风或系统声音二选一，同时保存录音 只有它的延迟足够低 课后重新转写 先让 Claude Sonnet 从实时字幕里提取术语表，再用本地的 Qwen3-ASR 带着术语表把录音重新转写一遍 在一节 106 分钟的课里，8 个已知容易认错的术语，Qwen3-ASR 认对了 7 个，Apple 只认对 1 个 课堂笔记 Sonnet 通读整场字幕写中文笔记，再用代码逐条核对引文和时间戳 本地小模型分批总结的效果不够理想 分工的考虑主要是节省 token，把重复、机械、量大的工作交给本地模型，把需要通读全文、理解上下文的工作交给云端的大模型。对于模型输出不可靠的地方，我尝试用两类护栏来约束，一类是代码护栏，检查笔记里的每条引文能不能在字幕原文中找到、时间戳是否对得上；另一类是小模型护栏，用小模型做术语校正，对比下来 Qwen 4B 和 9B 的校正结果一致，但 4B 快了大约 3 倍。一场 68 分钟的分享，最后生成的笔记里 41 条引文和 209 个时间戳全部通过了校验。\n这些模型都是在同一份素材上直接对比输出结果选出来的，比较的时候我主要考虑三个方面：一是模型大小和性能，电脑能不能撑得住、速度够不够快；二是结构化输出和指令遵循能力，能不能按要求输出规范的字幕，会不会把提示词当成字幕内容输出；三是识别质量，包括对杂音和环境音的幻觉情况，以及专业术语、数字和公式的识别。\n还没有做好的地方：动画 我希望桌宠足够精美逼真，动作足够丝滑，但目前还没有实现比较好的效果，几种方案都试过，各有各的问题。Codex 和 Hermes 自带的宠物素材像素都比较低，猫的毛发质感出不来；用 GIF 的话颜色数量有限，同样影响毛发的质感；先生成视频再抽帧，处理起来很麻烦，而且很难精确控制宠物的动作，比如猫跑到一半被点了一下、回头看你，这种交互可能就实现不好。\n现在采用的是用 GPT 逐帧生图、再用代码拼接成动画的方式，单帧画面的精度有保障，但 GPT 做不到多帧之间的对齐，生成的几张图边缘位置会有细微差异，连起来播放的时候动作就会有卡顿、不连贯的感觉。\n和 AI 协作开发 这个项目的代码几乎都是 AI coding agent 写的，我的工作主要是定义需求和验收标准、在日常使用中发现问题、决定功能上的取舍、判断模型对比的结果，并对最后的效果负责。开发过程中项目整体重写过一次，改成了原生的 macOS 应用，重写之前先把关键功能的行为录成了 20 个回归用例，新版本逐条对照验证，避免只凭感觉判断\u0026quot;看起来差不多\u0026quot;。\n目前的开源版本需要 macOS 26 以上和 Apple Silicon 芯片，默认接入任意 OpenAI 兼容的接口，也可以接本机的 Ollama 或 LM Studio；上面提到的\u0026quot;Qwen3-ASR 重新转写 + Sonnet 笔记\u0026quot;是我本机的配置，没有放进开源版本的默认功能里。\n文章开头的视频也是用代码做的，画面是用 HTML 写的 2D 动画，逐帧截图后合成，背景音乐也是用程序合成的。\n","permalink":"https://www.xiaoxiangtao.cn/zh/posts/desktop-pet/","summary":"一个常驻 macOS 桌面的学习入口，可以聊天、划词查词、显示实时字幕并在课后整理笔记。这里记录了做这个项目时的需求取舍、模型对比和一些体会。","title":"DesktopPet：我给自己做的一个英文学习桌宠"},{"content":"https://docs.openclaw.ai/\nOpenClaw部署 服务器与系统环境 腾讯云轻量应用服务器 4核CPU，4GB内存，70G系统盘\nubuntu 22.04.5 LTS 64bit，根据chatGPT推荐兼容性最好\n安装OpenClaw 更新系统并下载依赖 # 更新系统 sudo apt update \u0026amp;\u0026amp; sudo apt upgrade -y # 安装基础依赖 sudo apt install -y git curl wget unzip build-essential # 安装nvm curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash source ~/.bashrc # 安装node.js nvm install --lts nvm use --lts # 验证安装成功，查看版本号 node -v npm -v 下载OpenClaw npm install -g openclaw@latest 启动OpenClaw # 初始化配置并安装 openclaw onboard --install-daemon # install-daemon 自动将 OpenClaw 的 Gateway 服务安装为后台守护进程，静默运行， # 开机自动启动及崩溃自动重启 from chatGPT\n配置项 含义 作用 选择建议 跳过后如何配置 model / auth provider 选择模型提供商和认证方式 决定可用模型、调用方式、成本与延迟 选择你能用到的最强模型或最稳定的 provider，如 OpenAI / Anthropic / Ollama 后续可通过 openclaw configure 或手动修改 models.providers 补齐 filter models by provider 筛选某个 provider 下的模型 避免模型过多，防止误选不支持的模型 新手可选单一 provider，高级用户可精确筛选 使用 openclaw models list + openclaw models set \u0026lt;model\u0026gt; 或修改配置文件 default model 默认使用的模型 决定 agent 默认调用的 primary 模型 primary: 强模型，fallback: 便宜模型 手动设置：openclaw models set \u0026lt;model\u0026gt; 或修改 agents.defaults.model.primary model check 检查模型可用性 检测 API key 是否有效、provider 是否可用 必做，保证后续 agent 可用 手动执行：openclaw models status select channel 选择 bot 的入口渠道 决定用户如何与 agent 交互 Telegram/Discord/Web/UI，本地测试可用 Web/CLI，生产建议 Telegram 或 Docker + channel 后续可通过 openclaw configure 或修改 channels 配置 web search 是否开启联网搜索能力 让 agent 可查最新信息，不局限于训练数据 做助手或查询最新信息可开，内网环境可关 后续可在 tools 或配置文件中添加搜索工具 search provider 选择搜索引擎 决定搜索质量、返回结果结构和成本 优先稳定 API，如 SerpAPI 后续通过 tool 配置或 openclaw configure 添加 hooks 生命周期钩子 可插入自定义逻辑，如安全检查、日志、工具权限 新手可跳过，安全/企业级必配 后续通过编写插件或修改 gateway 配置补充 How do you want to hatch your bot? 决定 agent 初始化方式 控制 agent 创建方式和配置复杂度 选TUI，二者不冲突，web UI仍可访问，但是没有配置LLM API时TUI无法交互 后续可通过重新 run openclaw onboard 或手动修改配置 远程访问web UI 在本地电脑命令行执行以下命令，然后在浏览器访问127.0.0.1:18789\n初步体验下来web UI用于配置参数的体验并不好，开发者更多是为开发人员设计的这款产品，配置项不是傻瓜式的，也没有提示文案，比如配置LLM的API居然要自己在输入框里输入JSON格式的配置内容，而且没有告知格式规范，反而TUI更加简单。\n# 创建一个 SSH 本地端口转发（Local Port Forwarding）隧道，用于安全地将远程服务器上的服务通过 SSH 加密通道映射到你本地的电脑上访问。 ssh -N -L 18789:127.0.0.1:18789 你的系统用户名@你的服务器ip 关于LLM api配置 # 配置命令 openclaw configure https://bailian.console.aliyun.com/cn-beijing/?spm=5176.45613825.0.0.46735b4cFCNR9w\u0026amp;tab=doc#/doc/?type=model\u0026amp;url=3020785\nQQ Bot配置 - 通过QQ与龙虾对话 session按入口和会话实例隔离，TUI和QQ聊天属于两个main session，彼此不共享上下文与记忆。\nhttps://q.qq.com/qqbot/openclaw/\nAgent初始化 初次见面 Bootstrapping 在.openclaw/workspace下，有BOOTSTRAP.md文件，首次在tui界面与agent对话，LLM会先阅读该文件，遵循指示与用户交互以完成身份定位，然后会改写agent.md等文件，并删除BOOTSTRAP.md\n注意到直接通过QQ Bot与Agent对话，没有触发Bootstrapping，需要通过TUI或web UI对话\n关键配置 控制层（怎么思考） ├── SOUL.md ├── model config 记忆层（记住什么） ├── session（短期） ├── memory（长期） ├── RAG（外部） 执行层（怎么做事） ├── workspace ├── tools ├── skills ├── sub-agents 配置项 作用 是否隔离（按session） 是否持久化 是否影响token 典型用途 workspace agent的工作目录，存储文件、代码、运行产物 是 是 否（间接影响） 文件处理、代码执行、任务输出 SOUL.md / AGENT.md agent的核心行为规则（系统提示词） 否（全局注入） 是 是（高） 控制agent策略、角色、执行方式 memory 长期记忆存储（结构化/非结构化） 视配置而定 是 是（中） 记录用户偏好、历史信息 session（主会话） 当前对话上下文（聊天历史） 是 否（短期） 是（高） 多轮对话、上下文推理 sub-agent session 子代理的独立执行上下文 是（完全隔离） 否 是（低） 执行复杂或耗时任务 compaction（压缩） 对长上下文进行摘要压缩 是 否 是（降低） 控制上下文长度、节省token tools agent可调用的工具集合 否（全局配置） 是 否 执行外部操作（API、代码等） skills 封装好的高阶能力（工具组合） 否 是 否 提供复用能力（如任务流） model config 模型参数（maxTokens、temperature等） 否 是 是（高） 控制生成行为与成本 RAG / embeddings 外部知识库检索系统 否（通常全局） 是 是（中） 提供长期知识支持 机制 触发方式 是否依赖时间 是否在主session执行 是否有上下文 是否创建任务记录 核心特点 典型用途 cron job 时间调度（精确时间 / cron表达式） 是（精确） 可选（main / isolated） 可无（isolated） 是 精确调度、可隔离执行 定时报告、提醒、批处理任务 heartbeat 固定间隔触发（默认30分钟） 是（近似） 是（主session） 有（完整上下文） 否 周期性“思考/检查” inbox检查、通知、状态监控 hook 事件触发（生命周期/工具调用等） 否 视事件而定 视情况而定 否 事件驱动、即时执行 自动化流程、拦截/增强行为 如果没有需要agent定期判断的事项，可以把heartbeat关闭来节省token。 cron = 我让它什么时候做 heartbeat = 它自己定期想一想 hook = 有事发生就自动做 Sub Agent与Muti Agent 设置主agent在遇到复杂耗时问题时启动子代理处理任务，并将最终的任务结果反馈给主agent，以此来节省token与时间。\nSub-agent 是“非阻塞”的，主agent不需要等待子agent，可以继续与用户进行其他对话，子agent任务执行后将结果返回给主agent实现闭环。 子agent是独立session，不会继承主agent的上下文与SOUL.md，因此可以节约token。 子agent是临时工，在后台执行任务，结束后将结果返回给主agent。 适合长任务、并行任务、专业分工 通过设置SOUL.md来指导主Agent何时启用sub agent，定义行为规则，并给子agent一段提示词设定其身份、守则用于更好的完成指定任务。 多个长期独立存在的agent，具备独立 workspace、memory、SOUL.md、session。\n用于设定多个长期角色，比如一个长期专门写代码，一个长期做调研，各自有记忆和灵魂 可以设置不同的权限、不同的模型、不同的消息通道（微信 or QQ） Context window相关配置 初步感受是非常的消耗token，简单的对话都会消耗上万token，而如果使用了不够聪明的LLM的话一旦思考陷入循环消耗更是惊人，解决复杂任务单词消耗token可达百万token。\n基于模型的能力设置合理模型的上下文窗口，比如minimax2.5本身支持200k的上下文，更大的上下文可以使得AI的对话连贯性更好，避免频繁的压缩信息。\nSKILL实践 基于Notion数据库进行时间管理 https://clawhub.ai/xiangtaoxiao/notion-time-management-matrix\n基于自己搭建的notion的数据库模版（四象限时间管理）作为数据源，openclaw通过notion api 接口调用来实现。通过微信聊天的方式添加及结束代办事项，临近日期自动提醒，提供事项的相关文件及信息，更新进度。接口调用参考notion skill。\n比传统模式好在哪？通过微信交互更自然，AI秘书可以提供情绪价值🐶 其实直接记在openclaw里效果最好，但是缺少一个好看界面，以及需要防止LLM不稳定导致数据出错的情况。 可以基于openclaw本身的cron定时任务来实现定时检查待办事项及提醒。cron本质就是在指定时间通过指定session向AI发出一个指令。 遇到的问题： TRAE不遵循openclaw的规范：提供openclaw的skill文档链接，让agent阅读。 安装后agent不识别：在TOOL.md里加提示词要求AI使用这个技能，或者首次对话明确要求使用这个skill；至于如何让skill安装好后agent识别语义触发这个skill，我估计是因为openclaw的系统提示词或者agent提示词默认了待办任务的处理方式，因此优先级更高。 skill的状态不ready：执行命令看看是哪个配置不满足，修改即可 openclaw skills check 调试困难，看不到agent的思考和工具调用过程：安装clawmetry解决 系统拼错路径，乱加空格，导致命令无法执行，问了gpt，进行两处修改：一个是是skill的文件夹名称，把‘-’改成‘_’，然后提示词里的路径，增加了./script/，这次很顺利，AI没有再试错，直接执行成功了。 AI写的任务似乎逻辑的严谨程度不是特别高，遇到了AI不读取状态文件直接通过记忆行事的情况，理论上这是聪明的做法，但是如果提示词不做要求，AI对情况的变化缺乏判断。（miniMax2.5） openclaw的原生记忆能力不好，目前看memory文件记住了很多不重要的甚至错误的内容，并且这些内容严重污染上下文。有时候明确指出其错误并要求记忆，反而不会记录到memory文件。 也许可以试一下直接用notino api调用（也就是notion技能），然后魔改一下让AI记住不同数据库的用途、结构，然后能否做到同步管理我的待办事项、知识库？ 总结经验 提示词技巧：\n避免AI随意发挥：找官方文档让AI先看完，然后严禁AI违反官方文档设置的规范 避免AI只改动局部，不做全局考量： 规避部分模型对‘-’等token处理能力以及指令拼接能力差的问题：根据不同大模型的能力，以及temperature，其拼接路径及系统指令的能力有所区别，对于不稳定的情况最好是把指令固化下来作为工具，然后AI输出指令调用工具。这个问题可能随着LLM的强大得到解决 避免AI总是根据记忆行事：虽然openclaw提供了memory结构，但一些关键数据如果发生变更，而AI仍遵循记忆的内容执行操作，就会导致失败或数据异常更新。关键配置项最好要求AI读取配置文件，而禁止从上下文与记忆中获取，尤其是在调试功能时。 ","permalink":"https://www.xiaoxiangtao.cn/zh/posts/openclaw-deployment-and-application/","summary":"\u003cp\u003e\u003ca href=\"https://docs.openclaw.ai/concepts/multi-agent\"\u003ehttps://docs.openclaw.ai/\u003c/a\u003e\u003c/p\u003e\n\u003ch1 id=\"openclaw部署\"\u003eOpenClaw部署\u003c/h1\u003e\n\u003ch2 id=\"服务器与系统环境\"\u003e服务器与系统环境\u003c/h2\u003e\n\u003cp\u003e腾讯云轻量应用服务器 4核CPU，4GB内存，70G系统盘\u003c/p\u003e\n\u003cp\u003eubuntu 22.04.5 LTS 64bit，根据chatGPT推荐兼容性最好\u003c/p\u003e\n\u003ch2 id=\"安装openclaw\"\u003e安装OpenClaw\u003c/h2\u003e\n\u003ch3 id=\"更新系统并下载依赖\"\u003e更新系统并下载依赖\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# 更新系统\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esudo apt update \u003cspan class=\"o\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e sudo apt upgrade -y\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# 安装基础依赖\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esudo apt install -y git curl wget unzip build-essential\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# 安装nvm\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ecurl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh \u003cspan class=\"p\"\u003e|\u003c/span\u003e bash\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003esource\u003c/span\u003e ~/.bashrc\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# 安装node.js\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003envm install --lts\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003envm use --lts\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# 验证安装成功，查看版本号\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003enode -v\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003enpm -v\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"下载openclaw\"\u003e下载OpenClaw\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003enpm install -g openclaw@latest\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"启动openclaw\"\u003e启动OpenClaw\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# 初始化配置并安装\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eopenclaw onboard --install-daemon\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# install-daemon 自动将 OpenClaw 的 Gateway 服务安装为后台守护进程，静默运行，\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# 开机自动启动及崩溃自动重启\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003efrom chatGPT\u003c/p\u003e","title":"OpenClaw部署与应用"},{"content":"AI Agent（从 Chatbot 到生产级 Agent） AI Agent是LLM应用的高级形态，能够自主规划、执行任务并与环境交互。\n经典论文：\nYao, S., et al. (2022). \u0026ldquo;ReAct: Synergizing Reasoning and Acting in Language Models.\u0026rdquo; ICLR. [论文链接] - ReAct框架，Agent核心范式 Wei, J., et al. (2022). \u0026ldquo;Chain-of-Thought Prompting Elicits Reasoning in Large Language Models.\u0026rdquo; NeurIPS. [论文链接] Wang, G., et al. (2024). \u0026ldquo;A Survey on Large Language Model based Autonomous Agents.\u0026rdquo; arXiv. [论文链接] - Agent综述 一、整体演进路径 Chatbot → Tool Use → Agent → Production Agent（工业级） 演进说明：\nChatbot: 仅能对话，无法执行外部操作 Tool Use: 能调用单一工具 Agent: 能自主规划并执行多步骤任务 Production Agent: 工业级，具备错误处理、权限控制、监控等能力 二、核心概念拆解 1️⃣ Chatbot LLM + Prompt\n特点：\n只能对话 无法执行外部操作 无状态或弱状态 经典论文：\nVinyals, O., \u0026amp; Le, Q. (2015). \u0026ldquo;A Neural Conversational Model.\u0026rdquo; ICML Deep Learning Workshop. [论文链接] 2️⃣ Function / Tool / Function Calling Function 真实执行代码的最小单元。\nTool Function 的 LLM 可调用接口描述。\n经典论文：\nSchick, T., et al. (2023). \u0026ldquo;Toolformer: Language Models Can Teach Themselves to Use Tools.\u0026rdquo; NeurIPS. [论文链接] - 工具学习开创性工作 Parisi, A., et al. (2022). \u0026ldquo;TALM: Tool Augmented Language Models.\u0026rdquo; arXiv. [论文链接] Function Calling LLM 生成结构化调用请求，Runtime 执行函数。\n技术实现：\nOpenAI Function Calling API Anthropic Tool Use LangChain Tools 三、Agent 的本质 LLM + Tools + Loop\n经典论文：\nYao, S., et al. (2022). \u0026ldquo;ReAct: Synergizing Reasoning and Acting in Language Models.\u0026rdquo; ICLR. [论文链接] Shinn, N., et al. (2023). \u0026ldquo;Reflexion: Language Agents with Verbal Reinforcement Learning.\u0026rdquo; NeurIPS. [论文链接] Agent Loop Thought（思考）→ Action（行动）→ Observation（观察）→ Thought... ReAct框架示例：\nQuestion: What is the elevation range for the area that the eastern sector of the Colorado orogeny extends into? Thought 1: I need to search Colorado orogeny, find the area that the eastern sector of the Colorado orogeny extends into, then find the elevation range of that area. Action 1: Search[Colorado orogeny] Observation 1: The Colorado orogeny was an episode of mountain building... Thought 2: I need to search eastern sector of the Colorado orogeny. Action 2: Search[eastern sector of Colorado orogeny] ... 四、Agent Runtime Agent Runtime是执行Agent逻辑的核心基础设施。\n核心职责：\n解析 tool call 执行函数/API 控制循环（循环次数限制、超时控制） 错误处理 权限控制 状态管理 主流框架：\nLangChain AutoGPT BabyAGI CrewAI Microsoft AutoGen 经典论文：\nRichards, T. (2023). \u0026ldquo;AutoGPT.\u0026rdquo; [GitHub] Nakajima, Y. (2023). \u0026ldquo;BabyAGI.\u0026rdquo; [GitHub] 五、Tool Retrieval 通过 embedding 做语义匹配，从大量工具中选 Top-K 给 LLM。\n经典论文：\nQin, Y., et al. (2023). \u0026ldquo;Tool Learning with Foundation Models.\u0026rdquo; arXiv. [论文链接] - 工具学习综述 流程：\n用户问题 → Embedding → 工具库检索 → Top-K Tools → LLM选择调用 六、Skill Skill = 多个 Tools 的组合能力\nSkill是对复杂任务能力的封装，类似于人类的\u0026quot;技能\u0026quot;。\n示例：\n\u0026ldquo;写博客\u0026rdquo; Skill = 搜索工具 + 写作工具 + 图片生成工具 \u0026ldquo;数据分析\u0026rdquo; Skill = 数据查询工具 + 可视化工具 + 报告生成工具 七、生产级 Agent 架构 User → Retriever → LLM → Runtime → Tool → Observation → LLM → Response 生产级要求：\n错误处理与重试 监控与日志 权限控制 成本控制 安全审计 八、关键原则 Agent 上限由模型决定，下限由 Runtime 决定\n模型能力决定Agent能做什么，Runtime质量决定Agent的稳定性和可靠性。\n先检索再推理\n在执行任务前先检索相关信息和工具。\nSkill 用于封装复杂能力\n将常用复杂任务封装为Skill，提高复用性和可靠性。\n九、终极模型 组件 类比 作用 LLM 大脑 推理、规划、决策 Tools 手 执行具体操作 Skills 肌肉记忆 封装的复杂能力 Retriever 感知系统 获取信息和工具 Runtime 神经系统 协调执行、传递信息 十、总结 Agent = LLM + Tools + Loop + Runtime + Retrieval (+ Skills)\nAI Agent代表了LLM应用的高级形态，从简单的对话系统进化为能够自主规划、执行复杂任务的智能体。随着技术发展，Agent将在更多场景中发挥重要作用。\n参考文献 Prompt Engineering Brown, T. B., et al. (2020). \u0026ldquo;Language Models are Few-Shot Learners.\u0026rdquo; NeurIPS. Wei, J., et al. (2022). \u0026ldquo;Chain-of-Thought Prompting Elicits Reasoning in Large Language Models.\u0026rdquo; NeurIPS. Kojima, T., et al. (2022). \u0026ldquo;Large Language Models are Zero-Shot Reasoners.\u0026rdquo; NeurIPS. Zhou, Y., et al. (2022). \u0026ldquo;Large Language Models Are Human-Level Prompt Engineers.\u0026rdquo; ICLR. RAG Lewis, P., et al. (2020). \u0026ldquo;Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks.\u0026rdquo; NeurIPS. Guu, K., et al. (2020). \u0026ldquo;REALM: Retrieval-Augmented Language Model Pre-Training.\u0026rdquo; ICML. Karpukhin, V., et al. (2020). \u0026ldquo;Dense Passage Retrieval for Open-Domain Question Answering.\u0026rdquo; EMNLP. Johnson, J., Douze, M., \u0026amp; Jégou, H. (2019). \u0026ldquo;Billion-scale similarity search with GPUs.\u0026rdquo; IEEE TBD. AI Agent Yao, S., et al. (2022). \u0026ldquo;ReAct: Synergizing Reasoning and Acting in Language Models.\u0026rdquo; ICLR. Schick, T., et al. (2023). \u0026ldquo;Toolformer: Language Models Can Teach Themselves to Use Tools.\u0026rdquo; NeurIPS. Shinn, N., et al. (2023). \u0026ldquo;Reflexion: Language Agents with Verbal Reinforcement Learning.\u0026rdquo; NeurIPS. Wang, G., et al. (2024). \u0026ldquo;A Survey on Large Language Model based Autonomous Agents.\u0026rdquo; arXiv. ","permalink":"https://www.xiaoxiangtao.cn/zh/posts/learning-notes-of-ai-agent/","summary":"\u003ch1 id=\"ai-agent从-chatbot-到生产级-agent\"\u003eAI Agent（从 Chatbot 到生产级 Agent）\u003c/h1\u003e\n\u003cp\u003eAI Agent是LLM应用的高级形态，能够自主规划、执行任务并与环境交互。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e经典论文：\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eYao, S., et al. (2022). \u0026ldquo;ReAct: Synergizing Reasoning and Acting in Language Models.\u0026rdquo; ICLR. [\u003ca href=\"https://arxiv.org/abs/2210.01691\"\u003e论文链接\u003c/a\u003e] - ReAct框架，Agent核心范式\u003c/li\u003e\n\u003cli\u003eWei, J., et al. (2022). \u0026ldquo;Chain-of-Thought Prompting Elicits Reasoning in Large Language Models.\u0026rdquo; NeurIPS. [\u003ca href=\"https://arxiv.org/abs/2201.11903\"\u003e论文链接\u003c/a\u003e]\u003c/li\u003e\n\u003cli\u003eWang, G., et al. (2024). \u0026ldquo;A Survey on Large Language Model based Autonomous Agents.\u0026rdquo; arXiv. [\u003ca href=\"https://arxiv.org/abs/2308.11432\"\u003e论文链接\u003c/a\u003e] - Agent综述\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"一整体演进路径\"\u003e一、整体演进路径\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eChatbot → Tool Use → Agent → Production Agent（工业级）\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e\u003cstrong\u003e演进说明：\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eChatbot\u003c/strong\u003e: 仅能对话，无法执行外部操作\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eTool Use\u003c/strong\u003e: 能调用单一工具\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eAgent\u003c/strong\u003e: 能自主规划并执行多步骤任务\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eProduction Agent\u003c/strong\u003e: 工业级，具备错误处理、权限控制、监控等能力\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003ch2 id=\"二核心概念拆解\"\u003e二、核心概念拆解\u003c/h2\u003e\n\u003ch3 id=\"1-chatbot\"\u003e1️⃣ Chatbot\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eLLM + Prompt\u003c/strong\u003e\u003c/p\u003e","title":"AI Agent（从 Chatbot 到生产级 Agent）"},{"content":"Prompt Engineering https://www.coursera.org/learn/chatgpt-prompt-engineering-for-developers-project/home/welcome\nPrompt Engineering（提示工程）是设计和优化输入提示（prompts）以引导大语言模型生成期望输出的技术。这一领域随着GPT-3的发布而兴起，是连接用户意图与模型能力的关键桥梁。\n经典论文：\nBrown, T. B., et al. (2020). \u0026ldquo;Language Models are Few-Shot Learners.\u0026rdquo; NeurIPS. [论文链接] - GPT-3论文，首次系统展示了prompt engineering的潜力 Wei, J., et al. (2022). \u0026ldquo;Chain-of-Thought Prompting Elicits Reasoning in Large Language Models.\u0026rdquo; NeurIPS. [论文链接] 1. Prompting Principles（提示原则） Principle 1: Write clear and specific instructions（编写清晰具体的指令） 清晰性（Clarity）和具体性（Specificity）是prompt设计的核心原则。研究表明，模糊的指令会导致模型输出不确定性增加，而具体的指令能显著提升输出质量。\nTactic 1: Use delimiters to clearly indicate distinct parts of the input\n分隔符（如 ```、\u0026quot;\u0026quot;\u0026quot;、\u0026mdash;、\u0026lt;\u0026gt;）能帮助模型识别输入的不同部分，避免混淆。这在处理包含多段文本或代码的任务时尤为重要。\nTactic 2: Ask for a structured output\n要求结构化输出（如JSON、HTML、Markdown表格）便于后续程序处理，是构建AI应用的最佳实践。\nTactic 3: Ask the model to check whether conditions are satisfied\n让模型先验证条件再执行任务，可以减少错误输出。\nTactic 4: \u0026ldquo;Few-shot\u0026rdquo; prompting - give examples\nFew-shot prompting通过提供少量示例来引导模型理解任务格式和期望输出。\n经典论文：\nBrown, T. B., et al. (2020). \u0026ldquo;Language Models are Few-Shot Learners.\u0026rdquo; NeurIPS. [论文链接] - 首次提出few-shot learning概念 Min, S., et al. (2022). \u0026ldquo;Rethinking the Role of Demonstrations: What Makes In-Context Learning Work?\u0026rdquo; EMNLP. [论文链接] Principle 2: Give the model time to \u0026ldquo;think\u0026rdquo;（给模型思考时间） 这一原则源于Chain-of-Thought（思维链）研究，让模型通过逐步推理来解决复杂问题。\n经典论文：\nWei, J., et al. (2022). \u0026ldquo;Chain-of-Thought Prompting Elicits Reasoning in Large Language Models.\u0026rdquo; NeurIPS. [论文链接] - CoT开山之作\nKojima, T., et al. (2022). \u0026ldquo;Large Language Models are Zero-Shot Reasoners.\u0026rdquo; NeurIPS. [论文链接] - \u0026ldquo;Let\u0026rsquo;s think step by step\u0026quot;的起源\nWang, X., et al. (2022). \u0026ldquo;Self-Consistency Improves Chain of Thought Reasoning in Language Models.\u0026rdquo; ICLR. [论文链接]\nTactic 1: Specify the steps required to complete a task\n明确列出任务步骤，引导模型按步骤执行。\nTactic 2: Instruct the model to work out its own solution before rushing to a conclusion\n让模型先独立推导答案再给出结论，避免直接猜测。\nAbout Hallucinations（关于幻觉） Hallucination（幻觉）是指模型生成看似合理但实际上错误或虚构的信息。\n经典论文：\nMaynez, J., et al. (2020). \u0026ldquo;On Faithfulness and Factuality in Abstractive Summarization.\u0026rdquo; ACL. [论文链接] Zhang, Y., et al. (2023). \u0026ldquo;Siren\u0026rsquo;s Song in the AI Ocean: A Survey on Hallucination in Large Language Models.\u0026rdquo; arXiv. [论文链接] 缓解策略：\nAsk model to find relative information first and answer questions based on the information 要求模型标注信息来源 使用RAG系统提供可靠上下文 2. Iterative Prompt Development（迭代式提示开发） 提示工程是一个迭代过程，需要不断测试和优化。\n经典方法论：\nZhou, Y., et al. (2022). \u0026ldquo;Large Language Models Are Human-Level Prompt Engineers.\u0026rdquo; ICLR. [论文链接] - APE (Automatic Prompt Engineer) 迭代流程：\nTry something（尝试初始prompt） Analyze where the result does not give what you want（分析失败原因） Clarify instructions, give more time to think（优化指令） Refine prompts with a batch of examples（用批量示例优化） 3. Summary（摘要任务） 文本摘要是最常见的NLP任务之一，LLM在此任务上表现优异。\n经典论文：\nSee, A., et al. (2017). \u0026ldquo;Get To The Point: Summarization with Pointer-Generator Networks.\u0026rdquo; ACL. [论文链接] Liu, Y., \u0026amp; Lapata, M. (2019). \u0026ldquo;Text Summarization with Pretrained Encoders.\u0026rdquo; EMNLP. [论文链接] 技术要点：\nSummarise with a word/sentence/character limit（限制长度） Summarise with a focus on certain topics such as shipping and delivery（聚焦特定主题） Try \u0026ldquo;extract\u0026rdquo; instead of \u0026ldquo;summarise\u0026rdquo;: for certain topic you want to see（提取而非摘要） Summarise multiple product reviews（多文档摘要） 4. Inferring（推理任务） LLMs are pretty good at extracting specific things out of a piece of text.\nLLM在文本推理任务上表现出色，能够从非结构化文本中提取结构化信息。\n经典论文：\nRadford, A., et al. (2019). \u0026ldquo;Language Models are Unsupervised Multitask Learners.\u0026rdquo; - GPT-2论文，展示zero-shot能力 [论文链接] 应用场景：\nSentiment: positive or negative（情感分析）\n经典论文：Socher, R., et al. (2013). \u0026ldquo;Recursive Deep Models for Semantic Compositionality Over a Sentiment Treebank.\u0026rdquo; EMNLP.\nIdentity types of emotions: happy, grateful, anger etc（情绪分类）\n经典论文：Mohammad, S. M., \u0026amp; Turney, P. D. (2013). \u0026ldquo;Crowdsourcing a Word-Emotion Association Lexicon.\u0026rdquo; Computational Intelligence.\nIdentify specific emotion: such as \u0026lsquo;is the writer expressing anger?\u0026rsquo;（特定情绪识别）\nExtract product and company name from customer reviews（命名实体识别）\n经典论文：Nadeau, D., \u0026amp; Sekine, S. (2007). \u0026ldquo;A survey of named entity recognition and classification.\u0026rdquo; Lingvisticae Investigationes.\n💡 Format your response as a JSON object with \u0026ldquo;Item\u0026rdquo; and \u0026ldquo;Brand\u0026rdquo; as the keys. If the information isn\u0026rsquo;t present, use \u0026ldquo;unknown\u0026rdquo; as the value. Make your response as short as possible.\nInfer some topics, ask LLM give answer in JSON format（主题推理）\n经典论文：Blei, D. M., Ng, A. Y., \u0026amp; Jordan, M. I. (2003). \u0026ldquo;Latent Dirichlet Allocation.\u0026rdquo; JMLR. - LDA主题模型开山之作\nMake a news alert for certain topics: Zero-Shot learning（零样本学习）\n经典论文：\nRadford, A., et al. (2021). \u0026ldquo;Learning Transferable Visual Models From Natural Language Supervision.\u0026rdquo; ICML. - CLIP论文 [论文链接] Xian, Y., et al. (2017). \u0026ldquo;Zero-Shot Learning - A Comprehensive Evaluation of the Good, the Bad and the Ugly.\u0026rdquo; TPAMI. [论文链接] 5. Transforming（转换任务） LLM擅长各种文本转换任务，包括语言翻译、风格转换、格式转换等。\n经典论文：\nVaswani, A., et al. (2017). \u0026ldquo;Attention Is All You Need.\u0026rdquo; NeurIPS. [论文链接] - Transformer开山之作，奠定现代NLP基础 转换类型：\nLanguage（语言翻译）\n经典论文：Wu, Y., et al. (2016). \u0026ldquo;Google\u0026rsquo;s Neural Machine Translation System.\u0026rdquo; arXiv. [论文链接]\nTone: informal to formal（语气转换）\nFormat Conversion: JSON to HTML（格式转换）\nSpellcheck/Grammar check or given style such as APA style（语法检查）\n经典论文：Yuan, Z., et al. (2021). \u0026ldquo;Synthesizing Coherent Story with Generative Pre-trained Transformer.\u0026rdquo; IJCAI.\n6. Expanding（扩展任务） 文本扩展是将简短输入扩展为更详细输出的任务。\n经典论文：\nFan, A., et al. (2018). \u0026ldquo;Hierarchical Neural Story Generation.\u0026rdquo; ACL. [论文链接] 技术要点：\nCustomise the automated reply to a customer email Remind the model to use details from the customer\u0026rsquo;s email Use Temperature to control the answer: more creative or stable Temperature参数详解 Temperature是控制LLM输出随机性的关键参数，源自统计力学和模拟退火算法。\n经典论文：\nAckley, D. H., Hinton, G. E., \u0026amp; Sejnowski, T. J. (1985). \u0026ldquo;A Learning Algorithm for Boltzmann Machines.\u0026rdquo; Cognitive Science. - 模拟退火理论基础 Ficler, J., \u0026amp; Goldberg, Y. (2017). \u0026ldquo;Controlling Linguistic Style Aspects in Neural Language Generation.\u0026rdquo; EMNLP. [论文链接] 💡 Temperature 实际上是在 调整 softmax 概率分布。\nTemperature 效果 应用场景 T \u0026lt; 1 概率差距变大（更确定） stable, for RAG system, set T = 0, many chatbot use 0.7 as default T = 1 原始分布 标准生成 T \u0026gt; 1 概率更平均（更随机） creative 数学原理： $$P(x_i) = \\frac{\\exp(z_i/T)}{\\sum_j \\exp(z_j/T)}$$\n7. Chatbot（聊天机器人） 聊天机器人是LLM最直接的应用形式。\n经典论文：\nVinyals, O., \u0026amp; Le, Q. (2015). \u0026ldquo;A Neural Conversational Model.\u0026rdquo; ICML Deep Learning Workshop. [论文链接] Zhang, Y., et al. (2020). \u0026ldquo;DIALOGPT: Large-Scale Generative Pre-training for Conversational Response Generation.\u0026rdquo; ACL. [论文链接] 三种角色（Three Roles） 现代聊天机器人系统通常采用三种角色架构：\nSystem: 定义AI助手的整体行为和人设 User: 用户输入 Assistant: 模型回复 Chatbot will obey system roles firstly, so we can use this to finish specific tasks.\n## example messages = [ {\u0026#39;role\u0026#39;:\u0026#39;system\u0026#39;, \u0026#39;content\u0026#39;:\u0026#39;You are an assistant that speaks like Shakespeare.\u0026#39;}, {\u0026#39;role\u0026#39;:\u0026#39;user\u0026#39;, \u0026#39;content\u0026#39;:\u0026#39;tell me a joke\u0026#39;}, {\u0026#39;role\u0026#39;:\u0026#39;assistant\u0026#39;, \u0026#39;content\u0026#39;:\u0026#39;Why did the chicken cross the road\u0026#39;}, {\u0026#39;role\u0026#39;:\u0026#39;user\u0026#39;, \u0026#39;content\u0026#39;:\u0026#39;I don\\\u0026#39;t know\u0026#39;} ] Context（上下文） Context: all messages including 3 roles are needed for the next response of chatbot.\n上下文管理是聊天机器人系统的核心技术挑战，涉及如何有效利用历史对话信息。\n经典论文：\nBae, S., et al. (2022). \u0026ldquo;Keep Me Updated! Memory Management in Long-term Conversations.\u0026rdquo; EMNLP. [论文链接] ","permalink":"https://www.xiaoxiangtao.cn/zh/posts/learning-notes-of-prompt-engineering/","summary":"\u003ch1 id=\"prompt-engineering\"\u003ePrompt Engineering\u003c/h1\u003e\n\u003cp\u003e\u003ca href=\"https://www.coursera.org/learn/chatgpt-prompt-engineering-for-developers-project/home/welcome\"\u003ehttps://www.coursera.org/learn/chatgpt-prompt-engineering-for-developers-project/home/welcome\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003ePrompt Engineering（提示工程）是设计和优化输入提示（prompts）以引导大语言模型生成期望输出的技术。这一领域随着GPT-3的发布而兴起，是连接用户意图与模型能力的关键桥梁。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e经典论文：\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eBrown, T. B., et al. (2020). \u0026ldquo;Language Models are Few-Shot Learners.\u0026rdquo; NeurIPS. [\u003ca href=\"https://arxiv.org/abs/2005.14165\"\u003e论文链接\u003c/a\u003e] - GPT-3论文，首次系统展示了prompt engineering的潜力\u003c/li\u003e\n\u003cli\u003eWei, J., et al. (2022). \u0026ldquo;Chain-of-Thought Prompting Elicits Reasoning in Large Language Models.\u0026rdquo; NeurIPS. [\u003ca href=\"https://arxiv.org/abs/2201.11903\"\u003e论文链接\u003c/a\u003e]\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"1-prompting-principles提示原则\"\u003e1. Prompting Principles（提示原则）\u003c/h2\u003e\n\u003ch3 id=\"principle-1-write-clear-and-specific-instructions编写清晰具体的指令\"\u003ePrinciple 1: Write clear and specific instructions（编写清晰具体的指令）\u003c/h3\u003e\n\u003cp\u003e清晰性（Clarity）和具体性（Specificity）是prompt设计的核心原则。研究表明，模糊的指令会导致模型输出不确定性增加，而具体的指令能显著提升输出质量。\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eTactic 1: Use delimiters to clearly indicate distinct parts of the input\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e分隔符（如 ```、\u0026quot;\u0026quot;\u0026quot;、\u0026mdash;、\u0026lt;\u0026gt;）能帮助模型识别输入的不同部分，避免混淆。这在处理包含多段文本或代码的任务时尤为重要。\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eTactic 2: Ask for a structured output\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e要求结构化输出（如JSON、HTML、Markdown表格）便于后续程序处理，是构建AI应用的最佳实践。\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eTactic 3: Ask the model to check whether conditions are satisfied\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e让模型先验证条件再执行任务，可以减少错误输出。\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eTactic 4: \u0026ldquo;Few-shot\u0026rdquo; prompting - give examples\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eFew-shot prompting通过提供少量示例来引导模型理解任务格式和期望输出。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e经典论文：\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eBrown, T. B., et al. (2020). \u0026ldquo;Language Models are Few-Shot Learners.\u0026rdquo; NeurIPS. [\u003ca href=\"https://arxiv.org/abs/2005.14165\"\u003e论文链接\u003c/a\u003e] - 首次提出few-shot learning概念\u003c/li\u003e\n\u003cli\u003eMin, S., et al. (2022). \u0026ldquo;Rethinking the Role of Demonstrations: What Makes In-Context Learning Work?\u0026rdquo; EMNLP. [\u003ca href=\"https://arxiv.org/abs/2202.12837\"\u003e论文链接\u003c/a\u003e]\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e","title":"Prompt Engineering"},{"content":"RAG RAG (Retrieval-Augmented Generation) 是一种结合信息检索与文本生成的AI架构，通过检索外部知识库来增强LLM的回答能力。\n经典论文：\nLewis, P., et al. (2020). \u0026ldquo;Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks.\u0026rdquo; NeurIPS. [论文链接] - RAG开山之作 Guu, K., et al. (2020). \u0026ldquo;REALM: Retrieval-Augmented Language Model Pre-Training.\u0026rdquo; ICML. [论文链接] Izacard, G., \u0026amp; Grave, É. (2021). \u0026ldquo;Leveraging Passage Retrieval with Generative Models for Open Domain Question Answering.\u0026rdquo; EACL. [论文链接] - RAG的另一种实现 1. Context Window（上下文窗口） 概念 Context Window 指的是 大语言模型在一次推理时能够读取和理解的最大文本长度。\n经典论文：\nDai, Z., et al. (2019). \u0026ldquo;Transformer-XL: Attentive Language Models Beyond a Fixed-Length Context.\u0026rdquo; ACL. [论文链接] - 突破固定上下文长度的开创性工作 通常包含：\n用户问题 历史对话 system prompt 检索到的文档 模型生成的内容 这些内容的总 token 数不能超过模型的 context window。\n关键要点 超过长度的内容会被 截断 模型只能\u0026quot;看到\u0026quot;窗口内的信息 window 大小直接影响： 长文档处理能力 RAG 系统能放入多少资料 主流模型Context Window对比：\n模型 Context Window GPT-3.5 4K / 16K tokens GPT-4 8K / 32K tokens GPT-4 Turbo 128K tokens Claude 3 200K tokens Gemini 1.5 Pro 1M+ tokens 2. Token 概念 Token 是 模型处理文本的基本单位。\n经典论文：\nSennrich, R., Haddow, B., \u0026amp; Birch, A. (2016). \u0026ldquo;Neural Machine Translation of Rare Words with Subword Units.\u0026rdquo; ACL. [论文链接] - BPE算法，现代tokenizer的基础 Kudo, T., \u0026amp; Richardson, J. (2018). \u0026ldquo;SentencePiece: A simple and language independent subword tokenizer.\u0026rdquo; EMNLP. [论文链接] 一个 token 可能是：\n一个词 一个子词（subword） 一个字符片段 关键要点 模型限制通常按 token 计算 成本和 token 数量直接相关 不同语言token化效率不同（中文通常比英文更高效） 经验法则：\n英文：约 4 字符 = 1 token 中文：约 1-2 汉字 = 1 token 3. Embedding（向量表示） 概念 Embedding 是将文本转换为 数字向量（vector），用来表示语义。\n经典论文：\nMikolov, T., et al. (2013). \u0026ldquo;Efficient Estimation of Word Representations in Vector Space.\u0026rdquo; ICLR. [论文链接] - Word2Vec开山之作 Pennington, J., Socher, R., \u0026amp; Manning, C. D. (2014). \u0026ldquo;GloVe: Global Vectors for Word Representation.\u0026rdquo; EMNLP. [论文链接] Devlin, J., et al. (2018). \u0026ldquo;BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding.\u0026rdquo; NAACL. [论文链接] - 上下文相关embedding的开创性工作 Reimers, N., \u0026amp; Gurevych, I. (2019). \u0026ldquo;Sentence-BERT: Sentence Embeddings using Siamese BERT-Networks.\u0026rdquo; EMNLP. [论文链接] - Sentence-Transformers 语义相似的句子在向量空间中 距离更近。\n关键要点 Embedding 用于：\n语义搜索（Semantic Search） 文档检索（Document Retrieval） 推荐系统（Recommendation Systems） 聚类分析（Clustering） 主流Embedding模型：\nOpenAI text-embedding-ada-002 / text-embedding-3 Cohere Embed BGE (Beijing Academy of Artificial Intelligence) E5 (Microsoft) 4. Vector Search（向量搜索） 概念 Vector Search 是通过 向量相似度 来查找相关内容的搜索方式。\n经典论文：\nJohnson, J., Douze, M., \u0026amp; Jégou, H. (2019). \u0026ldquo;Billion-scale similarity search with GPUs.\u0026rdquo; IEEE Transactions on Big Data. [论文链接] - Faiss向量数据库 Malkov, Y. A., \u0026amp; Yashunin, D. A. (2020). \u0026ldquo;Efficient and robust approximate nearest neighbor search using Hierarchical Navigable Small World graphs.\u0026rdquo; TPAMI. [论文链接] - HNSW算法 常见计算方式：\nCosine similarity（余弦相似度）: $\\cos(\\theta) = \\frac{A \\cdot B}{|A| |B|}$ Dot product（点积）: $A \\cdot B$ Euclidean distance（欧氏距离）: $|A - B|$ 特点 传统搜索 向量搜索 关键词匹配 语义匹配 精确匹配 相似度排序 无法理解同义词 理解语义相似性 5. RAG（Retrieval Augmented Generation） 概念 RAG 是一种 AI 系统架构，通过 检索外部知识再生成回答。\n经典论文：\nLewis, P., et al. (2020). \u0026ldquo;Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks.\u0026rdquo; NeurIPS. [论文链接] Gao, Y., et al. (2023). \u0026ldquo;Retrieval-Augmented Generation for Large Language Models: A Survey.\u0026rdquo; arXiv. [论文链接] - RAG综述 基本流程：\n用户问题 → 向量检索 → 找到相关文档 → LLM生成回答 RAG架构类型 经典论文：\nLewis, P., et al. (2020). 区分了两种RAG架构： RAG-Sequence: 对所有检索文档使用相同的生成 RAG-Token: 每个token可以参考不同文档 优势 能利用最新知识（无需重新训练） 减少模型幻觉（基于检索事实回答） 可接入企业知识库 可追溯信息来源 6. Chunking（文本切分） 概念 Chunking 指将长文档 拆分成较小文本块（chunk），用于 embedding 和检索。\n经典论文：\nLyu, C., et al. (2024). \u0026ldquo;Chunking Strategies for RAG.\u0026rdquo; arXiv. [论文链接] 原因：\n文档太长，无法直接处理 embedding 需要语义集中 context window 有限制 7. Chunk Size（切分大小） 概念 Chunk Size 指每个文本块的 token 数量。\n经验值：\n300 – 800 tokens（通用场景） 100 – 300 tokens（问答场景） 1000+ tokens（长文档理解） Trade-off Chunk Size 优点 缺点 太大 上下文完整 语义被稀释，检索不准确 太小 语义集中 上下文丢失，信息碎片化 8. Overlap（重叠） 概念 Overlap 指相邻 chunk 之间 共享一部分内容。\n目的：避免语义被切断或关键信息丢失。\n常见设置：10% – 20%\n示例：\nChunk 1: [0-500 tokens] Chunk 2: [400-900 tokens] # 100 tokens overlap Chunk 3: [800-1300 tokens] # 100 tokens overlap 9. Sliding Window（滑动窗口） 概念 Sliding Window 是一种 chunk 切分方式，使相邻 chunk 部分重叠。\n经典论文：\nLiu, J., et al. (2022). \u0026ldquo;Lost in the Middle: How Language Models Use Long Contexts.\u0026rdquo; arXiv. [论文链接] - 研究了长上下文中信息位置的影响 优点：\n保留上下文 减少信息断裂 10. Semantic Chunking（语义切分） 概念 Semantic Chunking 根据 语义变化 来切分文本，而不是固定 token 数量。\n经典论文：\nLoman, T., \u0026amp; Tekman, B. (2023). \u0026ldquo;Semantic Chunking for RAG.\u0026rdquo; [参考] 基本方法：\n按句子切分 生成 embedding 计算相邻句子相似度 相似度低于阈值则开始新的 chunk 优势：\n语义完整性更好 检索精度更高 11. Hybrid Chunking（混合切分） 概念 实际系统常用策略：结构切分 + token 限制\n流程：\n按标题或段落切分 → 超过最大长度 → 按句子拆分 → 加 overlap 优点：\n稳定可控 语义自然 兼顾结构和长度 12. Vector Database（向量数据库） 概念 向量数据库用于 存储 embedding 并进行高效相似度搜索。\n经典论文与系统：\nJohnson, J., Douze, M., \u0026amp; Jégou, H. (2019). \u0026ldquo;Faiss: A library for efficient similarity search.\u0026rdquo; [论文链接] Pinecone: 商业向量数据库 Weaviate: 开源向量数据库 Milvus: 开源向量数据库 [GitHub] Chroma: 轻量级向量数据库 作用：在大量向量中快速找到最相似内容。\n核心技术：\nHNSW (Hierarchical Navigable Small World) IVF (Inverted File Index) PQ (Product Quantization) 13. Retrieval（检索） 概念 Retrieval 是从向量数据库中 找到最相关的文档片段。\n流程：\n用户问题 → embedding → 向量搜索 → TopK chunks 常见：Top3 / Top5 / Top10\n检索策略：\nDense Retrieval: 基于向量相似度 Sparse Retrieval: 基于关键词（如BM25） Hybrid Retrieval: 结合两者 经典论文：\nRobertson, S., \u0026amp; Zaragoza, H. (2009). \u0026ldquo;The Probabilistic Relevance Framework: BM25 and Beyond.\u0026rdquo; Foundations and Trends in IR. - BM25算法 Karpukhin, V., et al. (2020). \u0026ldquo;Dense Passage Retrieval for Open-Domain Question Answering.\u0026rdquo; EMNLP. [论文链接] - DPR 14. Re-ranking（重排序） 概念 Re-ranking 是在检索结果基础上 再次排序，提高相关性。\n经典论文：\nNogueira, R., \u0026amp; Cho, K. (2019). \u0026ldquo;Passage Re-ranking with BERT.\u0026rdquo; arXiv. [论文链接] Nogueira, R., et al. (2020). \u0026ldquo;Document Ranking with a Pretrained Sequence-to-Sequence Model.\u0026rdquo; EMNLP. [论文链接] 流程：\n向量检索 Top20 → Re-ranker模型 → Top3 → LLM回答 作用：提高检索精度，减少无关内容。\n常用Re-ranker模型：\nBGE Re-ranker Cohere Re-rank Cross-Encoder models 15. Hallucination（模型幻觉） 概念 Hallucination 指模型生成 看似合理但事实错误的内容。\n经典论文：\nMaynez, J., et al. (2020). \u0026ldquo;On Faithfulness and Factuality in Abstractive Summarization.\u0026rdquo; ACL. [论文链接] Zhang, Y., et al. (2023). \u0026ldquo;Siren\u0026rsquo;s Song in the AI Ocean: A Survey on Hallucination in Large Language Models.\u0026rdquo; arXiv. [论文链接] Ji, Z., et al. (2023). \u0026ldquo;Survey of Hallucination in Natural Language Generation.\u0026rdquo; ACM Computing Surveys. [论文链接] 常见原因：\n检索不到正确文档 上下文不足 prompt 不明确 模型知识过时 缓解策略：\n使用RAG提供可靠上下文 要求模型标注来源 设置\u0026quot;不知道\u0026quot;选项 多轮验证 16. RAG Debugging（RAG排查） 排查顺序通常为：\n用户 Query（问题是否清晰） 检索 TopK chunks（是否检索到相关内容） Re-ranking 结果（排序是否正确） Prompt（指令是否明确） LLM 模型（模型能力是否足够） 经验分布：\n80% 问题来自 Retrieval 15% 来自 Prompt 5% 来自模型能力 调试工具：\nLangSmith Arize Phoenix Weights \u0026amp; Biases 17. RAG系统完整流程 文档 ↓ Chunking（文本切分） ↓ Embedding（向量化） ↓ Vector Database（存储） ↓ Retrieval (TopK)（检索） ↓ Re-ranking（重排序） ↓ LLM生成回答 总结 RAG系统核心目标：\n在有限 context window 中，让 LLM 获取最相关知识，并生成准确回答。\n关键优化点：\nChunking策略 Embedding质量 Retrieval准确率 Re-ranking Prompt设计 ","permalink":"https://www.xiaoxiangtao.cn/zh/posts/learning-notes-of-rag/","summary":"\u003ch1 id=\"rag\"\u003eRAG\u003c/h1\u003e\n\u003cp\u003eRAG (Retrieval-Augmented Generation) 是一种结合信息检索与文本生成的AI架构，通过检索外部知识库来增强LLM的回答能力。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e经典论文：\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eLewis, P., et al. (2020). \u0026ldquo;Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks.\u0026rdquo; NeurIPS. [\u003ca href=\"https://arxiv.org/abs/2005.11401\"\u003e论文链接\u003c/a\u003e] - RAG开山之作\u003c/li\u003e\n\u003cli\u003eGuu, K., et al. (2020). \u0026ldquo;REALM: Retrieval-Augmented Language Model Pre-Training.\u0026rdquo; ICML. [\u003ca href=\"https://arxiv.org/abs/2002.08909\"\u003e论文链接\u003c/a\u003e]\u003c/li\u003e\n\u003cli\u003eIzacard, G., \u0026amp; Grave, É. (2021). \u0026ldquo;Leveraging Passage Retrieval with Generative Models for Open Domain Question Answering.\u0026rdquo; EACL. [\u003ca href=\"https://arxiv.org/abs/2007.01282\"\u003e论文链接\u003c/a\u003e] - RAG的另一种实现\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"1-context-window上下文窗口\"\u003e1. Context Window（上下文窗口）\u003c/h2\u003e\n\u003ch3 id=\"概念\"\u003e概念\u003c/h3\u003e\n\u003cp\u003eContext Window 指的是 \u003cstrong\u003e大语言模型在一次推理时能够读取和理解的最大文本长度\u003c/strong\u003e。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e经典论文：\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eDai, Z., et al. (2019). \u0026ldquo;Transformer-XL: Attentive Language Models Beyond a Fixed-Length Context.\u0026rdquo; ACL. [\u003ca href=\"https://arxiv.org/abs/1901.02860\"\u003e论文链接\u003c/a\u003e] - 突破固定上下文长度的开创性工作\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e通常包含：\u003c/p\u003e","title":"RAG (Retrieval-Augmented Generation)"},{"content":"Transformer：从入门到产品视角 📚 导论：为什么Transformer如此重要？ Transformer模型是由Vaswani等人在2017年发表的论文《Attention Is All You Need》中提出的神经网络架构。它彻底改变了自然语言处理领域，成为现代大语言模型（如GPT、BERT、LLaMA等）的基石。\n核心创新：完全抛弃传统的CNN/RNN架构，仅使用注意力机制来捕捉序列依赖关系，实现了两大突破：\n并行计算：解决了RNN无法并行的问题，大幅提升训练速度 长程依赖：解决了RNN/LSTM在处理长序列时的梯度消失问题 🏗️ 一、Transformer整体架构 1.1 编码器-解码器结构 Transformer遵循Seq2Seq模型的编码器-解码器架构：\n编码器（Encoder）：将输入序列（如源语言句子）转换为连续表示 由N个相同的编码器层堆叠而成（原始论文中N=6） 每层包含：多头自注意力子层 + 前馈神经网络子层 解码器（Decoder）：基于编码器输出生成目标序列（如目标语言句子） 同样由N个相同的解码器层堆叠而成 每层包含：掩码多头自注意力 + 编码器-解码器注意力 + 前馈神经网络 掩码机制：确保解码器在预测位置i时只能看到位置i之前的输出，防止信息泄露 1.2 核心组件概览 组件 功能 创新点 自注意力机制 捕捉序列内部任意两个位置的关系 全局建模、并行计算 多头注意力 从不同角度关注信息 并行子空间学习 位置编码 为模型提供序列位置信息 弥补注意力机制的位置盲点 前馈网络 对每个位置进行非线性变换 增强模型表达能力 残差连接 将输入直接连接到输出 缓解深层网络退化问题 层归一化 稳定每层的输出分布 加速收敛、提高稳定性 🔍 二、核心机制详解 2.1 自注意力机制（Self-Attention） 核心思想：让序列中的每个词都能直接关注到所有其他词，动态计算词与词之间的相关性。\n实现步骤： 输入表示：每个输入词$x_i$被转换为嵌入向量 生成Q、K、V：通过三个可训练的权重矩阵$W_Q, W_K, W_V$将输入映射为查询（Query）、键（Key）、值（Value）向量 计算注意力分数：Query与所有Key的点积，表示当前位置对其他位置的关注程度 缩放与归一化：除以$\\sqrt{d_k}$（防止点积过大导致梯度消失），经Softmax归一化为权重 加权聚合：用权重对Value进行加权求和，得到最终输出 数学公式： $$ \\text{Attention}(Q,K,V) = \\text{softmax}\\left(\\frac{QK^T}{\\sqrt{d_k}}\\right)V $$\nQKV设计的精妙之处： Query（查询）：代表当前位置\u0026quot;想要寻找什么信息\u0026quot; Key（键）：代表当前位置\u0026quot;能提供什么信息\u0026quot;（标签/索引） Value（值）：代表被关注时贡献的\u0026quot;实际信息内容\u0026quot; 为什么需要三个角色？ 实现了\u0026quot;权责分离\u0026quot;——Key决定被关注程度，Value决定被关注时贡献什么，Query决定关注什么。这比单一向量表示更具表达力。\n2.2 多头注意力（Multi-Head Attention） 核心思想：不只用\u0026quot;一双眼睛\u0026quot;看句子，而是用多组\u0026quot;专家之眼\u0026quot;同时从不同角度审视。\n实现方式：\n将Q、K、V投影到$h$个不同的低维子空间（$h$是头数，如8或12） 在每个子空间中独立计算注意力 将所有头的输出拼接，通过输出投影矩阵$W^O$融合 数学公式： $$ \\text{MultiHead}(Q,K,V) = \\text{Concat}(\\text{head}_1, \\dots, \\text{head}_h)W^O $$ $$ \\text{head}_i = \\text{Attention}(QW_i^Q, KW_i^K, VW_i^V) $$\n多头注意力的优势：\n分工合作：不同头自发学习不同类型的关注模式（语法、语义、指代等） 增强容量：捕捉不同粒度的依赖关系 并行高效：完美适配GPU并行计算 重要发现：每个头专注什么是不是人为指定的，而是通过数据驱动、在训练过程中自发涌现形成的分工。研究者可以通过可视化事后分析每个头学到的模式，但无法预先规定。\n2.3 位置编码（Positional Encoding） 为什么需要？ 自注意力机制本身没有序列顺序概念，打乱句子顺序会得到相同结果。\n解决方案：在词嵌入中加入位置信息\n原始Transformer采用的正余弦编码： $$ PE_{(pos, 2i)} = \\sin\\left(\\frac{pos}{10000^{2i/d_{\\text{model}}}}\\right) $$ $$ PE_{(pos, 2i+1)} = \\cos\\left(\\frac{pos}{10000^{2i/d_{\\text{model}}}}\\right) $$ 其中$pos$是位置，$i$是维度索引，$d_{\\text{model}}$是隐藏维度\n设计优点：\n值域在$[-1, +1]$，不会破坏词嵌入语义 可以外推到比训练时更长的序列 蕴含相对位置信息（$PE_{pos+k}$可表示为$PE_{pos}$的线性组合） 现代演进：许多新模型（如LLaMA、RoBERTa）采用可学习的绝对位置编码或旋转位置编码（RoPE）。\n2.4 前馈网络（Feed-Forward Network） 每个Transformer层中的前馈网络是一个两层的全连接网络： $$ \\text{FFN}(x) = \\max(0, xW_1 + b_1)W_2 + b_2 $$\n特点：\n对每个位置独立应用，相同参数 中间维度通常扩大4倍（如$d_{\\text{model}}=512$，$d_{ff}=2048$） 引入非线性变换（ReLU），增强表达能力 实验发现：增大前馈层维度有利于提升模型性能。\n2.5 残差连接与层归一化 Transformer的深度（通常6层以上）会带来训练稳定性问题，这两个机制共同解决了这一挑战。\n残差连接（Residual Connection） 目的：解决网络退化问题——随着深度增加，性能不升反降\n实现： $$ \\text{output} = \\text{LayerNorm}(x + \\text{Sublayer}(x)) $$\n为什么有效：\n提供\u0026quot;高速公路\u0026quot;，让梯度可以直接回传到底层 使网络可以学习恒等映射，冗余层至少不降低性能 源自ResNet的创新思想 层归一化（Layer Normalization） 目的：解决梯度消失/爆炸问题，稳定训练过程\n实现：对每个样本的所有特征计算均值和方差，进行标准化： $$ \\text{LN}(x) = g \\cdot \\frac{x - \\mu}{\\sigma} + b $$ 其中$g$和$b$是可学习的缩放和偏移参数，$\\mu$和$\\sigma$是均值和标准差。\n两种结构：\n后标准化（Post-norm）：原始Transformer方案，残差连接后归一化 前标准化（Pre-norm）：现代模型更常用，子层输入前归一化，更利于训练深层网络 📊 三、关键概念深度解析 3.1 隐藏维度（$d_{\\text{model}}$ / hidden_size） 定义：模型内部表示信息的\u0026quot;思维画布\u0026quot;大小，即每个词在模型内部被表示为向量的维度。\n类比：\n小隐藏维度（128-256）：小笔记本，记录核心信息，空间有限 中等隐藏维度（768-1024）：标准办公桌，有充足空间系统性思考 大隐藏维度（4096+）：大型工作室，极致创作空间 关键影响：隐藏维度决定了模型的表达能力和计算成本。Transformer层的主要参数量与$d_{\\text{model}}$的平方成正比。\n3.2 注意力头（Attention Head） 定义：多头注意力中的每个并行处理单元，在低维子空间（$d_{\\text{model}}/h$）中学习一种特定的关注模式。\n头数设置经验：\nBERT-base：12层，12头 BERT-large：24层，16头 GPT-3：96层，96头 LLaMA：32/40/80层，32/40/64头不等 现代演进：为优化推理效率，出现了分组查询注意力（GQA），让多个头共享Key-Value投影，大幅减少KV缓存，几乎不损失效果（如LLaMA 2/3采用）。\n3.3 层数（Number of Layers） 含义：信息精炼的\u0026quot;深度\u0026quot;。每层让词向量在上下文中再交流、再消化一次。\n权衡：\n更多层：抽象理解能力更强，但需要更多数据、更长训练时间、更大显存 更少层：训练快、易部署，但处理复杂任务能力有限 经验法则：模型性能与层数、隐藏维度、数据规模之间存在幂律关系。\n3.4 模型权重的本质 权重包含什么？：\n注意力层的投影矩阵（$W_Q, W_K, W_V, W_O$） 前馈网络的权重矩阵（$W_1, W_2$） 层归一化的缩放与偏移参数（$g, b$） 词嵌入矩阵 为什么这么大？ 参数量 × 数值精度\nFP32（32位浮点）：4字节/参数 FP16/BF16：2字节/参数 INT8：1字节/参数 公式：模型文件大小 ≈ 参数量 × 每参数字节数\n示例：LLaMA 3 70B用FP16存储 ≈ $70B \\times 2\\text{字节} = 140\\text{GB}$\n权重是怎么来的？ 通过海量数据上的梯度下降和反向传播学习得到，而非人工编写。\n🧮 四、参数量计算与估算 4.1 单层Transformer参数量计算公式 组件 公式 说明 嵌入层 $V \\times d_{\\text{model}}$ $V$为词表大小 多头注意力 $4 \\times d_{\\text{model}}^2$ Q/K/V投影(3×) + 输出投影(1×) 前馈网络 $2 \\times d_{\\text{model}} \\times d_{ff}$ 通常$d_{ff} = 4 \\times d_{\\text{model}}$ 层归一化 $2 \\times d_{\\text{model}}$ 每层两个LN（缩放+偏移） 4.2 总参数量估算 单层参数量 ≈ $4d_{\\text{model}}^2 + 8d_{\\text{model}}^2 = 12d_{\\text{model}}^2$（当$d_{ff}=4d_{\\text{model}}$时）\n模型总参数量 ≈ $L \\times 12d_{\\text{model}}^2 + V \\times d_{\\text{model}}$（$L$为层数，$V$为词表大小）\n实例验证：LLaMA 7B（$d_{\\text{model}}=4096, L=32, V=32000$）\n$32 \\times 12 \\times 4096^2 + 32000 \\times 4096 \\approx 6.4B + 0.13B = 6.53B$，接近7B\n4.3 训练成本估算 核心公式：$C \\approx 6PD$\n$C$：训练所需计算量（FLOPs） $P$：模型参数量 $D$：训练数据规模（token数） 经验法则：计算最优模型满足$D \\approx 20P$\n🚀 五、训练流程：从预训练到应用 5.1 预训练（Pre-training） 目标：让模型学习通用语言规律和知识\n方式：在海量无标注数据上完成自回归语言建模（预测下一个词）或掩码语言建模（完形填空）\n产出：基础模型（Base Model），拥有强大的\u0026quot;续写\u0026quot;能力但未对齐人类偏好\n5.2 监督微调（Supervised Fine-Tuning, SFT） 目标：让模型学会遵循指令、进行对话\n数据：高质量的人工标注指令-回答对\n本质：有监督分类任务，让模型输出匹配标准答案\n5.3 基于人类反馈的强化学习（RLHF） 目标：让模型输出更符合人类复杂偏好（安全、有用、无害）\n流程：\n人工对模型多个输出进行偏好排序 训练奖励模型（Reward Model）学习人类偏好 用强化学习（如PPO）微调SFT模型 5.4 参数高效微调（PEFT） 针对大模型全参数微调成本过高的问题，出现了一系列高效微调技术：\nLoRA：注入低秩适配器，只训练少量参数 Adapter：在层间插入小型可训练模块 Prefix Tuning：优化连续提示向量 🔧 六、模型压缩与加速 大模型落地必须考虑效率问题，主要技术包括：\n6.1 量化（Quantization） 原理：用更低精度（如INT8、INT4）表示权重和激活\n类型：\n训练后量化（PTQ）：训练完成后量化，无需重新训练 量化感知训练（QAT）：训练中模拟量化误差，效果更好但成本高 收益：模型体积减半（FP16→INT8），推理速度提升\n6.2 剪枝（Pruning） 原理：删除冗余的注意力头、FFN层或不重要的权重连接\n方式：结构化剪枝（移除整个头/层）vs 非结构化剪枝（移除个别参数）\n6.3 知识蒸馏（Knowledge Distillation） 原理：让小型\u0026quot;学生模型\u0026quot;学习大型\u0026quot;教师模型\u0026quot;的输出分布\n优势：学生模型不仅学习\u0026quot;答案是什么\u0026quot;，更学习教师模型的\u0026quot;思考方式\u0026quot;（软标签）\n应用：将云端大模型能力下沉至手机、IoT设备\n6.4 参数共享 原理：不同层之间共享部分参数\n代表：ALBERT通过跨层参数共享大幅减少参数量\n💡 七、产品经理的Transformer视角 7.1 技术选型的核心考量 维度 产品含义 关键问题 隐藏维度 模型\u0026quot;思维带宽\u0026quot; 任务复杂度需要多大画布？ 层数 模型\u0026quot;思考深度\u0026quot; 需要多少步推理？ 头数 \u0026ldquo;专家团队\u0026quot;规模 需要从多少角度分析？ 参数量 能力上限与成本 预算内能负担多大模型？ 7.2 成本与效果权衡 训练成本 ≈ $6 \\times \\text{参数量} \\times \\text{数据量}$ 推理内存 ≈ $1.2 \\times \\text{参数量} \\times \\text{精度字节}$（推理时） 训练内存：权重+梯度+优化器状态，通常是推理的3-4倍 7.3 产品决策指南 定义任务复杂度：简单分类？复杂推理？创意生成？ 评估资源约束：云端还是端侧？延迟要求？预算？ 选择起点模型：通用大模型API vs 开源可微调模型 规划数据策略：需要多少标注数据？质量要求？ 设计评估体系：模型指标 vs 用户体验指标 7.4 理解模型能力的来源 数据：预训练数据的规模、多样性与质量决定模型知识的上限。 架构：Transformer 及其变体提供了高效的并行计算与长程依赖建模能力。 对齐：SFT 与 RLHF 将模型行为约束到人类期望的轨道上。 9 参考文献 Vaswani et al. (2017). Attention Is All You Need Devlin et al. (2019). BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding Brown et al. (2020). Language Models are Few-Shot Learners Hoffmann et al. (2022). Training Compute-Optimal Large Language Models Touvron et al. (2023). LLaMA: Open and Efficient Foundation Language Models Hu et al. (2022). LoRA: Low-Rank Adaptation of Large Language Models Sanh et al. (2019). DistilBERT, a distilled version of BERT: smaller, faster, cheaper and lighter ","permalink":"https://www.xiaoxiangtao.cn/zh/posts/learning-notes-of-transformer/","summary":"\u003ch1 id=\"transformer从入门到产品视角\"\u003eTransformer：从入门到产品视角\u003c/h1\u003e\n\u003ch2 id=\"-导论为什么transformer如此重要\"\u003e📚 导论：为什么Transformer如此重要？\u003c/h2\u003e\n\u003cp\u003eTransformer模型是由Vaswani等人在2017年发表的论文《\u003cstrong\u003eAttention Is All You Need\u003c/strong\u003e》中提出的神经网络架构。它彻底改变了自然语言处理领域，成为现代大语言模型（如GPT、BERT、LLaMA等）的基石。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e核心创新\u003c/strong\u003e：完全抛弃传统的CNN/RNN架构，仅使用\u003cstrong\u003e注意力机制\u003c/strong\u003e来捕捉序列依赖关系，实现了两大突破：\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003e并行计算\u003c/strong\u003e：解决了RNN无法并行的问题，大幅提升训练速度\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e长程依赖\u003c/strong\u003e：解决了RNN/LSTM在处理长序列时的梯度消失问题\u003c/li\u003e\n\u003c/ul\u003e","title":"Transformer概念与理解"},{"content":"一、主流支付方式对比 1. 公对公现金支付 方式：柜台或网银主动转账、通过银行分账系统支付并获取回单\n限额：可大额转账，5万以上走人行大额支付系统周末和假期不开可能受影响（工作日是前天晚上20:30一直跑到当天17:15）\n到账时效：一般能及时到账\n电商平台核验收款成功：财务手工核查银行账户、通过识别汇款备注里与订单关联的唯一代码自动核查、通过银行分账系统支付一般可实时确认\n2. 网关支付 前往第三方支付公司或银行提供的统一收银台，跳转指定银行网银支付\n限额：取决于支付卡类型及安全等级\n支持银行：取决于统一收银台的服务提供方的合作银行数量\n3. 聚合码/扫码支付 分主扫（客户手机APP唤起摄像头扫描商家二维码）和被扫（客户出示支付码给商家），电商网页用主扫的方案。\n由聚合支付服务提供商提供的聚合码一般支持多个支付方式（比如微信、支付宝等），接入聚合码对商户更加方便。\n由支付公司提供的单一渠道比如微信收款码、支付宝收款码只能支持指定APP扫码支付，好处是服务更稳定，体验更好。\n4. 第三方APP支付 唤起第三方APP付款，国内头部的三家是微信、支付宝、云闪付，其中微信在线下场景覆盖广，支付宝依托淘宝生态、碰一碰支付创新持续和微信抢占市场，云闪付作为国家队，目前依托消费补贴、一站式银行卡管理功能也有一定流量且铺的比较广。其他的比如京东支付、连连支付等，体量和前三有一定差距，在特定场景有自身优势。\n支持银行：基本齐全，且都支持余额、信用支付等方式。微信目前侧重个人支付，不支持绑定公账，支付宝可以创建企业账户绑定公账支付。\n5. 移动快捷支付 打开支付渠道H5页面绑定银行卡付款，目前用的较少，主流支付公司都有该形式，但H5页面安全风险相较APP支付更高，且用户体验较差（需重复登录）。\n6. 银行卡快捷支付 通过和支付公司合作，平台对接支付公司，用户在平台绑卡后选卡支付。\n部分渠道可以免密支付，平台需承担部分风控责任，但用户体验好，支付速度快。\n支持银行：取决于服务提供方的合作银行数量。\n7. 账户余额支付 购买支付牌照或通过和第三方支付公司合作提供钱包功能，支持用户充值余额支付。\n平台需要针对充值、支付、提现做一定风控措施。该方式对用户体验好，且有助于提高用户粘性。\n8. 金融白条支付 比较知名的有花呗、京东白条、美团月付等，通过金融机构授信一定额度给用户支付，C端大部分有一个月的平台贴息。该方式可以大幅提升用户粘性，特别是一些B端客户对现金流比较重视，提供账期可以建立紧密合作关系，但这对信用评估和风控有较高要求。\n9. 月结 由商家针对指定客户允许其赊账或签订月结的协议，商家自行记账并要求客户定期还款，平台如果有自营业务，也会考虑设计相关功能。该方式交易不受第三方担保，可以不经过电商平台，通常是商家与合作紧密熟悉的客户采用该方式。\n10. 数字人民币 等同于现金支付，目前支付APP和扫码支付，使用量较低。\n11. 代付 生成订单并将代付收银台分享给其他用户进行支付。代付收银台页面提供的支付方式需要考虑代付用户的身份，设备环境等因素。\n12. 先用后付 授信门槛低，通常额度小，不计入央行征信，由平台担保并向商家收取交易服务费，C端通常用户要开通了绑定银行卡代扣支付方式，个人认为该方式可以降低用户的下单决策成本，同时不像花呗等信用支付方式那么重。\n","permalink":"https://www.xiaoxiangtao.cn/zh/posts/comparison-of-payment-methods-on-domestic-e-commerce-platforms/","summary":"\u003ch1 id=\"一主流支付方式对比\"\u003e一、主流支付方式对比\u003c/h1\u003e\n\u003ch2 id=\"1-公对公现金支付\"\u003e1. 公对公现金支付\u003c/h2\u003e\n\u003cp\u003e方式：柜台或网银主动转账、通过银行分账系统支付并获取回单\u003c/p\u003e\n\u003cp\u003e限额：可大额转账，5万以上走人行大额支付系统周末和假期不开可能受影响（工作日是前天晚上20:30一直跑到当天17:15）\u003c/p\u003e\n\u003cp\u003e到账时效：一般能及时到账\u003c/p\u003e\n\u003cp\u003e电商平台核验收款成功：财务手工核查银行账户、通过识别汇款备注里与订单关联的唯一代码自动核查、通过银行分账系统支付一般可实时确认\u003c/p\u003e\n\u003ch2 id=\"2-网关支付\"\u003e2. 网关支付\u003c/h2\u003e\n\u003cp\u003e前往第三方支付公司或银行提供的统一收银台，跳转指定银行网银支付\u003c/p\u003e\n\u003cp\u003e限额：取决于支付卡类型及安全等级\u003c/p\u003e\n\u003cp\u003e支持银行：取决于统一收银台的服务提供方的合作银行数量\u003c/p\u003e\n\u003ch2 id=\"3-聚合码扫码支付\"\u003e3. 聚合码/扫码支付\u003c/h2\u003e\n\u003cp\u003e分主扫（客户手机APP唤起摄像头扫描商家二维码）和被扫（客户出示支付码给商家），电商网页用主扫的方案。\u003c/p\u003e\n\u003cp\u003e由聚合支付服务提供商提供的聚合码一般支持多个支付方式（比如微信、支付宝等），接入聚合码对商户更加方便。\u003c/p\u003e\n\u003cp\u003e由支付公司提供的单一渠道比如微信收款码、支付宝收款码只能支持指定APP扫码支付，好处是服务更稳定，体验更好。\u003c/p\u003e\n\u003ch2 id=\"4-第三方app支付\"\u003e4. 第三方APP支付\u003c/h2\u003e\n\u003cp\u003e唤起第三方APP付款，国内头部的三家是微信、支付宝、云闪付，其中微信在线下场景覆盖广，支付宝依托淘宝生态、碰一碰支付创新持续和微信抢占市场，云闪付作为国家队，目前依托消费补贴、一站式银行卡管理功能也有一定流量且铺的比较广。其他的比如京东支付、连连支付等，体量和前三有一定差距，在特定场景有自身优势。\u003c/p\u003e\n\u003cp\u003e支持银行：基本齐全，且都支持余额、信用支付等方式。微信目前侧重个人支付，不支持绑定公账，支付宝可以创建企业账户绑定公账支付。\u003c/p\u003e\n\u003ch2 id=\"5-移动快捷支付\"\u003e5. 移动快捷支付\u003c/h2\u003e\n\u003cp\u003e打开支付渠道H5页面绑定银行卡付款，目前用的较少，主流支付公司都有该形式，但H5页面安全风险相较APP支付更高，且用户体验较差（需重复登录）。\u003c/p\u003e\n\u003ch2 id=\"6-银行卡快捷支付\"\u003e6. 银行卡快捷支付\u003c/h2\u003e\n\u003cp\u003e通过和支付公司合作，平台对接支付公司，用户在平台绑卡后选卡支付。\u003c/p\u003e\n\u003cp\u003e部分渠道可以免密支付，平台需承担部分风控责任，但用户体验好，支付速度快。\u003c/p\u003e\n\u003cp\u003e支持银行：取决于服务提供方的合作银行数量。\u003c/p\u003e\n\u003ch2 id=\"7-账户余额支付\"\u003e7. 账户余额支付\u003c/h2\u003e\n\u003cp\u003e购买支付牌照或通过和第三方支付公司合作提供钱包功能，支持用户充值余额支付。\u003c/p\u003e\n\u003cp\u003e平台需要针对充值、支付、提现做一定风控措施。该方式对用户体验好，且有助于提高用户粘性。\u003c/p\u003e\n\u003ch2 id=\"8-金融白条支付\"\u003e8. 金融白条支付\u003c/h2\u003e\n\u003cp\u003e比较知名的有花呗、京东白条、美团月付等，通过金融机构授信一定额度给用户支付，C端大部分有一个月的平台贴息。该方式可以大幅提升用户粘性，特别是一些B端客户对现金流比较重视，提供账期可以建立紧密合作关系，但这对信用评估和风控有较高要求。\u003c/p\u003e\n\u003ch2 id=\"9-月结\"\u003e9. 月结\u003c/h2\u003e\n\u003cp\u003e由商家针对指定客户允许其赊账或签订月结的协议，商家自行记账并要求客户定期还款，平台如果有自营业务，也会考虑设计相关功能。该方式交易不受第三方担保，可以不经过电商平台，通常是商家与合作紧密熟悉的客户采用该方式。\u003c/p\u003e\n\u003ch2 id=\"10-数字人民币\"\u003e10. 数字人民币\u003c/h2\u003e\n\u003cp\u003e等同于现金支付，目前支付APP和扫码支付，使用量较低。\u003c/p\u003e\n\u003ch2 id=\"11-代付\"\u003e11. 代付\u003c/h2\u003e\n\u003cp\u003e生成订单并将代付收银台分享给其他用户进行支付。代付收银台页面提供的支付方式需要考虑代付用户的身份，设备环境等因素。\u003c/p\u003e\n\u003ch2 id=\"12-先用后付\"\u003e12. 先用后付\u003c/h2\u003e\n\u003cp\u003e授信门槛低，通常额度小，不计入央行征信，由平台担保并向商家收取交易服务费，C端通常用户要开通了绑定银行卡代扣支付方式，个人认为该方式可以降低用户的下单决策成本，同时不像花呗等信用支付方式那么重。\u003c/p\u003e","title":"国内电商平台支付方式对比"},{"content":"3.15更新：\n//3pvtkwzwrm.coze.site\ncoze生产环境的参数是部署时系统自动赋值的，不需要自己填API key之类的参数。重新做了一个在生产环境就跑通了，具体方法是让AI基于前一个应用生成一个详细的提示词包含功能点、技术架构等内容，感觉提示词专业的话对于编码还是有帮助的，但是依然会出现细节上的bug，需要进行两三次修复。功能出了问题好排查，配置或者网络等细节出了问题不是程序员的话真的不太好排查，也许是我对一些技术细节还不够了解。\n最近正好考虑雅思，新东方的雅思小程序推出了一个AI练真题的功能，参考这个试了下能否用扣子直接生成一个类似的功能。\n功能介绍：\n根据选择的题型随机生成题目，点击开始录音可以根据题型限制录音时长。录音结束后进行语音识别，并通过AI对识别结果进行分析，给出评分、改进建议和AI扩写的答案。\n首页：\n这里题目下方的灰色提示是AI自动补全的功能，prompt并未做要求，同时录音时间的文字提示也是AI补全的，页面也是响应式，交互总体比较友好。我也没有对UI风格做要求，感觉AI味比较浓（非贬义），第一遍生成的字体较小做了一次调整。\n评分页：\n在扣子上直接部署后可能是api的原因，生成环境语音识别功能没有跑通，但是在测试环境实现了完整的功能。\n整个过程大概用了两个小时，修复bug的过程比较顺畅，会进行自测基本功能问题提了都可以修复。但是涉及到接口调用，环境部署等导致的问题时，修复bug的技术要求就直线上升了，需要你能够发现比较具体的问题并准确描述，否则的话只是基于前端的报错，AI可能无法定位到准确问题，对无开发背景的人来说还是有难度。\n","permalink":"https://www.xiaoxiangtao.cn/zh/posts/preliminary-experience-generate-an-ielts-speaking-practice-webpage-using-buttons/","summary":"\u003cp\u003e3.15更新：\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"/zh/\"\u003e//3pvtkwzwrm.coze.site\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003ecoze生产环境的参数是部署时系统自动赋值的，不需要自己填API key之类的参数。重新做了一个在生产环境就跑通了，具体方法是让AI基于前一个应用生成一个详细的提示词包含功能点、技术架构等内容，感觉提示词专业的话对于编码还是有帮助的，但是依然会出现细节上的bug，需要进行两三次修复。功能出了问题好排查，配置或者网络等细节出了问题不是程序员的话真的不太好排查，也许是我对一些技术细节还不够了解。\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"/posts/preliminary-experience-generate-an-ielts-speaking-practice-webpage-using-buttons/2026031512591560-designaxt-1024x876.png\"\u003e\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003e最近正好考虑雅思，新东方的雅思小程序推出了一个AI练真题的功能，参考这个试了下能否用扣子直接生成一个类似的功能。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e功能介绍：\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e根据选择的题型随机生成题目，点击开始录音可以根据题型限制录音时长。录音结束后进行语音识别，并通过AI对识别结果进行分析，给出评分、改进建议和AI扩写的答案。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e首页：\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"/posts/preliminary-experience-generate-an-ielts-speaking-practice-webpage-using-buttons/2026012814413133-designaxt-1024x680.png\"\u003e\u003c/p\u003e\n\u003cp\u003e这里题目下方的灰色提示是AI自动补全的功能，prompt并未做要求，同时录音时间的文字提示也是AI补全的，页面也是响应式，交互总体比较友好。我也没有对UI风格做要求，感觉AI味比较浓（非贬义），第一遍生成的字体较小做了一次调整。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e评分页：\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"/posts/preliminary-experience-generate-an-ielts-speaking-practice-webpage-using-buttons/202601281501356-designaxt-1024x827.png\"\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"/posts/preliminary-experience-generate-an-ielts-speaking-practice-webpage-using-buttons/2026012815015559-designaxt-895x1024.png\"\u003e\u003c/p\u003e\n\u003cp\u003e在扣子上直接部署后可能是api的原因，生成环境语音识别功能没有跑通，但是在测试环境实现了完整的功能。\u003c/p\u003e\n\u003cp\u003e整个过程大概用了两个小时，修复bug的过程比较顺畅，会进行自测基本功能问题提了都可以修复。但是涉及到接口调用，环境部署等导致的问题时，修复bug的技术要求就直线上升了，需要你能够发现比较具体的问题并准确描述，否则的话只是基于前端的报错，AI可能无法定位到准确问题，对无开发背景的人来说还是有难度。\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"/posts/preliminary-experience-generate-an-ielts-speaking-practice-webpage-using-buttons/2026012815044317-designaxt-1024x183.png\"\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"/posts/preliminary-experience-generate-an-ielts-speaking-practice-webpage-using-buttons/2026012815041617-designaxt-1024x991.png\"\u003e\u003c/p\u003e","title":"初步体验：用扣子生成一个雅思口语练习网页"},{"content":"最近接触到了一些关于反诈骗洗钱的工作，对电信诈骗洗钱等有了比较直观的认知。电商平台很容易被犯罪份子利用，作为产品经理，设计产品时一定要有风险意识，否则产品上出现犯罪情况，轻则有自责感、负罪感，重则接受行政处罚，双罚制实施后上至平台下至负责人均会受罚，打击犯罪，人人有责。\n相关资料 充值提现平台，缘何沦为诈骗犯“洗钱工具”？ //zhuanlan.zhihu.com/p/151289531\n中华人民共和国反电信网络诈骗法（全文） //zhuanlan.zhihu.com/p/560714960\n风控系统设计 对于电商平台的账户系统，一般会有开户、储值、交易、提现几个主要功能。在设计之初，每个功能都需要针对业务场景做限制，功能上线后，需要考虑可能被利用或存在风险的场景，对用户数据做监控，及时识别异常用户行为，做对应的限制、告警、以及拦截。\n开户环节，要充分落实KYC，非目标用户无需开放开户入口，如果账户权限有多种类别，则对用户也要严格分类对应，满足指定条件用户可开对应账户。不要为了后期功能改造的灵活性，或者为了业务的快速扩张，而放松限制，设计时务必要在业务和安全方面做好衡量，追求业务指标而忽视安全可能导致严重后果。\n储值环节，要考虑支持哪些支付渠道储值，一般来说信用卡支付要禁止，公私账支付也要根据平台虚拟账户性质做对应处理。另外，用户是否有储值的需要？一般需要储值多少额度？用户一般在什么时间操作储值？这些特征都需要研究并做对应风控，比如限制储值额度，禁止部分用户储值，禁止部分业务使用余额支付，异常时间储值告警等。\n交易的监控是电商平台的核心工作之一，一般来说平台对用户和商家入驻已经做了限制和审核，平台仅需要核对买卖双方的交易真实性即可。从分账系统的角度看，交易的概念更为广泛，从A账户到B账户的转账，即是一笔交易，在用户购买商品行为之外，其他业务场景也可能出现交易。这里我们需要检查交易的合理性，不仅针对正常的用户购买行为，还需检查用户账户之间和商家账户之间可能的转账行为。对于特殊业务场景导致的和购买行为不对应的交易，应该做严格限制，最低程度的满足业务场景需求即可，超出此场景的交易一律禁止。对于用户购买产生的交易，则要检查其购买频次、金额，以避免用户和商家串通，伪造交易利用平台洗钱，必要时需要校验付款用户身份以防范盗号、卖号等情况。\n原路退款一般没有风险，提现是用户账户出金的唯二路径（不含平台转账扣费等），不管前面出现了哪些问题，最后一道防火墙如果拦住了，就可以避免资金损失。提现本身需要做安全校验，另外提现还需要严格限制资金去向。对于提现金额、笔数、到账时效都需要做风控，如果是提现次数不多的B端平台，交给人工审核也是个好主意。\n总的来说，风控既要防竞对，又要防内鬼，还要防未知的犯罪份子，设计产品时不能只想到一方，不同坏人做坏事，手段会有所区别，做产品的，对于本身存在较大风险的业务，能不做尽量别做，一定要做的话，还是想想清楚什么方案风险最小。\n","permalink":"https://www.xiaoxiangtao.cn/zh/posts/anti-telecom-fraud-money-laundering-and-risk-control/","summary":"\u003cp\u003e最近接触到了一些关于反诈骗洗钱的工作，对电信诈骗洗钱等有了比较直观的认知。电商平台很容易被犯罪份子利用，作为产品经理，设计产品时一定要有风险意识，否则产品上出现犯罪情况，轻则有自责感、负罪感，重则接受行政处罚，双罚制实施后上至平台下至负责人均会受罚，打击犯罪，人人有责。\u003c/p\u003e\n\u003ch3 id=\"相关资料\"\u003e相关资料\u003c/h3\u003e\n\u003cp\u003e充值提现平台，缘何沦为诈骗犯“洗钱工具”？ \u003ca href=\"//zhuanlan.zhihu.com/p/151289531\"\u003e//zhuanlan.zhihu.com/p/151289531\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e中华人民共和国反电信网络诈骗法（全文） \u003ca href=\"//zhuanlan.zhihu.com/p/560714960\"\u003e//zhuanlan.zhihu.com/p/560714960\u003c/a\u003e\u003c/p\u003e\n\u003ch3 id=\"风控系统设计\"\u003e风控系统设计\u003c/h3\u003e\n\u003cp\u003e对于电商平台的账户系统，一般会有开户、储值、交易、提现几个主要功能。在设计之初，每个功能都需要针对业务场景做限制，功能上线后，需要考虑可能被利用或存在风险的场景，对用户数据做监控，及时识别异常用户行为，做对应的限制、告警、以及拦截。\u003c/p\u003e\n\u003cp\u003e开户环节，要充分落实KYC，非目标用户无需开放开户入口，如果账户权限有多种类别，则对用户也要严格分类对应，满足指定条件用户可开对应账户。不要为了后期功能改造的灵活性，或者为了业务的快速扩张，而放松限制，设计时务必要在业务和安全方面做好衡量，追求业务指标而忽视安全可能导致严重后果。\u003c/p\u003e\n\u003cp\u003e储值环节，要考虑支持哪些支付渠道储值，一般来说信用卡支付要禁止，公私账支付也要根据平台虚拟账户性质做对应处理。另外，用户是否有储值的需要？一般需要储值多少额度？用户一般在什么时间操作储值？这些特征都需要研究并做对应风控，比如限制储值额度，禁止部分用户储值，禁止部分业务使用余额支付，异常时间储值告警等。\u003c/p\u003e\n\u003cp\u003e交易的监控是电商平台的核心工作之一，一般来说平台对用户和商家入驻已经做了限制和审核，平台仅需要核对买卖双方的交易真实性即可。从分账系统的角度看，交易的概念更为广泛，从A账户到B账户的转账，即是一笔交易，在用户购买商品行为之外，其他业务场景也可能出现交易。这里我们需要检查交易的合理性，不仅针对正常的用户购买行为，还需检查用户账户之间和商家账户之间可能的转账行为。对于特殊业务场景导致的和购买行为不对应的交易，应该做严格限制，最低程度的满足业务场景需求即可，超出此场景的交易一律禁止。对于用户购买产生的交易，则要检查其购买频次、金额，以避免用户和商家串通，伪造交易利用平台洗钱，必要时需要校验付款用户身份以防范盗号、卖号等情况。\u003c/p\u003e\n\u003cp\u003e原路退款一般没有风险，提现是用户账户出金的唯二路径（不含平台转账扣费等），不管前面出现了哪些问题，最后一道防火墙如果拦住了，就可以避免资金损失。提现本身需要做安全校验，另外提现还需要严格限制资金去向。对于提现金额、笔数、到账时效都需要做风控，如果是提现次数不多的B端平台，交给人工审核也是个好主意。\u003c/p\u003e\n\u003cp\u003e总的来说，风控既要防竞对，又要防内鬼，还要防未知的犯罪份子，设计产品时不能只想到一方，不同坏人做坏事，手段会有所区别，做产品的，对于本身存在较大风险的业务，能不做尽量别做，一定要做的话，还是想想清楚什么方案风险最小。\u003c/p\u003e","title":"反电信诈骗洗钱与风控"},{"content":"\n和美术馆由普利兹克获奖建筑师安藤忠雄担任建筑设计。建筑理念融入“天圆地方”的中原正朔文化元素，主体由圆弧形与方形的几何结构组成。正中心的圆形逐渐变换重心、比例、高度，交错重叠，从内到外、从建筑到城市，慢慢扩展延伸。和美术馆的“和”既是“协和”，也是“混和”，象征空间融合境界的理念。\n馆藏有部分国画精品，包括张大千、吴冠中、黄宾虹等画家作品。\n此外不定期有国内外艺术家作品展。这次去的时候有极简艺术家夏纳•霍维兹作品展：交织的韵律。作品特点大致是在方格纸上按数学规律重复基础图案、线条、色彩，形成有韵律感的画作。没有看到大型作品，有启发但不是很感兴趣。\n在4楼可以参观艺术品修复工作，有点像三星堆博物馆的参观形式。但是隔着透明玻璃一直看着里边工作人员其实感觉有些尴尬。\n","permalink":"https://www.xiaoxiangtao.cn/zh/posts/and-the-art-museum-hem/","summary":"\u003cp\u003e\u003cimg loading=\"lazy\" src=\"/posts/and-the-art-museum-hem/2023060413581778-designaxt-1024x683.jpg\"\u003e\u003c/p\u003e\n\u003cp\u003e和美术馆由普利兹克获奖建筑师安藤忠雄担任建筑设计。建筑理念融入“天圆地方”的中原正朔文化元素，主体由圆弧形与方形的几何结构组成。正中心的圆形逐渐变换重心、比例、高度，交错重叠，从内到外、从建筑到城市，慢慢扩展延伸。和美术馆的“和”既是“协和”，也是“混和”，象征空间融合境界的理念。\u003c/p\u003e\n\u003cp\u003e馆藏有部分国画精品，包括张大千、吴冠中、黄宾虹等画家作品。\u003c/p\u003e\n\u003cp\u003e此外不定期有国内外艺术家作品展。这次去的时候有极简艺术家夏纳•霍维兹作品展：交织的韵律。作品特点大致是在方格纸上按数学规律重复基础图案、线条、色彩，形成有韵律感的画作。没有看到大型作品，有启发但不是很感兴趣。\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"/posts/and-the-art-museum-hem/2023060414562710-designaxt-909x1024.png\"\u003e\u003c/p\u003e\n\u003cp\u003e在4楼可以参观艺术品修复工作，有点像三星堆博物馆的参观形式。但是隔着透明玻璃一直看着里边工作人员其实感觉有些尴尬。\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"/posts/and-the-art-museum-hem/2023060413543989-designaxt-1024x683.jpg\"\u003e\u003c/p\u003e","title":"和美术馆（HEM）"},{"content":"从《跨境电子商务支付与结算》一书出发，了解跨境支付领域。\n跨境支付的几个基本概念 汇（外汇） 外汇，英文名是Foreign currency，是货币行政当局（ 中央银行、货币管理机构、 外汇平准基金 及财政部）以 银行存款、财政部库券、长短期政府证券等形式保有的在 国际收支逆差 时可以使用的债权。包括外国货币、外币存款、外币有价证券（政府公债、国库券、公司债券、股票等）、 外币支付凭证（票据、银行存款凭证、邮政储蓄凭证等）。\n广义 一国拥有的一切以外币表示的资产。是指货币在各国间的流动以及把一个国家的 货币兑换 成另一个国家的货币，借以清偿国际间债权、债务关系的一种专门性的经营活动。实际上就是货币行政当局（ 中央银行、货币管理机构、外汇平准基金及财政部）以银行存款、 财政部 库券、长短期政府债券等形式所保有的在 国际收支逆差 时可以使用的债权。\n狭义 以外国货币表示的，为各国普遍接受的，可用于国际间债权债务结算的各种支付手段。必须具备三个特点：可支付性（必须以外国货币表示的资产）、可获得性（必须是在国外能够得到补偿的债权）和可换性（必须是可以自由兑换为其他支付手段的外币资产）。\n浮动汇率制度 法郎的汇率水平，并非由投机者或贸易平衡，甚至不是 鲁尔区 的冒险行为所决定的，而是法国的纳税人愿意拿出多少自己的收入，去支付给法国的食利者们。——凯恩斯\n汇率的一个基本来源是维持购买力平价，比如在我国买一个鸡蛋1元，在美国买一个鸡蛋0.2美元，则1rmb就应该对0.2usd。如果没有汇率而是1:1兑换，那么1元人民在国内可以买一个蛋，换成美元在美国可以买几个蛋，国内的人就会把人民币换成美元买美国的蛋，导致人民币流向美国，美国的蛋流向中国。这样一来市场就对国内的蛋商失去信心，国内商品价格没有竞争力，资金都往国外跑，而美国的蛋则变得供小于求，物价飞升，美国百姓买不起蛋，中国用钞票轻松换走了美国的蛋，这么一看中美都不乐意了，为了维持国内市场的稳定和国际贸易的公平，需要有汇率来换算双方货币。\n当然现实是反过来的，过去我们可以用黄金来作为衡量的基准，后来美国称霸世界美元取代了黄金，国际结算都用美元，美国可以印钞票从全世界买蛋。1973年，以美元为中心的固定汇率制完全解体，各国（或地区）纷纷实行浮动汇率制。实际情况下汇率还会受到贸易保护、金融市场、政治等因素的影响，为了摆脱美元霸权，我们开始推行人民币结算，另外我们也制定了更为稳定可靠的汇率制度。\n我国实施以市场供求为基础、 参考一篮子货币， 有管理的浮动汇率制度。中国人民银行根据前一日 银行间外汇市场 形成的价格，公布人民币对美元等主要货币的汇率，各银行以此为依据，在中国人民银行规定的浮动幅度内自行挂牌。人行本身是银行间外汇市场的重要参与者，可以根据货币政策买卖外汇，调整汇率。\n传统跨境支付方式 汇付（Remittance，即汇款） 汇付属于商业信用，银行只是接受委托提供服务，是否支付取决于买方遵守合同约定。\n信汇：汇出行寄信汇委托书给汇入行，解付金额给收款方 电汇：汇出行拍发加压电报、电传给汇入行，解付金额 票汇：付款方使用汇票、本票、支票等工具主动支付给收款方 托收 托收属于逆汇，即单据流向与资金流相反，卖房（出口方）开具以进口方为汇款人的汇票，委托出口方银行通过其在进口方的分行或代理行向进口方收款的一种结算方式。\n托收同样属于商业信用，银行完全根据卖房指示收款，是否付款取决于买房的信用。\n光票托收：一般是小额、预付款、分期或者收取贸易从属费用等，金融单据不跟随商业票据 跟单托收：金融票据跟随商业票据 信用证（Letter of Credit，L/C） 信用证属于银行信用。信用证不依赖于买卖商业合同（自足文件，self-sufficient instrument)，不和货物关联（纯单据业务），开证银行有首要付款责任。\n新型跨境支付方式 传统的跨境支付贸易主要为B2B大额贸易，支付手段多依靠银行完成。伴随着互联网的发展与普及，B2B、C2C跨境电子商务以及小额B2B贸易市场不断发展，涌现了许多新型跨境支付方式，就国内来说，这些支付方式多为持有支付业务许可证（央行颁发）和外汇管理局准许开展跨境电子商务外汇支付业务试点的批复文件的第三方支付机构所开发。\n以下列举了主流的新型跨境支付方式：\n国内：支付宝、微信支付、连连支付、pingPong\n国外：Paypal、Western Union、WebMoney（在俄语系国家、日本、欧美使用较多）\n以上支付机构的主要收入来源为支付手续费和支付解决方案。另外还有汇率差等非常规性收入。\n相较传统的跨境支付方式，新型跨境支付具有：手续费低、付款简单、到账时间快、能应对平台高并发交易场景等优势。\n第三方机构的支付实现 跨境电子商务平台一般会接入多个支付通道并进行路由，和境内支付类似。\n税务 金融及风险应对 有关技术 ","permalink":"https://www.xiaoxiangtao.cn/zh/posts/introduction-to-cross-border-payment/","summary":"\u003cp\u003e从《跨境电子商务支付与结算》一书出发，了解跨境支付领域。\u003c/p\u003e\n\u003ch2 id=\"跨境支付的几个基本概念\"\u003e跨境支付的几个基本概念\u003c/h2\u003e\n\u003ch3 id=\"汇外汇\"\u003e汇（外汇）\u003c/h3\u003e\n\u003cp\u003e外汇，英文名是Foreign currency，是货币行政当局（ \u003ca href=\"//baike.baidu.com/item/E4%5CxB8%5CxAD%5CxE5%5CxA4%5CxAE%5CxE9%5Cx93%5CxB6%5CxE8%5CxA1%5Cx8C/1441284?fromModule=lemma_inlink\"\u003e中央银行\u003c/a\u003e、货币管理机构、 \u003ca 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\"\u003e外汇平准基金\u003c/a\u003e 及财政部）以 \u003ca href=\"//baike.baidu.com/item/E9%5Cx93%5CxB6%5CxE8%5CxA1%5Cx8C%5CxE5%5CxAD%5Cx98%5CxE6%5CxAC%5CxBE/10010786?fromModule=lemma_inlink\"\u003e银行存款\u003c/a\u003e、财政部库券、长短期政府证券等形式保有的在 \u003ca 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\"\u003e国际收支逆差\u003c/a\u003e 时可以使用的债权。包括外国货币、外币存款、外币有价证券（政府公债、国库券、公司债券、股票等）、 \u003ca 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\"\u003e外币支付凭证\u003c/a\u003e（票据、银行存款凭证、邮政储蓄凭证等）。\u003c/p\u003e\n\u003ch4 id=\"广义\"\u003e广义\u003c/h4\u003e\n\u003cp\u003e一国拥有的一切以外币表示的资产。是指货币在各国间的流动以及把一个国家的 \u003ca href=\"//baike.baidu.com/item/E8%5CxB4%5CxA7%5CxE5%5CxB8%5Cx81%5CxE5%5Cx85%5Cx91%5CxE6%5Cx8D%5CxA2?fromModule=lemma_inlink\"\u003e货币兑换\u003c/a\u003e 成另一个国家的货币，借以清偿国际间债权、债务关系的一种专门性的经营活动。实际上就是货币行政当局（ \u003ca href=\"//baike.baidu.com/item/E4%5CxB8%5CxAD%5CxE5%5CxA4%5CxAE%5CxE9%5Cx93%5CxB6%5CxE8%5CxA1%5Cx8C?fromModule=lemma_inlink\"\u003e中央银行\u003c/a\u003e、货币管理机构、外汇平准基金及财政部）以银行存款、 \u003ca href=\"//baike.baidu.com/item/E8%5CxB4%5CxA2%5CxE6%5Cx94%5CxBF%5CxE9%5Cx83%5CxA8?fromModule=lemma_inlink\"\u003e财政部\u003c/a\u003e 库券、长短期政府债券等形式所保有的在 \u003ca 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\"\u003e国际收支逆差\u003c/a\u003e 时可以使用的债权。\u003c/p\u003e\n\u003ch4 id=\"狭义\"\u003e狭义\u003c/h4\u003e\n\u003cp\u003e以外国货币表示的，为各国普遍接受的，可用于国际间债权债务结算的各种支付手段。必须具备三个特点：可支付性（必须以外国货币表示的资产）、可获得性（必须是在国外能够得到补偿的债权）和可换性（必须是可以自由兑换为其他支付手段的外币资产）。\u003c/p\u003e\n\u003ch3 id=\"浮动汇率制度\"\u003e浮动汇率制度\u003c/h3\u003e\n\u003cp\u003e\u003cem\u003e法郎的汇率水平，并非由投机者或贸易平衡，甚至不是 \u003ca href=\"/zh/search/?q=%5cxE9%5cxB2%5cx81%5cxE5%5cxB0%5cx94%5cxE5%5cx8C%5cxBA\u0026amp;search_source=Entity\u0026amp;hybrid_search_source=Entity\u0026amp;hybrid_search_extra=%5cx7B%5cx22sourceType%5cx22%5cx3A%5cx22answer%5cx22%5cx2C%5cx22sourceId%5cx22%5cx3A%5cx2222965187%5cx22%5cx7D\"\u003e鲁尔区\u003c/a\u003e 的冒险行为所决定的，而是法国的纳税人愿意拿出多少自己的收入，去支付给法国的食利者们。——凯恩斯\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003e汇率的一个基本来源是维持购买力平价，比如在我国买一个鸡蛋1元，在美国买一个鸡蛋0.2美元，则1rmb就应该对0.2usd。如果没有汇率而是1:1兑换，那么1元人民在国内可以买一个蛋，换成美元在美国可以买几个蛋，国内的人就会把人民币换成美元买美国的蛋，导致人民币流向美国，美国的蛋流向中国。这样一来市场就对国内的蛋商失去信心，国内商品价格没有竞争力，资金都往国外跑，而美国的蛋则变得供小于求，物价飞升，美国百姓买不起蛋，中国用钞票轻松换走了美国的蛋，这么一看中美都不乐意了，为了维持国内市场的稳定和国际贸易的公平，需要有汇率来换算双方货币。\u003c/p\u003e\n\u003cp\u003e当然现实是反过来的，过去我们可以用黄金来作为衡量的基准，后来美国称霸世界美元取代了黄金，国际结算都用美元，美国可以印钞票从全世界买蛋。1973年，以美元为中心的固定汇率制完全解体，各国（或地区）纷纷实行浮动汇率制。实际情况下汇率还会受到贸易保护、金融市场、政治等因素的影响，为了摆脱美元霸权，我们开始推行人民币结算，另外我们也制定了更为稳定可靠的汇率制度。\u003c/p\u003e\n\u003cp\u003e我国实施以市场供求为基础、 \u003ca href=\"/zh/search/?q=%5cxE5%5cx8F%5cx82%5cxE8%5cx80%5cx83%5cxE4%5cxB8%5cx80%5cxE7%5cxAF%5cxAE%5cxE5%5cxAD%5cx90%5cxE8%5cxB4%5cxA7%5cxE5%5cxB8%5cx81\u0026amp;search_source=Entity\u0026amp;hybrid_search_source=Entity\u0026amp;hybrid_search_extra=%5cx7B%5cx22sourceType%5cx22%5cx3A%5cx22answer%5cx22%5cx2C%5cx22sourceId%5cx22%5cx3A%5cx2268768295%5cx22%5cx7D\"\u003e参考一篮子货币\u003c/a\u003e， \u003ca href=\"/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\u0026amp;search_source=Entity\u0026amp;hybrid_search_source=Entity\u0026amp;hybrid_search_extra=%5cx7B%5cx22sourceType%5cx22%5cx3A%5cx22answer%5cx22%5cx2C%5cx22sourceId%5cx22%5cx3A%5cx2268768295%5cx22%5cx7D\"\u003e有管理的浮动汇率制度\u003c/a\u003e。中国人民银行根据前一日 \u003ca href=\"/zh/search/?q=%5cxE9%5cx93%5cxB6%5cxE8%5cxA1%5cx8C%5cxE9%5cx97%5cxB4%5cxE5%5cxA4%5cx96%5cxE6%5cxB1%5cx87%5cxE5%5cxB8%5cx82%5cxE5%5cx9C%5cxBA\u0026amp;search_source=Entity\u0026amp;hybrid_search_source=Entity\u0026amp;hybrid_search_extra=%5cx7B%5cx22sourceType%5cx22%5cx3A%5cx22answer%5cx22%5cx2C%5cx22sourceId%5cx22%5cx3A%5cx22107412890%5cx22%5cx7D\"\u003e银行间外汇市场\u003c/a\u003e 形成的价格，公布人民币对美元等主要货币的汇率，各银行以此为依据，在中国人民银行规定的浮动幅度内自行挂牌。人行本身是银行间外汇市场的重要参与者，可以根据货币政策买卖外汇，调整汇率。\u003c/p\u003e\n\u003ch3 id=\"传统跨境支付方式\"\u003e传统跨境支付方式\u003c/h3\u003e\n\u003ch4 id=\"汇付remittance即汇款\"\u003e汇付（Remittance，即汇款）\u003c/h4\u003e\n\u003cp\u003e汇付属于商业信用，银行只是接受委托提供服务，是否支付取决于买方遵守合同约定。\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e信汇：汇出行寄信汇委托书给汇入行，解付金额给收款方\u003c/li\u003e\n\u003cli\u003e电汇：汇出行拍发加压电报、电传给汇入行，解付金额\u003c/li\u003e\n\u003cli\u003e票汇：付款方使用汇票、本票、支票等工具主动支付给收款方\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch4 id=\"托收\"\u003e托收\u003c/h4\u003e\n\u003cp\u003e托收属于逆汇，即单据流向与资金流相反，卖房（出口方）开具以进口方为汇款人的汇票，委托出口方银行通过其在进口方的分行或代理行向进口方收款的一种结算方式。\u003c/p\u003e\n\u003cp\u003e托收同样属于商业信用，银行完全根据卖房指示收款，是否付款取决于买房的信用。\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e光票托收：一般是小额、预付款、分期或者收取贸易从属费用等，金融单据不跟随商业票据\u003c/li\u003e\n\u003cli\u003e跟单托收：金融票据跟随商业票据\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch4 id=\"信用证letter-of-creditlc\"\u003e信用证（Letter of Credit，L/C）\u003c/h4\u003e\n\u003cp\u003e信用证属于银行信用。信用证不依赖于买卖商业合同（自足文件，self-sufficient instrument)，不和货物关联（纯单据业务），开证银行有首要付款责任。\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"/posts/introduction-to-cross-border-payment/2023100402013367-designaxt-1024x739.png\"\u003e\u003c/p\u003e\n\u003ch3 id=\"新型跨境支付方式\"\u003e新型跨境支付方式\u003c/h3\u003e\n\u003cp\u003e传统的跨境支付贸易主要为B2B大额贸易，支付手段多依靠银行完成。伴随着互联网的发展与普及，B2B、C2C跨境电子商务以及小额B2B贸易市场不断发展，涌现了许多新型跨境支付方式，就国内来说，这些支付方式多为持有支付业务许可证（央行颁发）和外汇管理局准许开展跨境电子商务外汇支付业务试点的批复文件的第三方支付机构所开发。\u003c/p\u003e\n\u003cp\u003e以下列举了主流的新型跨境支付方式：\u003c/p\u003e\n\u003cp\u003e国内：支付宝、微信支付、连连支付、pingPong\u003c/p\u003e\n\u003cp\u003e国外：Paypal、Western Union、WebMoney（在俄语系国家、日本、欧美使用较多）\u003c/p\u003e\n\u003cp\u003e以上支付机构的主要收入来源为支付手续费和支付解决方案。另外还有汇率差等非常规性收入。\u003c/p\u003e\n\u003cp\u003e相较传统的跨境支付方式，新型跨境支付具有：手续费低、付款简单、到账时间快、能应对平台高并发交易场景等优势。\u003c/p\u003e\n\u003ch5 id=\"第三方机构的支付实现\"\u003e第三方机构的支付实现\u003c/h5\u003e\n\u003cp\u003e跨境电子商务平台一般会接入多个支付通道并进行路由，和境内支付类似。\u003c/p\u003e\n\u003ch3 id=\"税务\"\u003e税务\u003c/h3\u003e\n\u003ch3 id=\"金融及风险应对\"\u003e金融及风险应对\u003c/h3\u003e\n\u003ch3 id=\"有关技术\"\u003e有关技术\u003c/h3\u003e","title":"初识跨境支付"},{"content":"众所周知，微信零钱的提现会收取千分之一的手续费，有人在使用中专门注意过这个手续费是怎么收的吗？说来惭愧，作为产品经理的我并没有好好研究过这个功能，直到这次碰到要做平台用户账户的提现功能，研究后才发现习以为常的微信零钱提现，也是有些小设计在的。\nQ：假设你要提现1万元，现在钱包里有两万，微信会怎么扣款呢？\nA：你的银行卡会到账1万元，但是钱包会有两条流水：1万元提现，以及10元的服务费，钱包里还剩下9990元。\nQ：假设你还是要提现1万元，现在钱包里正好有1万元，微信又是怎么处理的呢？\nA：此时自不能再扣除10010元了，钱包里只有1万，那从1万里扣10元手续费，银行卡到账9990元不就好了，真是如此吗？实际上，此时微信计算的手续费为9.99元，银行卡到账9990.01元。\n为什么是9.99？因为你会发现，第一种情况手续费比例可以算作 10/（10000+10），在第二种情况下，手续费比例则算做了 10/10000，当用户想把钱包里的钱全部提走，手续费变相的变高了，这是不合理的，遇到深究的用户，可能有法律风险。可是要避开第二种手续费情况，如何处理比较合适呢？此时用户输入的提现金额就是钱包余额，要扣除手续费，到账金额已经不可能与用户输入的提现金额相等了。\n微信的方案是计算出了一个区分情况1和情况2的提现金额，即 情况1下 到账金额加上手续费正好等于钱包余额对应的提现金额。输入的提现金额再大，就会变成情况2，这时系统自动把提现金额改为临界值，不管输入多大的提现金额，实际提现始终是 到账 + 手续费 = 全部余额 的情况。比如上述例子里，9990.01就是这个分界线，9990.01～10000元输入此间任意提现金额，到账金额都是9990.01，手续费都是9.99元。\n","permalink":"https://www.xiaoxiangtao.cn/zh/posts/thoughts-on-withdrawal-function/","summary":"\u003cp\u003e众所周知，微信零钱的提现会收取千分之一的手续费，有人在使用中专门注意过这个手续费是怎么收的吗？说来惭愧，作为产品经理的我并没有好好研究过这个功能，直到这次碰到要做平台用户账户的提现功能，研究后才发现习以为常的微信零钱提现，也是有些小设计在的。\u003c/p\u003e\n\u003cp\u003eQ：假设你要提现1万元，现在钱包里有两万，微信会怎么扣款呢？\u003c/p\u003e\n\u003cp\u003eA：你的银行卡会到账1万元，但是钱包会有两条流水：1万元提现，以及10元的服务费，钱包里还剩下9990元。\u003c/p\u003e\n\u003cp\u003eQ：假设你还是要提现1万元，现在钱包里正好有1万元，微信又是怎么处理的呢？\u003c/p\u003e\n\u003cp\u003eA：此时自不能再扣除10010元了，钱包里只有1万，那从1万里扣10元手续费，银行卡到账9990元不就好了，真是如此吗？实际上，此时微信计算的手续费为9.99元，银行卡到账9990.01元。\u003c/p\u003e\n\u003cp\u003e为什么是9.99？因为你会发现，第一种情况手续费比例可以算作 10/（10000+10），在第二种情况下，手续费比例则算做了 10/10000，当用户想把钱包里的钱全部提走，手续费变相的变高了，这是不合理的，遇到深究的用户，可能有法律风险。可是要避开第二种手续费情况，如何处理比较合适呢？此时用户输入的提现金额就是钱包余额，要扣除手续费，到账金额已经不可能与用户输入的提现金额相等了。\u003c/p\u003e\n\u003cp\u003e微信的方案是计算出了一个区分情况1和情况2的提现金额，即 情况1下 到账金额加上手续费正好等于钱包余额对应的提现金额。输入的提现金额再大，就会变成情况2，这时系统自动把提现金额改为临界值，不管输入多大的提现金额，实际提现始终是 到账 + 手续费 = 全部余额 的情况。比如上述例子里，9990.01就是这个分界线，9990.01～10000元输入此间任意提现金额，到账金额都是9990.01，手续费都是9.99元。\u003c/p\u003e","title":"关于提现功能的一点思考"},{"content":"\n国庆期间想要避开人潮，就只有走的够高够远了吧。像天堂一般的地方，希望下次来可以露营。\n","permalink":"https://www.xiaoxiangtao.cn/zh/posts/impression-of-changping-ditch/","summary":"\u003cp\u003e\u003cimg alt=\"蓝天下的雪峰与山脚森林\" loading=\"lazy\" src=\"/posts/impression-of-changping-ditch/2021101708192256-designaxt.webp\"\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg alt=\"云层下的山谷草地与疏林\" loading=\"lazy\" src=\"/posts/impression-of-changping-ditch/2021101708194882-designaxt.webp\"\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg alt=\"山谷中的秋色树林与远处山峰\" loading=\"lazy\" src=\"/posts/impression-of-changping-ditch/2021101708205490-designaxt.webp\"\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg alt=\"山峰下流经树林的溪水\" loading=\"lazy\" src=\"/posts/impression-of-changping-ditch/2021101708215864-designaxt.webp\"\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg alt=\"蓝天下的山脊与雪峰\" loading=\"lazy\" src=\"/posts/impression-of-changping-ditch/2021101708225716-designaxt.webp\"\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg alt=\"阳光穿过森林照亮林间小径\" loading=\"lazy\" src=\"/posts/impression-of-changping-ditch/2021101708232741-designaxt.webp\"\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg alt=\"清澈水流下的沙石纹理\" loading=\"lazy\" src=\"/posts/impression-of-changping-ditch/2021101708245257-designaxt.webp\"\u003e\u003c/p\u003e\n\u003cp\u003e国庆期间想要避开人潮，就只有走的够高够远了吧。像天堂一般的地方，希望下次来可以露营。\u003c/p\u003e","title":"印象｜长坪沟"},{"content":"总结一下新入职要做哪些准备，踩过的坑加深印象。\n1.软件安装\n了解公司常用的软件，如果有现成安装好的更好，把必备软件安装好并准备好账号。如果是陌生的软件，有空的话最好学一下使用方式，找同事问。\n2.工作模式了解\n了解公司的组织架构，一般的工作流程，产品开发是使用内部系统，还是使用文档，或者使用第三方软件等，公司部门如何协作。\n对公司技术部门的情况有一个大概的了解，条件允许的话了解下大概技术水平，主要技术路线等。\n3.认识同事\n同事不用急于熟络，也不可能一下子记住所有人，这个环节更重要的是让对方认识你。但是要记住接下来和你合作会比较密切的同事，留下好印象。\n感受一下部门氛围与工作节奏，了解自己上级的工作风格。\n有机会请同事或上级吃个饭，进一步请教了解公司的情况以及对自己的要求。\n4.熟悉业务*\n几个需要背下来的：公司的基本业务板块、公司价值观、公司内部常用术语、公司主要业绩指标数值、公司主要竞争对手、市场行情与政府政策。一般公司会有一份介绍文档或PPT，一些额外信息需要向相关同事请教。\n需要熟悉的产品：对于自己所在部门的产品，主要流程都走一遍，用一用，最好能用思维导图做个归纳思路会清晰很多。主要竞品也要用一用，了解异同。\n对于自己负责接手的产品，要整个用一便，每个功能，每个状态都要试用，并画出对应的流程图，对于不清晰的地方找对接同事确认清楚。对于自己感到疑惑或者功能比较复杂的，如果公司需求文档有保留，看一下以前的需求文档，顺便了解一下公司对需求文档的要求，以及写作规范。\n对于自己负责产品涉及到的业务，最好能够亲自体验，至少基本了解业务的情况：现有缺陷，发展目标，核心竞争力/价值，商业模式等。\n要具备对数据的敏感性，拿到相关埋点数据与统计数据做分析，做到心中有数。\n5.需求文档撰写基本要求\n工作很忙，不要重复造轮子，如果已有成熟的相关产品，或者网络上有相关介绍文档，务必了解，也能应对其他人后续对产品的挑战。\n写清楚需求的背景——开发更容易理解，也证明自己不是乱提需求。\n写清楚功能的入口——开发可能也是新接手，未必了解清楚。\n写清楚不同状态、交互的流转——技术在实现时可能不会注意到这些，即便是显而易见的逻辑，也要写清楚。\n涉及到数字或选项等，写清楚：极值、默认值、格式要求、格式要求的实现形式——基本要求。\n写清楚异常情况处理——对于能够预见的异常情况，写清楚如何避免或处理。每一步都必须要考虑可能存在的异常情况。\n很重要的——一定要给图。\n6.行事准则\n低调谦虚，对同事和开发有礼貌。对于日常遇到的问题，要换位思考，请对方办事注意措辞和时间，大家工作都很忙。\n需求要一定要和开发和测试同事确认清楚，确保开发和测试知情。不能写完就完事。\n开发完成后，一定要亲自测试，上线后要亲自确认效果无误。\n","permalink":"https://www.xiaoxiangtao.cn/zh/posts/new-product-manager-induction-summary/","summary":"\u003cp\u003e总结一下新入职要做哪些准备，踩过的坑加深印象。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e1.软件安装\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e了解公司常用的软件，如果有现成安装好的更好，把必备软件安装好并准备好账号。如果是陌生的软件，有空的话最好学一下使用方式，找同事问。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e2.工作模式了解\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e了解公司的组织架构，一般的工作流程，产品开发是使用内部系统，还是使用文档，或者使用第三方软件等，公司部门如何协作。\u003c/p\u003e\n\u003cp\u003e对公司技术部门的情况有一个大概的了解，条件允许的话了解下大概技术水平，主要技术路线等。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e3.认识同事\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e同事不用急于熟络，也不可能一下子记住所有人，这个环节更重要的是让对方认识你。但是要记住接下来和你合作会比较密切的同事，留下好印象。\u003c/p\u003e\n\u003cp\u003e感受一下部门氛围与工作节奏，了解自己上级的工作风格。\u003c/p\u003e\n\u003cp\u003e有机会请同事或上级吃个饭，进一步请教了解公司的情况以及对自己的要求。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e4.熟悉业务*\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e几个需要背下来的：公司的基本业务板块、公司价值观、公司内部常用术语、公司主要业绩指标数值、公司主要竞争对手、市场行情与政府政策。一般公司会有一份介绍文档或PPT，一些额外信息需要向相关同事请教。\u003c/p\u003e\n\u003cp\u003e需要熟悉的产品：对于自己所在部门的产品，主要流程都走一遍，用一用，最好能用思维导图做个归纳思路会清晰很多。主要竞品也要用一用，了解异同。\u003c/p\u003e\n\u003cp\u003e对于自己负责接手的产品，要整个用一便，每个功能，每个状态都要试用，并画出对应的流程图，对于不清晰的地方找对接同事确认清楚。对于自己感到疑惑或者功能比较复杂的，如果公司需求文档有保留，看一下以前的需求文档，顺便了解一下公司对需求文档的要求，以及写作规范。\u003c/p\u003e\n\u003cp\u003e对于自己负责产品涉及到的业务，最好能够亲自体验，至少基本了解业务的情况：现有缺陷，发展目标，核心竞争力/价值，商业模式等。\u003c/p\u003e\n\u003cp\u003e要具备对数据的敏感性，拿到相关埋点数据与统计数据做分析，做到心中有数。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e5.需求文档撰写基本要求\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e工作很忙，不要重复造轮子，如果已有成熟的相关产品，或者网络上有相关介绍文档，务必了解，也能应对其他人后续对产品的挑战。\u003c/p\u003e\n\u003cp\u003e写清楚需求的背景——开发更容易理解，也证明自己不是乱提需求。\u003c/p\u003e\n\u003cp\u003e写清楚功能的入口——开发可能也是新接手，未必了解清楚。\u003c/p\u003e\n\u003cp\u003e写清楚不同状态、交互的流转——技术在实现时可能不会注意到这些，即便是显而易见的逻辑，也要写清楚。\u003c/p\u003e\n\u003cp\u003e涉及到数字或选项等，写清楚：极值、默认值、格式要求、格式要求的实现形式——基本要求。\u003c/p\u003e\n\u003cp\u003e写清楚异常情况处理——对于能够预见的异常情况，写清楚如何避免或处理。每一步都必须要考虑可能存在的异常情况。\u003c/p\u003e\n\u003cp\u003e很重要的——一定要给图。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e6.行事准则\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e低调谦虚，对同事和开发有礼貌。对于日常遇到的问题，要换位思考，请对方办事注意措辞和时间，大家工作都很忙。\u003c/p\u003e\n\u003cp\u003e需求要一定要和开发和测试同事确认清楚，确保开发和测试知情。不能写完就完事。\u003c/p\u003e\n\u003cp\u003e开发完成后，一定要亲自测试，上线后要亲自确认效果无误。\u003c/p\u003e","title":"新人产品经理入职总结"},{"content":"在发掘用户需求时，用户需求未必是具体而明确的，比如老生常谈的福特的‘用户不会想要一辆汽车’，但到了实际开发产品的阶段，针对发掘的用户需求还是需要落到实处，要通过产品的具体功能来满足用户需求。因此在这里的产品需求分析与管理，是指分析表面需求后得出深层次需求，对应需求评估后给出特定的解决方案，被交给开发人员和设计师实现最终呈现为实际产品。另外toB和toC产品有所不同。\n软件需求可以简单分为功能性需求以及非功能性需求，功能性需求指需要软件实现的具体功能，比如注册，回滚操作等，非功能性需求指对软件的稳定性、应对用户高并发的能力等的需求。软件需求是具有优先级并且定量化的。重要的需求要优先被满足，同时要量化需求：比如我们应该告诉开发人员一个具体的系统相应速度要求，而不是说把系统做快一点。\n1 需求分析 1.1 需求过程中的角色 用户直接操作软件的人员客户委托公司开发软件产品的人员市场分析人员市场分析人员根据市场的需要，对实际客户进行模拟高层相关下达指示领导\n1.2 需求变更 由于需求分析的失误，客户环境和业务流程的改变，市场趋势的变化，难以避免会出现需求变更的情况。合理的需求变更未必是坏事，虽然意味着工作量的增加，但也有助于产品不断发展。应对需求变更，一方面，当需求发生变化，需要经过需求评审、比较分析后才能实施，而不是随意的根据客户要求或者想法简单变更，对于异想天开的想法应该据理力争尽量避免无谓的工作；另一方面，在编写需求文档时，要了解业务细节全盘考虑，要有模块化思想和发展的思维，提前想好产品的框架，尽量预设各种正面和负面的可能性，预留修改的空间。前期考虑全面有助于后期工作开展的顺利，比如注册功能，除了注册成功，注册失败的各种情况包括一些恶意注册的行为都应当考虑在内，比如账号已存在，密码不安全，注册项未填，账号密码格式或内容不合规，防止机器人，验证码验证邮件未收到，邮件链接无法打开等各种情况。\n1.3 需求来源 高层意志：公司高层下达的目标，产品经理的职责需要对目标进行评估分析，对于确认的目标分解划分优先级。 行业知识：产品经理需要及时跟进行业动向，新技术新概念的产生与运用会带来新的需求，或者与已有需求矛盾，这需要产品经理依靠行业知识来判断。比如AI技术的火热会造成产品需要提供一些相关的新功能或者对已有功能提供的服务进行升级，如果竞品率先运用某优势技术并广泛宣传，则可能对本公司产品造成竞争威胁。 用户群体：用户直接提出的需求或者分析用户得到的需求。产品的用户群体常常是成分复杂的，不同用户角色，不同用户文化，组织结构差异会产生不同的需求，需要仔细辨别，做接地气的产品。 运行环境：用户规模的变化，地域基础建设的情况比如网络性能等会要求产品做出适应变化。 组织环境：一些toB产品，相关政策，企业文化，企业工作流程与组织结构等会对产品产生定制需求。 1.4 需求获取 亲自体验 亲自参加业务工作、亲自体验产品。 调查会 邀请相关人士开会，提前设计好讨论流程和问题，并做好记录。 询问专业人士 询问该领域的专业人士，比如某业务的主管。 头脑风暴 一对一或一对多，集思广益，最后对提出的需求进行归纳整理，取有用的。 问卷调查 向用户发放问卷。 查阅资料 查看公司资料数据等，从资料中了解发现需求 1.5 需求分析模型 1.5.1 卡诺(KANO)模型 卡诺模型将需求分为5个层次：\n基本需求：用户认为必须要有的基本功能，没有此功能用户满意度大幅降低，优化此功能用户满意度提升不明显。 期望需求：用户期望的功能，有则用户满意，无则用户不满。 兴奋需求：用户预料之外的功能，很好的满足的某个需求，有则用户惊喜，满意度提升，没有满意度不会下降。 无差异需求：用户感知不强，有无对满意度影响都不大。 反向需求：普遍用户没有该需求，提供后用户感到不满，比如在CCTV播耽美剧必然导致用户不满，也不可能。 在对需求划分优先级时，应该遵照优先满足基本需求，其后开发期望需求、兴奋需求，避免无差异需求及反向需求。一些情况下需要开发一些无差异需求对应的功能，以使产品丰满另甲方满意。\n用户调研过程中，用户常常提出期望需求，而基本需求和兴奋需求则需要我们去挖掘归纳，因为这些需要是用户认为理所当然或者意向不到的。\n随着时间的推移，一些兴奋需求和期望需求会逐渐转变为基本需求，比如以前手机提供拍照功能用户觉得很惊艳，后来拍照功能逐渐成为各大厂商的卖点，旗舰手机拍照不行用户就无法接受了。\n1.5.2 马斯洛需求层次理论-Y模型 马斯洛需求反应的是深层次的基本需求，当我们得到一个用户提出的需求，基于Y模型，我们可以分析这个需求对应的用户目标即用户实际要通过满足该需求达到什么目的，进一步挖掘该动机是基于马斯洛需求层次的什么需求，通过该人性需求去设计开发对应的产品功能。一般来讲，马斯洛层次底部的功能会更加基础，工具属性更强，比如地图，外卖app等，该层次的需求也应当被优先满足。\n①是代表用户需求场景，是起点，是表象，是需求的第一种深度，观点和行为，即在什么场景下什么目标用户的什么时间操作下的什么需求；\n②是代表用户需求背后的目标和动机，需求的第二种深度，用户为什么要提出这个需求，最底层的动机是什么？我们在思考用户目标时也要综合考虑公司、产品的目标；\n③是代表产品功能，是我们根据用户需求深度剖析得出的解决方案，是实施人员能看懂的描述；\n④是代表人性需求，即马斯洛需求，或者说是需求的第三种深度价值观，是人性的需求；\n运用Y模型的一个主要的好处在于它不能跳过流程②而直接从流程①到流程③，对用户的需求有更深层次的分析有助于：不被伪需求欺骗；能够解决需求冲突；能够发现更多用户目标；能够抓住恒定的人性；能够在成熟市场中找机会；\n//zhuanlan.zhihu.com/p/123364228\n1.5.3 用户旅程图 我们获取的需求往往是零散的，用户旅程图有助于将用户需求故事化以及可视化，将需求归纳总结起来，从而帮助形成完整的用户体验设计。用户旅程图上同时可以通过梳理用户体验过程，使需求易于发现，结合用户心情或者成本等地图，发现产品或者服务流程中的用户痛点。\n用户旅程图包含明确的用户，业务场景，操作、心态和情绪，接触点和通道（用户与产品或者服务交互的时间点以及渠道），见解和所有权（某个节点有什么问题，有哪些相关者）。\nhttp://www.woshipm.com/user-research/1089015.html\n","permalink":"https://www.xiaoxiangtao.cn/zh/posts/learning-notes-on-product-requirement-analysis-and-management/","summary":"\u003cp\u003e在发掘用户需求时，用户需求未必是具体而明确的，比如老生常谈的福特的‘用户不会想要一辆汽车’，但到了实际开发产品的阶段，针对发掘的用户需求还是需要落到实处，要通过产品的具体功能来满足用户需求。因此在这里的产品需求分析与管理，是指分析表面需求后得出深层次需求，对应需求评估后给出特定的解决方案，被交给开发人员和设计师实现最终呈现为实际产品。另外toB和toC产品有所不同。\u003c/p\u003e\n\u003cp\u003e软件需求可以简单分为功能性需求以及非功能性需求，功能性需求指需要软件实现的具体功能，比如注册，回滚操作等，非功能性需求指对软件的稳定性、应对用户高并发的能力等的需求。软件需求是具有优先级并且定量化的。重要的需求要优先被满足，同时要量化需求：比如我们应该告诉开发人员一个具体的系统相应速度要求，而不是说把系统做快一点。\u003c/p\u003e\n\u003ch2 id=\"1-需求分析\"\u003e1 需求分析\u003c/h2\u003e\n\u003ch3 id=\"11-需求过程中的角色\"\u003e1.1 需求过程中的角色\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003e用户\u003c/strong\u003e直接操作软件的人员\u003cstrong\u003e客户\u003c/strong\u003e委托公司开发软件产品的人员\u003cstrong\u003e市场分析人员\u003c/strong\u003e市场分析人员根据市场的需要，对实际客户进行模拟\u003cstrong\u003e高层\u003c/strong\u003e相关下达指示领导\u003c/p\u003e\n\u003ch3 id=\"12-需求变更\"\u003e1.2 需求变更\u003c/h3\u003e\n\u003cp\u003e由于需求分析的失误，客户环境和业务流程的改变，市场趋势的变化，难以避免会出现需求变更的情况。合理的需求变更未必是坏事，虽然意味着工作量的增加，但也有助于产品不断发展。应对需求变更，一方面，当需求发生变化，需要经过需求评审、比较分析后才能实施，而不是随意的根据客户要求或者想法简单变更，对于异想天开的想法应该据理力争尽量避免无谓的工作；另一方面，在编写需求文档时，要了解业务细节全盘考虑，要有模块化思想和发展的思维，提前想好产品的框架，尽量预设各种正面和负面的可能性，预留修改的空间。前期考虑全面有助于后期工作开展的顺利，比如注册功能，除了注册成功，注册失败的各种情况包括一些恶意注册的行为都应当考虑在内，比如账号已存在，密码不安全，注册项未填，账号密码格式或内容不合规，防止机器人，验证码验证邮件未收到，邮件链接无法打开等各种情况。\u003c/p\u003e\n\u003ch3 id=\"13-需求来源\"\u003e1.3 需求来源\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003e高层意志\u003c/strong\u003e：公司高层下达的目标，产品经理的职责需要对目标进行评估分析，对于确认的目标分解划分优先级。\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e行业知识\u003c/strong\u003e：产品经理需要及时跟进行业动向，新技术新概念的产生与运用会带来新的需求，或者与已有需求矛盾，这需要产品经理依靠行业知识来判断。比如AI技术的火热会造成产品需要提供一些相关的新功能或者对已有功能提供的服务进行升级，如果竞品率先运用某优势技术并广泛宣传，则可能对本公司产品造成竞争威胁。\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e用户群体\u003c/strong\u003e：用户直接提出的需求或者分析用户得到的需求。产品的用户群体常常是成分复杂的，不同用户角色，不同用户文化，组织结构差异会产生不同的需求，需要仔细辨别，做接地气的产品。\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e运行环境\u003c/strong\u003e：用户规模的变化，地域基础建设的情况比如网络性能等会要求产品做出适应变化。\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e组织环境\u003c/strong\u003e：一些toB产品，相关政策，企业文化，企业工作流程与组织结构等会对产品产生定制需求。\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"14-需求获取\"\u003e1.4 需求获取\u003c/h3\u003e\n\u003col\u003e\n\u003cli\u003e\u003cstrong\u003e亲自体验\u003c/strong\u003e 亲自参加业务工作、亲自体验产品。\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e调查会\u003c/strong\u003e 邀请相关人士开会，提前设计好讨论流程和问题，并做好记录。\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e询问专业人士\u003c/strong\u003e 询问该领域的专业人士，比如某业务的主管。\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e头脑风暴\u003c/strong\u003e 一对一或一对多，集思广益，最后对提出的需求进行归纳整理，取有用的。\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e问卷调查\u003c/strong\u003e 向用户发放问卷。\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e查阅资料\u003c/strong\u003e 查看公司资料数据等，从资料中了解发现需求\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3 id=\"15-需求分析模型\"\u003e1.5 需求分析模型\u003c/h3\u003e\n\u003ch4 id=\"151-卡诺kano模型\"\u003e1.5.1 卡诺(KANO)模型\u003c/h4\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"/posts/learning-notes-on-product-requirement-analysis-and-management/2021033016532789-designaxt.png\"\u003e\u003c/p\u003e\n\u003cp\u003e卡诺模型将需求分为5个层次：\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003e基本需求\u003c/strong\u003e：用户认为必须要有的基本功能，没有此功能用户满意度大幅降低，优化此功能用户满意度提升不明显。\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e期望需求\u003c/strong\u003e：用户期望的功能，有则用户满意，无则用户不满。\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e兴奋需求\u003c/strong\u003e：用户预料之外的功能，很好的满足的某个需求，有则用户惊喜，满意度提升，没有满意度不会下降。\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e无差异需求\u003c/strong\u003e：用户感知不强，有无对满意度影响都不大。\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e反向需求\u003c/strong\u003e：普遍用户没有该需求，提供后用户感到不满，比如在CCTV播耽美剧必然导致用户不满，也不可能。\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e在对需求划分优先级时，应该遵照优先满足基本需求，其后开发期望需求、兴奋需求，避免无差异需求及反向需求。一些情况下需要开发一些无差异需求对应的功能，以使产品丰满另甲方满意。\u003cbr\u003e\n用户调研过程中，用户常常提出期望需求，而基本需求和兴奋需求则需要我们去挖掘归纳，因为这些需要是用户认为理所当然或者意向不到的。\u003cbr\u003e\n随着时间的推移，一些兴奋需求和期望需求会逐渐转变为基本需求，比如以前手机提供拍照功能用户觉得很惊艳，后来拍照功能逐渐成为各大厂商的卖点，旗舰手机拍照不行用户就无法接受了。\u003c/p\u003e\n\u003ch4 id=\"152-马斯洛需求层次理论-y模型\"\u003e1.5.2 马斯洛需求层次理论-Y模型\u003c/h4\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"/posts/learning-notes-on-product-requirement-analysis-and-management/2021033016552660-designaxt-1024x548.jpg\"\u003e\u003c/p\u003e\n\u003cp\u003e马斯洛需求反应的是深层次的基本需求，当我们得到一个用户提出的需求，基于Y模型，我们可以分析这个需求对应的用户目标即用户实际要通过满足该需求达到什么目的，进一步挖掘该动机是基于马斯洛需求层次的什么需求，通过该人性需求去设计开发对应的产品功能。一般来讲，马斯洛层次底部的功能会更加基础，工具属性更强，比如地图，外卖app等，该层次的需求也应当被优先满足。\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"/posts/learning-notes-on-product-requirement-analysis-and-management/2021033102074035-designaxt.jpg\"\u003e\u003c/p\u003e\n\u003cp\u003e①是代表用户需求场景，是起点，是表象，是需求的第一种深度，观点和行为，即在什么场景下什么目标用户的什么时间操作下的什么需求；\u003cbr\u003e\n②是代表用户需求背后的目标和动机，需求的第二种深度，用户为什么要提出这个需求，最底层的动机是什么？我们在思考用户目标时也要综合考虑公司、产品的目标；\u003cbr\u003e\n③是代表产品功能，是我们根据用户需求深度剖析得出的解决方案，是实施人员能看懂的描述；\u003cbr\u003e\n④是代表人性需求，即马斯洛需求，或者说是需求的第三种深度价值观，是人性的需求；\u003c/p\u003e\n\u003cp\u003e运用Y模型的一个主要的好处在于它不能跳过流程②而直接从流程①到流程③，对用户的需求有更深层次的分析有助于：不被伪需求欺骗；能够解决需求冲突；能够发现更多用户目标；能够抓住恒定的人性；能够在成熟市场中找机会；\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e\u003ca href=\"//zhuanlan.zhihu.com/p/123364228\"\u003e//zhuanlan.zhihu.com/p/123364228\u003c/a\u003e\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003ch4 id=\"153-用户旅程图\"\u003e1.5.3 用户旅程图\u003c/h4\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"/posts/learning-notes-on-product-requirement-analysis-and-management/2021033016024262-designaxt-1024x725.jpg\"\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"/posts/learning-notes-on-product-requirement-analysis-and-management/2021033016573351-designaxt.png\"\u003e\u003c/p\u003e\n\u003cp\u003e我们获取的需求往往是零散的，用户旅程图有助于将用户需求故事化以及可视化，将需求归纳总结起来，从而帮助形成完整的用户体验设计。用户旅程图上同时可以通过梳理用户体验过程，使需求易于发现，结合用户心情或者成本等地图，发现产品或者服务流程中的用户痛点。\u003c/p\u003e\n\u003cp\u003e用户旅程图包含明确的用户，业务场景，操作、心态和情绪，接触点和通道（用户与产品或者服务交互的时间点以及渠道），见解和所有权（某个节点有什么问题，有哪些相关者）。\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e\u003ca href=\"http://www.woshipm.com/user-research/1089015.html\"\u003ehttp://www.woshipm.com/user-research/1089015.html\u003c/a\u003e\u003c/p\u003e\n\u003c/blockquote\u003e","title":"产品需求分析与管理笔记"},{"content":"1 为什么要做竞品分析 1.帮助决策：了解竞争对手的产品，帮助进行产品定位，避开强大的竞争对手，避免进入红海。降低决策风险。\n2.学习借鉴：充分了解对手产品的优点，竞争力，从而能够针对性的开发我们的产品，吸收对方的优点长处，提高竞争力。\n3.预警避险：及时了解竞争对手产品的产品发展，及时发现市面上出现的颠覆性替代品，新政策的出现等， 以便快速应对，规避风险。\n2 产品生命周期与竞品分析 3 竞品分析的一般步骤 明确目标：为什么要做竞品分析 选择竞品 确定分析维度 收集信息 信息整理与分析 总结报告 3.1 明确目标 为什么产品进行竞品分析？ 这个产品处于生命周期的哪个阶段？ 当前产品的主要问题与挑战是什么？可否通过竞品分析予以解决？ 做竞品分析的目的是什么？ 做竞品分析的目标是什么？（通过达成多个具体的目标来达到最终的目的）：\n目标可以包含：决策支持、市场预警、学习借鉴\n比如是要判断这个产品有没有前途，有没有做的必要，怎么做能挣钱\n人家成功的产品是怎么做的，我们也做个类似的，抢占市场份额\n定期追踪市场的情况，有没有要关注的风险，市场份额缩小是什么原因导致的，及时补救 竞品分析的输出成果是什么？（独立的报告还是商业计划书或立项报告中的一部分） 3.2 选择竞品 根据竞品分析目的不同有不同的竞品选择原则：\n1.当目的是 决策支持 预警避险 时，可以从品牌竞品，品类竞品，替代品中寻找竞品，具体原则根据竞品的市场份额、大公司背景、用户反馈、跨界替代品进行选择。\n2.当目的是 学习借鉴 时，可以从品牌竞品、品类竞品、参照品中寻找竞品，具体原则根据市场份额，跨界参照品，产品鼻祖进行选择。\n在初步选择竞品后，要根据实际情况再次进行筛选，一般会选择3个左右进行具体分析，选择方法根据自身情况比如目的，自家产品的市场份额，所处市场的竞争情况，自家产品的发展阶段等进行判读。\n不可凭直觉来选择竞品，否则容易遗漏掉重要竞品。\n3.3 确定分析维度 可以从产品和用户两个视角来进行产品分析。产品视角是从影响一个产品成败的因素进行分析，用户视角是从用户的角度看用户在选择产品时会关注哪些方面。举例来说，对于某类没有明显差距的产品，用户的角度可能关注的是产品的价格，而从产品角度则关注的是供应链和生产技术等问题，而这些是用户在选择产品时不会触及到的。从用户视角收集竞品信息可以采用问卷访谈等方法。\n对于分析维度的选择则要根据竞品分析的目标、产品类型、产品的关键成功要素来判断。即有针对性的去分析关键的维度，比如决定这个产品成功的是技术还是外观设计？这个产品的性质是2C还是2B的，两种产品显然要从不同的维度进行分析。比如要做一个企业财务管理系统，那么系统的外观设计一般就不用重点分析。\n3.4 收集竞品信息 要充分的收集信息，但也要懂得适可而止。\n常用的数据来源包括： 百度指数 友盟 阿里指数 腾讯大数据 易观智库 艾瑞 CNNIC TalkingData 流量指数 七麦数据\n专利机构： 专利检索及分析\n3.5 信息整理与分析 不仅要收集信息，还要处理信息；不仅要罗列要点，还要加以分析。 处理信息包括归纳、分类、组合、可靠性评估等。\n常用竞品信息分析方法：\n3.5.1 比较法 打钩比较法，评分比较法，描述比较法 （ $APPEALS）\n3.5.2 矩阵分析法 确定关键竞争要素，思考产品定位。\n3.5.3 竞品跟踪矩阵 耗时长一般针对核心产品才分析，对于频繁快速迭代的产品合并小更新取大更新分析。\n3.5.4 功能拆解 全面了解竞品的构成，避免遗漏。方法：（1）按导航菜单拆解（2）按使用流程拆解（3）按交互操作拆解（4）看产品说明书拆解\n3.5.5 探索需求 挖掘竞品满足的深层次需求以找到更好的解决方案。将需求分为3个层次： 方案级需求-\u0026gt;问题级需求-\u0026gt;人性级需求， 挖掘根本需求，比如说用户需要一张椅子，椅子就是方案级需求，可用户的需求真的是椅子吗？椅子只是用户表达的满足其需求的一个方案，要具体分析，可能用户是想要休息，因此用户的需求是休息，那么这个就是问题级需求。我们再深入一层，用户为什么想要休息呢？举个极端的例子，可能用户想要活的长久，这样有更多的时间陪伴家人，享受人生，而想要活的久就是背后的人性级需求。当我们发现了这个需求以后，我们就可以有针对性的开发产品，椅子？不，我们可以开发一个号称使用后可以延年益寿的离子休息器\u0026hellip;如果用户心理有迫切的深层次需求，那么他完全可能放弃椅子转而购买我们的产品（dog.jpg）\n在实际的探索中，要发现背后的真正需求或者原因，也许不只问2次就够了，反复多问几次总没坏处。参考丰田的5why分析法。\n3.5.6 PEST分析 产品所处环境可以分为3个层次： 宏观环境-\u0026gt;行业环境-\u0026gt;企业环境-\u0026gt;产品，PEST分析法用于对 宏观环境 进行分析：做产品要顺势而为，宏观环境可能影响产品乃至公司的成败。 结合PEST分析与波特五力模型可以归纳出SWOT中的机会与威胁。PEST可以采用团队共创的方式集思广益，由跨角色团队成员分别独立罗列PEST环境因素，然后合并相似因素，进行投票选出得分高的3-5个点子作为PEST分析结果。\n在PEST之外还有法律、人口统计学、生态学等环境，可以根据需要选择是否分析。PEST分析要与时俱进及时更新，因为外界环境常瞬息万变。\n3.5.7 波特五力模型 波特五力模型用于对 行业环境 进行分析，评估行业的吸引力和利润率。5种竞争力量的强弱决定了行业的竞争激烈程度，从而决定着行业保持高收益的能力和获利的最终潜力。比如供应商的议价能力强，则生产成本比较难下压，购买者的议价能力强意味着利润较难上升等。\n3.5.8 SWOT分析 类似检查清单，列出各方面的因素便于制定竞争策略。其中：优势与劣势是内部因素，机会与威胁是外部因素；优劣势均是通过竞品比较得出，而非假想的结果；各因素不是简单的罗列，要进行选择提炼，需和竞品分析的目标、分析维度相关才有意义。做 SWOT 分析时会涉及多种方法（比较法、矩阵分析法、PEST、波特五力模型等）。\n3.6 总结报告 总结应该是价值驱动的，围绕竞品分析的目标写。在总结报告中，通常要给出竞争策略与行动计划。基于制定竞争策略的目标，可以采用一些分析方法：\n3.6.1 基于SWOT的竞争策略 3.6.2 波特三大竞争战略 成本领先战略： 企业通过降低产品的生产和经营成本，以价格优势获取市场份额，并获得超越同行业平均水平的利润。 适用于规模化生产的公司特别是制造业。 差异化战略： 做出和竞争对手不同的产品，通过提供独特的价值来吸引用户。做差异化产品的工具与方法可以选用 战略画布 与 加减乘除 等。 适用于产品线较宽的公司。 专注战略： 也叫细分市场战略，为某个特殊用户群或细分市场提供服务。 适用于比较狭小的市场。 3.6.3 其他竞争策略 4 竞品分析工具 4.1 精益画布 精益画布用于规划和分析产品商业模式。Ash Maurya在《精益创业实战》中提出精益画布，其可以帮助产品经理更全面的思考、决策，从系统、商业的角度来规划产品、分析产品，建立产品的全局观。精益画布可以用于产品规划、分析竞品商业模式以及交流讨论。\n精益画布工具与方法：\n4.2 竞品画布 竞品画布相当于竞品分析报告的MVP（最小可用产品）。可以帮助快速上手竞品分析，以及提早验证思路，避免写出一份不符合要求思路的竞品分析报告。\n4.2 战略画布 战略画布可以帮助制定“蓝海战略”开辟未开发的市场，进行产品差异化创新。案例：以产品的竞争元素作为横坐标绘制价值曲线。\n《有效竞品分析》\n张在旺\n","permalink":"https://www.xiaoxiangtao.cn/zh/posts/learning-notes-of-competitive-product-analysis/","summary":"\u003ch2 id=\"1-为什么要做竞品分析\"\u003e1 为什么要做竞品分析\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003e1.帮助决策\u003c/strong\u003e：了解竞争对手的产品，帮助进行产品定位，避开强大的竞争对手，避免进入红海。降低决策风险。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e2.学习借鉴\u003c/strong\u003e：充分了解对手产品的优点，竞争力，从而能够针对性的开发我们的产品，吸收对方的优点长处，提高竞争力。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e3.预警避险\u003c/strong\u003e：及时了解竞争对手产品的产品发展，及时发现市面上出现的颠覆性替代品，新政策的出现等， 以便快速应对，规避风险。\u003c/p\u003e\n\u003ch2 id=\"2-产品生命周期与竞品分析\"\u003e2 产品生命周期与竞品分析\u003c/h2\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"/posts/learning-notes-of-competitive-product-analysis/6435.png\"\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"/posts/learning-notes-of-competitive-product-analysis/4376547.png\"\u003e\u003c/p\u003e\n\u003ch2 id=\"3-竞品分析的一般步骤\"\u003e3 竞品分析的一般步骤\u003c/h2\u003e\n\u003col\u003e\n\u003cli\u003e明确目标：为什么要做竞品分析\u003c/li\u003e\n\u003cli\u003e选择竞品\u003c/li\u003e\n\u003cli\u003e确定分析维度\u003c/li\u003e\n\u003cli\u003e收集信息\u003c/li\u003e\n\u003cli\u003e信息整理与分析\u003c/li\u003e\n\u003cli\u003e总结报告\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"/posts/learning-notes-of-competitive-product-analysis/ertyjn.png\"\u003e\u003c/p\u003e\n\u003ch3 id=\"31-明确目标\"\u003e3.1 明确目标\u003c/h3\u003e\n\u003col\u003e\n\u003cli\u003e为什么产品进行竞品分析？\u003c/li\u003e\n\u003cli\u003e这个产品处于生命周期的哪个阶段？\u003c/li\u003e\n\u003cli\u003e当前产品的主要问题与挑战是什么？可否通过竞品分析予以解决？\u003c/li\u003e\n\u003cli\u003e做竞品分析的目的是什么？\u003c/li\u003e\n\u003cli\u003e做竞品分析的目标是什么？（通过达成多个具体的目标来达到最终的目的）：\u003cbr\u003e\n目标可以包含：决策支持、市场预警、学习借鉴\u003cbr\u003e\n比如是要判断这个产品有没有前途，有没有做的必要，怎么做能挣钱\u003cbr\u003e\n人家成功的产品是怎么做的，我们也做个类似的，抢占市场份额\u003cbr\u003e\n定期追踪市场的情况，有没有要关注的风险，市场份额缩小是什么原因导致的，及时补救\u003c/li\u003e\n\u003cli\u003e竞品分析的输出成果是什么？（独立的报告还是商业计划书或立项报告中的一部分）\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3 id=\"32-选择竞品\"\u003e3.2 选择竞品\u003c/h3\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"/posts/learning-notes-of-competitive-product-analysis/ertuytre.png\"\u003e\u003c/p\u003e\n\u003cp\u003e根据竞品分析目的不同有不同的竞品选择原则：\u003cbr\u003e\n1.当目的是 \u003cstrong\u003e决策支持 预警避险\u003c/strong\u003e 时，可以从品牌竞品，品类竞品，替代品中寻找竞品，具体原则根据竞品的市场份额、大公司背景、用户反馈、跨界替代品进行选择。\u003cbr\u003e\n2.当目的是 \u003cstrong\u003e学习借鉴\u003c/strong\u003e 时，可以从品牌竞品、品类竞品、参照品中寻找竞品，具体原则根据市场份额，跨界参照品，产品鼻祖进行选择。\u003c/p\u003e\n\u003cp\u003e在初步选择竞品后，要根据实际情况再次进行筛选，一般会选择3个左右进行具体分析，选择方法根据自身情况比如目的，自家产品的市场份额，所处市场的竞争情况，自家产品的发展阶段等进行判读。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e不可凭直觉来选择竞品，否则容易遗漏掉重要竞品。\u003c/strong\u003e\u003c/p\u003e\n\u003ch3 id=\"33-确定分析维度\"\u003e3.3 确定分析维度\u003c/h3\u003e\n\u003cp\u003e可以从产品和用户两个视角来进行产品分析。产品视角是从影响一个产品成败的因素进行分析，用户视角是从用户的角度看用户在选择产品时会关注哪些方面。举例来说，对于某类没有明显差距的产品，用户的角度可能关注的是产品的价格，而从产品角度则关注的是供应链和生产技术等问题，而这些是用户在选择产品时不会触及到的。从用户视角收集竞品信息可以采用问卷访谈等方法。\u003c/p\u003e\n\u003cp\u003e对于分析维度的选择则要根据竞品分析的目标、产品类型、产品的关键成功要素来判断。即有针对性的去分析关键的维度，比如决定这个产品成功的是技术还是外观设计？这个产品的性质是2C还是2B的，两种产品显然要从不同的维度进行分析。比如要做一个企业财务管理系统，那么系统的外观设计一般就不用重点分析。\u003c/p\u003e\n\u003ch3 id=\"34-收集竞品信息\"\u003e3.4 收集竞品信息\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003e要充分的收集信息，但也要懂得适可而止。\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"/posts/learning-notes-of-competitive-product-analysis/picture-1.png\"\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e常用的数据来源包括：\u003c/strong\u003e \u003ca href=\"http://index.baidu.com\"\u003e百度指数\u003c/a\u003e \u003ca href=\"http://compass.umeng.com\"\u003e友盟\u003c/a\u003e \u003ca href=\"http://alizs.taobao.com\"\u003e阿里指数\u003c/a\u003e \u003ca href=\"http://data.qq.com\"\u003e腾讯大数据\u003c/a\u003e \u003ca href=\"http://www.analysys.cn\"\u003e易观智库\u003c/a\u003e \u003ca href=\"http://www.iresearch.com.cn\"\u003e艾瑞\u003c/a\u003e \u003ca href=\"http://www.cnnic.net.cn\"\u003eCNNIC\u003c/a\u003e \u003ca href=\"/zh/\"\u003eTalkingData\u003c/a\u003e \u003ca href=\"http://www.alexa.com\"\u003e流量指数\u003c/a\u003e \u003ca href=\"/zh/\"\u003e七麦数据\u003c/a\u003e\u003cbr\u003e\n\u003cstrong\u003e专利机构：\u003c/strong\u003e \u003ca href=\"http://www.pss-system.gov.cn/\"\u003e专利检索及分析\u003c/a\u003e\u003c/p\u003e\n\u003ch3 id=\"35-信息整理与分析\"\u003e3.5 信息整理与分析\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003e不仅要收集信息，还要处理信息；不仅要罗列要点，还要加以分析。\u003c/strong\u003e 处理信息包括归纳、分类、组合、可靠性评估等。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e常用竞品信息分析方法：\u003c/strong\u003e\u003c/p\u003e\n\u003ch4 id=\"351-比较法\"\u003e3.5.1 比较法\u003c/h4\u003e\n\u003cp\u003e打钩比较法，评分比较法，描述比较法 （ \u003ca href=\"http://www.woshipm.com/pmd/3542523.html\"\u003e$APPEALS\u003c/a\u003e）\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"/posts/learning-notes-of-competitive-product-analysis/picture-6.png\"\u003e\u003c/p\u003e\n\u003ch4 id=\"352-矩阵分析法\"\u003e3.5.2 矩阵分析法\u003c/h4\u003e\n\u003cp\u003e确定关键竞争要素，思考产品定位。\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"/posts/learning-notes-of-competitive-product-analysis/picture-7.png\"\u003e\u003c/p\u003e\n\u003ch4 id=\"353-竞品跟踪矩阵\"\u003e3.5.3 竞品跟踪矩阵\u003c/h4\u003e\n\u003cp\u003e耗时长一般针对核心产品才分析，对于频繁快速迭代的产品合并小更新取大更新分析。\u003c/p\u003e","title":"竞品分析学习笔记"},{"content":"bitwarden是一个开源的密码管理器，可以部署在私有服务器上。官方的bitwarden对服务器配置要求较高，网友开发了bitwardenrs适用于小用户，对配置要求低不怎么占内存。本次采用安装docker后在docker上安装bitwardenrs和nginx，通过nginx反向代理实现HTTPS加密访问bitwarden的方法。\n服务器配置：Tencent Hong Kong centOS 7.6 1C1G 25GSSD 30M峰值带宽\n服务器上已经运行bitnami wordpress堆栈，因此80和443端口都被apache占用，挂了个人博客。网络上大部分blog都采用nginx做反向代理，由于不懂技术因此也用nginx照做。\n安装Docker docker是一个虚拟机，他打包了多个不同主流应用，可以很方便的安装这些应用，并且每个应用都是以容器的形式存在，与宿主机的环境是隔离的，这些应用的配置与运行可以干净的删除不会对宿主机造成影响。\ndocker中有images 镜像和container 容器，比如我可以在宿主机下载一个nginx镜像，然后我制作两个容器：nginx_1 和 nginx_2，两个容器中都可以通过镜像安装nginx应用，两个nginx是分开的，可以各自用于不同用途，方便管理。\nyum install -y docker #安装docker systemctl docker #启动docker 安装bitwarden_rs docker有几个需要事先理解的概念，比如 目录映射。我们可以让容器的目录去映射一个宿主机的目录，简单来讲就是用一个宿主机的目录当做容器应用的目录，这样要修改应用配置或者上传文件只要动宿主机的目录就可以。\n我们在run 应用的时候添加以下形式的配置：\n-v /library:/library #\u0026#39;:\u0026#39;前是要映射的宿主机目录，后面是容器应用的实际目录 端口映射：容器是一个虚拟环境，比如nginx监听的80和443端口，在我的宿主机中这两个端口被Apache占用了，因此我可以分配另外两个端口与容器的80端口和443端口进行映射。\n这样一来避免了端口冲突，比如访问//domain:4444实际上就会通过容器的443端口被nginx监听到。需要注意的是通过这种方式要在防火墙打开4444端口，否则浏览器还是无法访问的。\n-p 8088:80/tcp 4444:443/tcp #8088映射到80 4444映射到443 映射端口根据需要选择空闲端口即可 mkdir /data/bitwarden #建立宿主机映射目录 docker run -d \\ --rm \\ --name bitwarden \\ -p 8085:80 \\ -p 3012:3012 \\ -e SIGNUPS_ALLOWED=true \\ -e WEB_VAULT_ENABLED=true \\ -e DOMAIN=//mydomain.cn \\ -v /data/bitwarden:/data \\ bitwardenrs/server:latest 上面命令的各个参数含义如下： -d 在后台运行 --rm 容器停止运行后，自动删除容器文件 --name bitwarden容器的名字为bitwarden -p 8085:80 容器的端口80映射到8085，在Nginx配置 -p 3012:3012 容器的端口3012映射到3012 -e SIGNUPS_ALLOWED=true 设置环境变量SIGNUPS_ALLOWED=true允许用户注册 -e WBE_VAULT_ENABLE=true 设置环境变量WBE_VAULT_ENABLE=true -e DOMAIN=//mydomain.cn设置域名,需要替换成自己申请的域名 -v /data/bitwarden:/data 容器的/data/目录映射到宿主机的/data/bitwarden目录 安装nginx mkdir /data/nginx #建立宿主机映射目录 # 安装nginx docker run \\ --rm \\ --name nginx \\ -d \\ -p 8088:80/tcp \\ -p 2443:443/tcp \\ nginx # 由于不知道nginx目录下的内容，我们将容器的目录复制到宿主机目录/data下 docker cp nginx:/etc/nginx /data # 创建用于存放ssl证书的文件夹，将申请到的.cert和.key证书文件上传到这个文件夹 mkdir /data/nginx/certs 修改/data/nginx/conf.d/default.conf文件添加以下内容，启用https访问并对bitwarden进行反向代理\nserver { listen 80; server_name domain; #替换ssl认证的域名 ……此处省略无修改的内容 return 301 //$host$request_uri; #将http的域名请求转成https } server { listen 443 ssl http2; server_name domain; #替换ssl认证的域名 ssl on; ssl_certificate /etc/nginx/certs/1_domain_bundle.crt; #配置证书文件 这个目录不用改，在接下来映射到宿主机的/data目录即可 ssl_certificate_key /etc/nginx/certs/2_domain.key; #配置证书私钥文件 ssl_session_timeout 5m; ssl_ciphers HIGH:!aNULL:!MD5; ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2; ssl_prefer_server_ciphers on; # 加大缓存机制容量，提高访问速度，不加的话bitwarden要加载很慢，且nginx会生成warn警告 fastcgi_buffers 8 4K; client_max_body_size 2050m; #配置反向代理，请求代理发送到8085端口 location / { proxy_pass http://192.168.0.1:8085; #不用127.0.0.1，理由见下文。192.168.0.1是docker建立的bridge子网地址 proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; root /usr/share/nginx/html; index index.html index.htm; } location /notifications/hub { proxy_pass http://192.168.0.1:3012; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection \u0026#34;upgrade\u0026#34;; } location /notifications/hub/negotiate { proxy_pass http://192.168.0.1:8085; } } docker新建bridge子网 反向代理后的效果是这样的：浏览器输入//domain:2443被nginx443端口监听到，然后转去访问http://192.168.0.1:8085也就是bitwarden的实际url，从而起到https加密的效果。实验一下防火墙开放8085端口，直接访问http://宿主机IP:8085一样可以进入bitwarden，只是这个方式不安全。\n由于nginx在虚拟机环境中，因此如果在代理中用127.0.0.1，访问的是虚拟机而不是宿主机，因此会报502拒绝访问错误。我们在虚拟机的nginx中访问到宿主机可以采用建立桥接子网的方式。\n我们在Docker中新建一个名叫localNet的bridge子网，并设定其gateway范围，这样我们通过子网网关地址去访问宿主机127.0.0.1：\ndocker network create -d bridge --subnet 192.168.0.0/24 --gateway 192.168.0.1 localNet # 与default.conf中的地址对应 docker network --help #可以查看相关命令用法 最后一步 接下来我们让两个容器与这个子网建立连接并重新运行nginx容器建立宿主机目录映射：\n# 运行中的容器bitwarden与子网建立连接 docker network connect localNet bitwarden # 重新运行nginx，建立目录映射并加入子网 #先停止掉名叫nginx的容器，或者直接新建一个不同名的nginx容器 docker stop nginx #重新运行nginx，-- network localNet加入网络，-v /data/nginx:/etc/nginx映射目录否则上传的ssl证书不生效 docker run \\ --rm \\ --name nginx \\ -- network localNet \\ -d \\ -p 8088:80/tcp \\ -p 2443:443/tcp \\ -v /data/nginx:/etc/nginx \\ nginx 接下来通过//domain:2443应该就可以访问到bitwarden的登录界面了。\n点击创建账号，创建账号成功以后修改一下bitwarden的配置关掉注册功能：\n# 先停止bitwarden容器 docker stop bitwarden # 设置环境变量不允许注册用户-e SIGNUPS_ALLOWED=false，再启动bitwarden容器 docker run -d \\ --rm \\ --name bitwarden \\ -p 8085:80 \\ -p 3012:3012 \\ -e SIGNUPS_ALLOWED=false \\ -e WEB_VAULT_ENABLED=true \\ -e DOMAIN=//mydomain \\ -v /data/bitwarden:/data \\ bitwardenrs/server:latest # 记得mydomain要改成自己的 大功告成！！！接下来下载bitwarden的浏览器插件和app，填上自己配置的domain就可以用了！！！\n常用docker指令 docker ps #列出在运行的容器 docker rm container_id #删除容器 docker stop container_id #停止容器，对于在运行时添加了--rm参数的容器，停止即会自动删除 docker images #列出下载的镜像 docker rmi image_id #删除镜像 #要重新安装一个镜像需要完成以上步骤 docker logs -f container_id #查看指定容器运行日志 参考 //www.zhihu.com/search?type=content\u0026amp;q=bitwarden\n//blog.csdn.net/weixin_39716800/article/details/111215226\n//blog.csdn.net/dhaiuda/article/details/82820318\n//www.cnblogs.com/littlewrong/p/7076459.html\n//www.bilibili.com/video/av543535091/\n","permalink":"https://www.xiaoxiangtao.cn/zh/posts/bitwarden_-rs-nginx-reverse-proxy-configuration-record/","summary":"\u003cp\u003ebitwarden是一个开源的密码管理器，可以部署在私有服务器上。官方的bitwarden对服务器配置要求较高，网友开发了bitwardenrs适用于小用户，对配置要求低不怎么占内存。本次采用安装docker后在docker上安装bitwardenrs和nginx，通过nginx反向代理实现HTTPS加密访问bitwarden的方法。\u003c/p\u003e\n\u003cp\u003e服务器配置：Tencent Hong Kong centOS 7.6 1C1G 25GSSD 30M峰值带宽\u003c/p\u003e\n\u003cp\u003e服务器上已经运行bitnami wordpress堆栈，因此80和443端口都被apache占用，挂了个人博客。网络上大部分blog都采用nginx做反向代理，由于不懂技术因此也用nginx照做。\u003c/p\u003e\n\u003ch3 id=\"安装docker\"\u003e安装Docker\u003c/h3\u003e\n\u003cp\u003edocker是一个虚拟机，他打包了多个不同主流应用，可以很方便的安装这些应用，并且每个应用都是以容器的形式存在，与宿主机的环境是隔离的，这些应用的配置与运行可以干净的删除不会对宿主机造成影响。\u003c/p\u003e\n\u003cp\u003edocker中有images 镜像和container 容器，比如我可以在宿主机下载一个nginx镜像，然后我制作两个容器：nginx_1 和 nginx_2，两个容器中都可以通过镜像安装nginx应用，两个nginx是分开的，可以各自用于不同用途，方便管理。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eyum install -y docker #安装docker\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esystemctl docker #启动docker\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"安装bitwarden_rs\"\u003e安装bitwarden_rs\u003c/h3\u003e\n\u003cp\u003edocker有几个需要事先理解的概念，比如 \u003cstrong\u003e目录映射\u003c/strong\u003e。我们可以让容器的目录去映射一个宿主机的目录，简单来讲就是用一个宿主机的目录当做容器应用的目录，这样要修改应用配置或者上传文件只要动宿主机的目录就可以。\u003c/p\u003e\n\u003cp\u003e我们在run 应用的时候添加以下形式的配置：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e-v /library:/library #\u0026#39;:\u0026#39;前是要映射的宿主机目录，后面是容器应用的实际目录\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e\u003cstrong\u003e端口映射\u003c/strong\u003e：容器是一个虚拟环境，比如nginx监听的80和443端口，在我的宿主机中这两个端口被Apache占用了，因此我可以分配另外两个端口与容器的80端口和443端口进行映射。\u003c/p\u003e\n\u003cp\u003e这样一来避免了端口冲突，比如访问//domain:4444实际上就会通过容器的443端口被nginx监听到。需要注意的是通过这种方式要在防火墙打开4444端口，否则浏览器还是无法访问的。\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"/posts/bitwarden_-rs-nginx-reverse-proxy-configuration-record/%E5%9B%BE%E7%89%87-1024x227.png\"\u003e\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e-p 8088:80/tcp 4444:443/tcp #8088映射到80 4444映射到443 映射端口根据需要选择空闲端口即可\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emkdir /data/bitwarden #建立宿主机映射目录\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003edocker run  -d \\\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            --rm \\\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            --name bitwarden \\\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            -p 8085:80 \\\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            -p 3012:3012 \\\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            -e SIGNUPS_ALLOWED=true \\\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            -e WEB_VAULT_ENABLED=true \\\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            -e DOMAIN=//mydomain.cn \\\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            -v /data/bitwarden:/data \\\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            bitwardenrs/server:latest\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e上面命令的各个参数含义如下：\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e-d 在后台运行\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e--rm 容器停止运行后，自动删除容器文件\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e--name bitwarden容器的名字为bitwarden\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e-p 8085:80 容器的端口80映射到8085，在Nginx配置\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e-p 3012:3012 容器的端口3012映射到3012\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e-e SIGNUPS_ALLOWED=true 设置环境变量SIGNUPS_ALLOWED=true允许用户注册\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e-e WBE_VAULT_ENABLE=true 设置环境变量WBE_VAULT_ENABLE=true\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e-e DOMAIN=//mydomain.cn设置域名,需要替换成自己申请的域名\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e-v /data/bitwarden:/data 容器的/data/目录映射到宿主机的/data/bitwarden目录\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"安装nginx\"\u003e安装nginx\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emkdir /data/nginx #建立宿主机映射目录\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e# 安装nginx\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003edocker run \\\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e           --rm \\\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e           --name nginx \\\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e           -d \\\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e           -p 8088:80/tcp \\\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e           -p 2443:443/tcp \\\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e           nginx\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e# 由于不知道nginx目录下的内容，我们将容器的目录复制到宿主机目录/data下\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003edocker cp nginx:/etc/nginx /data\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e# 创建用于存放ssl证书的文件夹，将申请到的.cert和.key证书文件上传到这个文件夹\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emkdir /data/nginx/certs\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e修改/data/nginx/conf.d/default.conf文件添加以下内容，启用https访问并对bitwarden进行反向代理\u003c/p\u003e","title":"bitwarden_rs+nginx反向代理配置记录"},{"content":"昨晚后知后觉微信更新了一个大版本，关于微信向视频、文章方向的发力与改变，我感知并不明显。曾经自己一度迷上短视频，后来感到太过消耗时间，且没什么营养，所以基本不看了，抖音也卸载了。在关注了一大堆公众号后，微信里的文章开始变的五花八门，看不过来，只有通勤时偶尔看一看，对于这些文章，看多了以后感到并没有很迫切需要看的需求。当然，这也是因为自己没有养成持续关注阅读一些优秀公众号的良好习惯吧，我想对于有坚持看文章的人来说，这次更新可以较好的改善体验。\n说回视频方向的发力，我深感创作的乐趣要大于观看的乐趣，明明自己对别人的视频毫无兴趣，却希望自己的视频被广泛的观看点赞，作为社交的需要，也要给别人点赞，孤独感和虚荣心被充分利用了。朋友圈里的自制视频没有什么质量可言，应该是没上年纪又或许性子孤僻吧，对于别人发的视频没有多大的兴趣。在外面看视频总让我感到非常不适，尤其是地铁等人多的地方，图像比文字清晰的多，隔了很远也可以分辨出来，虽然大多数人不会偷窥你的屏幕，但我仍然会感到不自在，我不希望有陌生人从我的手机屏幕上获取到信息，即使是毫不相干的信息，这真是个奇怪的感觉，也许是我不够自信，缺乏安全感所致。对于微信来说，我想让用户积极发视频也是很关键的，当用户发了视频，他就有了看视频的动力。\n微信有建成一个大生态系统的目的，似乎一切都可以在微信上完成，可所谓的生态不也是一种垄断吗？一切似乎都被微信统治了，比如这次表情的升级，即使自己不喜欢，也没有选择的余地。表情的UI统一了，这是合理的，但也毫无疑问低龄化了，比如[敲打]的锤头变成了平底锅，毫无疑问这套UI更现代，我猜想微信考量年轻一代的消费水平更高，也更高频的使用各种表情，而年长一代对表情并不那么敏感，换了也不是很在乎，通过之前加入的少部分新表情进行测试后，大的更新也就顺理成章了。不得不承认我自己也使用新表情比较多，但是老表情的直接下架依然让人感到不那么愉快。\n当这个app成为一个国民级应用后，各种用户都被迫使用它，但它势必无法迎合所有用户群体，悲伤之处就在于，那些不被迎合的用户没有别的选择。微信的产品确实很有水准，说说UI吧，这次更新的欢迎页，确实是微信的风格，很文艺，但是当一个社交应用说出‘我看见你，我看见你看见的’时候，文艺的背后，又有一种裸露在网络空间中的感觉，包括这次的状态栏，我想自己也许不会经常设置自己的状态吧。庆幸的是微信巧妙地把附加的功能隐藏了起来，因此常规使用的界面依然简洁，日常使用体验没有很大改变。\n","permalink":"https://www.xiaoxiangtao.cn/zh/posts/wechat-8-0/","summary":"\u003cp\u003e昨晚后知后觉微信更新了一个大版本，关于微信向视频、文章方向的发力与改变，我感知并不明显。曾经自己一度迷上短视频，后来感到太过消耗时间，且没什么营养，所以基本不看了，抖音也卸载了。在关注了一大堆公众号后，微信里的文章开始变的五花八门，看不过来，只有通勤时偶尔看一看，对于这些文章，看多了以后感到并没有很迫切需要看的需求。当然，这也是因为自己没有养成持续关注阅读一些优秀公众号的良好习惯吧，我想对于有坚持看文章的人来说，这次更新可以较好的改善体验。\u003c/p\u003e\n\u003cp\u003e说回视频方向的发力，我深感创作的乐趣要大于观看的乐趣，明明自己对别人的视频毫无兴趣，却希望自己的视频被广泛的观看点赞，作为社交的需要，也要给别人点赞，孤独感和虚荣心被充分利用了。朋友圈里的自制视频没有什么质量可言，应该是没上年纪又或许性子孤僻吧，对于别人发的视频没有多大的兴趣。在外面看视频总让我感到非常不适，尤其是地铁等人多的地方，图像比文字清晰的多，隔了很远也可以分辨出来，虽然大多数人不会偷窥你的屏幕，但我仍然会感到不自在，我不希望有陌生人从我的手机屏幕上获取到信息，即使是毫不相干的信息，这真是个奇怪的感觉，也许是我不够自信，缺乏安全感所致。对于微信来说，我想让用户积极发视频也是很关键的，当用户发了视频，他就有了看视频的动力。\u003c/p\u003e\n\u003cp\u003e微信有建成一个大生态系统的目的，似乎一切都可以在微信上完成，可所谓的生态不也是一种垄断吗？一切似乎都被微信统治了，比如这次表情的升级，即使自己不喜欢，也没有选择的余地。表情的UI统一了，这是合理的，但也毫无疑问低龄化了，比如[敲打]的锤头变成了平底锅，毫无疑问这套UI更现代，我猜想微信考量年轻一代的消费水平更高，也更高频的使用各种表情，而年长一代对表情并不那么敏感，换了也不是很在乎，通过之前加入的少部分新表情进行测试后，大的更新也就顺理成章了。不得不承认我自己也使用新表情比较多，但是老表情的直接下架依然让人感到不那么愉快。\u003c/p\u003e\n\u003cp\u003e当这个app成为一个国民级应用后，各种用户都被迫使用它，但它势必无法迎合所有用户群体，悲伤之处就在于，那些不被迎合的用户没有别的选择。微信的产品确实很有水准，说说UI吧，这次更新的欢迎页，确实是微信的风格，很文艺，但是当一个社交应用说出‘我看见你，我看见你看见的’时候，文艺的背后，又有一种裸露在网络空间中的感觉，包括这次的状态栏，我想自己也许不会经常设置自己的状态吧。庆幸的是微信巧妙地把附加的功能隐藏了起来，因此常规使用的界面依然简洁，日常使用体验没有很大改变。\u003c/p\u003e","title":"微信8.0感受"},{"content":"简介 摆脱传统的每天要睡8小时的陈旧规则，通过高质量的睡眠来缩短睡眠时间（即30分钟内进入深度睡眠）。作者号称每天只睡3小时，从而快乐工作，并获得了额外的娱乐时间。总之，睡多久取决于个人情况，8小时不是必要的。（商务精英都是4、5点起床emm？）\n归纳 三个方法 消除脑疲劳 改善血液循环 调整睡眠环境 书里每个方法都介绍了几种具体方式，但是对我这种懒人来说，一些方式太繁琐了，所以只挑几个自己应该能做到的记录总结，\n消除脑疲劳 日常做眼保健操即可 作者认为眼睛与大脑相连，是第二大脑，让眼睛休息即可舒缓大脑。以前做眼保健操确实会很放松，做完精神会更好。\n按摩头部 两耳上方 2 cm 处，手掌根部画圈按压 在侧头部（第一步往上挪），4根手指按摩 5根手指在头顶画圈同时按压松开 5分钟重复6-10次，考虑到发型问题这个晚上回家做比较好\n总结复盘并列次日计划 把做的不好的写下来，担心的事写下来，完成的事写下来，希望发生的事写下来，计划也写下来。\n作者认为把心事写出来可以缓解压力，写出来以后就安心了，之后睡觉就可以不去想它（类似于用笔咆哮，吼几句就舒服了）\n写论文期间写过类似的日志，亲测管用。\n多笑 多笑 多笑 笑总是没坏处的，多笑笑，运气好，办事也顺利。。。\n作者表示心理学上，心情的愉悦可以带动肌肉做出微笑的表情，那反过来也行得通\n改善血液循环 泡澡或泡脚或边泡脚边洗澡 理由不解释，但是时间不要超过10分钟，温度不宜过高\n挺胸抬头 驼背导致呼吸不畅会影响血液循环，这个倒是有意思。具体办法就是做转肩运动、背部拉伸、扩胸等。\n通过运动来改善体态，而不是每天日常刻意挺胸，这样用处不大\n运动 不用剧烈运动，挺胸走一走，做几组深蹲即可。剧烈运动反而导致脑疲劳，影响睡眠。\n按摩小腿肚 小腿肚号称第二心脏，按摩也有助于改善血液循环。\n调整睡眠环境 床是用来睡的 上床就睡觉，醒了就起床。在床上做别的事情就会影响睡眠。凡不是睡觉的事就不要在床上进行。\n如果房间小，必须要坐在床上，就在床上盖一块布，睡觉的时候才掀掉。\n搞好卫生很重要 房间里的灰尘会严重影响睡眠质量，所以要搞卫生，把被子，床底下等等地方的灰清理干净。\n合适的温湿度 温度太高不利于入睡，太干燥也不行，所以夏天开空调，冬天加湿器，空气质量不好还要空气净化器。保持一个凉爽的状态才能更快入睡。\n脑袋 脖子 脊柱 睡觉一条直线 买合适的枕头和床垫，还要透气，不能潮湿，5年换一次emm。\n精油 乳香味改善呼吸\n薰衣草帮助镇静安眠\n其他tips 早起 早起来调节自己的生物钟。具体方法包括：\n早起晒太阳，要充足的光线 早起一杯水，因为水分在睡觉时流失严重 早起大声说话与咀嚼早餐，帮助激活大脑，唤醒精神 周末也要和平时一样起床，不能晚睡晚起否则扰乱生物钟 安排早晨活动，读书会或者简单运动，更有成就感 安排早餐计划，按规律行事 午睡 不要超过30分钟，否则进入正式的睡眠，难以清醒 不一定要躺着睡，条件不好坐着闭眼即可。 睡不着可以用冥想（正念呼吸）代替 咖啡睡眠法： 睡前一杯咖啡，睡20分钟起来后咖啡因生效，精神特别好。\n晚上不作死 睡前不喝咖啡和酒 睡前90分钟洗澡，不要洗完立刻上床，要等身体降温冷却 睡前不要看手机等，看书就好 睡前不要吃东西（尤其是不易消化的），让肠道进入休息状态 用app检测记录睡眠情况 养成习惯，防止反弹，增强成就感\n","permalink":"https://www.xiaoxiangtao.cn/zh/posts/concentrated-sleep/","summary":"\u003ch2 id=\"简介\"\u003e简介\u003c/h2\u003e\n\u003cp\u003e摆脱传统的每天要睡8小时的陈旧规则，通过高质量的睡眠来缩短睡眠时间（即30分钟内进入深度睡眠）。作者号称每天只睡3小时，从而快乐工作，并获得了额外的娱乐时间。总之，睡多久取决于个人情况，8小时不是必要的。（商务精英都是4、5点起床emm？）\u003c/p\u003e\n\u003ch2 id=\"归纳\"\u003e归纳\u003c/h2\u003e\n\u003ch3 id=\"三个方法\"\u003e三个方法\u003c/h3\u003e\n\u003col\u003e\n\u003cli\u003e消除脑疲劳\u003c/li\u003e\n\u003cli\u003e改善血液循环\u003c/li\u003e\n\u003cli\u003e调整睡眠环境\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e书里每个方法都介绍了几种具体方式，但是对我这种懒人来说，一些方式太繁琐了，所以只挑几个自己应该能做到的记录总结，\u003c/p\u003e\n\u003ch4 id=\"消除脑疲劳\"\u003e消除脑疲劳\u003c/h4\u003e\n\u003ch5 id=\"日常做眼保健操即可\"\u003e\u003cstrong\u003e日常做眼保健操即可\u003c/strong\u003e\u003c/h5\u003e\n\u003cp\u003e作者认为眼睛与大脑相连，是第二大脑，让眼睛休息即可舒缓大脑。以前做眼保健操确实会很放松，做完精神会更好。\u003c/p\u003e\n\u003ch5 id=\"按摩头部\"\u003e\u003cstrong\u003e按摩头部\u003c/strong\u003e\u003c/h5\u003e\n\u003col\u003e\n\u003cli\u003e两耳上方 2 cm 处，手掌根部画圈按压\u003c/li\u003e\n\u003cli\u003e在侧头部（第一步往上挪），4根手指按摩\u003c/li\u003e\n\u003cli\u003e5根手指在头顶画圈同时按压松开\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e5分钟重复6-10次，考虑到发型问题这个晚上回家做比较好\u003c/p\u003e\n\u003ch5 id=\"总结复盘并列次日计划\"\u003e\u003cstrong\u003e总结复盘并列次日计划\u003c/strong\u003e\u003c/h5\u003e\n\u003cp\u003e把做的不好的写下来，担心的事写下来，完成的事写下来，希望发生的事写下来，计划也写下来。\u003c/p\u003e\n\u003cp\u003e作者认为把心事写出来可以缓解压力，写出来以后就安心了，之后睡觉就可以不去想它（类似于用笔咆哮，吼几句就舒服了）\u003c/p\u003e\n\u003cp\u003e写论文期间写过类似的日志，亲测管用。\u003c/p\u003e\n\u003ch5 id=\"多笑-多笑-多笑\"\u003e\u003cstrong\u003e多笑 多笑 多笑\u003c/strong\u003e\u003c/h5\u003e\n\u003cp\u003e笑总是没坏处的，多笑笑，运气好，办事也顺利。。。\u003c/p\u003e\n\u003cp\u003e作者表示心理学上，心情的愉悦可以带动肌肉做出微笑的表情，那反过来也行得通\u003c/p\u003e\n\u003ch4 id=\"改善血液循环\"\u003e改善血液循环\u003c/h4\u003e\n\u003ch5 id=\"泡澡或泡脚或边泡脚边洗澡\"\u003e\u003cstrong\u003e泡澡或泡脚或边泡脚边洗澡\u003c/strong\u003e\u003c/h5\u003e\n\u003cp\u003e理由不解释，但是时间不要超过10分钟，温度不宜过高\u003c/p\u003e\n\u003ch5 id=\"挺胸抬头\"\u003e\u003cstrong\u003e挺胸抬头\u003c/strong\u003e\u003c/h5\u003e\n\u003cp\u003e驼背导致呼吸不畅会影响血液循环，这个倒是有意思。具体办法就是做转肩运动、背部拉伸、扩胸等。\u003c/p\u003e\n\u003cp\u003e\u003cem\u003e通过运动来改善体态，而不是每天日常刻意挺胸，这样用处不大\u003c/em\u003e\u003c/p\u003e\n\u003ch5 id=\"运动\"\u003e\u003cstrong\u003e运动\u003c/strong\u003e\u003c/h5\u003e\n\u003cp\u003e不用剧烈运动，挺胸走一走，做几组深蹲即可。剧烈运动反而导致脑疲劳，影响睡眠。\u003c/p\u003e\n\u003ch5 id=\"按摩小腿肚\"\u003e\u003cstrong\u003e按摩小腿肚\u003c/strong\u003e\u003c/h5\u003e\n\u003cp\u003e小腿肚号称第二心脏，按摩也有助于改善血液循环。\u003c/p\u003e\n\u003ch4 id=\"调整睡眠环境\"\u003e调整睡眠环境\u003c/h4\u003e\n\u003ch5 id=\"床是用来睡的\"\u003e\u003cstrong\u003e床是用来睡的\u003c/strong\u003e\u003c/h5\u003e\n\u003cp\u003e上床就睡觉，醒了就起床。在床上做别的事情就会影响睡眠。凡不是睡觉的事就不要在床上进行。\u003c/p\u003e\n\u003cp\u003e如果房间小，必须要坐在床上，就在床上盖一块布，睡觉的时候才掀掉。\u003c/p\u003e\n\u003ch5 id=\"搞好卫生很重要\"\u003e\u003cstrong\u003e搞好卫生很重要\u003c/strong\u003e\u003c/h5\u003e\n\u003cp\u003e房间里的灰尘会严重影响睡眠质量，所以要搞卫生，把被子，床底下等等地方的灰清理干净。\u003c/p\u003e\n\u003ch5 id=\"合适的温湿度\"\u003e\u003cstrong\u003e合适的温湿度\u003c/strong\u003e\u003c/h5\u003e\n\u003cp\u003e温度太高不利于入睡，太干燥也不行，所以夏天开空调，冬天加湿器，空气质量不好还要空气净化器。保持一个凉爽的状态才能更快入睡。\u003c/p\u003e\n\u003ch5 id=\"脑袋-脖子-脊柱-睡觉一条直线\"\u003e\u003cstrong\u003e脑袋 脖子 脊柱 睡觉一条直线\u003c/strong\u003e\u003c/h5\u003e\n\u003cp\u003e买合适的枕头和床垫，还要透气，不能潮湿，5年换一次emm。\u003c/p\u003e\n\u003ch5 id=\"精油\"\u003e\u003cstrong\u003e精油\u003c/strong\u003e\u003c/h5\u003e\n\u003cp\u003e乳香味改善呼吸\u003c/p\u003e\n\u003cp\u003e薰衣草帮助镇静安眠\u003c/p\u003e\n\u003ch3 id=\"其他tips\"\u003e其他tips\u003c/h3\u003e\n\u003ch5 id=\"早起\"\u003e\u003cstrong\u003e早起\u003c/strong\u003e\u003c/h5\u003e\n\u003cp\u003e早起来调节自己的生物钟。具体方法包括：\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e早起晒太阳，要充足的光线\u003c/li\u003e\n\u003cli\u003e早起一杯水，因为水分在睡觉时流失严重\u003c/li\u003e\n\u003cli\u003e早起大声说话与咀嚼早餐，帮助激活大脑，唤醒精神\u003c/li\u003e\n\u003cli\u003e周末也要和平时一样起床，不能晚睡晚起否则扰乱生物钟\u003c/li\u003e\n\u003cli\u003e安排早晨活动，读书会或者简单运动，更有成就感\u003c/li\u003e\n\u003cli\u003e安排早餐计划，按规律行事\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch5 id=\"午睡\"\u003e\u003cstrong\u003e午睡\u003c/strong\u003e\u003c/h5\u003e\n\u003col\u003e\n\u003cli\u003e不要超过30分钟，否则进入正式的睡眠，难以清醒\u003c/li\u003e\n\u003cli\u003e不一定要躺着睡，条件不好坐着闭眼即可。\u003c/li\u003e\n\u003cli\u003e睡不着可以用冥想（正念呼吸）代替\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e\u003cem\u003e咖啡睡眠法：\u003c/em\u003e 睡前一杯咖啡，睡20分钟起来后咖啡因生效，精神特别好。\u003c/p\u003e\n\u003ch5 id=\"晚上不作死\"\u003e\u003cstrong\u003e晚上不作死\u003c/strong\u003e\u003c/h5\u003e\n\u003col\u003e\n\u003cli\u003e睡前不喝咖啡和酒\u003c/li\u003e\n\u003cli\u003e睡前90分钟洗澡，不要洗完立刻上床，要等身体降温冷却\u003c/li\u003e\n\u003cli\u003e睡前不要看手机等，看书就好\u003c/li\u003e\n\u003cli\u003e睡前不要吃东西（尤其是不易消化的），让肠道进入休息状态\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch5 id=\"用app检测记录睡眠情况\"\u003e\u003cstrong\u003e用app检测记录睡眠情况\u003c/strong\u003e\u003c/h5\u003e\n\u003cp\u003e养成习惯，防止反弹，增强成就感\u003c/p\u003e","title":"读书|《浓缩睡眠》"},{"content":"Linux基本语法 复制 cp 要复制的文件路径 目标路径 cp -r 递归复制整个目录\n删除 rm -f 强制删除 -r 递归删除目录\n改名 mv 原文件 新文件名\n更改文件权限 chmod 777（完全写入权限） 要更改的目录或文件\nvim编辑器显示行号：输入指令：set number\n跳转到制定行：输入指令：n（要跳转的行号）\nWP-Super-Cache问题解决 将插件wp-super-cache中的wp-cache-config.php与advanced-cache.php复制到wp-content目录下。\n临时更改wp-content权限为777\n在wp-config.php中增加以下内容：1.在require_once(ABSPATH.’wp-settings.php’);前增加define(\u0026lsquo;WP_CACHE\u0026rsquo;, true); 2.增加define(\u0026lsquo;WPCACHEHOME\u0026rsquo;, \u0026lsquo;插件wp-super-cache绝对路径\u0026rsquo;);\n修改完成后应该可以进入设置界面，在专家模式下更新设置如果出现要求更新Mod_write规则则按要求进行更新。\n对于采用bitnami的wordpress堆栈环境，由于其对文件访问权限的安全设置较严，安装时同样会弹出以上情况的警告。无需理会，连接到服务器执行以下指令：（事实上应当优先采用这种更改权限的做法，未生效再尝试上方操作）\nsudo chmod g+w /YOURADRESS/apps/wordpress/htdocs/wp-config.php 之后禁用插件并重新激活即可。完事以后要将文件权限复原，执行：\nsudo chmod g-w /YOURADRESS/apps/wordpress/htdocs/wp-config.php 更多内容，在bitnami.com官方文档的trouble shooting部分有详细介绍。\n","permalink":"https://www.xiaoxiangtao.cn/zh/posts/wordpress-configuration-problem-record/","summary":"\u003ch2 id=\"linux基本语法\"\u003eLinux基本语法\u003c/h2\u003e\n\u003cp\u003e复制 cp 要复制的文件路径 目标路径 cp -r 递归复制整个目录\u003c/p\u003e\n\u003cp\u003e删除 rm -f 强制删除 -r 递归删除目录\u003c/p\u003e\n\u003cp\u003e改名 mv 原文件 新文件名\u003c/p\u003e\n\u003cp\u003e更改文件权限 chmod 777（完全写入权限） 要更改的目录或文件\u003c/p\u003e\n\u003cp\u003evim编辑器显示行号：输入指令：set number\u003c/p\u003e\n\u003cp\u003e跳转到制定行：输入指令：n（要跳转的行号）\u003c/p\u003e\n\u003ch2 id=\"wp-super-cache问题解决\"\u003eWP-Super-Cache问题解决\u003c/h2\u003e\n\u003cp\u003e将插件wp-super-cache中的wp-cache-config.php与advanced-cache.php复制到wp-content目录下。\u003c/p\u003e\n\u003cp\u003e临时更改wp-content权限为777\u003c/p\u003e\n\u003cp\u003e在wp-config.php中增加以下内容：1.在require_once(ABSPATH.’wp-settings.php’);前增加define(\u0026lsquo;WP_CACHE\u0026rsquo;, true); 2.增加define(\u0026lsquo;WPCACHEHOME\u0026rsquo;, \u0026lsquo;插件wp-super-cache绝对路径\u0026rsquo;);\u003c/p\u003e\n\u003cp\u003e修改完成后应该可以进入设置界面，在专家模式下更新设置如果出现要求更新Mod_write规则则按要求进行更新。\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003e对于采用bitnami的wordpress堆栈环境，由于其对文件访问权限的安全设置较严，安装时同样会弹出以上情况的警告。无需理会，连接到服务器执行以下指令：（事实上应当优先采用这种更改权限的做法，未生效再尝试上方操作）\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esudo chmod g+w /YOURADRESS/apps/wordpress/htdocs/wp-config.php\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e之后禁用插件并重新激活即可。完事以后要将文件权限复原，执行：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esudo chmod g-w /YOURADRESS/apps/wordpress/htdocs/wp-config.php\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e更多内容，在bitnami.com官方文档的trouble shooting部分有详细介绍。\u003c/p\u003e","title":"wordpress配置问题记录"},{"content":"欧姆定律 - I=U/R\n面包板的用法 - 面包板通常指免焊面包板，板子上有很多小插孔，专为电子电路的无焊接实验设计制造。由于各种电子元器件可根据需要随意插入或拔出，免去了焊接，节省了电路的组装时间，而且元件可以重复使用，所以非常适合电子电路的组装、调试和训练。 百度百科\n上拉/下拉电阻 - 如果一个线路中的电压处于不确定的状态（例如一个引脚不和任何其它回路连通时），那我们就说它的电压是浮动的，他会随着时间不断变化，跳动，而且很容易受到外界环境的影响。处于这种不确定状态的电路会被随机解释为高或者低电平。 这种现象也叫电子噪声。为了让某个引脚保持高电平或者低电平，我们可以将该引脚接地或者接一个大阻值电阻（arduino的引脚内置了上拉电阻，如果需要外接上拉电阻，arduino建议的上拉电阻为10KΩ）。 参考\n二极管 - 二极管是用半导体材料(硅、硒、锗等)制成的一种电子器件。它具有单向导电性能， 即给二极管阳极和阴极加上正向电压时，二极管导通。 当给阳极和阴极加上反向电压时，二极管截止。 因此，二极管的导通和截止，则相当于开关的接通与断开。其电路图如图所示。\n电容 - 两个相互靠近的导体，中间夹一层不导电的绝缘介质，这就构成了电容器。当电容器的两个极板之间加上电压时，电容器就会储存电荷。电容器的电容量在数值上等于一个导电极板上的电荷量与两个极板之间的电压之比。电容器的电容量的基本单位是法拉(F)。在电路图中通常用字母C表示电容元件。 百度百科\n","permalink":"https://www.xiaoxiangtao.cn/zh/posts/basic-knowledge-of-interactive-devices/","summary":"\u003cp\u003e\u003cstrong\u003e欧姆定律\u003c/strong\u003e - I=U/R\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e面包板的用法\u003c/strong\u003e - 面包板通常指免焊面包板，板子上有很多小插孔，专为电子电路的无焊接实验设计制造。由于各种电子元器件可根据需要随意插入或拔出，免去了焊接，节省了电路的组装时间，而且元件可以重复使用，所以非常适合电子电路的组装、调试和训练。 \u003ca href=\"//baike.baidu.com/item/E9%5Cx9D%5CxA2%5CxE5%5Cx8C%5Cx85%5CxE6%5Cx9D%5CxBF/4703361?fr=aladdin\"\u003e百度百科\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"/posts/basic-knowledge-of-interactive-devices/08f790529822720e1fe8fb4c7bcb0a46f21fab65.gif\"\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e上拉/下拉电阻\u003c/strong\u003e - 如果一个线路中的电压处于不确定的状态（例如一个引脚不和任何其它回路连通时），那我们就说它的电压是浮动的，他会随着时间不断变化，跳动，而且很容易受到外界环境的影响。处于这种不确定状态的电路会被随机解释为高或者低电平。 这种现象也叫电子噪声。为了让某个引脚保持高电平或者低电平，我们可以将该引脚接地或者接一个大阻值电阻（arduino的引脚内置了上拉电阻，如果需要外接上拉电阻，arduino建议的上拉电阻为10KΩ）。 \u003ca href=\"//blog.csdn.net/qianxuedegushi/article/details/82252077\"\u003e参考\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e二极管\u003c/strong\u003e - 二极管是用半导体材料(硅、硒、锗等)制成的一种电子器件。它具有单向导电性能， 即给二极管阳极和阴极加上正向电压时，二极管导通。 当给阳极和阴极加上反向电压时，二极管截止。 因此，二极管的导通和截止，则相当于开关的接通与断开。其电路图如图所示。\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"/posts/basic-knowledge-of-interactive-devices/500fd9f9d72a6059014ffd4b2b34349b033bba07.gif\"\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e电容\u003c/strong\u003e - 两个相互靠近的导体，中间夹一层不导电的绝缘介质，这就构成了电容器。当电容器的两个极板之间加上电压时，电容器就会储存电荷。电容器的电容量在数值上等于一个导电极板上的电荷量与两个极板之间的电压之比。电容器的电容量的基本单位是法拉(F)。在电路图中通常用字母C表示电容元件。 \u003ca href=\"//baike.baidu.com/item/E7%5Cx94%5CxB5%5CxE5%5CxAE%5CxB9%5CxE5%5Cx99%5CxA8/1087619?fromtitle=%5cxE7%5cx94%5cxB5%5cxE5%5cxAE%5cxB9\u0026amp;fromid=12031635\u0026amp;fr=aladdin\"\u003e百度百科\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"/posts/basic-knowledge-of-interactive-devices/e1fe9925bc315c602ae227cd89b1cb1349547798.png\"\u003e\u003c/p\u003e","title":"交互装置入门基础知识"},{"content":"根据arduino uno板子的接口进行解释，如图\nL指示灯 - 接13号引脚（13号引脚内置了电阻），arduino出厂烧录了闪烁程度，板子通电后L灯闪烁。\nTX/RX指示灯 - 串口通信时闪烁，分别在传输数据与接收数据时闪烁。\n上排0~13接口 - 数字I/O口，可以接受以及接受数字信号（二进制形式表示的信号），arduino用电平高低来表示0,1，低电平（-0.51.5V）表示0，高电平（35.5V）表示1。用 pinMode(pin, mode) 函数来指定要用的引脚编号以及其配置模式（INPUT 输入0，OUTPUT 输出1，INPUT_PULLUP输入上拉模式）。在输入模式下，可以用 digitalRead(pin) 读取输入的数字信号；在输出模式下，用 digitalWrite(pin, value) 来指定引脚及输出的电平高低（LOW 0， HIGH 1）。\n？digitalRead()函数返回什么，！digitalRead()代表什么？如果代表true，则digitalRead（）返回一个false，人体热释电持续输出低电平，在检测到人时输出高电平（范围和持续时间可以用电位器来调节），则正常情况下！digitalRead是！低电平，其代表了什么，还是说没有输出值，做个试验检测。\nPWM Pulse Width Modulation 脉冲宽度调制 ~符号\n- 模拟信号Output，模拟信号用连续变化的物理量来表示信息，上排接口中有 ~ 标志的接口可用于输出模拟信号。Arduino用05V的电压来表示模拟信号，通过输出周期固定（约490HZ）的方波，通过改变高低电平在每个周期中的比例（占空比）来得到近似输出不同电压的效果。具体方法为调用analogWrite(pin, value)函数，pin为指定引脚，value是PWM的脉冲宽度，范围为0255（将5v电压模拟成255段进行调整，8位精度，255=11111111）。\n下排A0~A5 - 模拟信号输入引脚，用analogRead(pin)函数读取引脚上输入电压的大小。模拟输入引脚带有ADC（Analog-to-Digital Converter，模/数转换器）功能，arduino的模拟输入功能有10位精度，可以将读取到的05V电压转换为01023（1023的二进制为1111111111）的整数形式表示。\nTX/RX引脚（1,0号） - transmit/receive，用于串行通信，Arduino的USB口通过一个转换芯片（通常为ATmege16u2）与这两个串口的引脚连接。该转换芯片通过USB接口在计算机上虚拟出一个用于与arduino通信的串口。串行通信是相对于并行通信的概念，并行通信占用的I/O口较多，而arduino的I/O口资源较少，因此采用串行通信方式。\n下排左侧 - VCC表示电源，有3.5和5V两个接口，GND（阴极，接地）两个比较常用。\n","permalink":"https://www.xiaoxiangtao.cn/zh/posts/summary-of-basic-knowledge-of-arduino/","summary":"\u003cp\u003e根据arduino uno板子的接口进行解释，如图\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"/posts/summary-of-basic-knowledge-of-arduino/1437476-af1157edc21babf9.jpg\"\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eL指示灯\u003c/strong\u003e - 接13号引脚（13号引脚内置了电阻），arduino出厂烧录了闪烁程度，板子通电后L灯闪烁。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eTX/RX指示灯\u003c/strong\u003e - 串口通信时闪烁，分别在传输数据与接收数据时闪烁。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e上排0~13接口\u003c/strong\u003e - 数字I/O口，可以接受以及接受数字信号（二进制形式表示的信号），arduino用电平高低来表示0,1，低电平（-0.5\u003cdel\u003e1.5V）表示0，高电平（3\u003c/del\u003e5.5V）表示1。用 pinMode(pin, mode) 函数来指定要用的引脚编号以及其配置模式（INPUT 输入0，OUTPUT 输出1，INPUT_PULLUP输入上拉模式）。在输入模式下，可以用 digitalRead(pin) 读取输入的数字信号；在输出模式下，用 digitalWrite(pin, value) 来指定引脚及输出的电平高低（LOW 0， HIGH 1）。\u003c/p\u003e\n\u003cp\u003e？digitalRead()函数返回什么，！digitalRead()代表什么？如果代表true，则digitalRead（）返回一个false，人体热释电持续输出低电平，在检测到人时输出高电平（范围和持续时间可以用电位器来调节），则正常情况下！digitalRead是！低电平，其代表了什么，还是说没有输出值，做个试验检测。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003ePWM Pulse Width Modulation 脉冲宽度调制 ~符号\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e- 模拟信号Output，模拟信号用连续变化的物理量来表示信息，上排接口中有 \u003cstrong\u003e~\u003c/strong\u003e 标志的接口可用于输出模拟信号。Arduino用0\u003cdel\u003e5V的电压来表示模拟信号，通过输出周期固定（约490HZ）的方波，通过改变高低电平在每个周期中的比例（占空比）来得到近似输出不同电压的效果。具体方法为调用analogWrite(pin, value)函数，pin为指定引脚，value是PWM的脉冲宽度，范围为0\u003c/del\u003e255（将5v电压模拟成255段进行调整，8位精度，255=11111111）。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e下排A0~A5\u003c/strong\u003e - 模拟信号输入引脚，用analogRead(pin)函数读取引脚上输入电压的大小。模拟输入引脚带有ADC（Analog-to-Digital Converter，模/数转换器）功能，arduino的模拟输入功能有10位精度，可以将读取到的0\u003cdel\u003e5V电压转换为0\u003c/del\u003e1023（1023的二进制为1111111111）的整数形式表示。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eTX/RX引脚（1,0号）\u003c/strong\u003e - transmit/receive，用于串行通信，Arduino的USB口通过一个转换芯片（通常为ATmege16u2）与这两个串口的引脚连接。该转换芯片通过USB接口在计算机上虚拟出一个用于与arduino通信的串口。串行通信是相对于并行通信的概念，并行通信占用的I/O口较多，而arduino的I/O口资源较少，因此采用串行通信方式。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e下排左侧\u003c/strong\u003e - VCC表示电源，有3.5和5V两个接口，GND（阴极，接地）两个比较常用。\u003c/p\u003e","title":"Arduino 入门基础知识总结"},{"content":"Core77 / Industrial Design Magazine 关于工业设计的新闻、点子、访谈等各种内容，网站很好看，访问不是很快。\n点此前往\n不断更新ing\u0026hellip;\n","permalink":"https://www.xiaoxiangtao.cn/zh/posts/core77-industrial-design-magazine/","summary":"\u003ch2 id=\"core77--industrial-design-magazine\"\u003eCore77 / Industrial Design Magazine\u003c/h2\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"/posts/core77-industrial-design-magazine/core77-1024x655.jpg\"\u003e\u003c/p\u003e\n\u003cp\u003e关于工业设计的新闻、点子、访谈等各种内容，网站很好看，访问不是很快。\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"/zh/\"\u003e点此前往\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e不断更新ing\u0026hellip;\u003c/p\u003e","title":"设计杂志类网站"},{"content":"Fuji X Weekly 关于富士x系列的博客，提供富士胶片模拟参数设置教程，各种胶片风格模拟，图片质量很不错。\n点此前往\n150胶片模拟参数表 摄影师David收集并整理，谷歌文档。\n查看\nf16.click 富士官方X摄影师，有许多关于富士相机的体验与使用经验。提供了一组适用X70与XF10的胶片模拟参数。其中 黑白+红色滤镜 的设置效果是我比较喜欢的。\n点此前往\n知乎胶片模拟参数设置回答 提供了一个日系参数设置感觉效果还不错。\nFILM:ASTIA　DR:400%　WB:AUTO　HIGHLIGHT:-2　SHADOW:-2　COLOR:+1　SHARP:-2　NR:0\n点此前往\n持续更新ing\u0026hellip;\n","permalink":"https://www.xiaoxiangtao.cn/zh/posts/photography-technology-sharing-website/","summary":"\u003ch2 id=\"fuji-x-weekly\"\u003eFuji X Weekly\u003c/h2\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"/posts/photography-technology-sharing-website/fujixweekly-1024x723.jpg\"\u003e\u003c/p\u003e\n\u003cp\u003e关于富士x系列的博客，提供富士胶片模拟参数设置教程，各种胶片风格模拟，图片质量很不错。\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"//fujixweekly.com/recipes/\"\u003e点此前往\u003c/a\u003e\u003c/p\u003e\n\u003ch2 id=\"150胶片模拟参数表\"\u003e150胶片模拟参数表\u003c/h2\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"/posts/photography-technology-sharing-website/150fujifilm-1024x510.jpg\"\u003e\u003c/p\u003e\n\u003cp\u003e摄影师David收集并整理，谷歌文档。\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"//docs.google.com/spreadsheets/d/1R7Zau2LIoy5vd5sPXrIGmtGbrSGlj_fPYPPG2rsWMFg/htmlview?fbclid=IwAR0OIBC8MAG8CyeZIU5-YOI_S_vaovETn5iUzTEKLFN__Glf6owWuUDyuxA\"\u003e查看\u003c/a\u003e\u003c/p\u003e\n\u003ch2 id=\"f16click\"\u003ef16.click\u003c/h2\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"/posts/photography-technology-sharing-website/f16click-1024x558.jpg\"\u003e\u003c/p\u003e\n\u003cp\u003e富士官方X摄影师，有许多关于富士相机的体验与使用经验。提供了一组适用X70与XF10的胶片模拟参数。其中 黑白+红色滤镜 的设置效果是我比较喜欢的。\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"//www.f16.click/blog/gear/fujifilm-x70-settings.html\"\u003e点此前往\u003c/a\u003e\u003c/p\u003e\n\u003ch2 id=\"知乎胶片模拟参数设置回答\"\u003e知乎胶片模拟参数设置回答\u003c/h2\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"/posts/photography-technology-sharing-website/v2-a8146ea48b7970255f8d69580e210041_r.jpg\"\u003e\u003c/p\u003e\n\u003cp\u003e提供了一个日系参数设置感觉效果还不错。\u003c/p\u003e\n\u003cp\u003eFILM:ASTIA　DR:400%　WB:AUTO　HIGHLIGHT:-2　SHADOW:-2　COLOR:+1　SHARP:-2　NR:0\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"//www.zhihu.com/question/40105658/answer/363818752\"\u003e点此前往\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e持续更新ing\u0026hellip;\u003c/p\u003e","title":"摄影技术分享网站"},{"content":"大学伊始，买了全画幅canon 6D + 24-105套头，玩了四年，让我从一个摄影小白逐步了解了摄影的各种技术，也见识了全画幅的威力——扛着一个红圈大单反出门好不威风，旅游的时候路人看到我在拍什么，常常也跟上来到同样的位置看看；同学老师们也乐意让我拍拍。尽管如此，四年下来，我对这台笨重的相机却有些厌倦了，它实在太重，加上三脚架，如果不是有重要活动，实在不想再扛着到处跑。\n6D我用的其实并不多，主要用来拍了学校班级的活动以及难得出去旅游用用，现在随着对摄影的了解更加深入，逐步意识到自己在技术和审美上还存在不足，要多拍才行——我需要一个能随身带着的可以到处拍的玩意儿来提高自己的拍摄频率。那么手机不行吗？不行，手机可玩性太低，参数调整远不如相机的拨盘来的方便，目前大多数手机画质也不及相机，用手机拍照着实差了点感觉，学摄影还得相机。\n预算2000元以下的卡片机，二手基本就是在XF10和LX10之间做选择。在网上看了一些测评，键盘摄影师太多 ，还是自己都买来尝试一下吧。\n先说结论：我留下了XF10，根本原因在于画质与可玩性：\n画质 我的目的是为了提升摄影技术，我有全幅了对变焦需求不大，定焦反而能让我专注构图拍照。XF10的APS-C画幅能与手机的画质拉开明显的差距，LX10的一英寸底则不能，特别是在手机摄影快速发展的今天，面对华为P40 pro+，即使光学变焦也不是一个很明显的优势。（说实话，华为的这款手机确实让人惊艳，也让我下定决心放弃了LX10），再过两年，把LX10的预算加在手机上买个拍照旗舰，日常拍摄发朋友圈完全够用。对比6D，XF10，LX10，可以看到画质上还是有非常明显的区别，放大画面在细节的保留上底大一级压死人的定律非常明显。XF10对细节的反映以及画面锐度是手机无法比拟的，这台相机给我的感觉更加专业，而LX10则更像是一台家用产品。\n可玩性 简单来说就是好不好折腾，我是喜欢折腾的，所以这些在我来看一些缺点也能当做优点。\n胶片模拟 富士的胶片模拟可用性很高，XF10提供了11种胶片模拟，并可对高光阴影对比度降噪等做进一步调整，jpeg直出色彩确实不错，不过在锐化和降噪上稍显激进导致一些网友认为涂抹感太强，实际上用raw格式在富士提供的专业软件如capture one里可以精细调整，不存在这个问题，其raw格式后期空间大，色彩丰富，同时2420万像素给了后期很大的剪裁空间，基本可以当做3倍变焦来用。LX10的raw则稍显不足，色彩不够丰富，宽容度较低，细节有所损失，因此后期空间相对较小。\n快拍模式 XF10的快拍模式被许多人吐槽只有5m和2m两种模式并且不支持更改光圈，但是说实话2000元要啥自行车，和GR比完全没必要，另外在手动对焦模式下，XF10提供了对焦距离标尺，通过设置不同光圈及对焦距离，想要什么距离和景深的快拍都是可以做到的，无非是没有一个快捷键快速设置的功能，但我认为可用性也不错了（自己也不是很有街拍经验）。LX10则没有快拍模式，其开机时间也比较长（镜头要伸出来），不过考虑到对焦速度快，也是用其拍照的一种优势。\n重量 在重量方面，XF10只有280g，而LX10有340g，同时LX10的镜头相较XF10凸起更加明显，就实际放在口袋里的感受来说，XF10要舒服的多，LX10会把口袋撑起来，并且让裤子有严重下坠感，在夏天，LX10放在口袋里出门并不是很方便。\n性能 至于网上频繁吐槽的XF10的对焦性能与操控，坦白说个人使用绝没有网上说的那么夸张。LX10毫无疑问是完胜的，对焦迅速，触屏强大流畅，维纳斯芯片性能强劲处理速度快。XF10的对焦比较慢，但在较好光线的情况下速度不错，手动峰值对焦也可以接受，无非就是拍摄节奏比较慢。\n唯一让我诟病的就是XF10的芯片显然速度不行，拍raw+fine jpg格式的照片，每一张都要处理个三四秒，这是限制拍摄节奏与连拍的最大问题，因为在处理器处理照片时，相机的触屏将失效，也就是说如果你想触屏改变模式或者对焦点，你必须等几秒相机处理完上一张照片，很多时候让我以为相机失灵了，但一般情况下，只要掌握了节奏或者不拍这么大的照片（加起来50多M）就还好。\nLX10的优势 选择XF10并不代表我不喜欢LX10，实际上这款相机在我看来是一款性价比极高的相机。一般提的比较多的就是它的翻转屏，4K录制功能，5轴防抖等，这些都是XF10没有的，如果是喜欢录制视频的朋友，LX10性价比极高值得尝试。\n我要着重赞美一下LX10的操控，松下的菜单以及操控实在是极其清晰简单，上手非常快，我认为这款相机很适合新手入门，去学习熟练控制光圈、快门以及感光度。并且其支持步进变焦，可以在35mm，50mm，75mm间进行切换，对熟悉焦段很有帮助。LX10在明亮环境下色彩还原度较高，用来旅行或者办公记录，都会是不错的选择。\n","permalink":"https://www.xiaoxiangtao.cn/zh/posts/fujifilm-xf10-vs-panasonic-lx10/","summary":"\u003cp\u003e大学伊始，买了全画幅canon 6D + 24-105套头，玩了四年，让我从一个摄影小白逐步了解了摄影的各种技术，也见识了全画幅的威力——扛着一个红圈大单反出门好不威风，旅游的时候路人看到我在拍什么，常常也跟上来到同样的位置看看；同学老师们也乐意让我拍拍。尽管如此，四年下来，我对这台笨重的相机却有些厌倦了，它实在太重，加上三脚架，如果不是有重要活动，实在不想再扛着到处跑。\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"/posts/fujifilm-xf10-vs-panasonic-lx10/20170811-IMG_3437-2-1024x320.jpg\"\u003e\u003c/p\u003e\n\u003cp\u003e6D我用的其实并不多，主要用来拍了学校班级的活动以及难得出去旅游用用，现在随着对摄影的了解更加深入，逐步意识到自己在技术和审美上还存在不足，要多拍才行——我需要一个能随身带着的可以到处拍的玩意儿来提高自己的拍摄频率。那么手机不行吗？不行，手机可玩性太低，参数调整远不如相机的拨盘来的方便，目前大多数手机画质也不及相机，用手机拍照着实差了点感觉，学摄影还得相机。\u003c/p\u003e\n\u003cp\u003e预算2000元以下的卡片机，二手基本就是在XF10和LX10之间做选择。在网上看了一些测评，键盘摄影师太多 ，还是自己都买来尝试一下吧。\u003c/p\u003e\n\u003cp\u003e先说结论：我留下了XF10，根本原因在于画质与可玩性：\u003c/p\u003e\n\u003ch2 id=\"画质\"\u003e画质\u003c/h2\u003e\n\u003cp\u003e我的目的是为了提升摄影技术，我有全幅了对变焦需求不大，定焦反而能让我专注构图拍照。XF10的APS-C画幅能与手机的画质拉开明显的差距，LX10的一英寸底则不能，特别是在手机摄影快速发展的今天，面对华为P40 pro+，即使光学变焦也不是一个很明显的优势。（说实话，华为的这款手机确实让人惊艳，也让我下定决心放弃了LX10），再过两年，把LX10的预算加在手机上买个拍照旗舰，日常拍摄发朋友圈完全够用。对比6D，XF10，LX10，可以看到画质上还是有非常明显的区别，放大画面在细节的保留上底大一级压死人的定律非常明显。XF10对细节的反映以及画面锐度是手机无法比拟的，这台相机给我的感觉更加专业，而LX10则更像是一台家用产品。\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"/posts/fujifilm-xf10-vs-panasonic-lx10/P1000929-1-1024x683.jpg\"\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"/posts/fujifilm-xf10-vs-panasonic-lx10/DSCF0251-1024x683.jpg\"\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"/posts/fujifilm-xf10-vs-panasonic-lx10/DSCF0458-2-1024x683.jpg\"\u003e\u003c/p\u003e\n\u003ch2 id=\"可玩性\"\u003e可玩性\u003c/h2\u003e\n\u003cp\u003e简单来说就是好不好折腾，我是喜欢折腾的，所以这些在我来看一些缺点也能当做优点。\u003c/p\u003e\n\u003ch3 id=\"胶片模拟\"\u003e胶片模拟\u003c/h3\u003e\n\u003cp\u003e富士的胶片模拟可用性很高，XF10提供了11种胶片模拟，并可对高光阴影对比度降噪等做进一步调整，jpeg直出色彩确实不错，不过在锐化和降噪上稍显激进导致一些网友认为涂抹感太强，实际上用raw格式在富士提供的专业软件如capture one里可以精细调整，不存在这个问题，其raw格式后期空间大，色彩丰富，同时2420万像素给了后期很大的剪裁空间，基本可以当做3倍变焦来用。LX10的raw则稍显不足，色彩不够丰富，宽容度较低，细节有所损失，因此后期空间相对较小。\u003c/p\u003e\n\u003ch3 id=\"快拍模式\"\u003e快拍模式\u003c/h3\u003e\n\u003cp\u003eXF10的快拍模式被许多人吐槽只有5m和2m两种模式并且不支持更改光圈，但是说实话2000元要啥自行车，和GR比完全没必要，另外在手动对焦模式下，XF10提供了对焦距离标尺，通过设置不同光圈及对焦距离，想要什么距离和景深的快拍都是可以做到的，无非是没有一个快捷键快速设置的功能，但我认为可用性也不错了（自己也不是很有街拍经验）。LX10则没有快拍模式，其开机时间也比较长（镜头要伸出来），不过考虑到对焦速度快，也是用其拍照的一种优势。\u003c/p\u003e\n\u003ch3 id=\"重量\"\u003e重量\u003c/h3\u003e\n\u003cp\u003e在重量方面，XF10只有280g，而LX10有340g，同时LX10的镜头相较XF10凸起更加明显，就实际放在口袋里的感受来说，XF10要舒服的多，LX10会把口袋撑起来，并且让裤子有严重下坠感，在夏天，LX10放在口袋里出门并不是很方便。\u003c/p\u003e\n\u003ch3 id=\"性能\"\u003e性能\u003c/h3\u003e\n\u003cp\u003e至于网上频繁吐槽的XF10的对焦性能与操控，坦白说个人使用绝没有网上说的那么夸张。LX10毫无疑问是完胜的，对焦迅速，触屏强大流畅，维纳斯芯片性能强劲处理速度快。XF10的对焦比较慢，但在较好光线的情况下速度不错，手动峰值对焦也可以接受，无非就是拍摄节奏比较慢。\u003c/p\u003e\n\u003cp\u003e唯一让我诟病的就是XF10的芯片显然速度不行，拍raw+fine jpg格式的照片，每一张都要处理个三四秒，这是限制拍摄节奏与连拍的最大问题，因为在处理器处理照片时，相机的触屏将失效，也就是说如果你想触屏改变模式或者对焦点，你必须等几秒相机处理完上一张照片，很多时候让我以为相机失灵了，但一般情况下，只要掌握了节奏或者不拍这么大的照片（加起来50多M）就还好。\u003c/p\u003e\n\u003ch2 id=\"lx10的优势\"\u003eLX10的优势\u003c/h2\u003e\n\u003cp\u003e选择XF10并不代表我不喜欢LX10，实际上这款相机在我看来是一款性价比极高的相机。一般提的比较多的就是它的翻转屏，4K录制功能，5轴防抖等，这些都是XF10没有的，如果是喜欢录制视频的朋友，LX10性价比极高值得尝试。\u003c/p\u003e\n\u003cp\u003e我要着重赞美一下LX10的操控，松下的菜单以及操控实在是极其清晰简单，上手非常快，我认为这款相机很适合新手入门，去学习熟练控制光圈、快门以及感光度。并且其支持步进变焦，可以在35mm，50mm，75mm间进行切换，对熟悉焦段很有帮助。LX10在明亮环境下色彩还原度较高，用来旅行或者办公记录，都会是不错的选择。\u003c/p\u003e","title":"Fujifilm XF10 对比 Panasonic LX10"},{"content":"简介 2019年3月末于香港国际会展中心，持续3天，在咸鱼花了600买到学生3天通票，顺便在会展4楼看了免费的佳士得拍卖会展览。都可以买学生票，实际上检票人员并不会查学生证只要你不要看着太不像学生\u0026hellip;整个展会看得快1天实际就够了，但是是比较累的，规模真的很大。\n其实我觉得免费的佳士得拍卖展更好看，都是大名鼎鼎的艺术家的作品，还有很多古迹，不用隔着玻璃罩一次性看过瘾。很可惜香港现在搞事情又闹疫情，今年的展会变成线上了。\n挑了几十张，大部分都是很有名的，没事儿留着翻一翻。\n图片 ","permalink":"https://www.xiaoxiangtao.cn/zh/posts/art-basel-2019-hong-kong/","summary":"\u003ch2 id=\"简介\"\u003e简介\u003c/h2\u003e\n\u003cp\u003e2019年3月末于香港国际会展中心，持续3天，在咸鱼花了600买到学生3天通票，顺便在会展4楼看了免费的佳士得拍卖会展览。都可以买学生票，实际上检票人员并不会查学生证只要你不要看着太不像学生\u0026hellip;整个展会看得快1天实际就够了，但是是比较累的，规模真的很大。\u003c/p\u003e\n\u003cp\u003e其实我觉得免费的佳士得拍卖展更好看，都是大名鼎鼎的艺术家的作品，还有很多古迹，不用隔着玻璃罩一次性看过瘾。很可惜香港现在搞事情又闹疫情，今年的展会变成线上了。\u003c/p\u003e\n\u003cp\u003e挑了几十张，大部分都是很有名的，没事儿留着翻一翻。\u003c/p\u003e\n\u003ch2 id=\"图片\"\u003e图片\u003c/h2\u003e\n\n\n\u003cdiv class=\"gallery gallery-cols-1\"\u003e\u003cimg loading=\"lazy\" src=\"/posts/art-basel-2019-hong-kong/IMG_7343.JPG-1024x768.jpg\"\u003e\u003cbr\u003e\n\u003cimg loading=\"lazy\" src=\"/posts/art-basel-2019-hong-kong/IMG_7342.JPG-1024x768.jpg\"\u003e\u003cbr\u003e\n\u003cimg loading=\"lazy\" src=\"/posts/art-basel-2019-hong-kong/IMG_7329.JPG-768x1024.jpg\"\u003e\u003cbr\u003e\n\u003cimg loading=\"lazy\" src=\"/posts/art-basel-2019-hong-kong/IMG_7328.JPG-768x1024.jpg\"\u003e\u003cbr\u003e\n\u003cimg loading=\"lazy\" src=\"/posts/art-basel-2019-hong-kong/IMG_7327.JPG-768x1024.jpg\"\u003e\u003cbr\u003e\n\u003cimg loading=\"lazy\" src=\"/posts/art-basel-2019-hong-kong/IMG_7326.JPG-768x1024.jpg\"\u003e\u003cbr\u003e\n\u003cimg loading=\"lazy\" src=\"/posts/art-basel-2019-hong-kong/IMG_7325.JPG-768x1024.jpg\"\u003e\u003cbr\u003e\n\u003cimg loading=\"lazy\" src=\"/posts/art-basel-2019-hong-kong/IMG_7324.JPG-768x1024.jpg\"\u003e\u003cbr\u003e\n\u003cimg loading=\"lazy\" src=\"/posts/art-basel-2019-hong-kong/IMG_7322.JPG-768x1024.jpg\"\u003e\u003cbr\u003e\n\u003cimg loading=\"lazy\" src=\"/posts/art-basel-2019-hong-kong/IMG_7319.JPG-768x1024.jpg\"\u003e\u003cbr\u003e\n\u003cimg loading=\"lazy\" src=\"/posts/art-basel-2019-hong-kong/IMG_7318.JPG-scaled-e1591186093967-1024x543.jpg\"\u003e\u003cbr\u003e\n\u003cimg loading=\"lazy\" src=\"/posts/art-basel-2019-hong-kong/IMG_7317.JPG-768x1024.jpg\"\u003e\u003cbr\u003e\n\u003cimg loading=\"lazy\" src=\"/posts/art-basel-2019-hong-kong/IMG_7316.JPG-768x1024.jpg\"\u003e\u003cbr\u003e\n\u003cimg loading=\"lazy\" src=\"/posts/art-basel-2019-hong-kong/IMG_7315.JPG-768x1024.jpg\"\u003e\u003cbr\u003e\n\u003cimg loading=\"lazy\" src=\"/posts/art-basel-2019-hong-kong/IMG_7314.JPG-768x1024.jpg\"\u003e\u003cbr\u003e\n\u003cimg loading=\"lazy\" src=\"/posts/art-basel-2019-hong-kong/IMG_7313.JPG-768x1024.jpg\"\u003e\u003cbr\u003e\n\u003cimg loading=\"lazy\" src=\"/posts/art-basel-2019-hong-kong/IMG_7312.JPG-768x1024.jpg\"\u003e\u003cbr\u003e\n\u003cimg loading=\"lazy\" src=\"/posts/art-basel-2019-hong-kong/IMG_7311.JPG-768x1024.jpg\"\u003e\u003cbr\u003e\n\u003cimg loading=\"lazy\" src=\"/posts/art-basel-2019-hong-kong/IMG_7310.JPG-1024x768.jpg\"\u003e\u003cbr\u003e\n\u003cimg loading=\"lazy\" src=\"/posts/art-basel-2019-hong-kong/IMG_7308.JPG-768x1024.jpg\"\u003e\u003cbr\u003e\n\u003cimg loading=\"lazy\" src=\"/posts/art-basel-2019-hong-kong/IMG_7307.JPG-768x1024.jpg\"\u003e\u003cbr\u003e\n\u003cimg loading=\"lazy\" src=\"/posts/art-basel-2019-hong-kong/IMG_7306.JPG-768x1024.jpg\"\u003e\u003cbr\u003e\n\u003cimg loading=\"lazy\" src=\"/posts/art-basel-2019-hong-kong/IMG_7304.JPG-1024x768.jpg\"\u003e\u003cbr\u003e\n\u003cimg loading=\"lazy\" src=\"/posts/art-basel-2019-hong-kong/IMG_7303.JPG-1024x768.jpg\"\u003e\u003cbr\u003e\n\u003cimg loading=\"lazy\" src=\"/posts/art-basel-2019-hong-kong/IMG_7302.JPG-1024x768.jpg\"\u003e\u003cbr\u003e\n\u003cimg loading=\"lazy\" src=\"/posts/art-basel-2019-hong-kong/IMG_7301.JPG-1024x768.jpg\"\u003e\u003cbr\u003e\n\u003cimg loading=\"lazy\" src=\"/posts/art-basel-2019-hong-kong/IMG_7298.JPG-1024x768.jpg\"\u003e\u003cbr\u003e\n\u003cimg loading=\"lazy\" src=\"/posts/art-basel-2019-hong-kong/IMG_7291.JPG-768x1024.jpg\"\u003e\u003cbr\u003e\n\u003cimg loading=\"lazy\" src=\"/posts/art-basel-2019-hong-kong/IMG_7289.JPG-1024x768.jpg\"\u003e\u003cbr\u003e\n\u003cimg loading=\"lazy\" src=\"/posts/art-basel-2019-hong-kong/IMG_7288.JPG-1024x768.jpg\"\u003e\u003cbr\u003e\n\u003cimg loading=\"lazy\" src=\"/posts/art-basel-2019-hong-kong/IMG_7284.JPG-768x1024.jpg\"\u003e\u003cbr\u003e\n\u003cimg loading=\"lazy\" src=\"/posts/art-basel-2019-hong-kong/IMG_7270.JPG-1024x768.jpg\"\u003e\u003cbr\u003e\n\u003cimg loading=\"lazy\" src=\"/posts/art-basel-2019-hong-kong/IMG_7269.JPG-768x1024.jpg\"\u003e\u003cbr\u003e\n\u003cimg loading=\"lazy\" src=\"/posts/art-basel-2019-hong-kong/IMG_7268.JPG-1024x768.jpg\"\u003e\u003cbr\u003e\n\u003cimg loading=\"lazy\" src=\"/posts/art-basel-2019-hong-kong/IMG_7267.JPG-768x1024.jpg\"\u003e\u003cbr\u003e\n\u003cimg loading=\"lazy\" src=\"/posts/art-basel-2019-hong-kong/IMG_7266.JPG-1024x768.jpg\"\u003e\u003cbr\u003e\n\u003cimg loading=\"lazy\" src=\"/posts/art-basel-2019-hong-kong/IMG_7265.JPG-768x1024.jpg\"\u003e\u003cbr\u003e\n\u003cimg loading=\"lazy\" src=\"/posts/art-basel-2019-hong-kong/IMG_7264.JPG-768x1024.jpg\"\u003e\u003cbr\u003e\n\u003cimg loading=\"lazy\" src=\"/posts/art-basel-2019-hong-kong/IMG_7262.JPG-768x1024.jpg\"\u003e\u003cbr\u003e\n\u003cimg loading=\"lazy\" src=\"/posts/art-basel-2019-hong-kong/IMG_7259.JPG-1024x768.jpg\"\u003e\u003cbr\u003e\n\u003cimg loading=\"lazy\" src=\"/posts/art-basel-2019-hong-kong/IMG_7189.JPG-768x1024.jpg\"\u003e\u003cbr\u003e\n\u003cimg loading=\"lazy\" src=\"/posts/art-basel-2019-hong-kong/IMG_7257.JPG-1024x768.jpg\"\u003e\u003cbr\u003e\n\u003cimg loading=\"lazy\" src=\"/posts/art-basel-2019-hong-kong/IMG_7254.JPG-1024x768.jpg\"\u003e\u003cbr\u003e\n\u003cimg loading=\"lazy\" src=\"/posts/art-basel-2019-hong-kong/IMG_7253.JPG-768x1024.jpg\"\u003e\u003cbr\u003e\n\u003cimg loading=\"lazy\" src=\"/posts/art-basel-2019-hong-kong/IMG_7246.JPG-1024x768.jpg\"\u003e\u003cbr\u003e\n\u003cimg loading=\"lazy\" src=\"/posts/art-basel-2019-hong-kong/IMG_7237.JPG-1024x768.jpg\"\u003e\u003cbr\u003e\n\u003cimg loading=\"lazy\" src=\"/posts/art-basel-2019-hong-kong/IMG_7236.JPG-768x1024.jpg\"\u003e\u003cbr\u003e\n\u003cimg loading=\"lazy\" src=\"/posts/art-basel-2019-hong-kong/IMG_7217.JPG-768x1024.jpg\"\u003e\u003cbr\u003e\n\u003cimg loading=\"lazy\" src=\"/posts/art-basel-2019-hong-kong/IMG_7211.JPG-768x1024.jpg\"\u003e\u003cbr\u003e\n\u003cimg loading=\"lazy\" src=\"/posts/art-basel-2019-hong-kong/IMG_7205.JPG-1024x768.jpg\"\u003e\u003cbr\u003e\n\u003cimg loading=\"lazy\" src=\"/posts/art-basel-2019-hong-kong/IMG_7204.JPG-1024x768.jpg\"\u003e\u003cbr\u003e\n\u003cimg loading=\"lazy\" src=\"/posts/art-basel-2019-hong-kong/IMG_7199.JPG-768x1024.jpg\"\u003e\u003cbr\u003e\n\u003cimg loading=\"lazy\" src=\"/posts/art-basel-2019-hong-kong/IMG_7195.JPG-768x1024.jpg\"\u003e\u003c/div\u003e","title":"2019巴塞尔艺术展（香港）"},{"content":"简介 人物\n王璜生\n美术学博士，中央美术学院教授，博士生导师，中央美院美术馆馆长，全国美术馆专业委员会副主任，文化部“国家当代艺术研究中心”专家委员会委员。\n关键字\n偷渡 战争 伤害 疗愈 救赎 挣扎 自由 天堂 束缚 生命\u0026hellip;\n材料\n铁丝 塑料管 铃铛 纱布 风 火 光 报纸 胶带等\n形式\n水墨 拓印 摄影 装置影像\n图片 感受 有的作品名字忘记了，在现场看感觉挺好的，引人深思，至于照片就没啥好看的，我也不觉得这些东西好看。\n大概思想就是与战争，偷渡等概念相关，所以很压抑，以前刚看完写了很多感想，现在回过头来看索然无味，没有相关经历其实看得没什么意思。\n","permalink":"https://www.xiaoxiangtao.cn/zh/posts/wang-huangsheng-boundary-space-release-of-sense-and/","summary":"\u003ch2 id=\"简介\"\u003e简介\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003e人物\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e王璜生\u003c/p\u003e\n\u003cp\u003e美术学博士，中央美术学院教授，博士生导师，中央美院美术馆馆长，全国美术馆专业委员会副主任，文化部“国家当代艺术研究中心”专家委员会委员。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e关键字\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e偷渡 战争 伤害 疗愈 救赎 挣扎 自由 天堂 束缚 生命\u0026hellip;\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e材料\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e铁丝 塑料管 铃铛 纱布 风 火 光 报纸 胶带等\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e形式\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e水墨 拓印 摄影 装置影像\u003c/p\u003e\n\u003ch2 id=\"图片\"\u003e图片\u003c/h2\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"/posts/wang-huangsheng-boundary-space-release-of-sense-and/20180415-IMG_5653-1024x766.jpg\"\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"/posts/wang-huangsheng-boundary-space-release-of-sense-and/20180415-IMG_5656-683x1024.jpg\"\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"/posts/wang-huangsheng-boundary-space-release-of-sense-and/20180415-IMG_5657-1024x683.jpg\"\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"/posts/wang-huangsheng-boundary-space-release-of-sense-and/20180415-IMG_5665-571x1024.jpg\"\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"/posts/wang-huangsheng-boundary-space-release-of-sense-and/20180415-IMG_5667-1024x653.jpg\"\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"/posts/wang-huangsheng-boundary-space-release-of-sense-and/20180415-IMG_5684-1024x902.jpg\"\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"/posts/wang-huangsheng-boundary-space-release-of-sense-and/20180415-IMG_5690-1024x503.jpg\"\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"/posts/wang-huangsheng-boundary-space-release-of-sense-and/20180415-IMG_5696-1024x829.jpg\"\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"/posts/wang-huangsheng-boundary-space-release-of-sense-and/20180415-IMG_5705-1024x531.jpg\"\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"/posts/wang-huangsheng-boundary-space-release-of-sense-and/20180415-IMG_5713-1024x1015.jpg\"\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"/posts/wang-huangsheng-boundary-space-release-of-sense-and/20180415-IMG_5718-1024x763.jpg\"\u003e\u003c/p\u003e\n\u003ch2 id=\"感受\"\u003e感受\u003c/h2\u003e\n\u003cp\u003e有的作品名字忘记了，在现场看感觉挺好的，引人深思，至于照片就没啥好看的，我也不觉得这些东西好看。\u003c/p\u003e\n\u003cp\u003e大概思想就是与战争，偷渡等概念相关，所以很压抑，以前刚看完写了很多感想，现在回过头来看索然无味，没有相关经历其实看得没什么意思。\u003c/p\u003e","title":"王璜生：边界/空间——感观的释放与媒材的突破"},{"content":"namesilo的域名在众多服务商里价格是比较实惠的，.com域名只要$8.99，近年新推出了web hosting服务，价格也比较实惠，最便宜的一个网站20G存储空间的套餐每月只要$2.39元（年套餐）。最近有一个做网站的需求，腾讯的学生优惠已经用过了，又不想备案，正好找到这个便宜的尝试一下。\n购买 namesilo的hosting购买服务在namesilo新版网站，进入 namesilo.com 首页就能看见\n总共有3个套餐，可以按年或者按月购买，按年购买会更便宜。购买过程非常简单，选择对应套餐点击Get Started。\n然后会让你选择域名，这一步也提供3种选择：\n1.如果你没有域名的话，可以直接搜索选择一个可注册的，然后和云主机套餐打包在namesilo购买；\n2.如果你在其他注册商处（比如腾讯云等）已经购买了域名，输入你购买的域名进行绑定即可，注意要输入你希望是主网站的域名比如www.test.com，namesilo会自动增加域名解析；\n3.你也可以选择将其他注册商处购买的域名转移至namesilo（不过注意如果你是新购买的域名通常有一个期限限制域名转出）。\n我选择了绑定我在腾讯云购买的域名，选择好域名后点击continue即跳转到确认订单页面（注意：确认订单页面在旧版网站，新旧网站功能混在一起确实比较容易让人迷惑），不用犹豫点击确认订单，然后在付款页面选择Alipay，输入你的支付宝账号然后扫二维码付款即可。\n域名解析 ！！！购买完成以后，在新版网站是找不到你购买的host的，这点很让人迷惑，在新版网站，你可以选择点击自己的账户信息来跳转到旧版网站，然后在侧边栏选择hosting manager，即可进入主机管理页面，在这里你会看到自己购买的主机，名称就是你之前绑定的域名。\n点击链接图标，就进入了你的主机的cpanel管理面板。第一次登陆要设置账号密码邮箱配置等，cpanel支持中文（在偏好-更改语言处选择语言），可视化界面简单易懂，网上已经有很多介绍。\n购买完成后就可以前往控制面板进行相关设置了，namesilo根据你在购买时绑定的域名已经自动为该域名添加了域名解析，包括test.com,www.test.com,ftp.test.com以及mail解析等，如果购买套餐时你选择在namesilo购买一个新域名，那么一切已经就绪，在cpanel面板选择安装wordpress即可开始建站。如果像我一样绑定了其他注册商处的域名，虽然namesilo已经添加了相关解析，但这些解析是基于namesilo自家DNS服务器才会生效的，这里有两种选择：\n1.到购买域名的域名注册商处将域名的DNS解析服务器地址改为namesilo的DNS服务器地址使解析生效：\nNS1.DNSOWL.COM NS2.DNSOWL.COM NS3.DNSOWL.COM 2.如果不希望更换DNS服务商，在cpanel面板的域名Zone找到自动添加的所有域名解析，然后将他们全部复制添加到自己的域名注册商处的域名解析中，同样可以让解析生效。\n做完这些，在cpanel面板安装好wordpress，在浏览器输入你的域名就可以看到wordpress主页了！\nSSL证书实现HTTPS 购买的主机已经添加了自签名的SSL证书，但是自签名证书在用浏览器访问时会报不安全，一个第三方签名还是有必要的，namesilo自家在已购主机管理页面就有SSL证书购买服务，不过要花钱，有很多免费提供签名的第三方机构，我直接申请了腾讯云提供的TrustAsia 1年期免费证书（在云产品-SSL证书处申请即可）。\n申请下来后下载证书得到.key及.crt证书文件（host使用的是apache服务器，要选对版本），找到cpanel面板的：安全-SSL/TLS选项，删除已有自签名证书文件，上传自己的证书文件，然后选择[管理SSL主机]，选择证书对应的域名，点击按域自动填充，上传的证书会被自动选中填充，点击安装证书即可。\n在cpanel面板的：域-域选项找到自己的域名，选择启用Force HTTPS Redirect，至此，网站即可安全的用HTTPS进行访问了。\nCloudFlare CDN加速 在cpanel安装好wordpress后，就是进入wordpress后台搭建网站，但是实测在中国境内网页的访问速度很慢，并且容易丢包。为了提高访问速度，需要将网页进行静态缓存以及CDN加速。\n类似七牛云等国内免费CDN服务要求你的主域名是备案了的，没有备案要选择海外CDN， CloudFlare 提供个人免费版CDN加速服务，推荐这个 教程，注意登录cloudflare的外国官网，中国网站注册是企业版的，注册完就有客服打电话给你谈业务了\u0026hellip;CloudFlare的CDN需要将DNS服务器地址转成他们家的，生效时间大概十分钟不到。\n在wordpress安装一个静态缓存插件，比如wp fast cache，在CDN选项选择cloudflare，需要输入API码，然后在cloudflare的Overview的侧边栏点击get your API token，选择global API，点击view，复制API代码到wordpress中即可，一路点击确认，cdn配置就完成了。\n配置CDN及静态缓存后，网站的访问速度得到很明显的改善，访问变的更稳定，虽然相较国内的网站速度稍慢，但是对于像个人博客之类的小网站完全可以接受了。\n邮箱 namesilo的host已经配置好了邮箱服务，发送邮件没问题，但是我用163发的邮件它却收不到，在wordpress设置中更换邮件地址，发现验证邮件也发不到我的邮箱上。因此使用了第三方的SMTP服务，下载了wp SMTP mail插件，SMTP服务用的是腾讯云的企业邮。\n将原本的地址解析中的邮件地址解析删掉，添加腾讯企业邮的地址进去，就可以使用腾讯企业邮箱的服务了，方法很简单，注册一个腾讯企业邮箱账号（免费的），然后按指导设置完成即可。增加一个业务邮箱账号，比如mail@designaxt.com，然后得到对应的邮箱密匙，在wp SMTP mail选择其他SMTP，输入密匙，腾讯企业邮的服务器地址及端口号，保存更改就可以用腾讯的服务发邮件了，其他家应该类似。\n","permalink":"https://www.xiaoxiangtao.cn/zh/posts/namesilo-web-hosting-virtual-machine-station-building/","summary":"\u003cp\u003enamesilo的域名在众多服务商里价格是比较实惠的，.com域名只要$8.99，近年新推出了web hosting服务，价格也比较实惠，最便宜的一个网站20G存储空间的套餐每月只要$2.39元（年套餐）。最近有一个做网站的需求，腾讯的学生优惠已经用过了，又不想备案，正好找到这个便宜的尝试一下。\u003c/p\u003e\n\u003ch2 id=\"购买\"\u003e购买\u003c/h2\u003e\n\u003cp\u003enamesilo的hosting购买服务在namesilo新版网站，进入 \u003ca href=\"/zh/\"\u003enamesilo.com\u003c/a\u003e 首页就能看见\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"/posts/namesilo-web-hosting-virtual-machine-station-building/%E5%9B%BE%E7%89%87.png\"\u003e\u003c/p\u003e\n\u003cp\u003e总共有3个套餐，可以按年或者按月购买，按年购买会更便宜。购买过程非常简单，选择对应套餐点击Get Started。\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"/posts/namesilo-web-hosting-virtual-machine-station-building/%E5%9B%BE%E7%89%87-1-1024x554.png\"\u003e\u003c/p\u003e\n\u003cp\u003e然后会让你选择域名，这一步也提供3种选择：\u003c/p\u003e\n\u003cp\u003e1.如果你没有域名的话，可以直接搜索选择一个可注册的，然后和云主机套餐打包在namesilo购买；\u003c/p\u003e\n\u003cp\u003e2.如果你在其他注册商处（比如腾讯云等）已经购买了域名，输入你购买的域名进行绑定即可，注意要输入你希望是主网站的域名比如www.test.com，namesilo会自动增加域名解析；\u003c/p\u003e\n\u003cp\u003e3.你也可以选择将其他注册商处购买的域名转移至namesilo（不过注意如果你是新购买的域名通常有一个期限限制域名转出）。\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"/posts/namesilo-web-hosting-virtual-machine-station-building/%E5%9B%BE%E7%89%87-2-1024x451.png\"\u003e\u003c/p\u003e\n\u003cp\u003e我选择了绑定我在腾讯云购买的域名，选择好域名后点击continue即跳转到确认订单页面（注意：确认订单页面在旧版网站，新旧网站功能混在一起确实比较容易让人迷惑），不用犹豫点击确认订单，然后在付款页面选择Alipay，输入你的支付宝账号然后扫二维码付款即可。\u003c/p\u003e\n\u003ch2 id=\"域名解析\"\u003e域名解析\u003c/h2\u003e\n\u003cp\u003e！！！购买完成以后，在新版网站是找不到你购买的host的，这点很让人迷惑，在新版网站，你可以选择点击自己的账户信息来跳转到旧版网站，然后在侧边栏选择hosting manager，即可进入主机管理页面，在这里你会看到自己购买的主机，名称就是你之前绑定的域名。\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"/posts/namesilo-web-hosting-virtual-machine-station-building/%E5%9B%BE%E7%89%87-3.png\"\u003e\u003c/p\u003e\n\u003cp\u003e点击链接图标，就进入了你的主机的cpanel管理面板。第一次登陆要设置账号密码邮箱配置等，cpanel支持中文（在偏好-更改语言处选择语言），可视化界面简单易懂，网上已经有很多介绍。\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"/posts/namesilo-web-hosting-virtual-machine-station-building/%E5%9B%BE%E7%89%87-4.png\"\u003e\u003c/p\u003e\n\u003cp\u003e购买完成后就可以前往控制面板进行相关设置了，namesilo根据你在购买时绑定的域名已经自动为该域名添加了域名解析，包括test.com,www.test.com,ftp.test.com以及mail解析等，如果购买套餐时你选择在namesilo购买一个新域名，那么一切已经就绪，在cpanel面板选择安装wordpress即可开始建站。如果像我一样绑定了其他注册商处的域名，虽然namesilo已经添加了相关解析，但这些解析是基于namesilo自家DNS服务器才会生效的，这里有两种选择：\u003c/p\u003e\n\u003cp\u003e1.到购买域名的域名注册商处将域名的DNS解析服务器地址改为namesilo的DNS服务器地址使解析生效：\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"/posts/namesilo-web-hosting-virtual-machine-station-building/%E5%9B%BE%E7%89%87-5.png\"\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eNS1.DNSOWL.COM\u003c/li\u003e\n\u003cli\u003eNS2.DNSOWL.COM\u003c/li\u003e\n\u003cli\u003eNS3.DNSOWL.COM\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e2.如果不希望更换DNS服务商，在cpanel面板的域名Zone找到自动添加的所有域名解析，然后将他们全部复制添加到自己的域名注册商处的域名解析中，同样可以让解析生效。\u003c/p\u003e\n\u003cp\u003e做完这些，在cpanel面板安装好wordpress，在浏览器输入你的域名就可以看到wordpress主页了！\u003c/p\u003e\n\u003ch2 id=\"ssl证书实现https\"\u003eSSL证书实现HTTPS\u003c/h2\u003e\n\u003cp\u003e购买的主机已经添加了自签名的SSL证书，但是自签名证书在用浏览器访问时会报不安全，一个第三方签名还是有必要的，namesilo自家在已购主机管理页面就有SSL证书购买服务，不过要花钱，有很多免费提供签名的第三方机构，我直接申请了腾讯云提供的TrustAsia 1年期免费证书（在云产品-SSL证书处申请即可）。\u003c/p\u003e\n\u003cp\u003e申请下来后下载证书得到.key及.crt证书文件（host使用的是apache服务器，要选对版本），找到cpanel面板的：安全-SSL/TLS选项，删除已有自签名证书文件，上传自己的证书文件，然后选择[管理SSL主机]，选择证书对应的域名，点击按域自动填充，上传的证书会被自动选中填充，点击安装证书即可。\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"/posts/namesilo-web-hosting-virtual-machine-station-building/%E5%9B%BE%E7%89%87-6.png\"\u003e\u003c/p\u003e\n\u003cp\u003e在cpanel面板的：域-域选项找到自己的域名，选择启用Force HTTPS Redirect，至此，网站即可安全的用HTTPS进行访问了。\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"/posts/namesilo-web-hosting-virtual-machine-station-building/%E5%9B%BE%E7%89%87-7-1024x94.png\"\u003e\u003c/p\u003e\n\u003ch2 id=\"cloudflare-cdn加速\"\u003eCloudFlare CDN加速\u003c/h2\u003e\n\u003cp\u003e在cpanel安装好wordpress后，就是进入wordpress后台搭建网站，但是实测在中国境内网页的访问速度很慢，并且容易丢包。为了提高访问速度，需要将网页进行静态缓存以及CDN加速。\u003c/p\u003e\n\u003cp\u003e类似七牛云等国内免费CDN服务要求你的主域名是备案了的，没有备案要选择海外CDN， \u003ca href=\"/zh/\"\u003eCloudFlare\u003c/a\u003e 提供个人免费版CDN加速服务，推荐这个 \u003ca href=\"//zhuanlan.zhihu.com/p/29891330\"\u003e教程\u003c/a\u003e，注意登录cloudflare的外国官网，中国网站注册是企业版的，注册完就有客服打电话给你谈业务了\u0026hellip;CloudFlare的CDN需要将DNS服务器地址转成他们家的，生效时间大概十分钟不到。\u003c/p\u003e\n\u003cp\u003e在wordpress安装一个静态缓存插件，比如wp fast cache，在CDN选项选择cloudflare，需要输入API码，然后在cloudflare的Overview的侧边栏点击get your API token，选择global API，点击view，复制API代码到wordpress中即可，一路点击确认，cdn配置就完成了。\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"/posts/namesilo-web-hosting-virtual-machine-station-building/%E5%9B%BE%E7%89%87-8.png\"\u003e\u003c/p\u003e\n\u003cp\u003e配置CDN及静态缓存后，网站的访问速度得到很明显的改善，访问变的更稳定，虽然相较国内的网站速度稍慢，但是对于像个人博客之类的小网站完全可以接受了。\u003c/p\u003e\n\u003ch2 id=\"邮箱\"\u003e邮箱\u003c/h2\u003e\n\u003cp\u003enamesilo的host已经配置好了邮箱服务，发送邮件没问题，但是我用163发的邮件它却收不到，在wordpress设置中更换邮件地址，发现验证邮件也发不到我的邮箱上。因此使用了第三方的SMTP服务，下载了wp SMTP mail插件，SMTP服务用的是腾讯云的企业邮。\u003c/p\u003e\n\u003cp\u003e将原本的地址解析中的邮件地址解析删掉，添加腾讯企业邮的地址进去，就可以使用腾讯企业邮箱的服务了，方法很简单，注册一个腾讯企业邮箱账号（免费的），然后按指导设置完成即可。增加一个业务邮箱账号，比如mail@designaxt.com，然后得到对应的邮箱密匙，在wp SMTP mail选择其他SMTP，输入密匙，腾讯企业邮的服务器地址及端口号，保存更改就可以用腾讯的服务发邮件了，其他家应该类似。\u003c/p\u003e","title":"NameSilo Web hosting 云主机建站服务购买与使用体验"},{"content":"在进行文本分类的时候，预处理我们可以自己做一个词向量模型，也可以采用预训练的模型。采用预训练的模型比如谷歌基于goole news训练的Word2vec模型，由于在大量文本数据中训练过，所以词的概率分布会比较准确，当自己的数据集比较小的时候，用预训练数据有利于提升模型的准确度。\n以下内容使用了tensorflow。\n训练文本生成word2vec模型 自己训练模型一般有以下几步：\n处理数据集，首先gensim的Word2Vec()方法需要的输入是句子顺序的单词，比如 我 爱 你 而不是我爱你，所以要将文本数据分词处理，在这个过程中，我们可以去除停用词，英文全部小写，语法统一等处理，可能对词向量的训练比较有帮助。 完成文本的处理以后，我们得到一个分词后的文本数据集，比如一个列表[\u0026lsquo;she\u0026rsquo;, \u0026lsquo;is\u0026rsquo;, \u0026lsquo;beautiful\u0026rsquo;]，在gensim模块中可以简单的使用model=gensim.models.word2vec.Word2Vec()得到训练的模型。\n该方法有一些参数：\nsentences-即数据集；sg-设置训练算法，0代表CBOW，1代表skip-gram算法；\nsize-指特征向量的维度，默认为100，大的size需要更多数据，效果更好，但是过大则浪费资源，效果提升不明显；\nwindow-当前词与预测词在一个句子中的最大距离，默认是5，比如 我 今天 成功 完成 工作，对于 成功，如果设置窗口为2，可能去预测的词就是我 今天 完成 和 工作，注意是最大值而不是一定选取四个词。最后模型输出的是一个概率分布，即一个词出现在其他词边的概率是多少，我们也就可以据此去发现相似的词。\nmin_count-去除词频小于min_count的词；\nhs-1采用hierarchy softmax，0采用negative sample；\niter-迭代次数\nworkers-参数控制训练的并行数¨C9C 更多参考： //www.cnblogs.com/kjkj/p/9825418.html 其他训练词向量有相似的方法和思路，网上有很多资料。\n使用预训练词向量 首先加载获取到准备好的模型，然后我们的目标是得到一个embedding_metrics即词向量矩阵，词向量矩阵的shape为（vocab_size, embedding_dim），它是我们要用于训练的数据的每个词（更具体的说是词表中的词）在训练好的模型中的词向量组成的矩阵。\n接下来处理训练数据，即用tokenizer处理训练后的数据得到词表，然后将每条文本数据转变为用词表索引数字代替各单词表示的列表，这里给词编码的顺序是词频由高到低，再进行padding使句子输入变为定长，最后我们利用word_index和模型生成embedding_metrics，数据的准备就基本完成了。这些步骤使用tensorflow提供的api可以很简单的实现。\n生成代码及相关解释如下：\nembedding_matrix = np.zeros((len(word_index) + 1, word2vec.vector_size)) # len(word_index) + 1，加1是因为word_index的标记是从1开始而非0，这样词索引与词向量刚好对应，并且对于padding后为 # 0的填充位置可以有对应的映射。 for word, index in word_index.items(): try: embedding_vector = word2vec.wv.getitem(str(word)) embedding_matrix[int(index)] = embedding_vector except KeyError: print(\u0026#34;vector not found for word - %s\u0026#34; % word) Embedding层做了什么？ Embedding层就是以one hot为输入、中间层节点为词向量维数的全连接层！而这个全连接层的参数，就是一个“词向量表”即我们的embedding_metrics，也就是说，其实onehot的作用就是查表，选择onehot表示的词对应的词向量，然后输出到下一层去。如果我们不用预处理的词向量，就是放一个空矩阵在embedding层（或者说是随机初始化参数），然后在训练网络过程中更新参数。\nEmbedding(len(vocab) + 1, embedding_dim, input_length=50, weights=[embedding_matrix], trainable=False) # (len(vocab) + 1, embedding_dim)与embedding_matrix的shape是一致的。 参考：\n苏剑林. (2016, Dec 03). 《词向量与Embedding究竟是怎么回事？》\n//blog.csdn.net/asialee_bird/article/details/88813385\n//www.cnblogs.com/kjkj/p/9825418.html\n//blog.csdn.net/zgj_gutou/article/details/89683727\n//blog.csdn.net/qq_17249717/article/details/101752670\n","permalink":"https://www.xiaoxiangtao.cn/zh/posts/gensim-training-word-vector-and-embedding-related-knowledge/","summary":"\u003cp\u003e在进行文本分类的时候，预处理我们可以自己做一个词向量模型，也可以采用预训练的模型。采用预训练的模型比如谷歌基于goole news训练的Word2vec模型，由于在大量文本数据中训练过，所以词的概率分布会比较准确，当自己的数据集比较小的时候，用预训练数据有利于提升模型的准确度。\u003c/p\u003e\n\u003cp\u003e以下内容使用了tensorflow。\u003c/p\u003e\n\u003ch2 id=\"训练文本生成word2vec模型\"\u003e训练文本生成word2vec模型\u003c/h2\u003e\n\u003cp\u003e自己训练模型一般有以下几步：\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e处理数据集，首先gensim的Word2Vec()方法需要的输入是句子顺序的单词，比如 我 爱 你 而不是我爱你，所以要将文本数据分词处理，在这个过程中，我们可以去除停用词，英文全部小写，语法统一等处理，可能对词向量的训练比较有帮助。\u003c/li\u003e\n\u003cli\u003e完成文本的处理以后，我们得到一个分词后的文本数据集，比如一个列表[\u0026lsquo;she\u0026rsquo;, \u0026lsquo;is\u0026rsquo;, \u0026lsquo;beautiful\u0026rsquo;]，在gensim模块中可以简单的使用model=gensim.models.word2vec.Word2Vec()得到训练的模型。\u003cbr\u003e\n该方法有一些参数：\u003cbr\u003e\n\u003cstrong\u003esentences\u003c/strong\u003e-即数据集；sg-设置训练算法，0代表CBOW，1代表skip-gram算法；\u003cbr\u003e\n\u003cstrong\u003esize\u003c/strong\u003e-指特征向量的维度，默认为100，大的size需要更多数据，效果更好，但是过大则浪费资源，效果提升不明显；\u003cbr\u003e\n\u003cstrong\u003ewindow\u003c/strong\u003e-当前词与预测词在一个句子中的最大距离，默认是5，比如 我 今天 成功 完成 工作，对于 成功，如果设置窗口为2，可能去预测的词就是我 今天 完成 和 工作，注意是最大值而不是一定选取四个词。最后模型输出的是一个概率分布，即一个词出现在其他词边的概率是多少，我们也就可以据此去发现相似的词。\u003cbr\u003e\n\u003cstrong\u003emin_count\u003c/strong\u003e-去除词频小于min_count的词；\u003cbr\u003e\n\u003cstrong\u003ehs\u003c/strong\u003e-1采用hierarchy softmax，0采用negative sample；\u003cbr\u003e\n\u003cstrong\u003eiter\u003c/strong\u003e-迭代次数\u003cbr\u003e\n\u003cstrong\u003eworkers\u003c/strong\u003e-参数控制训练的并行数¨C9C    更多参考： \u003ca href=\"//www.cnblogs.com/kjkj/p/9825418.html\"\u003e//www.cnblogs.com/kjkj/p/9825418.html\u003c/a\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e其他训练词向量有相似的方法和思路，网上有很多资料。\u003c/p\u003e\n\u003ch2 id=\"使用预训练词向量\"\u003e使用预训练词向量\u003c/h2\u003e\n\u003cp\u003e首先加载获取到准备好的模型，然后我们的目标是得到一个embedding_metrics即词向量矩阵，词向量矩阵的shape为（vocab_size, embedding_dim），它是我们要用于训练的数据的每个词（更具体的说是词表中的词）在训练好的模型中的词向量组成的矩阵。\u003c/p\u003e\n\u003cp\u003e接下来处理训练数据，即用tokenizer处理训练后的数据得到词表，然后将每条文本数据转变为用词表索引数字代替各单词表示的列表，这里给词编码的顺序是词频由高到低，再进行padding使句子输入变为定长，最后我们利用word_index和模型生成embedding_metrics，数据的准备就基本完成了。这些步骤使用tensorflow提供的api可以很简单的实现。\u003c/p\u003e\n\u003cp\u003e生成代码及相关解释如下：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-python\" data-lang=\"python\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eembedding_matrix\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003enp\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ezeros\u003c/span\u003e\u003cspan class=\"p\"\u003e((\u003c/span\u003e\u003cspan class=\"nb\"\u003elen\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eword_index\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"o\"\u003e+\u003c/span\u003e \u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eword2vec\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003evector_size\u003c/span\u003e\u003cspan class=\"p\"\u003e))\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e#  len(word_index) + 1，加1是因为word_index的标记是从1开始而非0，这样词索引与词向量刚好对应，并且对于padding后为\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e#  0的填充位置可以有对应的映射。\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003efor\u003c/span\u003e \u003cspan class=\"n\"\u003eword\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eindex\u003c/span\u003e \u003cspan class=\"ow\"\u003ein\u003c/span\u003e \u003cspan class=\"n\"\u003eword_index\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eitems\u003c/span\u003e\u003cspan class=\"p\"\u003e():\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003etry\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003eembedding_vector\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eword2vec\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ewv\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003egetitem\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nb\"\u003estr\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eword\u003c/span\u003e\u003cspan class=\"p\"\u003e))\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003eembedding_matrix\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nb\"\u003eint\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eindex\u003c/span\u003e\u003cspan class=\"p\"\u003e)]\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eembedding_vector\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003eexcept\u003c/span\u003e \u003cspan class=\"ne\"\u003eKeyError\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"nb\"\u003eprint\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;vector not found for word - \u003c/span\u003e\u003cspan class=\"si\"\u003e%s\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e \u003cspan class=\"o\"\u003e%\u003c/span\u003e \u003cspan class=\"n\"\u003eword\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch2 id=\"embedding层做了什么\"\u003eEmbedding层做了什么？\u003c/h2\u003e\n\u003cp\u003eEmbedding层就是以one hot为输入、中间层节点为词向量维数的全连接层！而这个全连接层的参数，就是一个“词向量表”即我们的embedding_metrics，也就是说，其实onehot的作用就是查表，选择onehot表示的词对应的词向量，然后输出到下一层去。如果我们不用预处理的词向量，就是放一个空矩阵在embedding层（或者说是随机初始化参数），然后在训练网络过程中更新参数。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-python\" data-lang=\"python\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eEmbedding\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nb\"\u003elen\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003evocab\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"o\"\u003e+\u003c/span\u003e \u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eembedding_dim\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003einput_length\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"mi\"\u003e50\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eweights\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"n\"\u003eembedding_matrix\u003c/span\u003e\u003cspan class=\"p\"\u003e],\u003c/span\u003e \u003cspan class=\"n\"\u003etrainable\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"kc\"\u003eFalse\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# (len(vocab) + 1, embedding_dim)与embedding_matrix的shape是一致的。\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e参考：\u003c/p\u003e","title":"Gensim训练词向量与Embedding相关知识"},{"content":"概念 为什么要计算F1：避免样本分布带来的偏差，综合考量分类效果，假如有100个样本，其中1个正样本，99个负样本，如果模型的预测只输出0，那么正确率是99%，这时候用正确率来衡量模型的好坏显然是不对的。\n真实 1真实 0预测 1True Positive(TP)False Positive(FP)预测 0False Negative(FN)True Negative(TN)\n查准率(precision)，预测正确的样本在所有预测为1的样本中的比例，该值反映有多少其他类被错误的归为该类。 召回率(recall)，预测正确的样本在所有真实为1的样本中的比例，该值反映有多少该类被预测为其他类了。 F1(F1-Score)， 精准率和召回率的调和平均数。 Micro-F1与Macro-F1\n针对多标签分类而言衡量分类效果\nMicro-F1：直接计算所有类别的Precision和Recall，然后计算F1。（类别有权重，分到样本数多的类别有更大的影响力） Macro-F1：计算出每一个类的Precision和Recall并分别计算F1，最后将F1平均。（各类别的F1权重相同） 代码实现 二分类\ndef f1(y_hat, y_true): \u0026#39;\u0026#39;\u0026#39; 输入张量y_hat是输出层经过sigmoid激活的张量 y_true是label{0,1}的集和 model指的是如果是多任务分类，single会返回每个分类的f1分数，multi会返回所有类的平均f1分数（Marco-F1） 如果只是单个二分类任务，则可以忽略model \u0026#39;\u0026#39;\u0026#39; epsilon = 1e-7 y_hat = tf.round(y_hat)#将经过sigmoid激活的张量四舍五入变为0，1输出 # 输入的数据是矩阵，标签为单行矩阵，预测值为单列矩阵，如果不是需要转换 tp = tf.cast(tf.matmul(y_true,y_hat), \u0026#39;float\u0026#39;) #tn = tf.sum(tf.cast((1-y_hat)\u0026lt;em\u0026gt;(1-y_true), \u0026#39;float\u0026#39;), axis=0) fp = tf.cast(tf.matmul(1-y_true,y_hat), \u0026#39;float\u0026#39;) fn = tf.cast(tf.matmul(y_true,1-y_hat), \u0026#39;float\u0026#39;) print(\u0026#39;tp: \u0026#39;, tp[0][0].numpy(),\u0026#39;fp: \u0026#39;, fp[0][0].numpy(),\u0026#39;fn: \u0026#39;, fn[0][0].numpy()) p = tp/(tp+fp+epsilon)#epsilon的意义在于防止分母为0，否则当分母为0时python会报错 r = tp/(tp+fn+epsilon) f1 = 2\u0026lt;/em\u0026gt;p\u0026lt;em\u0026gt;r/(p+r+epsilon) result = [f1[0][0].numpy(), p[0][0].numpy(), r[0][0].numpy()] return result 多标签\nimport tensorflow as tf def f1(y_hat, y_true, model=\u0026#39;multi\u0026#39;): \u0026#39;\u0026#39;\u0026#39; 输入张量y_hat是输出层经过sigmoid激活的张量 y_true是label{0,1}的集和 model指的是如果是多任务分类，single会返回每个分类的f1分数，multi会返回所有类的平均f1分数（Marco-F1） 如果只是单个二分类任务，则可以忽略model \u0026#39;\u0026#39;\u0026#39; epsilon = 1e-7 y_hat = tf.round(y_hat)#将经过sigmoid激活的张量四舍五入变为0，1输出 #tf.cast()转换张量数据类型 tp = tf.reduce_sum(tf.cast(y_hat\u0026lt;/em\u0026gt;y_true, \u0026#39;float\u0026#39;), axis=0) #取axis维数据求和 #tn = tf.sum(tf.cast((1-y_hat)\u0026lt;em\u0026gt;(1-y_true), \u0026#39;float\u0026#39;), axis=0) fp = tf.reduce_sum(tf.cast((1-y_hat)\u0026lt;/em\u0026gt;y_true, \u0026#39;float\u0026#39;), axis=0) fn = tf.reduce_sum(tf.cast(y_hat\u0026lt;em\u0026gt;(1-y_true), \u0026#39;float\u0026#39;), axis=0) p = tp/(tp+fp+epsilon)#epsilon的意义在于防止分母为0，否则当分母为0时python会报错 r = tp/(tp+fn+epsilon) f1 = 2\u0026lt;/em\u0026gt;p*r/(p+r+epsilon) f1 = tf.where(tf.is_nan(f1), tf.zeros_like(f1), f1) if model == \u0026#39;single\u0026#39;: return f1 if model == \u0026#39;multi\u0026#39;: return tf.reduce_mean(f1) 参考 //blog.csdn.net/zjn295771349/article/details/84961596\n//blog.csdn.net/lyb3b3b/article/details/84819931\n//www.jianshu.com/p/30b40b504bae\n","permalink":"https://www.xiaoxiangtao.cn/zh/posts/nlp-classification-effect-measurement-index-f1-p-r/","summary":"\u003ch2 id=\"概念\"\u003e概念\u003c/h2\u003e\n\u003cp\u003e为什么要计算F1：避免样本分布带来的偏差，综合考量分类效果，假如有100个样本，其中1个正样本，99个负样本，如果模型的预测只输出0，那么正确率是99%，这时候用正确率来衡量模型的好坏显然是不对的。\u003c/p\u003e\n\u003cp\u003e真实 1真实 0预测 1True Positive(TP)False Positive(FP)预测 0False Negative(FN)True Negative(TN)\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e查准率(precision)，预测正确的样本在所有预测为1的样本中的比例，该值反映有多少其他类被错误的归为该类。\u003c/li\u003e\n\u003cli\u003e召回率(recall)，预测正确的样本在所有真实为1的样本中的比例，该值反映有多少该类被预测为其他类了。\u003c/li\u003e\n\u003cli\u003eF1(F1-Score)， 精准率和召回率的调和平均数。\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eMicro-F1与Macro-F1\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e针对多标签分类而言衡量分类效果\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eMicro-F1：直接计算所有类别的Precision和Recall，然后计算F1。（类别有权重，分到样本数多的类别有更大的影响力）\u003c/li\u003e\n\u003cli\u003eMacro-F1：计算出每一个类的Precision和Recall并分别计算F1，最后将F1平均。（各类别的F1权重相同）\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"代码实现\"\u003e\u003cstrong\u003e代码实现\u003c/strong\u003e\u003c/h2\u003e\n\u003cp\u003e二分类\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-python\" data-lang=\"python\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003edef\u003c/span\u003e \u003cspan class=\"nf\"\u003ef1\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ey_hat\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003ey_true\u003c/span\u003e\u003cspan class=\"p\"\u003e):\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"s1\"\u003e\u0026#39;\u0026#39;\u0026#39;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s1\"\u003e    输入张量y_hat是输出层经过sigmoid激活的张量\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s1\"\u003e    y_true是label{0,1}的集和\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s1\"\u003e    model指的是如果是多任务分类，single会返回每个分类的f1分数，multi会返回所有类的平均f1分数（Marco-F1）\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s1\"\u003e    如果只是单个二分类任务，则可以忽略model\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s1\"\u003e    \u0026#39;\u0026#39;\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003eepsilon\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mf\"\u003e1e-7\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003ey_hat\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003etf\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eround\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ey_hat\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"c1\"\u003e#将经过sigmoid激活的张量四舍五入变为0，1输出\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"c1\"\u003e#  输入的数据是矩阵，标签为单行矩阵，预测值为单列矩阵，如果不是需要转换\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003etp\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003etf\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ecast\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003etf\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ematmul\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ey_true\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"n\"\u003ey_hat\u003c/span\u003e\u003cspan class=\"p\"\u003e),\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;float\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"c1\"\u003e#tn = tf.sum(tf.cast((1-y_hat)\u0026lt;em\u0026gt;(1-y_true), \u0026#39;float\u0026#39;), axis=0)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003efp\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003etf\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ecast\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003etf\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ematmul\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003ey_true\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"n\"\u003ey_hat\u003c/span\u003e\u003cspan class=\"p\"\u003e),\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;float\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003efn\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003etf\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ecast\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003etf\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ematmul\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ey_true\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003ey_hat\u003c/span\u003e\u003cspan class=\"p\"\u003e),\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;float\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nb\"\u003eprint\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;tp: \u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003etp\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e][\u003c/span\u003e\u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003enumpy\u003c/span\u003e\u003cspan class=\"p\"\u003e(),\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;fp: \u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e  \u003cspan class=\"n\"\u003efp\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e][\u003c/span\u003e\u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003enumpy\u003c/span\u003e\u003cspan class=\"p\"\u003e(),\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;fn: \u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e  \u003cspan class=\"n\"\u003efn\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e][\u003c/span\u003e\u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003enumpy\u003c/span\u003e\u003cspan class=\"p\"\u003e())\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003ep\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003etp\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003etp\u003c/span\u003e\u003cspan class=\"o\"\u003e+\u003c/span\u003e\u003cspan class=\"n\"\u003efp\u003c/span\u003e\u003cspan class=\"o\"\u003e+\u003c/span\u003e\u003cspan class=\"n\"\u003eepsilon\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"c1\"\u003e#epsilon的意义在于防止分母为0，否则当分母为0时python会报错\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003er\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003etp\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003etp\u003c/span\u003e\u003cspan class=\"o\"\u003e+\u003c/span\u003e\u003cspan class=\"n\"\u003efn\u003c/span\u003e\u003cspan class=\"o\"\u003e+\u003c/span\u003e\u003cspan class=\"n\"\u003eepsilon\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003ef1\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e2\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"n\"\u003eem\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003ep\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003eem\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003er\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ep\u003c/span\u003e\u003cspan class=\"o\"\u003e+\u003c/span\u003e\u003cspan class=\"n\"\u003er\u003c/span\u003e\u003cspan class=\"o\"\u003e+\u003c/span\u003e\u003cspan class=\"n\"\u003eepsilon\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003eresult\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"n\"\u003ef1\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e][\u003c/span\u003e\u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003enumpy\u003c/span\u003e\u003cspan class=\"p\"\u003e(),\u003c/span\u003e \u003cspan class=\"n\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e][\u003c/span\u003e\u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003enumpy\u003c/span\u003e\u003cspan class=\"p\"\u003e(),\u003c/span\u003e \u003cspan class=\"n\"\u003er\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e][\u003c/span\u003e\u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003enumpy\u003c/span\u003e\u003cspan class=\"p\"\u003e()]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"n\"\u003eresult\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e\u003cem\u003e多标签\u003c/em\u003e\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eimport tensorflow as tf\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003edef f1(y_hat, y_true, model=\u0026#39;multi\u0026#39;):\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u0026#39;\u0026#39;\u0026#39;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    输入张量y_hat是输出层经过sigmoid激活的张量\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    y_true是label{0,1}的集和\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    model指的是如果是多任务分类，single会返回每个分类的f1分数，multi会返回所有类的平均f1分数（Marco-F1）\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    如果只是单个二分类任务，则可以忽略model\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u0026#39;\u0026#39;\u0026#39;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    epsilon = 1e-7\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    y_hat = tf.round(y_hat)#将经过sigmoid激活的张量四舍五入变为0，1输出\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    #tf.cast()转换张量数据类型\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    tp = tf.reduce_sum(tf.cast(y_hat\u0026lt;/em\u0026gt;y_true, \u0026#39;float\u0026#39;), axis=0) #取axis维数据求和\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    #tn = tf.sum(tf.cast((1-y_hat)\u0026lt;em\u0026gt;(1-y_true), \u0026#39;float\u0026#39;), axis=0)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    fp = tf.reduce_sum(tf.cast((1-y_hat)\u0026lt;/em\u0026gt;y_true, \u0026#39;float\u0026#39;), axis=0)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    fn = tf.reduce_sum(tf.cast(y_hat\u0026lt;em\u0026gt;(1-y_true), \u0026#39;float\u0026#39;), axis=0)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    p = tp/(tp+fp+epsilon)#epsilon的意义在于防止分母为0，否则当分母为0时python会报错\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    r = tp/(tp+fn+epsilon)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    f1 = 2\u0026lt;/em\u0026gt;p*r/(p+r+epsilon)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    f1 = tf.where(tf.is_nan(f1), tf.zeros_like(f1), f1)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    if model == \u0026#39;single\u0026#39;:\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        return f1\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    if model == \u0026#39;multi\u0026#39;:\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        return tf.reduce_mean(f1)\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch2 id=\"参考\"\u003e\u003cstrong\u003e参考\u003c/strong\u003e\u003c/h2\u003e\n\u003cp\u003e\u003ca href=\"//blog.csdn.net/zjn295771349/article/details/84961596\"\u003e//blog.csdn.net/zjn295771349/article/details/84961596\u003c/a\u003e\u003c/p\u003e","title":"NLP分类效果衡量指标(F1/p/r)"},{"content":"概述 multi-label是相较multi-class的概念，有关研究相对较少，multi-label指一个数据可以被分为多个类，一个输入对应多个输出，例如一篇新闻可以被同时打上娱乐、体育等多个类，类的数目也不确定；\n对于multi-label问题的处理，主要看到三种思路：\n当类别之间没有较强的联系时，将multi-label转化为多个二分类问题，对于每个类专门训练一个分类器，然后将多个分类器对同个样本进行分类输出结果达到多标签的效果。 当类别之间有一定联系的时候，将multi-label转化为multi-class问题，比如用二进制编码表示三个类：[\u0026lsquo;人\u0026rsquo;, \u0026lsquo;猫\u0026rsquo;, \u0026lsquo;狗\u0026rsquo;]，0表示不是该类，1表示是，则对于多标签分类可能有[0, 1, 1]的情况比如一张图片上既有猫又有狗，那么我们可以将每一个向量作为一个类别，比如[0, 1, 1]作为一个类，将[1, 0, 1]作为一个类，这样一来我们得到一个23个类，对单一样本输出的结果一定在这个类别空间中，这样就是一个多分类问题了，总共8个类，可以用长度为8的独热编码表示。\n当然对于类别特别多(n个类)的数据集，这时候类别空间就是2n，显然类别太多了运算压力大，可以选择将类别输出的种类限制在训练集数据中存在的类别中，比如[1, 0, 0]在训练集中没有这个输出，就把他从类别中去除，当然这会影响模型的准确程度，因为它不再识别那些被踢出的可能性。 最后一种就是改进算法使其能够直接处理多标签问题，输出多个类。 多标签分类算法 对于神经网络，简单的做法是在最后输出层使用sigmoid激活函数，输出数目为类别数，每个输出都是一个概率，注意输出的多个类别的概率总和不再是1，因为是多标签问题，然后损失函数用binary_crossentrophy，相当于对每个输出分别判断属不属于该类，从而使每一个可能属于的类的概率都趋近1。\n在简单的单层CNN算法的实验上效果并不是很好，确实得到了多输出的结果，但是出现了某个类概率接近1，另一个所属类概率虽然也比较突出但数值偏小，比如0.5左右的样子，同时属于3个或4个类效果就更差些，可以通过修改阈值比如threshold=0.3，大于0.3就算做该类，但改善不明显。应该和数据集不同类对应存在的样本不同有关。\n","permalink":"https://www.xiaoxiangtao.cn/zh/posts/notes-on-multi-label-classification-method/","summary":"\u003ch2 id=\"概述\"\u003e概述\u003c/h2\u003e\n\u003cp\u003emulti-label是相较multi-class的概念，有关研究相对较少，multi-label指一个数据可以被分为多个类，一个输入对应多个输出，例如一篇新闻可以被同时打上娱乐、体育等多个类，类的数目也不确定；\u003c/p\u003e\n\u003cp\u003e对于multi-label问题的处理，主要看到三种思路：\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e当类别之间没有较强的联系时，将multi-label转化为多个二分类问题，对于每个类专门训练一个分类器，然后将多个分类器对同个样本进行分类输出结果达到多标签的效果。\u003c/li\u003e\n\u003cli\u003e当类别之间有一定联系的时候，将multi-label转化为multi-class问题，比如用二进制编码表示三个类：[\u0026lsquo;人\u0026rsquo;, \u0026lsquo;猫\u0026rsquo;, \u0026lsquo;狗\u0026rsquo;]，0表示不是该类，1表示是，则对于多标签分类可能有[0, 1, 1]的情况比如一张图片上既有猫又有狗，那么我们可以将每一个向量作为一个类别，比如[0,  1, 1]作为一个类，将[1, 0, 1]作为一个类，这样一来我们得到一个23个类，对单一样本输出的结果一定在这个类别空间中，这样就是一个多分类问题了，总共8个类，可以用长度为8的独热编码表示。\u003cbr\u003e\n当然对于类别特别多(n个类)的数据集，这时候类别空间就是2n，显然类别太多了运算压力大，可以选择将类别输出的种类限制在训练集数据中存在的类别中，比如[1, 0, 0]在训练集中没有这个输出，就把他从类别中去除，当然这会影响模型的准确程度，因为它不再识别那些被踢出的可能性。\u003c/li\u003e\n\u003cli\u003e最后一种就是改进算法使其能够直接处理多标签问题，输出多个类。\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"多标签分类算法\"\u003e多标签分类算法\u003c/h2\u003e\n\u003cp\u003e对于神经网络，简单的做法是在最后输出层使用sigmoid激活函数，输出数目为类别数，每个输出都是一个概率，注意输出的多个类别的概率总和不再是1，因为是多标签问题，然后损失函数用binary_crossentrophy，相当于对每个输出分别判断属不属于该类，从而使每一个可能属于的类的概率都趋近1。\u003c/p\u003e\n\u003cp\u003e在简单的单层CNN算法的实验上效果并不是很好，确实得到了多输出的结果，但是出现了某个类概率接近1，另一个所属类概率虽然也比较突出但数值偏小，比如0.5左右的样子，同时属于3个或4个类效果就更差些，可以通过修改阈值比如threshold=0.3，大于0.3就算做该类，但改善不明显。应该和数据集不同类对应存在的样本不同有关。\u003c/p\u003e","title":"多标签分类(multi-label)分类方法笔记"},{"content":"NLP一般流程 文本预处理-\u0026gt;词向量与文本表示-\u0026gt;特征选择与特征抽取-\u0026gt;分类算法\n词向量与文本表示 词袋模型（BOW） 将所有词汇放进一个袋子里，假设有n个词，则每个句子表示为一个长度为n的词频向量，词频即对应词在句子里出现的次数，如果没有出现就是0。这种方法句子里的语义信息被完全遗失了。\nword based encodings 另一种思路是表示句子，这样就可以把词在句子中的位置关系考虑进去，例如 “我 喜欢 猫”和 “我 喜欢 狗”分别表示为（0 1 2）和（0 1 3），这里的数字不再是词频，而是对应单词被分配的编码，如果词重复了，显然在数组中对应的数字也会重复。\npadding 句子长度不同时，需要将他们转化为统一长度的向量输入到神经网络中训练，这时就要padding，设置一个长度n，如果句子长度小于n，就在数组左侧或右侧填充0，如果句子长了，就把左侧或右侧多余的部分忽略，具体方位由自己选择。\n词向量模型（word embedding） 考虑词与词之间的位置关系。原本用随机分配的数字代表每一个词，词与词之间是完全独立的，而embedding使得每一个词成为了一个n维空间中的向量，如果两个词的含义相近，那么相应的向量距离也就进，这样就考虑到了词的含义。\nword2Vec ： 底层采用基于CBOW和Skip-Gram算法的神经网络模型。\nCBOW模型：\nCBOW模型的训练输入是某一个特征词的上下文相关的词对应的词向量，而输出就是这特定的一个词的词向量。由于CBOW使用的是词袋模型，因此上下文的几个词都是平等的，也就是不考虑他们和我们关注的词之间的距离大小，只要在我们上下文之内即可。\n这样我们这个CBOW的例子里，我们的输入是上下文选定的词向量，输出是所有词的softmax概率（训练的目标是期望训练样本特定词对应的softmax概率最大），对应的CBOW神经网络模型输入层有4个神经元，输出层有词汇表大小个神经元。隐藏层的神经元个数我们可以自己指定。通过DNN的反向传播算法，我们可以求出DNN模型的参数，同时得到所有的词对应的词向量。这样当我们有新的需求，要求出某4个词对应的最可能的输出中心词时，我们可以通过一次DNN前向传播算法并通过softmax激活函数找到概率最大的词对应的神经元即可。\nSkip-Gram模型：\nSkip-Gram模型和CBOW的思路是反着来的，即输入是特定的一个词的词向量，而输出是特定词对应的上下文词向量。\n这样我们这个Skip-Gram的例子里，我们的输入是特定词， 输出是softmax概率排前几的词，对应的Skip-Gram神经网络模型输入层有1个神经元，输出层有词汇表大小个神经元。隐藏层的神经元个数我们可以自己指定。通过DNN的反向传播算法，我们可以求出DNN模型的参数，同时得到所有的词对应的词向量。这样当我们有新的需求，要求出某1个词对应的最可能的4个上下文词时，我们可以通过一次DNN前向传播算法得到概率大小排前4的softmax概率对应的神经元所对应的词即可。\n词向量模型突出特点：\n在词向量模型中，词向量与词向量之间有这非常特殊的特性。例如现在存在国王、男生、女人、皇后四个词向量，那么一个完善的词向量模型，就存在“国王-男人+女人=皇后”这样的关系。\n参考： 词袋模型（BOW，bag of words）和词向量模型（Word Embedding）概念介绍\n","permalink":"https://www.xiaoxiangtao.cn/zh/posts/understanding-of-related-concepts-of-natural-language/","summary":"\u003ch2 id=\"nlp一般流程\"\u003eNLP一般流程\u003c/h2\u003e\n\u003cp\u003e文本预处理-\u0026gt;词向量与文本表示-\u0026gt;特征选择与特征抽取-\u0026gt;分类算法\u003c/p\u003e\n\u003ch2 id=\"词向量与文本表示\"\u003e词向量与文本表示\u003c/h2\u003e\n\u003ch3 id=\"词袋模型bow\"\u003e词袋模型（BOW）\u003c/h3\u003e\n\u003cp\u003e将所有词汇放进一个袋子里，假设有n个词，则每个句子表示为一个长度为n的词频向量，词频即对应词在句子里出现的次数，如果没有出现就是0。这种方法句子里的语义信息被完全遗失了。\u003c/p\u003e\n\u003ch3 id=\"word-based-encodings\"\u003eword based encodings\u003c/h3\u003e\n\u003cp\u003e另一种思路是表示句子，这样就可以把词在句子中的位置关系考虑进去，例如 “我 喜欢 猫”和 “我 喜欢 狗”分别表示为（0 1 2）和（0 1 3），这里的数字不再是词频，而是对应单词被分配的编码，如果词重复了，显然在数组中对应的数字也会重复。\u003c/p\u003e\n\u003ch3 id=\"padding\"\u003epadding\u003c/h3\u003e\n\u003cp\u003e句子长度不同时，需要将他们转化为统一长度的向量输入到神经网络中训练，这时就要padding，设置一个长度n，如果句子长度小于n，就在数组左侧或右侧填充0，如果句子长了，就把左侧或右侧多余的部分忽略，具体方位由自己选择。\u003c/p\u003e\n\u003ch3 id=\"词向量模型word-embedding\"\u003e词向量模型（word embedding）\u003c/h3\u003e\n\u003cp\u003e考虑词与词之间的位置关系。原本用随机分配的数字代表每一个词，词与词之间是完全独立的，而embedding使得每一个词成为了一个n维空间中的向量，如果两个词的含义相近，那么相应的向量距离也就进，这样就考虑到了词的含义。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eword2Vec ：\u003c/strong\u003e 底层采用基于CBOW和Skip-Gram算法的神经网络模型。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eCBOW模型：\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eCBOW模型的训练输入是某一个特征词的上下文相关的词对应的词向量，而输出就是这特定的一个词的词向量。由于CBOW使用的是词袋模型，因此上下文的几个词都是平等的，也就是不考虑他们和我们关注的词之间的距离大小，只要在我们上下文之内即可。\u003c/p\u003e\n\u003cp\u003e这样我们这个CBOW的例子里，我们的输入是上下文选定的词向量，输出是所有词的softmax概率（训练的目标是期望训练样本特定词对应的softmax概率最大），对应的CBOW神经网络模型输入层有4个神经元，输出层有词汇表大小个神经元。隐藏层的神经元个数我们可以自己指定。通过DNN的反向传播算法，我们可以求出DNN模型的参数，同时得到所有的词对应的词向量。这样当我们有新的需求，要求出某4个词对应的最可能的输出中心词时，我们可以通过一次DNN前向传播算法并通过softmax激活函数找到概率最大的词对应的神经元即可。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eSkip-Gram模型：\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eSkip-Gram模型和CBOW的思路是反着来的，即输入是特定的一个词的词向量，而输出是特定词对应的上下文词向量。\u003c/p\u003e\n\u003cp\u003e这样我们这个Skip-Gram的例子里，我们的输入是特定词， 输出是softmax概率排前几的词，对应的Skip-Gram神经网络模型输入层有1个神经元，输出层有词汇表大小个神经元。隐藏层的神经元个数我们可以自己指定。通过DNN的反向传播算法，我们可以求出DNN模型的参数，同时得到所有的词对应的词向量。这样当我们有新的需求，要求出某1个词对应的最可能的4个上下文词时，我们可以通过一次DNN前向传播算法得到概率大小排前4的softmax概率对应的神经元所对应的词即可。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e词向量模型突出特点：\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e在词向量模型中，词向量与词向量之间有这非常特殊的特性。例如现在存在国王、男生、女人、皇后四个词向量，那么一个完善的词向量模型，就存在“国王-男人+女人=皇后”这样的关系。\u003c/p\u003e\n\u003cp\u003e参考： \u003ca href=\"//www.cnblogs.com/chenyusheng0803/p/10978883.html\"\u003e词袋模型（BOW，bag of words）和词向量模型（Word Embedding）概念介绍\u003c/a\u003e\u003c/p\u003e","title":"Natural Language Processing相关概念理解"},{"content":"csv文件 什么是csv文件 csv既逗号分隔符文件，行数据用\u0026rsquo;,\u0026lsquo;分隔，列数据用换行符\u0026rsquo;\\n\u0026rsquo;分隔\n读取与写入csv文件 with open(filename, \u0026#39;r\u0026#39;, encoding=\u0026#39;gbk\u0026#39;) as rf: reader = csv.reader(rf, dialect=csv.excel) # 按行读取，读取的是存储为excel可读格式的csv文件，这个文件可以用excel打开查看 with open(r\u0026#39;clean_data\\clean_data_0.5_no_repeat.csv\u0026#39;, \u0026#39;w\u0026#39;, encoding=\u0026#39;gbk\u0026#39;, newline=\u0026#39;\u0026#39;) as f: writer = csv.writer(f, dialect=csv.excel, delimiter=\u0026#39;,\u0026#39;) for data in final_dataset: writer.writerow(data) # 按行写入，写入格式也是csv.excel，会把一个二维列表自动存储为表格，行列对应，存储的内容是原封不动的 csv文件存储格式与换行问题 用以上方法读取的csv文件每一行每一列取出的都是字符串\u0026rsquo;str\u0026rsquo;格式，对于字典要用eval()函数自动转回原本对应的格式，而int等也要用对应函数转换\nnewline=\u0026rsquo;\u0026rsquo;\u0026ldquo;设置存储的行与行之间没有空行，否则会隔行存储。\njson格式 json格式文件特点 json格式文本对{对象:值}，例如： {\u0026ldquo;name\u0026rdquo;: \u0026ldquo;John Doe\u0026rdquo;, \u0026ldquo;age\u0026rdquo;: 18, \u0026ldquo;address\u0026rdquo;: {\u0026ldquo;country\u0026rdquo; : \u0026ldquo;china\u0026rdquo;, \u0026ldquo;zip-code\u0026rdquo;: \u0026ldquo;10000\u0026rdquo;}}，和字典有些相似，存储的值可以是字符串，数组，字典等，这个格式好处在于可以存储结构相对复杂的数据并且易于存取。\njson与str，json的读取 在实际操作中似乎直接把json放在列表里就可以和其他数据一样存储到csv文件中，在使用csv.writer方法时，双引号的问题被自动解决了，取出以后和其他数据一样都是str，使用json.loads()方法即可转换为json格式数据，写入的时候可以用同样的方法转换。\n转换后的json格式数据按对象取值的方法与字典相似，即data[\u0026lsquo;对象名\u0026rsquo;]-\u0026gt;值\npython集合、列表、字典 在处理重复数据时（这里指字符串或数值的数据），可以采用集合进行存储，因为集合中元素不能重复，可以很简单的使用set()或list()方法将集合和列表相互转换，因此可以利用集合去重后在转换为list存储。\n要注意的是，创建空的集合要使用a = set()方法，如果是a={}则是一个空的字典。\n当存储集合时如果集合为空会存储一个空集，内容为set()。\n集合增加元素要用add()方法，集合没有列表的append()方法。\n在处理数据时，字典一个很大的用处在于给出的key是有语义的，这提高了代码的可读性，list[1]中的数据是什么我们是不知道的，而dict[\u0026lsquo;key\u0026rsquo;]则很好懂。\ntensorflow输入数据格式转化 constant方法生成张量，tensorflow搭建的算法输入数据都是相应格式的张量，而不是列表，因此如果采用csv.reader读取csv文件而不是tensorflow自带的方法读取csv文件的话，要用对应的tensorflow或者numpy方法将数据转化为张量，通常为[None,*]None为数据量比如有2000条训练文本，None就是2000，后面的就是处理后的数据格式，比如设置的padding，maxlen=500的embedding size=12后的文本数据，格式就是[None,500,12]，label数据格式也要与之相对应。\ntensorflow自带的读取csv文件的方法可以直接得到tensor格式的数据，但是由于我要处理的csv文件是文本文件并且包含json，这个时候还是先用csv的方法处理完比较好。\n","permalink":"https://www.xiaoxiangtao.cn/zh/posts/nlp-data-preparation-related-code-record/","summary":"\u003ch2 id=\"csv文件\"\u003ecsv文件\u003c/h2\u003e\n\u003ch3 id=\"什么是csv文件\"\u003e什么是csv文件\u003c/h3\u003e\n\u003cp\u003ecsv既逗号分隔符文件，行数据用\u0026rsquo;,\u0026lsquo;分隔，列数据用换行符\u0026rsquo;\\n\u0026rsquo;分隔\u003c/p\u003e\n\u003ch3 id=\"读取与写入csv文件\"\u003e读取与写入csv文件\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-python\" data-lang=\"python\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003ewith\u003c/span\u003e \u003cspan class=\"nb\"\u003eopen\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003efilename\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;r\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eencoding\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;gbk\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"k\"\u003eas\u003c/span\u003e \u003cspan class=\"n\"\u003erf\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003ereader\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003ecsv\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ereader\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003erf\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003edialect\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"n\"\u003ecsv\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eexcel\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e#  按行读取，读取的是存储为excel可读格式的csv文件，这个文件可以用excel打开查看\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-python\" data-lang=\"python\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003ewith\u003c/span\u003e \u003cspan class=\"nb\"\u003eopen\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"sa\"\u003er\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;clean_data\\clean_data_0.5_no_repeat.csv\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;w\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eencoding\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;gbk\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003enewline\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"k\"\u003eas\u003c/span\u003e \u003cspan class=\"n\"\u003ef\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003ewriter\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003ecsv\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ewriter\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ef\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003edialect\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"n\"\u003ecsv\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eexcel\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003edelimiter\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;,\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003efor\u003c/span\u003e \u003cspan class=\"n\"\u003edata\u003c/span\u003e \u003cspan class=\"ow\"\u003ein\u003c/span\u003e \u003cspan class=\"n\"\u003efinal_dataset\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003ewriter\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ewriterow\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003edata\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e#    按行写入，写入格式也是csv.excel，会把一个二维列表自动存储为表格，行列对应，存储的内容是原封不动的\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"csv文件存储格式与换行问题\"\u003ecsv文件存储格式与换行问题\u003c/h3\u003e\n\u003cp\u003e用以上方法读取的csv文件每一行每一列取出的都是字符串\u0026rsquo;str\u0026rsquo;格式，对于字典要用eval()函数自动转回原本对应的格式，而int等也要用对应函数转换\u003c/p\u003e\n\u003cp\u003enewline=\u0026rsquo;\u0026rsquo;\u0026ldquo;设置存储的行与行之间没有空行，否则会隔行存储。\u003c/p\u003e\n\u003ch2 id=\"json格式\"\u003ejson格式\u003c/h2\u003e\n\u003ch3 id=\"json格式文件特点\"\u003ejson格式文件特点\u003c/h3\u003e\n\u003cp\u003ejson格式文本对{对象:值}，例如： {\u0026ldquo;name\u0026rdquo;: \u0026ldquo;John Doe\u0026rdquo;, \u0026ldquo;age\u0026rdquo;: 18, \u0026ldquo;address\u0026rdquo;: {\u0026ldquo;country\u0026rdquo; : \u0026ldquo;china\u0026rdquo;, \u0026ldquo;zip-code\u0026rdquo;: \u0026ldquo;10000\u0026rdquo;}}，和字典有些相似，存储的值可以是字符串，数组，字典等，这个格式好处在于可以存储结构相对复杂的数据并且易于存取。\u003c/p\u003e\n\u003ch3 id=\"json与strjson的读取\"\u003ejson与str，json的读取\u003c/h3\u003e\n\u003cp\u003e在实际操作中似乎直接把json放在列表里就可以和其他数据一样存储到csv文件中，在使用csv.writer方法时，双引号的问题被自动解决了，取出以后和其他数据一样都是str，使用json.loads()方法即可转换为json格式数据，写入的时候可以用同样的方法转换。\u003c/p\u003e\n\u003cp\u003e转换后的json格式数据按对象取值的方法与字典相似，即data[\u0026lsquo;对象名\u0026rsquo;]-\u0026gt;值\u003c/p\u003e\n\u003ch2 id=\"python集合列表字典\"\u003epython集合、列表、字典\u003c/h2\u003e\n\u003cp\u003e在处理重复数据时（这里指字符串或数值的数据），可以采用集合进行存储，因为集合中元素不能重复，可以很简单的使用set()或list()方法将集合和列表相互转换，因此可以利用集合去重后在转换为list存储。\u003c/p\u003e\n\u003cp\u003e要注意的是，创建空的集合要使用a = set()方法，如果是a={}则是一个空的字典。\u003c/p\u003e\n\u003cp\u003e当存储集合时如果集合为空会存储一个空集，内容为set()。\u003c/p\u003e\n\u003cp\u003e集合增加元素要用add()方法，集合没有列表的append()方法。\u003c/p\u003e\n\u003cp\u003e在处理数据时，字典一个很大的用处在于给出的key是有语义的，这提高了代码的可读性，list[1]中的数据是什么我们是不知道的，而dict[\u0026lsquo;key\u0026rsquo;]则很好懂。\u003c/p\u003e\n\u003ch2 id=\"tensorflow输入数据格式转化\"\u003etensorflow输入数据格式转化\u003c/h2\u003e\n\u003cp\u003econstant方法生成张量，tensorflow搭建的算法输入数据都是相应格式的张量，而不是列表，因此如果采用csv.reader读取csv文件而不是tensorflow自带的方法读取csv文件的话，要用对应的tensorflow或者numpy方法将数据转化为张量，通常为[None,*]None为数据量比如有2000条训练文本，None就是2000，后面的就是处理后的数据格式，比如设置的padding，maxlen=500的embedding size=12后的文本数据，格式就是[None,500,12]，label数据格式也要与之相对应。\u003c/p\u003e\n\u003cp\u003etensorflow自带的读取csv文件的方法可以直接得到tensor格式的数据，但是由于我要处理的csv文件是文本文件并且包含json，这个时候还是先用csv的方法处理完比较好。\u003c/p\u003e","title":"NLP数据准备相关代码记录"},{"content":"看网课视频老师讲的一些，实际上官方文档有非常详细的介绍\nimport numpy as np import tensorflow as tf # tf基础api：常量 t = tf.constant([[1., 2., 3.], [4., 5., 6.]]) # index索引操作 print(t) print(t[:, 1:]) print(t[..., 1]) #%% # ops算数操作 print(t+10) print(tf.square(t)) print(t @ tf.transpose(t)) # 乘转置 #%% # numpy conversion print(t.numpy()) print(np.square(t)) np_t = np.array([[1., 2., 3.], [4., 5., 6.]]) print(tf.constant(np_t)) #%% # Scalars tensor可以使0维、1维... t = tf.constant(2.718) print(t.numpy()) print(t.shape) #%% # strings t = tf.constant(\u0026#39;cafe\u0026#39;) print(t) print(tf.strings.length(t)) print(tf.strings.length(t, unit=\u0026#39;UTF8_CHAR\u0026#39;)) print(tf.strings.unicode_decode(t, \u0026#39;UTF8\u0026#39;)) #%% # string array t = tf.constant([\u0026#39;cafe\u0026#39;, \u0026#39;coffee\u0026#39;, \u0026#39;咖啡\u0026#39;]) print(tf.strings.length(t, unit=\u0026#39;UTF8_CHAR\u0026#39;)) r = tf.strings.unicode_decode(t, \u0026#39;UTF8\u0026#39;) print(r) #%% # ragged tensor r = tf.ragged.constant([[11, 12], [21, 22, 23], [], [41]]) # index op print(r) print(r[1]) print(r[1:2]) #%% # ops on ragged tensor r2 = tf.ragged.constant([[51, 52], [], [71]]) print(tf.concat([r, r2], axis=0)) r3 = tf.ragged.constant([[13, 14], [15], [], [41, 42, 43]]) print(tf.concat([r, r3], axis=1)) # ragged tensor 变成 普通tensor 空位用0补齐，注意0永远在正常值的后面 print(r.to_tensor()) #%% # sparse tensor 0可以在正常值前面 s = tf.SparseTensor(indices=[[0, 1], [1, 0], [2, 3]], values=[1., 2., 3.], dense_shape=[3, 4]) print(s) print(tf.sparse.to_dense(s)) # 稀疏矩阵转密集矩阵，这样的稀疏矩阵不能用ragged tensor来表示 #%% # ops on sparse tensors s2 = s * 2.0 print(s2) try: s3 = s + 1 except TypeError as ex: print(ex) s4 = tf.constant([[10., 20.], [30., 40.], [50., 60.], [70., 80.]]) print(tf.sparse.sparse_dense_matmul(s, s4)) #%% s5 = tf.SparseTensor(indices=[[0, 2], [0, 1], [2, 3]], # 没有排好序的稀疏矩阵无法被转换为密集矩阵 values=[1., 2., 3.], dense_shape=[3, 4]) print(s5) s6 = tf.sparse.reorder(s5) # 对s5进行排序 print(tf.sparse.to_dense(s6)) #%% # Variable 变量 v = tf.Variable([[1., 2., 3.], [4., 5., 6.]]) print(v) print(v.value()) print(v.numpy()) #%% # assign value 变量重新赋值 v.assign(2*v) print(v.numpy()) v[0, 1].assign(42) print(v.numpy()) v[1].assign([7., 8., 9.]) print(v.numpy()) #%% # 不能用=号，只能用assign()重新赋值 try: v[1] = [7., 8., 9.] except TypeError as ex: print(ex) # \u0026#39;ResourceVariable\u0026#39; object does not support item assignment ","permalink":"https://www.xiaoxiangtao.cn/zh/posts/tensorflow-basic-api/","summary":"\u003cp\u003e看网课视频老师讲的一些，实际上官方文档有非常详细的介绍\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-python\" data-lang=\"python\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kn\"\u003eimport\u003c/span\u003e \u003cspan class=\"nn\"\u003enumpy\u003c/span\u003e \u003cspan class=\"k\"\u003eas\u003c/span\u003e \u003cspan class=\"nn\"\u003enp\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kn\"\u003eimport\u003c/span\u003e \u003cspan class=\"nn\"\u003etensorflow\u003c/span\u003e \u003cspan class=\"k\"\u003eas\u003c/span\u003e \u003cspan class=\"nn\"\u003etf\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# tf基础api：常量\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003et\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003etf\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003econstant\u003c/span\u003e\u003cspan class=\"p\"\u003e([[\u003c/span\u003e\u003cspan class=\"mf\"\u003e1.\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"mf\"\u003e2.\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"mf\"\u003e3.\u003c/span\u003e\u003cspan class=\"p\"\u003e],\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"mf\"\u003e4.\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"mf\"\u003e5.\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"mf\"\u003e6.\u003c/span\u003e\u003cspan class=\"p\"\u003e]])\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# index索引操作\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eprint\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003et\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eprint\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003et\u003c/span\u003e\u003cspan class=\"p\"\u003e[:,\u003c/span\u003e \u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e:])\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eprint\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003et\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"o\"\u003e...\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e])\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e#%%\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# ops算数操作\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eprint\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003et\u003c/span\u003e\u003cspan class=\"o\"\u003e+\u003c/span\u003e\u003cspan class=\"mi\"\u003e10\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eprint\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003etf\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003esquare\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003et\u003c/span\u003e\u003cspan class=\"p\"\u003e))\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eprint\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003et\u003c/span\u003e \u003cspan class=\"o\"\u003e@\u003c/span\u003e \u003cspan class=\"n\"\u003etf\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003etranspose\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003et\u003c/span\u003e\u003cspan class=\"p\"\u003e))\u003c/span\u003e  \u003cspan class=\"c1\"\u003e# 乘转置\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e#%%\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# numpy conversion\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eprint\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003et\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003enumpy\u003c/span\u003e\u003cspan class=\"p\"\u003e())\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eprint\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003enp\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003esquare\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003et\u003c/span\u003e\u003cspan class=\"p\"\u003e))\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003enp_t\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003enp\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003earray\u003c/span\u003e\u003cspan class=\"p\"\u003e([[\u003c/span\u003e\u003cspan class=\"mf\"\u003e1.\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"mf\"\u003e2.\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"mf\"\u003e3.\u003c/span\u003e\u003cspan class=\"p\"\u003e],\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"mf\"\u003e4.\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"mf\"\u003e5.\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"mf\"\u003e6.\u003c/span\u003e\u003cspan class=\"p\"\u003e]])\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eprint\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003etf\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003econstant\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003enp_t\u003c/span\u003e\u003cspan class=\"p\"\u003e))\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e#%%\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Scalars tensor可以使0维、1维...\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003et\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003etf\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003econstant\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"mf\"\u003e2.718\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eprint\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003et\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003enumpy\u003c/span\u003e\u003cspan class=\"p\"\u003e())\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eprint\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003et\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eshape\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e#%%\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# strings\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003et\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003etf\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003econstant\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;cafe\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eprint\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003et\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eprint\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003etf\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003estrings\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003elength\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003et\u003c/span\u003e\u003cspan class=\"p\"\u003e))\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eprint\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003etf\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003estrings\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003elength\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003et\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eunit\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;UTF8_CHAR\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e))\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eprint\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003etf\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003estrings\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eunicode_decode\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003et\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;UTF8\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e))\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e#%%\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# string array\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003et\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003etf\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003econstant\u003c/span\u003e\u003cspan class=\"p\"\u003e([\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;cafe\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;coffee\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;咖啡\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e])\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eprint\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003etf\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003estrings\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003elength\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003et\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eunit\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;UTF8_CHAR\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e))\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003er\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003etf\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003estrings\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eunicode_decode\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003et\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;UTF8\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eprint\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003er\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e#%%\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# ragged tensor\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003er\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003etf\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eragged\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003econstant\u003c/span\u003e\u003cspan class=\"p\"\u003e([[\u003c/span\u003e\u003cspan class=\"mi\"\u003e11\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"mi\"\u003e12\u003c/span\u003e\u003cspan class=\"p\"\u003e],\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"mi\"\u003e21\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"mi\"\u003e22\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"mi\"\u003e23\u003c/span\u003e\u003cspan class=\"p\"\u003e],\u003c/span\u003e \u003cspan class=\"p\"\u003e[],\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"mi\"\u003e41\u003c/span\u003e\u003cspan class=\"p\"\u003e]])\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# index op\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eprint\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003er\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eprint\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003er\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e])\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eprint\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003er\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"mi\"\u003e2\u003c/span\u003e\u003cspan class=\"p\"\u003e])\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e#%%\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# ops on ragged tensor\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003er2\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003etf\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eragged\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003econstant\u003c/span\u003e\u003cspan class=\"p\"\u003e([[\u003c/span\u003e\u003cspan class=\"mi\"\u003e51\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"mi\"\u003e52\u003c/span\u003e\u003cspan class=\"p\"\u003e],\u003c/span\u003e \u003cspan class=\"p\"\u003e[],\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"mi\"\u003e71\u003c/span\u003e\u003cspan class=\"p\"\u003e]])\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eprint\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003etf\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003econcat\u003c/span\u003e\u003cspan class=\"p\"\u003e([\u003c/span\u003e\u003cspan class=\"n\"\u003er\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003er2\u003c/span\u003e\u003cspan class=\"p\"\u003e],\u003c/span\u003e \u003cspan class=\"n\"\u003eaxis\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e))\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003er3\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003etf\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eragged\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003econstant\u003c/span\u003e\u003cspan class=\"p\"\u003e([[\u003c/span\u003e\u003cspan class=\"mi\"\u003e13\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"mi\"\u003e14\u003c/span\u003e\u003cspan class=\"p\"\u003e],\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"mi\"\u003e15\u003c/span\u003e\u003cspan class=\"p\"\u003e],\u003c/span\u003e \u003cspan class=\"p\"\u003e[],\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"mi\"\u003e41\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"mi\"\u003e42\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"mi\"\u003e43\u003c/span\u003e\u003cspan class=\"p\"\u003e]])\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eprint\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003etf\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003econcat\u003c/span\u003e\u003cspan class=\"p\"\u003e([\u003c/span\u003e\u003cspan class=\"n\"\u003er\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003er3\u003c/span\u003e\u003cspan class=\"p\"\u003e],\u003c/span\u003e \u003cspan class=\"n\"\u003eaxis\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e))\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# ragged tensor 变成 普通tensor 空位用0补齐，注意0永远在正常值的后面\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eprint\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003er\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eto_tensor\u003c/span\u003e\u003cspan class=\"p\"\u003e())\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e#%%\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# sparse tensor 0可以在正常值前面\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003es\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003etf\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eSparseTensor\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eindices\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e],\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e],\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"mi\"\u003e2\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"mi\"\u003e3\u003c/span\u003e\u003cspan class=\"p\"\u003e]],\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"n\"\u003evalues\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"mf\"\u003e1.\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"mf\"\u003e2.\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"mf\"\u003e3.\u003c/span\u003e\u003cspan class=\"p\"\u003e],\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"n\"\u003edense_shape\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"mi\"\u003e3\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"mi\"\u003e4\u003c/span\u003e\u003cspan class=\"p\"\u003e])\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eprint\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003es\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eprint\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003etf\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003esparse\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eto_dense\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003es\u003c/span\u003e\u003cspan class=\"p\"\u003e))\u003c/span\u003e  \u003cspan class=\"c1\"\u003e# 稀疏矩阵转密集矩阵，这样的稀疏矩阵不能用ragged tensor来表示\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e#%%\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# ops on sparse tensors\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003es2\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003es\u003c/span\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"mf\"\u003e2.0\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eprint\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003es2\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003etry\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003es3\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003es\u003c/span\u003e \u003cspan class=\"o\"\u003e+\u003c/span\u003e \u003cspan class=\"mi\"\u003e1\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eexcept\u003c/span\u003e \u003cspan class=\"ne\"\u003eTypeError\u003c/span\u003e \u003cspan class=\"k\"\u003eas\u003c/span\u003e \u003cspan class=\"n\"\u003eex\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nb\"\u003eprint\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eex\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003es4\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003etf\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003econstant\u003c/span\u003e\u003cspan class=\"p\"\u003e([[\u003c/span\u003e\u003cspan class=\"mf\"\u003e10.\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"mf\"\u003e20.\u003c/span\u003e\u003cspan class=\"p\"\u003e],\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                  \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"mf\"\u003e30.\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"mf\"\u003e40.\u003c/span\u003e\u003cspan class=\"p\"\u003e],\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                  \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"mf\"\u003e50.\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"mf\"\u003e60.\u003c/span\u003e\u003cspan class=\"p\"\u003e],\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                  \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"mf\"\u003e70.\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"mf\"\u003e80.\u003c/span\u003e\u003cspan class=\"p\"\u003e]])\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eprint\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003etf\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003esparse\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003esparse_dense_matmul\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003es\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003es4\u003c/span\u003e\u003cspan class=\"p\"\u003e))\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e#%%\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003es5\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003etf\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eSparseTensor\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eindices\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"p\"\u003e[[\u003c/span\u003e\u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"mi\"\u003e2\u003c/span\u003e\u003cspan class=\"p\"\u003e],\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e],\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"mi\"\u003e2\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"mi\"\u003e3\u003c/span\u003e\u003cspan class=\"p\"\u003e]],\u003c/span\u003e  \u003cspan class=\"c1\"\u003e# 没有排好序的稀疏矩阵无法被转换为密集矩阵\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"n\"\u003evalues\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"mf\"\u003e1.\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"mf\"\u003e2.\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"mf\"\u003e3.\u003c/span\u003e\u003cspan class=\"p\"\u003e],\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"n\"\u003edense_shape\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"mi\"\u003e3\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"mi\"\u003e4\u003c/span\u003e\u003cspan class=\"p\"\u003e])\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eprint\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003es5\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003es6\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003etf\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003esparse\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ereorder\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003es5\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e  \u003cspan class=\"c1\"\u003e# 对s5进行排序\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eprint\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003etf\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003esparse\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eto_dense\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003es6\u003c/span\u003e\u003cspan class=\"p\"\u003e))\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e#%%\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Variable 变量\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003ev\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003etf\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eVariable\u003c/span\u003e\u003cspan class=\"p\"\u003e([[\u003c/span\u003e\u003cspan class=\"mf\"\u003e1.\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"mf\"\u003e2.\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"mf\"\u003e3.\u003c/span\u003e\u003cspan class=\"p\"\u003e],\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"mf\"\u003e4.\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"mf\"\u003e5.\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"mf\"\u003e6.\u003c/span\u003e\u003cspan class=\"p\"\u003e]])\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eprint\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ev\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eprint\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ev\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003evalue\u003c/span\u003e\u003cspan class=\"p\"\u003e())\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eprint\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ev\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003enumpy\u003c/span\u003e\u003cspan class=\"p\"\u003e())\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e#%%\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# assign value 变量重新赋值\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003ev\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eassign\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"mi\"\u003e2\u003c/span\u003e\u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"n\"\u003ev\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eprint\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ev\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003enumpy\u003c/span\u003e\u003cspan class=\"p\"\u003e())\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003ev\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eassign\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"mi\"\u003e42\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eprint\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ev\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003enumpy\u003c/span\u003e\u003cspan class=\"p\"\u003e())\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003ev\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eassign\u003c/span\u003e\u003cspan class=\"p\"\u003e([\u003c/span\u003e\u003cspan class=\"mf\"\u003e7.\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"mf\"\u003e8.\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"mf\"\u003e9.\u003c/span\u003e\u003cspan class=\"p\"\u003e])\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eprint\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ev\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003enumpy\u003c/span\u003e\u003cspan class=\"p\"\u003e())\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e#%%\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# 不能用=号，只能用assign()重新赋值\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003etry\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003ev\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"mf\"\u003e7.\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"mf\"\u003e8.\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"mf\"\u003e9.\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eexcept\u003c/span\u003e \u003cspan class=\"ne\"\u003eTypeError\u003c/span\u003e \u003cspan class=\"k\"\u003eas\u003c/span\u003e \u003cspan class=\"n\"\u003eex\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nb\"\u003eprint\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eex\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# \u0026#39;ResourceVariable\u0026#39; object does not support item assignment\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e","title":"TensorFlow基础API"},{"content":"一、理论 卷积神经网络结构：（卷积层+（可选）池化层）*N+全连接层*M（M\u0026gt;=0），卷积层的输入输出是矩阵，全连接层输入输出是向量，在卷积层的最后一层做一个展平。\n主要用于分类任务\n全卷积神经网络：（卷积层+（可选）池化层）*N+反卷积层*K，可以做物体分割类任务\n卷积操作 解决参数过多导致的计算资源不足，容易过拟合的问题。解决方法：局部连接（基于图像的区域性）、参数共享（基于图像特征与位置无关）\n卷积核是反向传播计算出的参数，卷积：卷积核与输入做点积乘法。步长：卷积核每次在输入上滑动的距离。padding：使输出size不变。\n池化操作 类似卷积，计算方式不同，最大值池化：池化核滑动覆盖区域的最大值作为结果输出。\n特点：常使用不重叠（kernal-size=步长）、不补零的操作。参数即为步长和池化核大小。用于减少图像尺寸，从而减少计算量。一定程度平移鲁棒。损失了空间精度。\n二、实现 embedding_dim = 16 batch_size = 128 cnn_model = keras.models.Sequential([ keras.layers.Embedding(vocab_size, embedding_dim, input_length=max_length), keras.layers.Conv1D(filters=256,kernel_size=2,kernel_initializer=\u0026#39;he_normal\u0026#39;, strides=1,padding=\u0026#39;SAME\u0026#39;,activation=\u0026#39;relu\u0026#39;), keras.layers.GlobalMaxPooling1D(), keras.layers.Dropout(rate=0.5), keras.layers.Dense(12, activation=\u0026#39;sigmoid\u0026#39;) ]) cnn_model.summary() cnn_model.compile(optimizer=\u0026#39;adam\u0026#39;, loss=\u0026#39;binary_crossentropy\u0026#39;, metrics=[\u0026#39;accuracy\u0026#39;]) Conv1D 在文本中，卷积的某一维大小往往为embedding长度，即在宽度上不需要窗口移动，宽度就是整个窗口，所以conv1d默认卷积的宽度就为embedding维度，长度通过kernel_size来指定的，此处为2，即卷积核的大小为2*embedding_size。strides为步长，此处为1，即卷积核每隔一个单词移动一次。filters是卷积核的个数，即输出的维度。padding有valid和same两种选择，valid在长度方向（宽度方向不padding）不进行padding，而same则在长度方向进行padding，保证输入句子长度和卷积后输出的句子长度一致。\n//blog.csdn.net/bobobe/article/details/87923618\ntensorflow fit()方法：参考\n//blog.csdn.net/crazyman2010/article/details/103705318\nTextCNN //blog.csdn.net/u014732537/article/details/79573174\n","permalink":"https://www.xiaoxiangtao.cn/zh/posts/theory-and-implementation-of-convolutional-neural-network/","summary":"\u003ch2 id=\"一理论\"\u003e一、理论\u003c/h2\u003e\n\u003cp\u003e卷积神经网络结构：（卷积层+（可选）池化层）*N+全连接层*M（M\u0026gt;=0），卷积层的输入输出是矩阵，全连接层输入输出是向量，在卷积层的最后一层做一个展平。\u003c/p\u003e\n\u003cp\u003e主要用于分类任务\u003c/p\u003e\n\u003cp\u003e全卷积神经网络：（卷积层+（可选）池化层）*N+反卷积层*K，可以做物体分割类任务\u003c/p\u003e\n\u003ch3 id=\"卷积操作\"\u003e卷积操作\u003c/h3\u003e\n\u003cp\u003e解决参数过多导致的计算资源不足，容易过拟合的问题。解决方法：局部连接（基于图像的区域性）、参数共享（基于图像特征与位置无关）\u003c/p\u003e\n\u003cp\u003e卷积核是反向传播计算出的参数，卷积：卷积核与输入做点积乘法。步长：卷积核每次在输入上滑动的距离。padding：使输出size不变。\u003c/p\u003e\n\u003ch3 id=\"池化操作\"\u003e池化操作\u003c/h3\u003e\n\u003cp\u003e类似卷积，计算方式不同，最大值池化：池化核滑动覆盖区域的最大值作为结果输出。\u003c/p\u003e\n\u003cp\u003e特点：常使用不重叠（kernal-size=步长）、不补零的操作。参数即为步长和池化核大小。用于减少图像尺寸，从而减少计算量。一定程度平移鲁棒。损失了空间精度。\u003c/p\u003e\n\u003ch2 id=\"二实现\"\u003e二、实现\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-python\" data-lang=\"python\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eembedding_dim\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e16\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003ebatch_size\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e128\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003ecnn_model\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003ekeras\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003emodels\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eSequential\u003c/span\u003e\u003cspan class=\"p\"\u003e([\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003ekeras\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003elayers\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eEmbedding\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003evocab_size\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                               \u003cspan class=\"n\"\u003eembedding_dim\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"n\"\u003einput_length\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"n\"\u003emax_length\u003c/span\u003e\u003cspan class=\"p\"\u003e),\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003ekeras\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003elayers\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eConv1D\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003efilters\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"mi\"\u003e256\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"n\"\u003ekernel_size\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"mi\"\u003e2\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"n\"\u003ekernel_initializer\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;he_normal\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e              \u003cspan class=\"n\"\u003estrides\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"n\"\u003epadding\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;SAME\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"n\"\u003eactivation\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;relu\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e),\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003ekeras\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003elayers\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eGlobalMaxPooling1D\u003c/span\u003e\u003cspan class=\"p\"\u003e(),\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003ekeras\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003elayers\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eDropout\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003erate\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"mf\"\u003e0.5\u003c/span\u003e\u003cspan class=\"p\"\u003e),\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003ekeras\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003elayers\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eDense\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"mi\"\u003e12\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eactivation\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;sigmoid\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e])\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003ecnn_model\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003esummary\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003ecnn_model\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ecompile\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eoptimizer\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;adam\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eloss\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;binary_crossentropy\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003emetrics\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;accuracy\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e])\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"conv1d\"\u003eConv1D\u003c/h3\u003e\n\u003cp\u003e在文本中，卷积的某一维大小往往为embedding长度，即在宽度上不需要窗口移动，宽度就是整个窗口，所以conv1d默认卷积的宽度就为embedding维度，长度通过kernel_size来指定的，此处为2，即卷积核的大小为2*embedding_size。strides为步长，此处为1，即卷积核每隔一个单词移动一次。filters是卷积核的个数，即输出的维度。padding有valid和same两种选择，valid在长度方向（宽度方向不padding）不进行padding，而same则在长度方向进行padding，保证输入句子长度和卷积后输出的句子长度一致。\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e\u003ca href=\"//blog.csdn.net/bobobe/article/details/87923618\"\u003e//blog.csdn.net/bobobe/article/details/87923618\u003c/a\u003e\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003etensorflow fit()方法：参考\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e\u003ca href=\"//blog.csdn.net/crazyman2010/article/details/103705318\"\u003e//blog.csdn.net/crazyman2010/article/details/103705318\u003c/a\u003e\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003ch3 id=\"textcnn\"\u003eTextCNN\u003c/h3\u003e\n\u003cblockquote\u003e\n\u003cp\u003e\u003ca href=\"//blog.csdn.net/u014732537/article/details/79573174\"\u003e//blog.csdn.net/u014732537/article/details/79573174\u003c/a\u003e\u003c/p\u003e\n\u003c/blockquote\u003e","title":"卷积神经网络(CNN)理论与实现"},{"content":"from __future__ import absolute_import, division, print_function, unicode_literals import tensorflow as tf mnist = tf.keras.datasets.mnist (x_train, y_train), (x_test, y_test) = mnist.load_data() # 加载数据 x_train, x_test = x_train / 255.0, x_test / 255.0 # /255：将RGB数值归一化 #%% print(y_train.shape) #%% model = tf.keras.models.Sequential([ tf.keras.layers.Flatten(input_shape=(28, 28)), # 张量扁平化，将28*28的图片矩阵转化为784的向量 tf.keras.layers.Dense(128, activation=\u0026#39;relu\u0026#39;), # 全连接层，128个神经元，激活函数为relu（The Rectified Linear Unit） # y=max(0,x) tf.keras.layers.Dropout(0.2), # 防止过拟合，drop out 80% of inputs，使用0.2*cell_size个神经元进行训练 tf.keras.layers.Dense(10, activation=\u0026#39;softmax\u0026#39;) # 全连接层输出 softmax激活函数 ]) model.compile(optimizer=\u0026#39;adam\u0026#39;, # 梯度下降策略 adam loss=\u0026#39;sparse_categorical_crossentropy\u0026#39;, # 损失函数 sparse:y独热化编码 交叉熵 metrics=[\u0026#39;accuracy\u0026#39;]) # metrics 列表，包含评估模型在训练和测试时的性能的指标，典型用法是metrics=[‘accuracy’]。 # 如果要在多输出模型中为不同的输出指定不同的指标，可向该参数传递一个字典，例如metrics={‘output_a’: ‘accuracy’} model.fit(x_train, y_train, epochs=5) # 训练5轮 model.evaluate(x_test, y_test, verbose=1) # Verbosity mode. 0 = silent, 1 = progress bar. # fit()用于使用给定输入训练模型. # evaluate()用于评估已经训练过的模型.返回损失值\u0026amp;模型的度量值. ","permalink":"https://www.xiaoxiangtao.cn/zh/posts/mnist-handwritten-digit-recognition-practice/","summary":"\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-python\" data-lang=\"python\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kn\"\u003efrom\u003c/span\u003e \u003cspan class=\"nn\"\u003e__future__\u003c/span\u003e \u003cspan class=\"kn\"\u003eimport\u003c/span\u003e \u003cspan class=\"n\"\u003eabsolute_import\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003edivision\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eprint_function\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eunicode_literals\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kn\"\u003eimport\u003c/span\u003e \u003cspan class=\"nn\"\u003etensorflow\u003c/span\u003e \u003cspan class=\"k\"\u003eas\u003c/span\u003e \u003cspan class=\"nn\"\u003etf\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003emnist\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003etf\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ekeras\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003edatasets\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003emnist\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ex_train\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003ey_train\u003c/span\u003e\u003cspan class=\"p\"\u003e),\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ex_test\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003ey_test\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003emnist\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eload_data\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# 加载数据\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003ex_train\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003ex_test\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003ex_train\u003c/span\u003e \u003cspan class=\"o\"\u003e/\u003c/span\u003e \u003cspan class=\"mf\"\u003e255.0\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003ex_test\u003c/span\u003e \u003cspan class=\"o\"\u003e/\u003c/span\u003e \u003cspan class=\"mf\"\u003e255.0\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# /255：将RGB数值归一化\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e#%%\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eprint\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ey_train\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eshape\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e#%%\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003emodel\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003etf\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ekeras\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003emodels\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eSequential\u003c/span\u003e\u003cspan class=\"p\"\u003e([\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"n\"\u003etf\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ekeras\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003elayers\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eFlatten\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003einput_shape\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"mi\"\u003e28\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"mi\"\u003e28\u003c/span\u003e\u003cspan class=\"p\"\u003e)),\u003c/span\u003e  \u003cspan class=\"c1\"\u003e# 张量扁平化，将28*28的图片矩阵转化为784的向量\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"n\"\u003etf\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ekeras\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003elayers\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eDense\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"mi\"\u003e128\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eactivation\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;relu\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e),\u003c/span\u003e  \u003cspan class=\"c1\"\u003e# 全连接层，128个神经元，激活函数为relu（The Rectified Linear Unit）\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"c1\"\u003e# y=max(0,x)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"n\"\u003etf\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ekeras\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003elayers\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eDropout\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"mf\"\u003e0.2\u003c/span\u003e\u003cspan class=\"p\"\u003e),\u003c/span\u003e  \u003cspan class=\"c1\"\u003e# 防止过拟合，drop out 80% of inputs，使用0.2*cell_size个神经元进行训练\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"n\"\u003etf\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ekeras\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003elayers\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eDense\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"mi\"\u003e10\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eactivation\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;softmax\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e  \u003cspan class=\"c1\"\u003e# 全连接层输出 softmax激活函数\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e])\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003emodel\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ecompile\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eoptimizer\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;adam\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e  \u003cspan class=\"c1\"\u003e# 梯度下降策略 adam\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e              \u003cspan class=\"n\"\u003eloss\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;sparse_categorical_crossentropy\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e  \u003cspan class=\"c1\"\u003e# 损失函数 sparse:y独热化编码 交叉熵\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e              \u003cspan class=\"n\"\u003emetrics\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;accuracy\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e])\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# metrics 列表，包含评估模型在训练和测试时的性能的指标，典型用法是metrics=[‘accuracy’]。\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# 如果要在多输出模型中为不同的输出指定不同的指标，可向该参数传递一个字典，例如metrics={‘output_a’: ‘accuracy’}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003emodel\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003efit\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ex_train\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003ey_train\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eepochs\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"mi\"\u003e5\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e  \u003cspan class=\"c1\"\u003e# 训练5轮\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003emodel\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eevaluate\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ex_test\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e  \u003cspan class=\"n\"\u003ey_test\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003everbose\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Verbosity mode. 0 = silent, 1 = progress bar.\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# fit()用于使用给定输入训练模型.\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# evaluate()用于评估已经训练过的模型.返回损失值\u0026amp;模型的度量值.\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e","title":"MNIST手写数字识别实践"},{"content":"清华镜像源安装 pip install tensorflow-gpu==1.12.0 -i //pypi.tuna.tsinghua.edu.cn/simple #可改成任意版本 CPU版本安装 pip install tensorflow -i //pypi.tuna.tsinghua.edu.cn/simple Pycharm环境配置 （一）导入TensorFlow模块测试 import tensorflow as tf hello = tf.constant() sess = tf.Session() sess.run(hello) 结果如下：ModuleNotFoundError: No module named \u0026rsquo;tensorflow'\n（二）加入运行路径 设置项目的编译器为python安装位置的python.exe，勾选导入所有的模块，显示如上图所示。再次运行出现同样的错误，查了一些资料应该是电脑的CPU太老了，我下载的tensorflow2.1.0版本不支持。\n（三）安装2.0.0版本并测试 运行代码： pip unintall tensorflow\n重新运行安装代码：pip install tensorflow==2.0.0 -i //pypi.tuna.tsinghua.edu.cn/simple\n再次测试成功！\n由于笔记本没有英伟达显卡，配置较低，只安装了CPU版本，后续使用有较好配置的电脑尝试安装GPU版本。确实CPU版本速度比较慢。\n","permalink":"https://www.xiaoxiangtao.cn/zh/posts/tensorflow2/","summary":"\u003ch2 id=\"清华镜像源安装\"\u003e清华镜像源安装\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epip install tensorflow-gpu==1.12.0 -i //pypi.tuna.tsinghua.edu.cn/simple #可改成任意版本\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch2 id=\"cpu版本安装\"\u003eCPU版本安装\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epip install tensorflow -i //pypi.tuna.tsinghua.edu.cn/simple\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch2 id=\"pycharm环境配置\"\u003ePycharm环境配置\u003c/h2\u003e\n\u003ch3 id=\"一导入tensorflow模块测试\"\u003e（一）导入TensorFlow模块测试\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-python\" data-lang=\"python\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kn\"\u003eimport\u003c/span\u003e \u003cspan class=\"nn\"\u003etensorflow\u003c/span\u003e \u003cspan class=\"k\"\u003eas\u003c/span\u003e \u003cspan class=\"nn\"\u003etf\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003ehello\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003etf\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003econstant\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003esess\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003etf\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eSession\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003esess\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003erun\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ehello\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e结果如下：ModuleNotFoundError: No module named \u0026rsquo;tensorflow'\u003c/p\u003e\n\u003ch3 id=\"二加入运行路径\"\u003e（二）加入运行路径\u003c/h3\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"/posts/tensorflow2/1582020554684026723.png\"\u003e\u003c/p\u003e\n\u003cp\u003e设置项目的编译器为python安装位置的python.exe，勾选导入所有的模块，显示如上图所示。再次运行出现同样的错误，查了一些资料应该是电脑的CPU太老了，我下载的tensorflow2.1.0版本不支持。\u003c/p\u003e\n\u003ch3 id=\"三安装200版本并测试\"\u003e（三）安装2.0.0版本并测试\u003c/h3\u003e\n\u003cp\u003e运行代码： pip unintall tensorflow\u003cbr\u003e\n重新运行安装代码：pip install tensorflow==2.0.0 -i \u003ca href=\"//pypi.tuna.tsinghua.edu.cn/simple\"\u003e//pypi.tuna.tsinghua.edu.cn/simple\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e再次测试成功！\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"/posts/tensorflow2/1582032626532066694.png\"\u003e\u003c/p\u003e\n\u003cp\u003e由于笔记本没有英伟达显卡，配置较低，只安装了CPU版本，后续使用有较好配置的电脑尝试安装GPU版本。确实CPU版本速度比较慢。\u003c/p\u003e","title":"TensorFlow2.0安装"},{"content":"张量 张量=容器\n张量是现代机器学习的基础。它的核心是一个数据容器，多数情况下，它包含数字，有时候它也包含字符串，但这种情况比较少。因此把它想象成一个数字的水桶。\n0维张量=数字；1维张量=向量；2维张量=矩阵；3维张量=公用数据存储在张量，彩色图片等\u0026hellip;\none-hot vector 独热编码，用于分类标记。比如（猫，狗，鼠）对应（1,0,0）代表猫，（0,1,0）代表狗\u0026hellip;将离散型特征采用独热编码，会使得特征之间的距离计算更加合理。\nsoftmax函数 softmax函数的作用主要是：1.通过将模型的预测结果转化到指数函数上将预测结果转化为非负数；2.归一化处理，使各种结果概率之和等于1.\n//blog.csdn.net/lz_peter/article/details/84574716\n交叉熵 对于单标签多分类问题，p(x)表示是否为标记的类，如果用独热编码表示分类，则取值0或1；q(x)则是预测结果为该类的概率。用交叉熵做损失函数，值越小，表示模型预测结果与实际情况一致性越高。\n单标签多分类问题所有类别概率和为1，多标签二分类问题所有类别和不为1，交叉熵的计算针对的是单个类别（即二分类），然后单张样本计算多个二分类交叉熵的和。\n//blog.csdn.net/tsyccnh/article/details/79163834\n欧式空间 欧几里得空间就是在对现实空间的规则抽象和推广（从n\u0026lt;=3推广到有限n维空间）。\n欧几里得几何就是中学学的平面几何、立体几何， 在欧几里得几何中，平行线任何位置的间距相等。\n而中学学的几何空间一般是2维，3维（所以，我们讨论余弦值、点间的距离、内积都是在低纬空间总结的），如果将这些低维空间所总结的规律推广到有限的n维空间，那这些符合定义的空间则被统称为 欧几里得空间（欧式空间，Euclidean Space）。而欧几里得空间主要是定义了 内积、距离、角（没错，就是初中的那些定义），理解了这些再去理解数学定义就很明确了。\n//www.zhihu.com/question/27903807/answer/699570097\n梯度弥散与梯度爆炸 靠近输出层的hidden layer 梯度大，参数更新快，所以很快就会收敛；\n而靠近输入层的hidden layer 梯度小，参数更新慢，几乎就和初始状态一样，随机分布。\n在上面的四层隐藏层网络结构中，第一层比第四层慢了接近100倍！！\n这种现象就是梯度弥散（vanishing gradient problem）。而在另一种情况中，前面layer的梯度通过训练变大，而后面layer的梯度指数级增大，这种现象又叫做梯度爆炸(exploding gradient problem)。\n总的来说，就是在这个深度网络中，梯度相当不稳定(unstable)。\n//www.cnblogs.com/yangmang/p/7477802.html\nbatch_size batch的选择首先决定的是下降的方向，batch_size越大，下降的方向越准确。\n综合考虑数据集的大小，数据集比较小的时候，用整个数据集作为batch_size就可以，这时候下降的方向也是最精准的，数据集比较大的时候，相对小的batch可以达到和用整个数据集相似的全局学习率，综合考量学习的效果以及电脑内存是否撑得住，目的是尽量让学习效果和效率同时最大化。\n在合理范围内，增大 Batch_Size 有何好处？\n内存利用率提高了，大矩阵乘法的并行化效率提高。 跑完一次 epoch（全数据集）所需的迭代次数减少，对于相同数据量的处理速度进一步加快。 在一定范围内，一般来说 Batch_Size 越大，其确定的下降方向越准，引起训练震荡越小。 batch_size增大到一定程度后，再增大则效率变差，下降方向也基本不再变化。\n//blog.csdn.net/starzhou/article/details/53692248\n学习率 梯度下降的伪代码如下：\n重复已下过程，直到收敛为止{ωj=ωj-λF(ωj) /ωj}\nλ就是学习率，学习率过小，优化效率可能很低，学习率过大则有可能越过最优值，收敛到局部最优解。\n关于解决学习率的一些问题，如选择合适的学习率，动态调整学习率，归一化等参考：\n//www.cnblogs.com/mazhujun/p/9633576.html\n如何通俗地解释欧氏空间？ - 知乎 //www.zhihu.com/question/27903807/answer/699570097\n","permalink":"https://www.xiaoxiangtao.cn/zh/posts/basic-concept-understanding-of-machine-learning/","summary":"\u003ch2 id=\"张量\"\u003e张量\u003c/h2\u003e\n\u003cp\u003e张量=容器\u003c/p\u003e\n\u003cp\u003e张量是现代机器学习的基础。它的核心是一个数据容器，多数情况下，它包含数字，有时候它也包含字符串，但这种情况比较少。因此把它想象成一个数字的水桶。\u003c/p\u003e\n\u003cp\u003e0维张量=数字；1维张量=向量；2维张量=矩阵；3维张量=公用数据存储在张量，彩色图片等\u0026hellip;\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"/posts/basic-concept-understanding-of-machine-learning/1582001628415031481.jpg\"\u003e\u003c/p\u003e\n\u003ch2 id=\"one-hot-vector\"\u003eone-hot vector\u003c/h2\u003e\n\u003cp\u003e独热编码，用于分类标记。比如（猫，狗，鼠）对应（1,0,0）代表猫，（0,1,0）代表狗\u0026hellip;将离散型特征采用独热编码，会使得特征之间的距离计算更加合理。\u003c/p\u003e\n\u003ch2 id=\"softmax函数\"\u003esoftmax函数\u003c/h2\u003e\n\u003cp\u003esoftmax函数的作用主要是：1.通过将模型的预测结果转化到指数函数上将预测结果转化为非负数；2.归一化处理，使各种结果概率之和等于1.\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"/posts/basic-concept-understanding-of-machine-learning/1582001007247022548-1.png\"\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"/posts/basic-concept-understanding-of-machine-learning/1582001209608023968-1024x764.png\"\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e\u003ca href=\"//blog.csdn.net/lz_peter/article/details/84574716%5C%22\"\u003e//blog.csdn.net/lz_peter/article/details/84574716\u003c/a\u003e\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003ch2 id=\"交叉熵\"\u003e交叉熵\u003c/h2\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"/posts/basic-concept-understanding-of-machine-learning/1582032638884051044.png\"\u003e\u003c/p\u003e\n\u003cp\u003e对于单标签多分类问题，p(x)表示是否为标记的类，如果用独热编码表示分类，则取值0或1；q(x)则是预测结果为该类的概率。用交叉熵做损失函数，值越小，表示模型预测结果与实际情况一致性越高。\u003c/p\u003e\n\u003cp\u003e单标签多分类问题所有类别概率和为1，多标签二分类问题所有类别和不为1，交叉熵的计算针对的是单个类别（即二分类），然后单张样本计算多个二分类交叉熵的和。\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e\u003ca href=\"//blog.csdn.net/tsyccnh/article/details/79163834\"\u003e//blog.csdn.net/tsyccnh/article/details/79163834\u003c/a\u003e\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003ch2 id=\"欧式空间\"\u003e欧式空间\u003c/h2\u003e\n\u003cp\u003e欧几里得空间就是在对现实空间的规则抽象和推广（从n\u0026lt;=3推广到有限n维空间）。\u003c/p\u003e\n\u003cp\u003e欧几里得几何就是中学学的平面几何、立体几何， \u003cstrong\u003e在欧几里得几何中，平行线任何位置的间距相等\u003c/strong\u003e。\u003c/p\u003e\n\u003cp\u003e而中学学的几何空间一般是2维，3维（所以，我们讨论余弦值、点间的距离、内积都是在低纬空间总结的），如果将这些低维空间所总结的规律推广到有限的n维空间，那这些符合定义的空间则被统称为 \u003cstrong\u003e欧几里得空间（欧式空间，Euclidean Space）\u003c/strong\u003e。而欧几里得空间主要是定义了 \u003cstrong\u003e内积、距离、角\u003c/strong\u003e（没错，就是初中的那些定义），理解了这些再去理解数学定义就很明确了。\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e\u003ca href=\"//www.zhihu.com/question/27903807/answer/699570097\"\u003e//www.zhihu.com/question/27903807/answer/699570097\u003c/a\u003e\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003ch2 id=\"梯度弥散与梯度爆炸\"\u003e梯度弥散与梯度爆炸\u003c/h2\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"/posts/basic-concept-understanding-of-machine-learning/1081032-20170905101008960-1183527271.png\"\u003e\u003c/p\u003e\n\u003cp\u003e靠近输出层的hidden layer 梯度大，参数更新快，所以很快就会收敛；\u003c/p\u003e\n\u003cp\u003e而靠近输入层的hidden layer 梯度小，参数更新慢，几乎就和初始状态一样，随机分布。\u003c/p\u003e\n\u003cp\u003e在上面的四层隐藏层网络结构中，第一层比第四层慢了接近100倍！！\u003c/p\u003e\n\u003cp\u003e这种现象就是梯度弥散（vanishing gradient problem）。而在另一种情况中，前面layer的梯度通过训练变大，而后面layer的梯度指数级增大，这种现象又叫做梯度爆炸(exploding gradient problem)。\u003c/p\u003e\n\u003cp\u003e总的来说，就是在这个深度网络中，梯度相当不稳定(unstable)。\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e\u003ca href=\"//www.cnblogs.com/yangmang/p/7477802.html\"\u003e//www.cnblogs.com/yangmang/p/7477802.html\u003c/a\u003e\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003ch2 id=\"batch_size\"\u003ebatch_size\u003c/h2\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"/posts/basic-concept-understanding-of-machine-learning/f5a6d3b5c4b5a91851f0f8b8735f162d_b.png\"\u003e\u003c/p\u003e\n\u003cp\u003ebatch的选择首先决定的是下降的方向，batch_size越大，下降的方向越准确。\u003c/p\u003e\n\u003cp\u003e综合考虑数据集的大小，数据集比较小的时候，用整个数据集作为batch_size就可以，这时候下降的方向也是最精准的，数据集比较大的时候，相对小的batch可以达到和用整个数据集相似的全局学习率，综合考量学习的效果以及电脑内存是否撑得住，目的是尽量让学习效果和效率同时最大化。\u003c/p\u003e\n\u003cp\u003e在合理范围内，增大 Batch_Size 有何好处？\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e内存利用率提高了，大矩阵乘法的并行化效率提高。\u003c/li\u003e\n\u003cli\u003e跑完一次 epoch（全数据集）所需的迭代次数减少，对于相同数据量的处理速度进一步加快。\u003c/li\u003e\n\u003cli\u003e在一定范围内，一般来说 Batch_Size 越大，其确定的下降方向越准，引起训练震荡越小。\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003ebatch_size增大到一定程度后，再增大则效率变差，下降方向也基本不再变化。\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e\u003ca href=\"//blog.csdn.net/starzhou/article/details/53692248\"\u003e//blog.csdn.net/starzhou/article/details/53692248\u003c/a\u003e\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003ch2 id=\"学习率\"\u003e学习率\u003c/h2\u003e\n\u003cp\u003e梯度下降的伪代码如下：\u003c/p\u003e\n\u003cp\u003e重复已下过程，直到收敛为止{ωj=ωj-λF(ωj) /ωj}\u003c/p\u003e\n\u003cp\u003eλ就是学习率，学习率过小，优化效率可能很低，学习率过大则有可能越过最优值，收敛到局部最优解。\u003c/p\u003e\n\u003cp\u003e关于解决学习率的一些问题，如选择合适的学习率，动态调整学习率，归一化等参考：\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e\u003ca href=\"//www.cnblogs.com/mazhujun/p/9633576.html\"\u003e//www.cnblogs.com/mazhujun/p/9633576.html\u003c/a\u003e\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e如何通俗地解释欧氏空间？ - 知乎 \u003ca href=\"//www.zhihu.com/question/27903807/answer/699570097\"\u003e//www.zhihu.com/question/27903807/answer/699570097\u003c/a\u003e\u003c/p\u003e","title":"机器学习入门基本概念理解"},{"content":"\n空间构成的方法 图形重叠 大小变化 倾斜变化 弯曲变化 投影效果 透视效果 面的链接 疏密变化\n色彩构成基本原理与法则 曼塞尔色环 色彩概念 基于纸上绘画的体系，是色彩颜料调色为准的显色系。\n色相：不同的颜色，红色对应绿色，蓝色对应黄色等。\n明度：由黑到白，明度最高为白色，明度最低为黑色，对于同一色相的颜色，明度越高颜色给人感觉越亮，反之则暗，接近黑色。\n纯度：色彩的纯度越低越接近灰色，最终纯度最低就是灰色。\n基本配色法则 色彩对比构成：\n将颜色分为主色、搭配色和点缀色，注意三者之间的比例关系 色彩的调和构成：\n属性统一调和：即色相、明度或者纯度三者之一保持相同使画面和谐（但配色应当注意突出重点）\n连贯统一调和：用黑色或白色勾边，将对比强烈的色彩贯穿起来 建议使用低明度高纯度的色彩（应试） 色彩情感 通过不同的色彩搭配烘托氛围，给人以忧伤或者喜悦的感受。\n","permalink":"https://www.xiaoxiangtao.cn/zh/posts/kongjian-secaigouchengjianjie/","summary":"\u003cp\u003e\u003cimg loading=\"lazy\" src=\"/posts/kongjian-secaigouchengjianjie/0ea4b6181cb5326fcce98ae7b4018818.jpg\"\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"/posts/kongjian-secaigouchengjianjie/03335300b5144b0cdefab37330a194f9.jpg\"\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"/posts/kongjian-secaigouchengjianjie/13bd94ded55b1ced978015321b9d289e.jpg\"\u003e\u003c/p\u003e\n\u003ch2 id=\"空间构成的方法\"\u003e空间构成的方法\u003c/h2\u003e\n\u003cp\u003e图形重叠 大小变化 倾斜变化 弯曲变化 投影效果 透视效果 面的链接 疏密变化\u003c/p\u003e\n\u003ch2 id=\"色彩构成基本原理与法则\"\u003e色彩构成基本原理与法则\u003c/h2\u003e\n\u003ch3 id=\"曼塞尔色环\"\u003e曼塞尔色环\u003c/h3\u003e\n\u003ch3 id=\"色彩概念\"\u003e色彩概念\u003c/h3\u003e\n\u003cp\u003e基于纸上绘画的体系，是色彩颜料调色为准的显色系。\u003c/p\u003e\n\u003cp\u003e色相：不同的颜色，红色对应绿色，蓝色对应黄色等。\u003c/p\u003e\n\u003cp\u003e明度：由黑到白，明度最高为白色，明度最低为黑色，对于同一色相的颜色，明度越高颜色给人感觉越亮，反之则暗，接近黑色。\u003c/p\u003e\n\u003cp\u003e纯度：色彩的纯度越低越接近灰色，最终纯度最低就是灰色。\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"/posts/kongjian-secaigouchengjianjie/c1e18aab0491905f5a197bc79c021449-1.jpg\"\u003e\u003c/p\u003e\n\u003ch3 id=\"基本配色法则\"\u003e基本配色法则\u003c/h3\u003e\n\u003col\u003e\n\u003cli\u003e色彩对比构成：\u003cbr\u003e\n    将颜色分为主色、搭配色和点缀色，注意三者之间的比例关系\u003c/li\u003e\n\u003cli\u003e色彩的调和构成：\u003cbr\u003e\n    属性统一调和：即色相、明度或者纯度三者之一保持相同使画面和谐（但配色应当注意突出重点）\u003cbr\u003e\n    连贯统一调和：用黑色或白色勾边，将对比强烈的色彩贯穿起来\u003c/li\u003e\n\u003cli\u003e建议使用低明度高纯度的色彩（应试）\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3 id=\"色彩情感\"\u003e色彩情感\u003c/h3\u003e\n\u003cp\u003e通过不同的色彩搭配烘托氛围，给人以忧伤或者喜悦的感受。\u003c/p\u003e","title":"空间/色彩构成简介"},{"content":"平面构成的三大元素 构成题的基本要求 完成度高 画面丰富，层次感强 笔触细腻 建议：配色明快，色彩明度高，纯度不要太高。\n点 点的大小不固定：点的形态大小在于比较，没有比较，点的大小不确定，点也可以被看做面。\n点的形状不固定：点可以是任意形状，只要这个形态在画面上与其他元素的大小关系满足我们从感性的角度判断其为一点。\n点能够塑造空间感：点可以塑造空间的明暗和虚实关系。\n点能够作为肌理。\n线 线有多种类型，包括直线、曲线、虚线等。线的形态不固定。\n线有粗细变化，一般满足近实远虚、在转折处加粗的特点。\n线能够勾勒轮廓，闭合的线就形成了面。\n与点类似，线也可以塑造肌理和空间感。\n线能够表达情感：直线一般代表着坚定、硬朗、速度等，曲线代表着韵动、柔韧、感性等。\n面 面分为 几何面 与 自由面 ，自由面是不规律的，随意的面，或者边界不明确、随意，类似于水墨晕开形成的面。\n面也分为 虚面 与 实面 ，点和线构成的面便是虚面。\n面具有正负形态：面正负形产生的错视。也就是我们常说的图与底的关系。图，就是形，也叫正形，位于画面醒目的位置，表达主要思想的元素，底，就是背景，也叫负形，位于正形的后面，对正形起衬托装饰的作用，让人感觉正形的存在。任何的图形都由正形和负形两部分组成，正形靠负形来衬托，负形需正形来界定。图底分明的图像层次感鲜明，更容易吸引关注的目光。不仅如此，还有一种矛盾图形，比如说太极图，分辨不出图与底。\n面可以突出重点，增加对比效果。\n面与面有许多不同的结合方式：重叠、透叠、分离、相切、重合等。\n构成法则 重复\n有规律的进行排列组合。 近似\n确定基本形不变，基本形的内容与组成形式改变。 特异\n有规律的形态中进行小部分的变异，形成视觉中心点，使画面生动活泼。 渐变\n指基本形进行规律化的渐变处理：比如产品造型上有植物渐变到灯具。带来节奏感和韵律感（进行构图和构思比较耗时），渐变可以是九宫格的形式或者综合的形式。重点在于渐变过程的展现。 发射\n从画面的视觉中心点出发，带来空间感和动感，发射的基本形可以任意变化（不是非要直线）。 对比\n具有差异元素构成的作品，对比包括色彩、大小、虚实、曲直对比等。 密集\n疏密关系，画面具有节奏感。 分割\n可以以等形、等量、重复、自由等形式进行分割。参考毕加索的画作。 异构（同构）\n基本形局部元素图形变化，比如一个肺部形状，内容替换为西蓝花。一般变化的就是要表达的主题本身。 一般在画面中会使用多种构成法则进行组合，综合体现效果。\n平面构成的表现形式 概念 元素：构成画面的基本形，由造型基本元素点线面组成。\n构成法则：对元素进行组合的一些规则。\n","permalink":"https://www.xiaoxiangtao.cn/zh/posts/pingmiangouchengfangfazongjie/","summary":"\u003ch2 id=\"平面构成的三大元素\"\u003e平面构成的三大元素\u003c/h2\u003e\n\u003ch3 id=\"构成题的基本要求\"\u003e构成题的基本要求\u003c/h3\u003e\n\u003col\u003e\n\u003cli\u003e完成度高\u003c/li\u003e\n\u003cli\u003e画面丰富，层次感强\u003c/li\u003e\n\u003cli\u003e笔触细腻\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e建议：配色明快，色彩明度高，纯度不要太高。\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"/posts/pingmiangouchengfangfazongjie/af260516807bee01596b22dcc07ad863.jpg\"\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"/posts/pingmiangouchengfangfazongjie/f141dae82dc57f959ffce2fb2c1d7a98.jpg\"\u003e\u003c/p\u003e\n\u003ch3 id=\"点\"\u003e点\u003c/h3\u003e\n\u003cp\u003e点的大小不固定：点的形态大小在于比较，没有比较，点的大小不确定，点也可以被看做面。\u003c/p\u003e\n\u003cp\u003e点的形状不固定：点可以是任意形状，只要这个形态在画面上与其他元素的大小关系满足我们从感性的角度判断其为一点。\u003c/p\u003e\n\u003cp\u003e点能够塑造空间感：点可以塑造空间的明暗和虚实关系。\u003c/p\u003e\n\u003cp\u003e点能够作为肌理。\u003c/p\u003e\n\u003ch3 id=\"线\"\u003e线\u003c/h3\u003e\n\u003cp\u003e线有多种类型，包括直线、曲线、虚线等。线的形态不固定。\u003c/p\u003e\n\u003cp\u003e线有粗细变化，一般满足近实远虚、在转折处加粗的特点。\u003c/p\u003e\n\u003cp\u003e线能够勾勒轮廓，闭合的线就形成了面。\u003c/p\u003e\n\u003cp\u003e与点类似，线也可以塑造肌理和空间感。\u003c/p\u003e\n\u003cp\u003e线能够表达情感：直线一般代表着坚定、硬朗、速度等，曲线代表着韵动、柔韧、感性等。\u003c/p\u003e\n\u003ch3 id=\"面\"\u003e面\u003c/h3\u003e\n\u003cp\u003e面分为 几何面 与 自由面 ，自由面是不规律的，随意的面，或者边界不明确、随意，类似于水墨晕开形成的面。\u003c/p\u003e\n\u003cp\u003e面也分为 虚面 与 实面 ，点和线构成的面便是虚面。\u003c/p\u003e\n\u003cp\u003e面具有正负形态：面正负形产生的错视。也就是我们常说的图与底的关系。图，就是形，也叫正形，位于画面醒目的位置，表达主要思想的元素，底，就是背景，也叫负形，位于正形的后面，对正形起衬托装饰的作用，让人感觉正形的存在。任何的图形都由正形和负形两部分组成，正形靠负形来衬托，负形需正形来界定。图底分明的图像层次感鲜明，更容易吸引关注的目光。不仅如此，还有一种矛盾图形，比如说太极图，分辨不出图与底。\u003c/p\u003e\n\u003cp\u003e面可以突出重点，增加对比效果。\u003c/p\u003e\n\u003cp\u003e面与面有许多不同的结合方式：重叠、透叠、分离、相切、重合等。\u003c/p\u003e\n\u003ch3 id=\"构成法则\"\u003e构成法则\u003c/h3\u003e\n\u003col\u003e\n\u003cli\u003e重复\u003cbr\u003e\n    有规律的进行排列组合。\u003c/li\u003e\n\u003cli\u003e近似\u003cbr\u003e\n    确定基本形不变，基本形的内容与组成形式改变。\u003c/li\u003e\n\u003cli\u003e特异\u003cbr\u003e\n    有规律的形态中进行小部分的变异，形成视觉中心点，使画面生动活泼。\u003c/li\u003e\n\u003cli\u003e渐变\u003cbr\u003e\n    指基本形进行规律化的渐变处理：比如产品造型上有植物渐变到灯具。带来节奏感和韵律感（进行构图和构思比较耗时），渐变可以是九宫格的形式或者综合的形式。重点在于渐变过程的展现。\u003c/li\u003e\n\u003cli\u003e发射\u003cbr\u003e\n    从画面的视觉中心点出发，带来空间感和动感，发射的基本形可以任意变化（不是非要直线）。\u003c/li\u003e\n\u003cli\u003e对比\u003cbr\u003e\n    具有差异元素构成的作品，对比包括色彩、大小、虚实、曲直对比等。\u003c/li\u003e\n\u003cli\u003e密集\u003cbr\u003e\n    疏密关系，画面具有节奏感。\u003c/li\u003e\n\u003cli\u003e分割\u003cbr\u003e\n    可以以等形、等量、重复、自由等形式进行分割。参考毕加索的画作。\u003c/li\u003e\n\u003cli\u003e异构（同构）\u003cbr\u003e\n    基本形局部元素图形变化，比如一个肺部形状，内容替换为西蓝花。一般变化的就是要表达的主题本身。\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e一般在画面中会使用多种构成法则进行组合，综合体现效果。\u003c/p\u003e\n\u003ch2 id=\"平面构成的表现形式\"\u003e平面构成的表现形式\u003c/h2\u003e\n\u003ch3 id=\"概念\"\u003e概念\u003c/h3\u003e\n\u003cp\u003e元素：构成画面的基本形，由造型基本元素点线面组成。\u003c/p\u003e\n\u003cp\u003e构成法则：对元素进行组合的一些规则。\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"/posts/pingmiangouchengfangfazongjie/f8319a3430c40b127216254613efe173.jpg\"\u003e\u003c/p\u003e","title":"平面构成方法总结"},{"content":"一、下载UEditor //ueditor.baidu.com/website/download.html\n在以上链接下载，选择自己需要的语言版本，我用的是jsp，就下载jsp版本。将下载的压缩包解压，可以直接将解压的文件导入到Eclipse中自己的项目中，导入到文件夹WebContent中即可。\n二、配置 将jsp/lib中的jar包全部复制到WEB-INF/lib下\n修改输入字符数统计、上限，自定义工具栏可以参考官方说明文档，配置项可在ueditor.config.js中修改。\n修改图片上传路径等在官方说明文档中有详细的介绍。\n注：这里仅仅是在一个项目中使用UEditor，还用别的使用方法，也可以直接部署到tomcat中。\n三、在页面中插入Ueditor编辑器 首先要引用文件\n\u0026lt;link rel=\u0026#34;stylesheet\u0026#34; type=\u0026#34;text/css\u0026#34; href=\u0026#34;\u0026lt;%= request.getContextPath() %\u0026gt;/thirdparts/utf8-jsp/themes/default/css/ueditor.change.css\u0026#34;\u0026gt; \u0026lt;script type=\u0026#34;text/javascript\u0026#34; charset=\u0026#34;utf-8\u0026#34; src=\u0026#34;\u0026lt;%= request.getContextPath() %\u0026gt;/thirdparts/utf8-jsp/ueditor.config.js\u0026#34;\u0026gt;\u0026lt;/script\u0026gt; \u0026lt;script type=\u0026#34;text/javascript\u0026#34; charset=\u0026#34;utf-8\u0026#34; src=\u0026#34;\u0026lt;%= request.getContextPath() %\u0026gt;/thirdparts/utf8-jsp/ueditor.all.min.js\u0026#34;\u0026gt; \u0026lt;/script\u0026gt; \u0026lt;script type=\u0026#34;text/javascript\u0026#34; charset=\u0026#34;utf-8\u0026#34; src=\u0026#34;\u0026lt;%= request.getContextPath() %\u0026gt;/thirdparts/utf8-jsp/lang/zh-cn/zh-cn.js\u0026#34;\u0026gt;\u0026lt;/script\u0026gt; 接着在需要插入编辑器的位置插入以下代码\n\u0026lt;textarea id=\u0026#34;content\u0026#34; name=\u0026#34;content\u0026#34; style=\u0026#34;width:100%;height:500px\u0026#34;\u0026gt;\u0026lt;/textarea\u0026gt; \u0026lt;script type=\u0026#34;text/javascript\u0026#34; charset=\u0026#34;utf-8\u0026#34;\u0026gt; UE.getEditor(\u0026#39;content\u0026#39;,{toolbars: [[ \u0026#39;fullscreen\u0026#39;, \u0026#39;source\u0026#39;, \u0026#39;|\u0026#39;, \u0026#39;undo\u0026#39;, \u0026#39;redo\u0026#39;, \u0026#39;|\u0026#39;,\u0026#39;bold\u0026#39;, \u0026#39;italic\u0026#39;, \u0026#39;underline\u0026#39;, \u0026#39;fontborder\u0026#39;, \u0026#39;strikethrough\u0026#39;, \u0026#39;superscript\u0026#39;, \u0026#39;subscript\u0026#39;, \u0026#39;removeformat\u0026#39;, \u0026#39;formatmatch\u0026#39;, \u0026#39;autotypeset\u0026#39;, \u0026#39;blockquote\u0026#39;, \u0026#39;pasteplain\u0026#39;, \u0026#39;|\u0026#39;, \u0026#39;forecolor\u0026#39;, \u0026#39;backcolor\u0026#39;, \u0026#39;insertorderedlist\u0026#39;, \u0026#39;insertunorderedlist\u0026#39;, \u0026#39;selectall\u0026#39;, \u0026#39;cleardoc\u0026#39;]]}); \u0026lt;/script\u0026gt; toolbars控制工具栏显示哪些工具\ntextarea是显示编辑器的容器，其id与UE.getEditor(\u0026lsquo;id\u0026rsquo;,{})要一致。\n不一定要是textarea，div等都可以，可以自己试一试，我没有深入研究，凑合着用了。\n","permalink":"https://www.xiaoxiangtao.cn/zh/posts/ueditorbushudaogerenzhandian/","summary":"\u003ch2 id=\"一下载ueditor\"\u003e一、下载UEditor\u003c/h2\u003e\n\u003cp\u003e\u003ca href=\"//ueditor.baidu.com/website/download.html\"\u003e//ueditor.baidu.com/website/download.html\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e在以上链接下载，选择自己需要的语言版本，我用的是jsp，就下载jsp版本。将下载的压缩包解压，可以直接将解压的文件导入到Eclipse中自己的项目中，导入到文件夹WebContent中即可。\u003c/p\u003e\n\u003ch2 id=\"二配置\"\u003e二、配置\u003c/h2\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"/posts/ueditorbushudaogerenzhandian/1563207389404033187.png\"\u003e\u003c/p\u003e\n\u003cp\u003e将jsp/lib中的jar包全部复制到WEB-INF/lib下\u003c/p\u003e\n\u003cp\u003e修改输入字符数统计、上限，自定义工具栏可以参考官方说明文档，配置项可在ueditor.config.js中修改。\u003c/p\u003e\n\u003cp\u003e修改图片上传路径等在官方说明文档中有详细的介绍。\u003c/p\u003e\n\u003cp\u003e注：这里仅仅是在一个项目中使用UEditor，还用别的使用方法，也可以直接部署到tomcat中。\u003c/p\u003e\n\u003ch2 id=\"三在页面中插入ueditor编辑器\"\u003e三、在页面中插入Ueditor编辑器\u003c/h2\u003e\n\u003cp\u003e首先要引用文件\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-html\" data-lang=\"html\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003elink\u003c/span\u003e \u003cspan class=\"na\"\u003erel\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;stylesheet\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003etype\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;text/css\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;\u0026lt;%= request.getContextPath() %\u0026gt;/thirdparts/utf8-jsp/themes/default/css/ueditor.change.css\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003escript\u003c/span\u003e \u003cspan class=\"na\"\u003etype\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;text/javascript\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003echarset\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;utf-8\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003esrc\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;\u0026lt;%= request.getContextPath() %\u0026gt;/thirdparts/utf8-jsp/ueditor.config.js\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003escript\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003escript\u003c/span\u003e \u003cspan class=\"na\"\u003etype\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;text/javascript\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003echarset\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;utf-8\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003esrc\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;\u0026lt;%= request.getContextPath() %\u0026gt;/thirdparts/utf8-jsp/ueditor.all.min.js\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003escript\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003escript\u003c/span\u003e \u003cspan class=\"na\"\u003etype\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;text/javascript\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003echarset\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;utf-8\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003esrc\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;\u0026lt;%= request.getContextPath() %\u0026gt;/thirdparts/utf8-jsp/lang/zh-cn/zh-cn.js\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003escript\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e接着在需要插入编辑器的位置插入以下代码\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-html\" data-lang=\"html\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003etextarea\u003c/span\u003e \u003cspan class=\"na\"\u003eid\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;content\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003ename\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;content\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003estyle\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;width:100%;height:500px\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003etextarea\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003escript\u003c/span\u003e \u003cspan class=\"na\"\u003etype\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;text/javascript\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003echarset\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;utf-8\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eUE\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003egetEditor\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;content\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,{\u003c/span\u003e\u003cspan class=\"nx\"\u003etoolbars\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e[[\u003c/span\u003e   \u003cspan class=\"s1\"\u003e\u0026#39;fullscreen\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;source\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;|\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;undo\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;redo\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;|\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;bold\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;italic\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;underline\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;fontborder\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;strikethrough\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;superscript\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;subscript\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;removeformat\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;formatmatch\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;autotypeset\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;blockquote\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;pasteplain\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;|\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;forecolor\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;backcolor\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;insertorderedlist\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;insertunorderedlist\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;selectall\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;cleardoc\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e]]});\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003escript\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003etoolbars控制工具栏显示哪些工具\u003c/p\u003e\n\u003cp\u003etextarea是显示编辑器的容器，其id与UE.getEditor(\u0026lsquo;id\u0026rsquo;,{})要一致。\u003c/p\u003e\n\u003cp\u003e不一定要是textarea，div等都可以，可以自己试一试，我没有深入研究，凑合着用了。\u003c/p\u003e","title":"UEditor部署到个人站点"},{"content":"Generative design is an iterative design process that involves a program that will generate a certain number of outputs that meet certain constraints, and a designer that will fine tune the feasible region by changing minimal and maximal values of an interval in which a variable of the program meets the set of constraints, in order to reduce or augment the number of outputs to choose from. The program doesn\u0026rsquo;t need to be run on a machine like a digital computer, it can be run by a human for example with pen and paper. [1] The designer doesn\u0026rsquo;t need to be a human, it can be a test program in a testing environment or an artificial intelligence (see for example Generative adversarial networks). The designer learns to refine the program (usually involving algorithms) with each iteration as his design goals become better defined over time.\n//en.wikipedia.org/wiki/Generative_Design\n//www.core77.com/posts/89318/Where-Does-Generative-Design-Belong-Designers-Must-Decide\n生成式设计与自然的比较（很有意思的想法） //generativedesign.wordpress.com/2011/01/29/what-is-generative-desing/\n生成式设计就是一种设计流程 生成式设计可以借助计算机技术和智能算法做到一些设计师无法通过传统设计方法完成的设计 逐渐成形的生成设计(Generative Design) 正在引发一种新的成器行为，所谓生成式设计即建立在数字化制造条件下的、基于协议与规则的、用户深度参与产品生成过程的设计途径。生成式设计相对于我们传统所讲的UCD（仔细想想传统UCD中用户的参与度并不是很高）最大的改变在于为用户参与产品属性的定义提供了可行的途径，生成式设计是一种新的契机，他要求设计师改变自己的角色定位，未来设计师需要扮演算法和规则的制定者角色。 关于生成设计的定义网上有很多种不同的说法，但都基本承认一些事实，既生成设计是一种设计流程，它借助计算机与算法的优势进行设计，根据给定设计要求（输入）返回精确的设计方案（输出），不同于以往设计师根据自身经验和知识进行设计，它可以设计出一些曾经不可能设计出的结构和形态，并通过3D打印技术使其变为现实，尤其是它可以设计出一些结构使得其在力学等性能上达到最优。生成式设计被看作CAD的未来。\n一些生成设计的例子：\n观点：外观设计留给人类设计师，计算机优化的结构设计被隐藏在不可见的内部，或者仅仅合理的出现在外部，运用在应该运用的地方。生成式设计得到的结构看起来不那么自然，美观。\n","permalink":"https://www.xiaoxiangtao.cn/zh/posts/what-is-generative-design/","summary":"\u003cp\u003eGenerative design is an \u003ca href=\"%5C%22//en.wikipedia.org/wiki/Iteration%5C%22\"\u003eiterative\u003c/a\u003e \u003ca href=\"%5C%22//en.wikipedia.org/wiki/Design%5C%22\"\u003edesign\u003c/a\u003e \u003ca href=\"%5C%22//en.wikipedia.org/wiki/Process_%28engineering%29%5C%22\"\u003eprocess\u003c/a\u003e that involves a \u003ca href=\"%5C%22//en.wikipedia.org/wiki/Computer_program%5C%22\"\u003eprogram\u003c/a\u003e that will \u003ca href=\"%5C%22//en.wikipedia.org/wiki/Generator_%28mathematics%29%5C%22\"\u003egenerate\u003c/a\u003e a certain number of \u003ca href=\"%5C%22//en.wikipedia.org/wiki/Output_%28computing%29%5C%22\"\u003eoutputs\u003c/a\u003e that meet certain \u003ca href=\"%5C%22//en.wikipedia.org/wiki/Constraint_%28mathematics%29%5C%22\"\u003econstraints\u003c/a\u003e, and a \u003ca href=\"%5C%22//en.wikipedia.org/wiki/Designer%5C%22\"\u003edesigner\u003c/a\u003e that will fine tune the \u003ca href=\"%5C%22//en.wikipedia.org/wiki/Feasible_region%5C%22\"\u003efeasible region\u003c/a\u003e by changing \u003ca href=\"%5C%22//en.wikipedia.org/wiki/Maxima_and_minima%5C%22\"\u003eminimal and maximal\u003c/a\u003e values of an \u003ca href=\"%5C%22//en.wikipedia.org/wiki/Interval_%28mathematics%29%5C%22\"\u003einterval\u003c/a\u003e in which a \u003ca href=\"%5C%22//en.wikipedia.org/wiki/Variable_%28mathematics%29%5C%22\"\u003evariable\u003c/a\u003e of the program meets the \u003ca href=\"%5C%22//en.wikipedia.org/wiki/Set_%28mathematics%29%5C%22\"\u003eset\u003c/a\u003e of constraints, in order to reduce or augment the number of outputs to \u003ca href=\"%5C%22//en.wikipedia.org/wiki/Choice%5C%22\"\u003echoose\u003c/a\u003e from. The program doesn\u0026rsquo;t need to be run on a \u003ca href=\"%5C%22//en.wikipedia.org/wiki/Machine%5C%22\"\u003emachine\u003c/a\u003e like a \u003ca href=\"%5C%22//en.wikipedia.org/wiki/Digital_computer%5C%22\"\u003edigital computer\u003c/a\u003e, it can be run by a human for example with \u003ca href=\"%5C%22//en.wikipedia.org/wiki/Pen_and_paper%5C%22\"\u003epen and paper\u003c/a\u003e. \u003ca href=\"%5C%22//en.wikipedia.org/wiki/Generative_Design#cite_note-1%5C%22\"\u003e[1]\u003c/a\u003e The designer doesn\u0026rsquo;t need to be a \u003ca href=\"%5C%22//en.wikipedia.org/wiki/Human%5C%22\"\u003ehuman\u003c/a\u003e, it can be a \u003ca href=\"%5C%22//en.wikipedia.org/wiki/Test_%28assessment%29%5C%22\"\u003etest\u003c/a\u003e program in a testing environment or an \u003ca href=\"%5C%22//en.wikipedia.org/wiki/Artificial_intelligence%5C%22\"\u003eartificial intelligence\u003c/a\u003e (see for example \u003ca href=\"%5C%22//en.wikipedia.org/wiki/Generative_adversarial_network%5C%22\"\u003eGenerative adversarial networks\u003c/a\u003e). The designer \u003ca href=\"%5C%22//en.wikipedia.org/wiki/Learning%5C%22\"\u003elearns\u003c/a\u003e to \u003ca href=\"%5C%22//en.wikipedia.org/wiki/Refinement_%28computing%29%5C%22\"\u003erefine\u003c/a\u003e the program (usually involving \u003ca href=\"%5C%22//en.wikipedia.org/wiki/Algorithm%5C%22\"\u003ealgorithms\u003c/a\u003e) with each iteration as his design \u003ca href=\"%5C%22//en.wikipedia.org/wiki/Goal%5C%22\"\u003egoals\u003c/a\u003e become better \u003ca href=\"%5C%22//en.wikipedia.org/wiki/Definition%5C%22\"\u003edefined\u003c/a\u003e over time.\u003c/p\u003e","title":"What is Generative Design?"},{"content":"\n工业设计起源于工业革命，技术的革新带来了工业设计，带来了一系列人类工具的创新和不同的可能性，这些带来了设计的需求。那么工业设计是不是受限于技术呢？技术发展的停滞或速度趋缓是否导致设计变成了外观设计？\n当前看到的两个方向，一个是拥抱信息技术，既信息革命，最基本的就是交互设计领域，信息技术，媒体的革新给交互设计带来了巨大的发展空间，单一的屏幕由于内容可改变实际带来了无穷尽的显示空间，VR、AR带来的更是3维的现实空间，这里就会有很多的设计需求。\n另一个方向就是整合设计、社会设计、服务设计等设计方向，当技术发展放缓，人们可以基于预测技术进行设计，这就是超前的设计，或者将现有技术进行充分利用，对现有技术进行排列组合式的再创造，而服务设计、社会设计、系统设计一定程度上脱离了对实物的设计，实际上就是将设计的思想运用到各个领域去创造价值。超前的设计，各个领域全方位的设计对企业的战略和竞争力提升很有帮助。\n信息是降低不确定性的，它帮助人们做决定，那么设计呢？设计是解决问题的，它要解决的是什么问题？设计也面对着充满不确定性的世界，设计也降低不确定性吗？\n","permalink":"https://www.xiaoxiangtao.cn/zh/posts/guanyuweilaishejideyidianxiangfa/","summary":"\u003cp\u003e\u003cimg loading=\"lazy\" src=\"/posts/guanyuweilaishejideyidianxiangfa/5736585.png\"\u003e\u003c/p\u003e\n\u003cp\u003e工业设计起源于工业革命，技术的革新带来了工业设计，带来了一系列人类工具的创新和不同的可能性，这些带来了设计的需求。那么工业设计是不是受限于技术呢？技术发展的停滞或速度趋缓是否导致设计变成了外观设计？\u003c/p\u003e\n\u003cp\u003e当前看到的两个方向，一个是拥抱信息技术，既信息革命，最基本的就是交互设计领域，信息技术，媒体的革新给交互设计带来了巨大的发展空间，单一的屏幕由于内容可改变实际带来了无穷尽的显示空间，VR、AR带来的更是3维的现实空间，这里就会有很多的设计需求。\u003c/p\u003e\n\u003cp\u003e另一个方向就是整合设计、社会设计、服务设计等设计方向，当技术发展放缓，人们可以基于预测技术进行设计，这就是超前的设计，或者将现有技术进行充分利用，对现有技术进行排列组合式的再创造，而服务设计、社会设计、系统设计一定程度上脱离了对实物的设计，实际上就是将设计的思想运用到各个领域去创造价值。超前的设计，各个领域全方位的设计对企业的战略和竞争力提升很有帮助。\u003c/p\u003e\n\u003cp\u003e信息是降低不确定性的，它帮助人们做决定，那么设计呢？设计是解决问题的，它要解决的是什么问题？设计也面对着充满不确定性的世界，设计也降低不确定性吗？\u003c/p\u003e","title":"关于未来设计的一点想法"},{"content":"M：Model\nV：View\nC：Controller\n在JSP开发中，JSP仅负责控制页面的显示内容，Javabean仅负责存储数据，在Javabean中，数据以设计好的格式存储着，这也是为什么他叫模型，JSP可以方便的从Javabean中取得数据进行显示，Servlet则负责从数据库中读取数据，向数据库存储数据，对数据进行逻辑处理，之后将数据存储在javabean中以供显示。\nMVC与三层架构：界面、业务逻辑、数据库存取是不一样的。MVC要实现的目标是将软件用户界面和业务逻辑分离以使代码可扩展性、可复用性、可维护性、灵活性加强。\n看到有另一种说法： //blog.csdn.net/zuiyingong6567/article/details/80150834\n同样是MVC，对于各层的理解有一些不同。尤其是对于数据库的连接，在PPT上看到的是C存取数据库，而网上一些资料显示是M存取数据库，而要求C尽量简单，仅仅负责在V与M间协调，大部分业务逻辑的处理，数据存取都放在Model中进行。\n","permalink":"https://www.xiaoxiangtao.cn/zh/posts/lijiemvcmoshi/","summary":"\u003cp\u003eM：Model\u003c/p\u003e\n\u003cp\u003eV：View\u003c/p\u003e\n\u003cp\u003eC：Controller\u003c/p\u003e\n\u003cp\u003e    在JSP开发中，JSP仅负责控制页面的显示内容，Javabean仅负责存储数据，在Javabean中，数据以设计好的格式存储着，这也是为什么他叫模型，JSP可以方便的从Javabean中取得数据进行显示，Servlet则负责从数据库中读取数据，向数据库存储数据，对数据进行逻辑处理，之后将数据存储在javabean中以供显示。\u003c/p\u003e\n\u003cp\u003e    MVC与三层架构：界面、业务逻辑、数据库存取是不一样的。MVC要实现的目标是将软件用户界面和业务逻辑分离以使代码可扩展性、可复用性、可维护性、灵活性加强。\u003c/p\u003e\n\u003cp\u003e    看到有另一种说法： \u003ca href=\"%5C%22//blog.csdn.net/zuiyingong6567/article/details/80150834%5C%22\"\u003e//blog.csdn.net/zuiyingong6567/article/details/80150834\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e    同样是MVC，对于各层的理解有一些不同。尤其是对于数据库的连接，在PPT上看到的是C存取数据库，而网上一些资料显示是M存取数据库，而要求C尽量简单，仅仅负责在V与M间协调，大部分业务逻辑的处理，数据存取都放在Model中进行。\u003c/p\u003e","title":"理解MVC模式"},{"content":"服务是一种无形的经济活动，它以满足用户需求为基础，创造服务价值为目标，在服务提供者与服务接受者（用户）之间进行价值传递的互动行为。 服务设计是以用户为主要视角，协同多方利益相关者共创，通过人员、场所、产品、信息等要素创新的综合集成，实现服务提供、服务流程、服务触点的系统创新，从而提升服务体验、服务品质和服务价值的设计活动。[1]\n服务设计强调：\n1.服务具备系统的特质：服务是一整个逻辑严密的流程，要从全局、整体的角度考虑，在各个环节都为客户创造良好的体验，在进行服务设计时，一个环节的服务失败会引发连锁反应导致后续环节出现一系列问题，用户有时会因为一个触点的糟糕体验而否定整个服务的提供，这也就是我们常说的服务周到，“周到”就是照顾到了方方面面，给用户带来了一个完整舒心的体验。\n2.服务设计的内容包括了 服务设施、服务产品、服务系统、服务规则、服务流程和服务政策等，服务设计将服务质量视为前提条件，特别关注服务介面和用户体验，重在设计整个使用流程中可以引发体验的不同触点。服务是被提供给用户的，从设计的角度看，设计服务的主要目的就是为用户提供良好的体验，而服务对企业效益、效率等的帮助，对企业品牌的打造等都建立在这个基础之上，无法给顾客提供良好的体验，其他都是空谈。\n3.服务设计强调用户视角，服务设计可以帮助企业全面的、共情的理解用户需求，探索用户旅程的不同接触点。和系统设计类似，服务设计要去了解用户需求，了解用户达到目的的流程，在此基础上进行优化，提供良好的服务满足用户需求。服务在给用户带来帮助的同时还需要给用户带来深刻的印象，提高用户的忠诚度。\n4.服务设计强调不同利益相关者的参与、协作与共创。服务是一个服务提供者与服务接受者交互的过程，服务通常不是单一组织或者个体提供的，而是不同利益相关者共同提供的，因此需要参与、协作、共创。举例来说，一个简单的服务：为客户提供一杯水，这个服务由递水的人（服务员或者与客户交谈的人），供应水的人（饮水机的购置、位置摆放），送饮用水的人共同完成，他们的工作都由这项服务产生并为此获得回报，任何一方的失误都导致服务的提供出现问题。\n5.强调服务设计的跨领域、跨学科。服务设计整合了设计、管理和过程工程中的多种技能和方法，实际产出系统、流程的设计旨在为客户提供全面的服务。\n相较其他学科对服务的研究，“用户视角”是设计学科服务研究的一个独特视角；“服务体验”是设计学科研究服务的重要关注点之一。\n理解服务设计定义：\n服务设计的原则：以用户为中心，协同多方利益相关者\n服务设计的内涵：对服务提供、流程、触点的全局优化和系统创新\n服务设计的外延：服务设计引导人员、环境、设施、信息等要素创新及其综合集成\n服务设计的作用：提升服务体验、效率和价值\n参考文献 [1]胡飞,李顽强.定义“服务设计”[J].包装工程,2019,40(10):37-51.\n","permalink":"https://www.xiaoxiangtao.cn/zh/posts/shenmeshifuwusheji/","summary":"\u003cp\u003e服务是一种无形的经济活动，它以满足用户需求为基础，创造服务价值为目标，在服务提供者与服务接受者（用户）之间进行价值传递的互动行为。 \u003cstrong\u003e服务设计是以用户为主要视角，协同多方利益相关者共创，通过人员、场所、产品、信息等要素创新的综合集成，实现服务提供、服务流程、服务触点的系统创新，从而提升服务体验、服务品质和服务价值的设计活动。[1]\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e服务设计强调：\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e1.服务具备系统的特质：服务是一整个逻辑严密的流程，要从全局、整体的角度考虑，在各个环节都为客户创造良好的体验，在进行服务设计时，一个环节的服务失败会引发连锁反应导致后续环节出现一系列问题，用户有时会因为一个触点的糟糕体验而否定整个服务的提供，这也就是我们常说的服务周到，“周到”就是照顾到了方方面面，给用户带来了一个完整舒心的体验。\u003c/p\u003e\n\u003cp\u003e2.服务设计的内容包括了 服务设施、服务产品、服务系统、服务规则、服务流程和服务政策等，服务设计将服务质量视为前提条件，特别关注服务介面和用户体验，重在设计整个使用流程中可以引发体验的不同触点。服务是被提供给用户的，从设计的角度看，设计服务的主要目的就是为用户提供良好的体验，而服务对企业效益、效率等的帮助，对企业品牌的打造等都建立在这个基础之上，无法给顾客提供良好的体验，其他都是空谈。\u003c/p\u003e\n\u003cp\u003e3.服务设计强调用户视角，服务设计可以帮助企业全面的、共情的理解用户需求，探索用户旅程的不同接触点。和系统设计类似，服务设计要去了解用户需求，了解用户达到目的的流程，在此基础上进行优化，提供良好的服务满足用户需求。服务在给用户带来帮助的同时还需要给用户带来深刻的印象，提高用户的忠诚度。\u003c/p\u003e\n\u003cp\u003e4.服务设计强调不同利益相关者的参与、协作与共创。服务是一个服务提供者与服务接受者交互的过程，服务通常不是单一组织或者个体提供的，而是不同利益相关者共同提供的，因此需要参与、协作、共创。举例来说，一个简单的服务：为客户提供一杯水，这个服务由递水的人（服务员或者与客户交谈的人），供应水的人（饮水机的购置、位置摆放），送饮用水的人共同完成，他们的工作都由这项服务产生并为此获得回报，任何一方的失误都导致服务的提供出现问题。\u003c/p\u003e\n\u003cp\u003e5.强调服务设计的跨领域、跨学科。服务设计整合了设计、管理和过程工程中的多种技能和方法，实际产出系统、流程的设计旨在为客户提供全面的服务。\u003c/p\u003e\n\u003cp\u003e相较其他学科对服务的研究，“用户视角”是设计学科服务研究的一个独特视角；“服务体验”是设计学科研究服务的重要关注点之一。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e理解服务设计定义：\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e服务设计的原则：以用户为中心，协同多方利益相关者\u003cbr\u003e\n服务设计的内涵：对服务提供、流程、触点的全局优化和系统创新\u003cbr\u003e\n服务设计的外延：服务设计引导人员、环境、设施、信息等要素创新及其综合集成\u003cbr\u003e\n服务设计的作用：提升服务体验、效率和价值\u003c/p\u003e\n\u003ch2 id=\"参考文献\"\u003e参考文献\u003c/h2\u003e\n\u003cp\u003e[1]胡飞,李顽强.定义“服务设计”[J].包装工程,2019,40(10):37-51.\u003c/p\u003e","title":"什么是服务设计？"},{"content":"你好，我是肖翔涛（Shawn）。过去四年，我一直从事 B2B 电商、支付与结算产品工作。目前，我在新加坡南洋理工大学全日制攻读计算机硕士（应用人工智能）。我正在寻找一份为期六个月、与 AI 产品或应用 AI 相关的实习，可立即到岗。\n我能带来什么经验：四年来，我一直在国内领先的 B2B 医药交易平台药师帮从事产品工作。我熟悉电商、支付与采购业务，能理清用户、商家和平台之间的交易关系，以及订单、账户、资金和履约系统如何配合。支付成本优化、商务谈判和新业务探索，也让我逐渐形成了对成本、收益与合作方诉求的商业理解。我熟悉从需求分析、方案评审到开发协作、测试验收和上线迭代的软件交付流程，能和业务、设计、研发团队一起把方案落地，并取得不错的成果。 我现在在做什么：动手做桌面学习助手、课程转写与笔记工作流，用同样的输入比较不同模型，看看实际用起来效果如何。学到的东西也会整理在这个站上——AI Agent、RAG、提示词工程、Transformer。 AI 项目 DesktopPet 与 NTU-Learn Downloader · 独立项目 · 2026 年 9 月\n用 AI coding agent 协作做了两个现在上课、听讲座时会用的工具：一只支持对话、查词和实时字幕的桌面宠物，以及课程录像转写与双语字幕工作流。课后再把录音整理成学习笔记。 用真实课程录音对比语音识别和翻译模型，权衡术语、可读性、处理耗时与内存占用，分别为实时字幕和课后更准确的转写选择方案。 语音识别和翻译主要用本地模型，术语提取和笔记生成交给 Sonnet；通过代码检查数字、引文和时间戳，在使用产出前拦下错误。 隐私政策文本分类 · 本科毕业论文 · 2020 年\n针对 App 隐私政策文本做分类，对比 Word2Vec 与 Doc2Vec 两种表示方法，配合 SVM 与引入注意力机制的 Bi-LSTM 分类器。 以 F1 比较分类效果，观察表示方法与分类器选择各自对结果的影响。 产品经验 药师帮（港交所：9885） · 产品经理 · 2021 年 4 月 – 2025 年 4 月；2026 年 4 – 7 月 B2B 医药交易平台。2026 年回归主导风控分析与调查工具建设。\n风控分析与调查工具（2026 年 4 – 7 月）\n主导识别爬取价格或帮助厂家查价的异常账号，同时避免误伤共用账号、设备的正常药店采购用户。 用 337 万条记录对比五组规则配置，通过补齐和纠正 IP 地理位置、过滤可信设备，使风险用户识别净增 6%。 将爬虫账号自动拉黑与释放、基于数据的黑名单复核和调查平台投入使用，脚本与工具通过 AI 辅助编程完成。 电商平台（2024 年 1 月 – 2025 年 4 月）\n将连锁药店的采购诉求转化为智能采购流程，约 30 秒匹配 300 个品种的清单，一年内新增覆盖约 600 家 KA 客户；同时协调连锁总部 ERP 对接。 将整箱采购从促销试验做成独立采购入口，打通件规、商家上架与搜索流程。 按客群分析点击和浏览数据，迭代 PC 端，用更符合需求的入口替换低价值功能，改版相关模块点击率提升约 200%。 支付与结算（2021 年 4 月 – 2024 年 1 月）\n作为支付方向唯一的产品经理，主导迁移至平安银行的银行分账方案，定义账户体系、资金分配与对账流程。 作为主要产品对接人，负责支付宝、银联、平安银行及第三方支付机构的合作，包括商务条款谈判，并协调系统接入、问题处理和定期服务复盘。 通过渠道费率谈判、支付路由调整和低成本支付方式推广，2023 年净节省支付处理成本 3,070 万元人民币。 通过收银台引导与支付营销，将快捷银行卡与云闪付合计交易额占比在一年内从约 5% 提升至 30% 以上。 用埋点、用户旅程、问卷和访谈定位新支付方式的使用摩擦，并联合支付宝优化支付流程。 设计支付渠道监控与自动或一键处置流程，将异常发现、告警和处置缩短到一分钟以内。 资金流改动会影响多个团队，因此我需要与财务、法务、供应链和研发一起解决分歧，并推动合规方案从达成共识到正式上线。 一些相关的经验沉淀：国内电商平台支付方式对比、跨境支付入门、反诈反洗钱与风控。\n教育背景 南洋理工大学 · 2026 年 8 月至今\n计算机硕士（应用人工智能，全日制）\n中山大学 · 2016 年 – 2020 年 6 月\n管理学学士，信息管理与信息系统\n技能 产品 — 需求分析、用户研究、用户旅程、支付路由与结算设计。 合作方与跨部门协作 — 商务条款谈判、银行及支付机构接入，以及财务／法务／供应链／研发协同交付。 AI — 模型对比与选型、语音识别和翻译评估、agent 工作流与验收标准设计。 数据与工具 — SQL、Python 数据分析、Tableau、Jupyter、Git 与 AI coding agent。 语言 — 中文（母语）、英文（雅思 7.0）。 工作之外 我喜欢摄影、自驾旅行，也会去看艺术和建筑展览，有些见闻也会记录在这个站上。个人网站已经维护了好几年，最近一次折腾，是借助 AI 把它从 WordPress 搬到了 Hugo。\n联系我 如果你在招 AI 产品或应用 AI 方向的实习生——或者只是想聊聊支付、agent、模型的真实行为——欢迎找我。\n📧 xxt9660@gmail.com · 💼 LinkedIn · 💻 GitHub\n","permalink":"https://www.xiaoxiangtao.cn/zh/about-me/","summary":"\u003cp\u003e你好，我是\u003cstrong\u003e肖翔涛\u003c/strong\u003e（Shawn）。过去四年，我一直从事 B2B 电商、支付与结算产品工作。目前，我在新加坡\u003cstrong\u003e南洋理工大学全日制攻读计算机硕士（应用人工智能）\u003c/strong\u003e。\u003cstrong\u003e我正在寻找一份为期六个月、与 AI 产品或应用 AI 相关的实习，可立即到岗。\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003e我能带来什么经验\u003c/strong\u003e：四年来，我一直在国内领先的 B2B 医药交易平台药师帮从事产品工作。我熟悉电商、支付与采购业务，能理清用户、商家和平台之间的交易关系，以及订单、账户、资金和履约系统如何配合。支付成本优化、商务谈判和新业务探索，也让我逐渐形成了对成本、收益与合作方诉求的商业理解。我熟悉从需求分析、方案评审到开发协作、测试验收和上线迭代的软件交付流程，能和业务、设计、研发团队一起把方案落地，并取得不错的成果。\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e我现在在做什么\u003c/strong\u003e：动手做桌面学习助手、课程转写与笔记工作流，用同样的输入比较不同模型，看看实际用起来效果如何。学到的东西也会整理在这个站上——\u003ca href=\"/zh/posts/learning-notes-of-ai-agent/\"\u003eAI Agent\u003c/a\u003e、\u003ca href=\"/zh/posts/learning-notes-of-rag/\"\u003eRAG\u003c/a\u003e、\u003ca href=\"/zh/posts/learning-notes-of-prompt-engineering/\"\u003e提示词工程\u003c/a\u003e、\u003ca href=\"/zh/posts/learning-notes-of-transformer/\"\u003eTransformer\u003c/a\u003e。\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"ai-项目\"\u003eAI 项目\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003e\u003ca href=\"/zh/posts/desktop-pet/\"\u003eDesktopPet\u003c/a\u003e 与 NTU-Learn Downloader\u003c/strong\u003e · 独立项目 · 2026 年 9 月\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e用 AI coding agent 协作做了两个现在上课、听讲座时会用的工具：一只支持对话、查词和实时字幕的桌面宠物，以及课程录像转写与双语字幕工作流。课后再把录音整理成学习笔记。\u003c/li\u003e\n\u003cli\u003e用真实课程录音对比语音识别和翻译模型，权衡术语、可读性、处理耗时与内存占用，分别为实时字幕和课后更准确的转写选择方案。\u003c/li\u003e\n\u003cli\u003e语音识别和翻译主要用本地模型，术语提取和笔记生成交给 Sonnet；通过代码检查数字、引文和时间戳，在使用产出前拦下错误。\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003e隐私政策文本分类\u003c/strong\u003e · 本科毕业论文 · 2020 年\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e针对 App 隐私政策文本做分类，对比 Word2Vec 与 Doc2Vec 两种表示方法，配合 SVM 与引入注意力机制的 Bi-LSTM 分类器。\u003c/li\u003e\n\u003cli\u003e以 F1 比较分类效果，观察表示方法与分类器选择各自对结果的影响。\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"产品经验\"\u003e产品经验\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003e药师帮（港交所：9885）\u003c/strong\u003e · 产品经理 · 2021 年 4 月 – 2025 年 4 月；2026 年 4 – 7 月\n\u003cem\u003eB2B 医药交易平台。2026 年回归主导风控分析与调查工具建设。\u003c/em\u003e\u003c/p\u003e","title":"关于我"}]