<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Lululove Blog</title><description>往昔之局未竞</description><link>https://lululove.top/</link><templateTheme>Firefly</templateTheme><templateThemeVersion>1.0.0</templateThemeVersion><templateThemeUrl>https://github.com/CuteLeaf/Firefly</templateThemeUrl><lastBuildDate>2026年8月19日 18:24:38</lastBuildDate><item><title>你好，Lululove Blog</title><link>https://lululove.top/posts/hello-airlove/</link><guid isPermaLink="true">https://lululove.top/posts/hello-airlove/</guid><description>这是 Lululove Blog 的第一篇文章。</description><pubDate>Tue, 21 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;欢迎来到 &lt;strong&gt;Lululove Blog&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;这里将记录我的网络安全学习、编程实践、项目开发与大学生活。&lt;/p&gt;
&lt;section&gt;&lt;h2&gt;接下来会写什么&lt;a href=&quot;#接下来会写什么&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Python、C/C++、Linux 与数据库学习笔记&lt;/li&gt;
&lt;li&gt;FastAPI、Django 和微信小程序开发记录&lt;/li&gt;
&lt;li&gt;古琴文化学习小程序的开发过程&lt;/li&gt;
&lt;li&gt;睡眠数据分析、LSTM 与智能温控项目进展&lt;/li&gt;
&lt;li&gt;旅行、摄影与阶段性总结&lt;/li&gt;
&lt;/ul&gt;&lt;blockquote&gt;&lt;p&gt;往昔之局未竞，今日仍可落子。&lt;/p&gt;&lt;/blockquote&gt;&lt;/section&gt;</content:encoded></item><item><title>古琴小程序开发记录：识谱页面终于有了第一个雏形</title><link>https://lululove.top/posts/guqin-notation-recognition-01/</link><guid isPermaLink="true">https://lululove.top/posts/guqin-notation-recognition-01/</guid><description>记录古琴小程序识谱功能的第一阶段开发，从图片选择、页面交互到后续 Django 接口规划。</description><pubDate>Wed, 19 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;section&gt;&lt;h2&gt;从一个按钮开始&lt;a href=&quot;#从一个按钮开始&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;最近继续折腾我的古琴小程序。&lt;/p&gt;&lt;p&gt;前面更多时间都花在页面结构和整体功能规划上，但一直只有页面，没有真正让我觉得“这个东西已经开始能用了”的功能。&lt;/p&gt;&lt;p&gt;所以这次我决定先把重点放到 &lt;strong&gt;识谱页面&lt;/strong&gt; 上。&lt;/p&gt;&lt;p&gt;我的想法很简单：&lt;/p&gt;&lt;p&gt;用户上传一张古琴琴谱图片，小程序识别图片中的琴谱内容，然后把结果展示出来。&lt;/p&gt;&lt;p&gt;真正做到完整识别当然还有很长一段路，但至少可以先把整个操作流程跑起来。&lt;/p&gt;&lt;p&gt;目前第一版已经有了一个比较完整的雏形。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;现在已经能做什么&lt;a href=&quot;#现在已经能做什么&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;目前识谱页面实现的流程是：&lt;/p&gt;&lt;p&gt;&lt;strong&gt;选择图片 → 显示图片 → 点击识别 → 显示识别结果&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;用户可以直接从相册选择图片，也可以调用手机摄像头拍摄。&lt;/p&gt;&lt;p&gt;小程序里我使用的是 &lt;code&gt;wx.chooseMedia&lt;/code&gt;：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;wx&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span&gt;chooseMedia&lt;/span&gt;&lt;span&gt;({&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;count&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;mediaType&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;span&gt;&apos;image&apos;&lt;/span&gt;&lt;span&gt;],&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;sourceType&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;span&gt;&apos;album&apos;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&apos;camera&apos;&lt;/span&gt;&lt;span&gt;],&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;success&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;res&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;/span&gt;&lt;span&gt;=&amp;gt;&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;tempFilePath&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;res&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span&gt;tempFiles&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;].&lt;/span&gt;&lt;span&gt;tempFilePath&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;this&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;setData&lt;/span&gt;&lt;span&gt;({&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;imagePath&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;tempFilePath&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;result&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;})&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;})&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;选择成功之后，会拿到一个临时图片路径：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;tempFilePath&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;res&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span&gt;tempFiles&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;].&lt;/span&gt;&lt;span&gt;tempFilePath&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;然后通过：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;this&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;setData&lt;/span&gt;&lt;span&gt;({&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;imagePath&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;tempFilePath&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;})&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;把图片路径保存到页面数据中。&lt;/p&gt;&lt;p&gt;这样页面就可以把用户刚刚选择的琴谱显示出来。&lt;/p&gt;&lt;p&gt;虽然只是很基础的一步，但当图片真正出现在页面上的时候，还是挺有“项目终于动起来了”的感觉。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;“开始识别”现在还只是一个演示版&lt;a href=&quot;#开始识别现在还只是一个演示版&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;图片上传之后，下一步自然就是点击“开始识别”。&lt;/p&gt;&lt;p&gt;目前我先写了一个简单的加载效果：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;wx&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span&gt;showLoading&lt;/span&gt;&lt;span&gt;({&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;title&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;识别中&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;})&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;然后暂时返回一段模拟识别结果。&lt;/p&gt;&lt;p&gt;现在的结果并不是真正通过算法得到的，而是为了先验证整个前端流程：&lt;/p&gt;&lt;p&gt;用户有没有上传图片？&lt;/p&gt;&lt;p&gt;按钮能不能正常点击？&lt;/p&gt;&lt;p&gt;识别的时候有没有加载提示？&lt;/p&gt;&lt;p&gt;识别结束后结果能不能正确显示？&lt;/p&gt;&lt;p&gt;这些功能确认没有问题以后，再把假的识别结果换成真正的后端返回数据。&lt;/p&gt;&lt;p&gt;以前写代码的时候，我经常想一次就把完整功能做完。&lt;/p&gt;&lt;p&gt;但现在慢慢发现，项目开发更适合一步一步来。&lt;/p&gt;&lt;p&gt;如果一开始同时写图片上传、Django 接口、图像处理和识别算法，一旦出错，很难判断到底是哪一层出了问题。&lt;/p&gt;&lt;p&gt;所以目前我的策略是：&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;先把前端做通，再做后端，最后接算法。&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;这样每一步都可以单独验证。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;下一步：把图片真正传给 Django&lt;a href=&quot;#下一步把图片真正传给-django&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;现在的识谱功能还全部发生在小程序前端。&lt;/p&gt;&lt;p&gt;真正完整的流程应该是：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;微信小程序&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;↓&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;用户选择琴谱图片&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;↓&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;上传图片&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;↓&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Django 后端接收&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;↓&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;识谱算法处理&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;↓&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;返回识别结果&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;↓&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;小程序展示结果&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;所以下一步我要做的，就是让小程序真正把图片发送到 Django。&lt;/p&gt;&lt;p&gt;第一版后端接口甚至不用马上做识谱。&lt;/p&gt;&lt;p&gt;可以先做到：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;收到图片&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;返回文件名&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;返回图片大小&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;返回上传成功&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;只要这一层能够成功，就意味着：&lt;/p&gt;&lt;p&gt;&lt;strong&gt;微信小程序和 Django 后端之间的图片上传链路已经打通。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;之后再慢慢把真正的琴谱识别算法接进去。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;为什么我想做识谱这个功能&lt;a href=&quot;#为什么我想做识谱这个功能&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;相比小程序里的文章展示、每日一曲这些功能，我一直觉得“识谱”是整个项目里最有意思的一部分。&lt;/p&gt;&lt;p&gt;因为它不只是把已有内容展示给用户。&lt;/p&gt;&lt;p&gt;而是用户给系统一个输入，系统真正对这个输入进行处理，再返回新的结果。&lt;/p&gt;&lt;p&gt;这种交互会让整个小程序从一个“古琴资料展示工具”，慢慢变成一个真正有功能的应用。&lt;/p&gt;&lt;p&gt;当然，现在距离真正能够识别古琴谱还很远。&lt;/p&gt;&lt;p&gt;图像预处理怎么做？&lt;/p&gt;&lt;p&gt;琴谱符号怎么识别？&lt;/p&gt;&lt;p&gt;复杂版面怎么处理？&lt;/p&gt;&lt;p&gt;识别结果以什么形式展示？&lt;/p&gt;&lt;p&gt;这些问题后面都会慢慢遇到。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;写在最后&lt;a href=&quot;#写在最后&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;现在这个识谱页面还只能算一个很早期的版本。&lt;/p&gt;&lt;p&gt;甚至真正的识谱算法都还没有接进来。&lt;/p&gt;&lt;p&gt;但相比最开始只有一个“识谱”按钮，现在至少已经有了：&lt;/p&gt;&lt;p&gt;图片选择、图片预览、识别交互和结果显示。&lt;/p&gt;&lt;p&gt;从“我想做一个识谱功能”，到屏幕上真的出现一个可以操作的页面，中间其实就是很多这样不起眼的小步骤。&lt;/p&gt;&lt;p&gt;下一步：&lt;/p&gt;&lt;p&gt;&lt;strong&gt;让图片真正跑到 Django 后端。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;等这一段跑通以后，再继续记录。&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/section&gt;</content:encoded></item><item><title>第一次用 LSTM 做睡眠预测：从看懂数据开始</title><link>https://lululove.top/posts/lstm-sleep-prediction-01/</link><guid isPermaLink="true">https://lululove.top/posts/lstm-sleep-prediction-01/</guid><description>记录智能睡眠项目中第一次接触真实 PSG 睡眠数据，以及学习 LSTM 睡眠时序预测的过程。</description><pubDate>Wed, 19 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;section&gt;&lt;h2&gt;最近开始认真学 LSTM&lt;a href=&quot;#最近开始认真学-lstm&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;最近除了继续写一些项目代码之外，我把不少时间放到了 LSTM 上。&lt;/p&gt;&lt;p&gt;原因也很直接。&lt;/p&gt;&lt;p&gt;现在正在做的智能睡眠项目，重点逐渐从“做一张温控床垫”转到了 &lt;strong&gt;睡眠数据分析和算法控制&lt;/strong&gt;。&lt;/p&gt;&lt;p&gt;硬件当然仍然重要，但真正决定系统是不是“智能”的，其实不是床垫能不能加热或者降温。&lt;/p&gt;&lt;p&gt;而是系统能不能知道：&lt;/p&gt;&lt;p&gt;&lt;strong&gt;用户现在睡得怎么样？&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;以及：&lt;/p&gt;&lt;p&gt;&lt;strong&gt;接下来可能进入什么睡眠状态？&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;如果连睡眠状态都无法判断，后面的智能温控就没有什么依据。&lt;/p&gt;&lt;p&gt;于是我开始接触 LSTM。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;第一次看到真实睡眠数据&lt;a href=&quot;#第一次看到真实睡眠数据&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;真正开始做以后，我发现第一件事根本不是搭模型。&lt;/p&gt;&lt;p&gt;而是：&lt;/p&gt;&lt;p&gt;&lt;strong&gt;先把数据看懂。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;以前学习机器学习的时候，经常使用已经整理好的数据集。&lt;/p&gt;&lt;p&gt;一行就是一个样本。&lt;/p&gt;&lt;p&gt;每一列是什么也写得清清楚楚。&lt;/p&gt;&lt;p&gt;但真实的睡眠数据完全不是这样。&lt;/p&gt;&lt;p&gt;我现在接触的是 PSG，也就是多导睡眠监测数据。&lt;/p&gt;&lt;p&gt;其中可能同时存在多个生理信号通道，例如：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;脑电信号&lt;/li&gt;
&lt;li&gt;心电信号&lt;/li&gt;
&lt;li&gt;呼吸信号&lt;/li&gt;
&lt;li&gt;血氧信号&lt;/li&gt;
&lt;li&gt;其他生理信号&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;每一个通道又对应不同的采样数据。&lt;/p&gt;&lt;p&gt;一开始打开数据的时候，最大的感觉就是：&lt;/p&gt;&lt;p&gt;&lt;strong&gt;多。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;不是几十行，也不是几千行。&lt;/p&gt;&lt;p&gt;因为生理信号是连续采样的。&lt;/p&gt;&lt;p&gt;如果采样频率是 100 Hz，那么一秒钟就会记录 100 个点。&lt;/p&gt;&lt;p&gt;一分钟就是：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;100 × 60 = 6000&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;一个小时就是：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;100 × 60 × 60 = 360000&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;如果记录一整晚，数据量很快就会上升到非常大的规模。&lt;/p&gt;&lt;p&gt;这也是我第一次比较直观地感受到什么叫“时间序列数据”。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;在训练模型之前，要先回答很多问题&lt;a href=&quot;#在训练模型之前要先回答很多问题&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;拿到数据以后，并不能直接扔进 LSTM。&lt;/p&gt;&lt;p&gt;首先要搞清楚：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;数据里一共有多少个通道？&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;每个通道分别代表什么？&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;采样频率是多少？&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;总记录时间有多长？&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;有没有缺失数据？&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;睡眠阶段标签在哪里？&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;标签和信号时间怎么对应？&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;这些问题如果没有弄清楚，后面模型训练出来的结果其实没有太大意义。&lt;/p&gt;&lt;p&gt;所以第一阶段我做的事情更像是在“认识数据”。&lt;/p&gt;&lt;p&gt;例如先读取文件基本信息：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;print&lt;/span&gt;&lt;span&gt;(raw.info)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;查看通道：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;print&lt;/span&gt;&lt;span&gt;(raw.ch_names)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;确认采样频率：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;print&lt;/span&gt;&lt;span&gt;(raw.info[&lt;/span&gt;&lt;span&gt;&quot;sfreq&quot;&lt;/span&gt;&lt;span&gt;])&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;然后再进一步确定数据持续时间。&lt;/p&gt;&lt;p&gt;这些代码看起来都很简单。&lt;/p&gt;&lt;p&gt;但真正意义并不是“打印几行信息”。&lt;/p&gt;&lt;p&gt;而是在确认：&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;我手里的数据到底是什么。&lt;/p&gt;&lt;/blockquote&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;为什么睡眠状态适合使用 LSTM&lt;a href=&quot;#为什么睡眠状态适合使用-lstm&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;睡眠本身并不是一个完全独立的分类问题。&lt;/p&gt;&lt;p&gt;假设某一个时刻人在浅睡眠。&lt;/p&gt;&lt;p&gt;下一个时刻的状态，并不是随机从：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;清醒&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;浅睡&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;深睡&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;REM&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;里面随便选择一个。&lt;/p&gt;&lt;p&gt;睡眠阶段之间存在比较明显的连续变化。&lt;/p&gt;&lt;p&gt;也就是说：&lt;/p&gt;&lt;p&gt;&lt;strong&gt;当前状态和之前发生了什么是有关联的。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;这正是时间序列问题的特点。&lt;/p&gt;&lt;p&gt;普通的全连接神经网络通常只关心当前输入。&lt;/p&gt;&lt;p&gt;而 LSTM 可以在处理序列的时候保留一部分之前的信息。&lt;/p&gt;&lt;p&gt;简单理解，可以把它想成：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;第1段睡眠数据&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span&gt;↓&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;记住一部分信息&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span&gt;↓&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;第2段睡眠数据&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span&gt;↓&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;继续更新记忆&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span&gt;↓&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;第3段睡眠数据&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span&gt;↓&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;预测睡眠状态&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;当然，这只是非常简单的理解。&lt;/p&gt;&lt;p&gt;真正训练的时候还要考虑窗口划分、特征维度、隐藏层、批次大小等很多参数。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;第一阶段，我不准备追求很高的准确率&lt;a href=&quot;#第一阶段我不准备追求很高的准确率&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;刚开始接触模型的时候很容易特别关注一个数字：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Accuracy&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;好像准确率越高，模型就越厉害。&lt;/p&gt;&lt;p&gt;但对于我现在这个阶段来说，我反而觉得：&lt;/p&gt;&lt;p&gt;&lt;strong&gt;先把整个流程跑通更重要。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;我的第一阶段目标大致是：&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;读取 PSG 数据&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;↓&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;选择需要的信号&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;↓&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;进行预处理&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;↓&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;划分时间窗口&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;↓&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;对应睡眠阶段标签&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;↓&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;构建 Dataset&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;↓&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;送入 LSTM&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;↓&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;完成训练&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;↓&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;输出预测结果&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;显示更多&lt;/span&gt;&lt;span&gt;显示更少&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;哪怕第一版准确率很一般，只要完整流程跑通，就意味着之后有很多地方可以继续调整。&lt;/p&gt;&lt;p&gt;例如：&lt;/p&gt;&lt;p&gt;窗口到底应该取多长？&lt;/p&gt;&lt;p&gt;输入原始信号还是提取特征？&lt;/p&gt;&lt;p&gt;LSTM 用一层还是多层？&lt;/p&gt;&lt;p&gt;hidden size 应该是多少？&lt;/p&gt;&lt;p&gt;不同信号组合效果有没有差异？&lt;/p&gt;&lt;p&gt;这些都可以在第一版模型之后慢慢实验。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;数据处理可能比模型本身更麻烦&lt;a href=&quot;#数据处理可能比模型本身更麻烦&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;这是最近最大的一个感受。&lt;/p&gt;&lt;p&gt;以前看很多深度学习教程的时候，注意力几乎都放在模型上。&lt;/p&gt;&lt;p&gt;比如：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;model &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;LSTM&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;...&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;然后：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;loss.&lt;/span&gt;&lt;span&gt;backward&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;optimizer.&lt;/span&gt;&lt;span&gt;step&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;看起来最核心的事情就是训练神经网络。&lt;/p&gt;&lt;p&gt;但真正处理真实数据以后会发现：&lt;/p&gt;&lt;p&gt;模型代码反而可能是最短的一部分。&lt;/p&gt;&lt;p&gt;真正花时间的是：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;读取&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;清洗&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;对齐&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;切片&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;归一化&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;标签处理&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;数据检查&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;如果这些步骤有问题，后面再复杂的网络也没什么意义。&lt;/p&gt;&lt;p&gt;所以现在我越来越觉得：&lt;/p&gt;&lt;p&gt;机器学习项目首先是一个&lt;strong&gt;数据问题&lt;/strong&gt;，其次才是模型问题。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;后面还想做什么&lt;a href=&quot;#后面还想做什么&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;目前 LSTM 还处在学习和第一版实验阶段。&lt;/p&gt;&lt;p&gt;接下来准备继续尝试：&lt;/p&gt;&lt;p&gt;&lt;strong&gt;第一步：完成数据预处理&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;把原始 PSG 数据整理成适合神经网络使用的格式。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;第二步：完成一个基础 LSTM&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;不追求特别复杂，先完成睡眠阶段预测。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;第三步：评价模型效果&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;除了 Accuracy，还需要关注不同睡眠阶段的识别情况。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;第四步：继续优化&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;尝试不同时间窗口、特征组合以及网络结构。&lt;/p&gt;&lt;p&gt;再往后，才是整个项目真正比较有意思的部分：&lt;/p&gt;&lt;p&gt;把睡眠预测结果和温控策略结合起来。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;写在最后&lt;a href=&quot;#写在最后&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;现在回头看，这个项目让我重新理解了“学习一个算法”是什么意思。&lt;/p&gt;&lt;p&gt;以前学习 LSTM，可能是：&lt;/p&gt;&lt;p&gt;看原理、抄代码、跑一个示例。&lt;/p&gt;&lt;p&gt;现在学习 LSTM，则变成了：&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;我手里真的有一份睡眠数据，我需要让这个模型解决一个实际问题。&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;这种感觉完全不一样。&lt;/p&gt;&lt;p&gt;现在还只是刚开始。&lt;/p&gt;&lt;p&gt;第一阶段甚至连模型效果都还谈不上。&lt;/p&gt;&lt;p&gt;但至少已经从“LSTM 是什么”，慢慢走到了：&lt;/p&gt;&lt;p&gt;&lt;strong&gt;怎么把真实的睡眠数据交给 LSTM。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;等第一版模型真正训练起来，再继续写下一篇。&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/section&gt;</content:encoded></item><item><title>关于这个小站</title><link>https://lululove.top/posts/my-first-post/</link><guid isPermaLink="true">https://lululove.top/posts/my-first-post/</guid><description>记录 Lululove Blog 建立的初衷，以及未来想在这里留下的内容。</description><pubDate>Sun, 26 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;欢迎来到 &lt;strong&gt;Lululove Blog&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;这是属于我的一片小天地，也是我用来记录生活、学习与成长的地方。&lt;/p&gt;
&lt;section&gt;&lt;h2&gt;为什么建立这个博客&lt;a href=&quot;#为什么建立这个博客&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;生活中有很多值得被记住的瞬间。&lt;/p&gt;&lt;p&gt;可能是一次项目顺利运行时的开心，也可能是学习新知识时的收获，还可能是一张照片、一首歌曲，或者某一天突然产生的想法。&lt;/p&gt;&lt;p&gt;我希望把这些内容记录下来，让它们不会轻易被时间遗忘。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;以后会记录什么&lt;a href=&quot;#以后会记录什么&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;编程与网络安全学习笔记&lt;/li&gt;
&lt;li&gt;项目开发过程和遇到的问题&lt;/li&gt;
&lt;li&gt;大学生活与志愿活动&lt;/li&gt;
&lt;li&gt;旅行、摄影和日常随笔&lt;/li&gt;
&lt;li&gt;音乐以及值得纪念的瞬间&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;这个小站现在还很简单，但我会慢慢完善它。&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;往昔之局未竞&lt;/p&gt;&lt;/blockquote&gt;&lt;/section&gt;</content:encoded></item></channel></rss>