diff --git a/.github/workflows/hexo.yml b/.github/workflows/hexo.yml new file mode 100644 index 00000000..88b14c91 --- /dev/null +++ b/.github/workflows/hexo.yml @@ -0,0 +1,42 @@ +name: Hexo Blog Deploy + +on: [push] + +jobs: + build: + + runs-on: ubuntu-18.04 + steps: + - uses: actions/checkout@master + - name: Prepare Node.js + uses: actions/setup-node@v1 + with: + node-version: 10.x + - name: Generate pages + run: | + npm install + ./node_modules/hexo/bin/hexo clean + ./node_modules/hexo/bin/hexo generate + echo "hexo generate done!" + - name: Deploy + env: + GITHUB_TOKEN: ${{ secrets.BLOG_DEPLOY }} + run: | + REPOSITORY_PATH="https://x-access-token:${GITHUB_TOKEN}@github.com/joeltsui/joeltsui.github.io.git" + + cd public/ + git init + git config user.name "${GITHUB_ACTION}" + git config user.email "${GITHUB_ACTOR}@users.noreply.github.com" + + git remote add origin "${REPOSITORY_PATH}" + git add --all + + echo "Start commit" + git commit --allow-empty -m "Deploy to master" + + echo "Start push" + git push origin master --force + + echo "Finish deploy" + diff --git a/.gitignore b/.gitignore index dd05dde7..221e9fd1 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,6 @@ node_modules tmp source/CNAME +package-lock.json +db.json +public \ No newline at end of file diff --git a/README.md b/README.md index f9c959c5..066a74cc 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ A brand new default theme for [[Hexo](https://hexo.io)]. [Preview](http://cofess.github.io/) | [中文说明文档](README.cn.md) | [iconfont](http://blog.cofess.com/hexo-theme-pure/iconfont/demo_fontclass.html) -![](screenshot/pure.png) +![](themes/pure/screenshot/pure.png) ## Features @@ -14,13 +14,13 @@ A brand new default theme for [[Hexo](https://hexo.io)]. [Preview](http://cofes ## Skins -![](screenshot/pure-theme-black.png) +![](themes/pure/screenshot/pure-theme-black.png) -![](screenshot/pure-theme-blue.png) +![](themes/pure/screenshot/pure-theme-blue.png) -![](screenshot/pure-theme-green.png) +![](themes/pure/screenshot/pure-theme-green.png) -![](screenshot/pure-theme-purple.png) +![](themes/pure/screenshot/pure-theme-purple.png) ## Appearance diff --git a/_config.yml b/_config.yml index 1836723f..99525ed5 100644 --- a/_config.yml +++ b/_config.yml @@ -1,236 +1,101 @@ -# menu -menu: - Home: . - Archives: archives # 归档 - Categories: categories # 分类 - Tags: tags # 标签 - Repository: repository # github repositories - Books: books # 豆瓣书单 - Links: links # 友链 - About: about # 关于 - -# Enable/Disable menu icons -menu_icons: - enable: true # 是否启用导航菜单图标 - home: icon-home-fill - archives: icon-archives-fill - categories: icon-folder - tags: icon-tags - repository: icon-project - books: icon-book-fill - links: icon-friendship - about: icon-cup-fill - -# rss -rss: /atom.xml +# Hexo Configuration +## Docs: https://hexo.io/docs/configuration.html +## Source: https://github.com/hexojs/hexo/ # Site -site: - logo: - enabled: true - width: 40 - height: 40 - url: ../images/logo.png - title: Hexo # 页面title - favicon: /favicon.png - board:
欢迎交流与分享经验!
# 站点公告 - copyright: false # 底部版权信息 - -# config -config: - skin: # 主题颜色 theme-black theme-blue theme-green theme-purple - layout: main-center # 布局方式 main-left main-center main-right - toc: true # 是否开启文章章节目录导航 - menu_highlight: false # 是否开启当前菜单高亮显示 - thumbnail: false # enable posts thumbnail, options: true, false - excerpt_link: Read More - -# Pagination -pagination: - number: false - prev: - alwayShow: true - next: - alwayShow: true - -# Sidebar -sidebar: right -widgets: - - board - - category - - tag - - tagcloud - - archive - - recent_posts - -# display widgets at the bottom of index pages (pagination == 2) -index_widgets: -# - category -# - tagcloud -# - archive - -# widget behavior -archive_type: 'monthly' -show_count: true - -# Fancybox -fancybox: false - -# Search -search: - insight: true # you need to install `hexo-generator-json-content` before using Insight Search - baidu: false # you need to disable other search engines to use Baidu search - -# Donate -donate: +title: 理想国 +subtitle: '一个码农的自留地' +description: '这是一个有趣的世界' +keywords: +author: Joel Tsui +language: zh +timezone: '' + +# URL +## If your site is put in a subdirectory, set url as 'http://yoursite.com/child' and root as '/child/' +url: http://joeltsui.github.io +root: / +permalink: :year/:month/:day/:title/ +permalink_defaults: +pretty_urls: + trailing_index: true # Set to false to remove trailing index.html from permalinks + +# Directory +source_dir: source +public_dir: public +tag_dir: tags +archive_dir: archives +category_dir: categories +code_dir: downloads/code +i18n_dir: :lang +skip_render: + +# Writing +new_post_name: :title.md # File name of new posts +default_layout: post +titlecase: false # Transform title into titlecase +external_link: + enable: true # Open external links in new tab + field: site # Apply to the whole site + exclude: '' +filename_case: 0 +render_drafts: false +post_asset_folder: false +relative_link: false +future: true +highlight: enable: true - # 微信打赏 - wechatpay: - qrcode: images/donate/wechatpayimg.png - title: 微信支付 - # 支付宝打赏 - alipay: - qrcode: images/donate/alipayimg.png - title: 支付宝 - -# Share -# weibo,qq,qzone,wechat,tencent,douban,diandian,facebook,twitter,google,linkedin -share: - enable: true # 是否启用分享 - sites: weibo,qq,wechat,facebook,twitter # PC端显示的分享图标 - mobile_sites: weibo,qq,qzone # 移动端显示的分享图标 + line_number: true + auto_detect: false + tab_replace: '' + +# Home page setting +# path: Root path for your blogs index page. (default = '') +# per_page: Posts displayed per page. (0 = disable pagination) +# order_by: Posts order. (Order by date descending by default) +index_generator: + path: '' + per_page: 10 + order_by: -date + +# Category & Tag +default_category: uncategorized +category_map: +tag_map: + +# Metadata elements +## https://developer.mozilla.org/en-US/docs/Web/HTML/Element/meta +meta_generator: true + +# Date / Time format +## Hexo uses Moment.js to parse and display date +## You can customize the date format as defined in +## http://momentjs.com/docs/#/displaying/format/ +date_format: YYYY-MM-DD +time_format: HH:mm:ss +## Use post's date for updated date unless set in front-matter +use_date_for_updated: true -# Github -github: - username: cofess # github username - -# Comment -# Gitment -# Introduction: https://imsun.net/posts/gitment-introduction/ -comment: - type: valine # 启用哪种评论系统 - disqus: # enter disqus shortname here - youyan: - uid: 1783844 # enter youyan uid - livere: - uid: # enter youyan uid - gitment: - githubID: - repo: - ClientID: - ClientSecret: - lazy: false - gitalk: # gitalk. https://gitalk.github.io/ - owner: #必须. GitHub repository 所有者,可以是个人或者组织。 - admin: #必须. GitHub repository 的所有者和合作者 (对这个 repository 有写权限的用户)。 - repo: #必须. GitHub repository. - ClientID: #必须. GitHub Application Client ID. - ClientSecret: #必须. GitHub Application Client Secret. - valine: # Valine. https://valine.js.org - appid: # your leancloud application appid - appkey: # your leancloud application appkey - notify: false # mail notifier , https://github.com/xCss/Valine/wiki - verify: false # Verification code - placeholder: Just go go # comment box placeholder - avatar: mm # gravatar style - meta: nick,mail,link # custom comment header - pageSize: 10 # pagination size - visitor: false # Article reading statistic https://valine.js.org/visitor.html - -# douban 豆瓣书单 -# Api: - # https://developers.douban.com/wiki/?title=book_v2 图书 - # https://developers.douban.com/wiki/?title=movie_v2 电影 -# books: - # https://api.douban.com/v2/book/user/:name/collections?start=0&count=100 个人书单列表 -# movies: - # https://api.douban.com/v2/movie/in_theaters 正在上映的电影 - # https://api.douban.com/v2/movie/coming_soon 即将上映的电影 - # https://api.douban.com/v2/movie/subject/:id 单个电影信息 - # https://api.douban.com/v2/movie/search?q={text} 电影搜索 -douban: - user: # 豆瓣用户名 - start: 0 # 从哪一条记录开始 - count: 100 # 获取豆瓣书单数据条数 - -# PV -pv: - busuanzi: - enable: false # 不蒜子统计 - leancloud: - enable: false # leancloud统计 - app_id: # leancloud码农
+
+### 本地端口转发
+假设,我有个服务运行在远程服务器上,如上图中的Host B,这个服务会监听远程服务器的143端口,当有消息过来的时候进行处理。
+
+在本地有个应用程序的客户端,它可以通过TCP/IP与远程服务进行通信。现在我希望本地的客户端程序通过SSH隧道进行通信。
+
+就可以使用以下的命令:
+```
+ssh -L
+
+但是,实际的使用中,我们省略了`localhost`,并且用`localhost`代替`remotehost`,这是为什么呢?
+```
+ssh -L
+
+
+
+
+
+
+
+
+
+
+
+## 第六章 DeepIntent模型在信息检索领域的应用
+普通的RNN可以接收一系列的输入,最后输出一个结果,当然中间也有结果输出,只是在最后的时候这部分很难用上,有时候我们要叠加LSTM模块,前一个模块的所有输出都引入到后一个模块上。还有另一种做法就是引入**注意力机制**,把中间的所有输出也都加上,然后通过一个权重向量得到一个输出。
+
+我们在表达的时候其实是有重点的,有些词语很重要,有些词语去了也没有关系,词语的重要程度是不同的,因此引入注意力机制。
+
+注意力机制的整个流程我们可以总结为下。
+
+我们先假设一种场景,用户输入一个句子`$X=\{ x_1, x_2,...,x_t \}$`,然后我们要根据用户的输入要给他推荐广告。其中`$x_t \in \mathbb{R}^V$`,这里的`$V$`表示的是向量的纬度,表示词典中不同词的个数,然后通过one-hot方法把原始输入映射成特征向量。
+
+有了特征向量之后,我们先进行一层特征提取,通过embedding层对原始特征向量进行变换。
+
+$$
+e_t = W_{emb}x_t, s.t. W_{emb} \in \mathbb{R}^{d_{emb}\times V}
+$$
+
+其中的`$d_{emb}$`就是生成的嵌入式向量的大小。
+
+经过嵌入式层的操作以后,就生成了`$\{e_1, e_2, ... , e_t\}$`的特征向量。
+
+通过简单的RNN的网络,我们可以有以下操作。
+
+$$
+h_t = H(e_t, h_{t-1})
+$$
+
+其中的`$H$`就是RNN的映射权重,他是一个非线性的映射。可以有多种选择。每一个输入都能得到一个输出,到现在就有输出`$\{h_1, h_2, ... ,h_t \}$`.
+
+所谓的注意力机制就是对于每一个输出都有一个权重,最后得到一个输出.
+
+$$
+h = \sum_{t=1}^{T}\alpha_th_t, \alpha_t = \frac{\exp^{s(h_t;\theta)}}{\sum_{t=1}^T(\exp^{s(h_t;\theta)})}
+$$
+
+这个`$\alpha_t$`就是我们的权重,这个权重通过`$s(h_t;\theta)$`得到概率分布,这就是所说的注意力模型网络。整个过程就是如下图所示了。
+
+
+
+**在经过注意力模型`$s(h_t;\theta)$`后输出了一系列的值,这个值经过上面的公式计算变成权重。但是直接输出的值还经过了一道加工,就是把所有的值都减去了最大值,这样保证所有的值都是小于等于0,如果其中的最大值比较大,按照指数增长的趋势,可能会造成溢出。**
+
+但是整个流程下来,loss怎么计算其实还不是很清晰。
+
+输入用户的输入,就是类似于图像中的像素,是一系列的特征,然后每经过一次RNN的网络,它输出的不是一个数值,而是一个特征向量,通过注意力模型得到的分数是每一个分量的分数,最后经过权重计算后得到的也是一个向量,用这个向量和广告得到的特征向量进行比较,可以得到两个特征向量的相似度。在我们平时的计算中,一个例子进行就有负样本,但是我们这里是要通过输入才有负样本,也就是一个batch输入既有正样本也有负样本,然后把这个看成一体计算loss。
+
+
+## 第七章 图像识别及在广告搜索方面的应用
+
+从特征提取模型中提取出1024维的特征向量,但是这个特征向量还是很长,因此还需要把特征向量进行压缩,压缩的方法可以通过PCA或者Rich-CDSSM算法提取成64维的特征向量。然后通过ANN(近似最邻近)来搜索两个向量之间的相似度。找出和query图像相似的内容。
+
+书中也提到了NGS(邻域图搜索,Query-drive Iterated Neighborhood Graph Search for Large Scale Indexing)。这个可以参考一下用于向量的搜索。
+
+Rich-CDSSM的算法到底是什么
+
+## 第八章 Seq2Seq模型在聊天机器人中的应用
+最重要的部分一点代码也没有,很多问题也根本没有说清楚。
+
+## 第九章 word2vec的改进:fastText模型
+word2vec中我们通过单词的n-gram方法构建输入输出对,但是会遇到生僻词、未知词,这个就没办法了。但是英文单词中很多单词是由词根等构成的,我们可以在单词的层面应用n-gram方法,这个就是*subword*了。每一个单词由多个特征向量构成,每一个特征向量就是我们的subword。
+
+本章最重要的内容就是**分层softmax**算法,其实我在实际中就遇到过,在求解softmax的值的时候,如果维度太大,会导致计算机内存不够算不下来,这里提出了分层的softmax算法。
+
+所谓的分层softmax就是对所有的类构建成树状结构,把softmax的多分类变成sigmoid二分类。
+
+## 第十章 生成对抗网络
+
+
+
+## 第十三章 深度学习的下一个浪潮
+我觉得未来的深度学习还是得在强化学习上面,其他方面也肯定大有作为,想想看互联网刚出来的时候不过是应用在很小范围内,但是现在几乎生活的方方面面都是计算机和互联网,未来深度学习或者机器学习会普及到生活的方方面面,显然现在还远远没有达到。
\ No newline at end of file
diff --git a/source/_posts/linear-regression.md b/source/_posts/linear-regression.md
new file mode 100644
index 00000000..37a90bd8
--- /dev/null
+++ b/source/_posts/linear-regression.md
@@ -0,0 +1,178 @@
+---
+title: "机器学习实践——线性回归(Linear Regression)"
+date: 2018-08-24
+mathjax: true
+---
+
+## 0x00 回归问题的引入
+有一批数据集,现在希望找出一个公式去拟合这批数据集,至于用几个参数,参数都是几阶,就看具体的数据集了。回归问题更像是解方程,有未知数,有训练集作为方程,几对训练集就有多少个方程,当方程数=未知数个数,有唯一解,当方程数>未知数个数,可能就无解,当方程数<未知数个数,有大于一个解。只不过现实中的数据都没有那么理想,并不能100%得到拟合,**只能是选取参数,尽可能的去拟合已有的数据。**
+
+## 0x01 线性回归问题概述
+现在我们有一批数据集`$(\overrightarrow{x}^{(i)},y^{(i)}),i\in[1,m]$`,数据总共有`$m$`组,`$\overrightarrow{x}$`表示的是向量,可以是多维的数据`$\overrightarrow{x}=(x_{0},x_{1},...,x_{n})$`,总共有`$n \times 1$`维的特征。
+对于我们来说,特征就是我们的输入,我们希望通过`$\overrightarrow{x}$`的输入得到我们的输出`$y$`。每一个特征都有对应的系数,因此有`$\overrightarrow{\theta}$`,其大小也是`$n \times 1$`。我们要求的就是这个`$\overrightarrow{\theta}$`.
+
+总的来说,我们就是希望能够得到以下的关系
+
+$$
+y^{(i)} = \overrightarrow{\theta}^{T}\overrightarrow{x}^{(i)}
+$$
+
+方便起见,向量符号统一去掉。
+
+现实中肯定是没有那么好的数据的,并不能保证拟合所有的已知点。我们只是**尽可能接近**的去拟合已有的数据。
+
+尽可能拟合其实包含了两层的意思。一层是估计值和实际值尽可能的接近,也就是说每一个训练集与预测值的误差的总和尽可能的小。另一层是指尽可能的拟合更多的数据,比如有一组参数可以拟合100个点,另一组参数可以拟合1000个点,我们肯定是选择后者参数。
+
+根据上面的两个思路就有了两种解法。
+
+## 0x02 误差角度的线性回归分析
+
+对于第一层意思,其实就是最小二乘法里面用到的。误差
+
+$$
+\varepsilon=|y^{(i)} - \theta^{T}x^{(i)}|
+$$
+
+将所有的训练数据误差进行累加。
+
+$$
+L=\frac{1}{2}\sum_{i}^{m}(y^{(i)} - \theta^{T}x^{(i)})^2.
+$$
+
+
+$$
+\begin{split}
+\delta&=
+\begin{bmatrix}
+y^{1}\\
+y^{2}\\
+\cdots \\
+y^{m}
+\end{bmatrix}
+-
+\begin{bmatrix}
+\theta^{T}x^{1}\\
+\theta^{T}x^{2}\\
+\cdots \\
+\theta^{T}x^{m}
+\end{bmatrix}\\
+&=
+\begin{bmatrix}
+y^{1} - \theta^{T}x^{1}\\
+y^{2} - \theta^{T}x^{2}\\
+\cdots \\
+y^{m} - \theta^{T}x^{m}
+\end{bmatrix}
+=Y - X\theta
+\end{split}
+$$
+
+式子`$(1)$`用矩阵可以表示为
+
+$$
+L=\frac{1}{2}\sum_{i}^{m}(y^{(i)} - \theta^{T}x^{(i)})^2 = \frac{1}{2}(Y-X\theta)^{T}(Y-X\theta)
+$$
+
+为了让误差最小,对`$L$`进行求导,就能得到最值点。
+
+$$
+\begin{split}
+L(y|x;\theta)&=\frac{1}{2}(Y^{T}-\theta^{T}X^{T})(Y-X\theta)\\
+&=\frac{1}{2}(Y^{T}Y-Y^{T}X\theta-\theta^{T}X^{T}Y+\theta^{T}X^{T}X\theta)
+\end{split}
+$$
+
+$$
+\begin{split}
+\frac{\partial}{\theta}L&=\frac{1}{2}(0-Y^{T}X-(X^{T}Y)^{T}+(X^TX\theta)^{T}+\theta^{T}X^{T}X)\\
+&=\frac{1}{2}(-2Y^{T}X+2\theta^{T}X^{T}X)
+\end{split}
+$$
+
+令`$\frac{\partial}{\theta}L=0$`,得到
+
+$$
+\theta^{T}X^{T}X=Y^{T}X\Leftrightarrow(X^{T}X\theta)^{T}=Y^{T}X\Leftrightarrow X^TX\theta=X^{T}Y\Leftrightarrow \theta=(X^{T}X)^{-1}X^{T}Y \tag{2}
+$$
+
+> 上面的推导过程主要的麻烦的地方就是`$\frac{\partial}{\theta}(\theta^TX^TY)$和$\frac{\partial}{\theta}(Y^TX\theta)$`怎么求。简单来说就是当`$\theta$`在前面的时候,求导的时候后面要进行转置,当`$\theta$`在后面的时候,保留前面的参数即可。
+
+## 0x03 概率角度的线性回归分析
+我们的预测值和实际值存在出入,我们考虑一个较为合理的假设,假设这个误差是一个正太分布,其概率密度就是属于`$\epsilon \sim (\mu,\sigma^2)$`,其均值假设为0(这个假设也是合理的,比较可以把这部分的值分到截距那块)。因此有
+
+$$
+y^{i}=\theta^{T}x^{i}+\epsilon^{i}
+$$
+
+$$
+p(\epsilon^{i})=p(y^{i}-\theta^{T}x^{i})=p(y^{i}|x^{i};\theta)\tag{3}
+$$
+
+> 怎么看待`$(3)$`式也是个问题,这里可以这样去理解。有了参数$\theta$,自变量$x$是已知的,不同因变量`$y$`的概率也就知道了,把所有的情况都考虑进去`$y$`的概率分布也就能得到了。
+
+$$
+\begin{split}
+p(y^{i}|x^{i};\theta)&=\frac{1}{\sqrt{2\pi}\sigma}e^{-\frac{(\epsilon^{i})^2}{2\sigma^2}}\\
+&=\frac{1}{\sqrt{2\pi}\sigma}e^{-\frac{(y^{i}-\theta^{T}x^{i})^2}{2\sigma^2}}
+\end{split}
+$$
+
+于是就有了关于预测值`$\hat{y}$`的概率分布情况。
+
+上面我们一直在强调一个观点,那就是,基本上是做不到拟合所有的点的,我们的目标是**拟合尽可能多的点**,比如对于正太分布,`$x=0$`的时候的概率是最高的,那么我们就用这最多的点去拟合我们的方程。所以有了所谓的**最大似然估计**。
+
+每个样本都是独立同分布,因此所有的样本的概率分布可以这样计算:
+
+$$
+P=\prod_{i}^{m}(\frac{1}{\sqrt{2\pi}\sigma}e^{-\frac{(y^{i}-\theta^{T}x^{i})^2}{2\sigma^2}})
+$$
+
+因为我们只是找最值,因此两边都取$log$:
+
+$$
+\begin{split}
+L=\ln{P}&=\sum_{i}^{m}(\ln{(\frac{1}{\sqrt{2\pi}\sigma}e^{-\frac{(y^{i}-\theta^{T}x^{i})^2}{2\sigma^2}})})\\
+&=\sum_{i}^{m}(\ln(\frac{1}{\sqrt{2\pi}\sigma})+(-\frac{1}{2\sigma^2}(y^{i}-\theta^{T}x^{i})^2))\\
+&=m\ln(\frac{1}{\sqrt{2\pi}\sigma})+(-\frac{1}{2\sigma^2})\sum_{i}^{m}((y^{i}-\theta^{T}x^{i})^2)
+\end{split}
+$$
+
+为了求最值,和`$\sigma$`是无关的。为了求$L$的最大值,就是求`$\frac{1}{2}\sum_{i}^{m}((y^{i}-\theta^{T}x^{i})^2$`的最小值。于是又回到了式`$(1)$`。接下去的推导就如上所述了。
+
+## 0x04 过拟合与正则
+当然,还有过拟合的问题。理论上,越多的参数越是能够拟合训练数据,参数到一定程度的时候,实现0误差也不是不可能,但是,这不是我们想要的,因为他的泛化能力特别差,很多数据是因为噪声造成的,而噪声不是通过训练数据去预测的。因此,我们需要控制参数。
+
+## 0x05 Coding Example
+以Python为例,测试一下简单的实现。随机生成一系列的自变量`$x^{i}$`,然后取`$y=ax+b,a=1.5, b=4.3$`,得到一系列的`$y$`,加上随机噪声,根据`$(x^{i},y^{i})$`点对计算出参数`$a,b$`。
+
+按照式`$(2)$`,可以的到
+
+$$
+X=
+\begin{bmatrix}
+x^{1} & 1 \\
+x^{2} & 1 \\
+\cdots & \cdots \\
+x^{m} & 1
+\end{bmatrix}
+$$
+
+$$
+Y=
+\begin{bmatrix}
+y^{1} \\
+y^{2} \\
+\cdots \\
+y^{m}
+\end{bmatrix}
+$$
+
+$$
+\theta=
+\begin{bmatrix}
+a\\
+b
+\end{bmatrix}
+$$
+
+直接将数据代入到`$(2)$`式中即可计算得到`$\theta$`。
\ No newline at end of file
diff --git a/source/_posts/mac-appication-config.md b/source/_posts/mac-appication-config.md
new file mode 100644
index 00000000..06dc08a6
--- /dev/null
+++ b/source/_posts/mac-appication-config.md
@@ -0,0 +1,34 @@
+---
+title: "mac应用配置总结"
+date: 2018-06-12
+---
+
+## 0x00 前言
+我有一种强迫症,如果IDE丑,就会浑身难受,而如果工具长得好看,写代码的动力都会上来的。最近对mac上常用的工具进行了一些配置,让他们看上去更优雅。写个总结的文章。其实总结起来就是Material Design,基本把我的工具都换成了这种风格。
+
+## 0x01 Visual Studio Code
+最近沉迷于Material Design的风格,配色很是让我喜欢。因此Visual Studio Code也搞了一套。主题采用的是[Material Palenight Theme](https://marketplace.visualstudio.com/items?itemName=whizkydee.material-palenight-theme),然后把字体改成了`Meslo LG M Regular`,最近也是沉迷于这个字体。具体的配置如下,图标等也换了一下,感觉还不错。
+``` json
+"workbench.colorTheme": "Material Theme Palenight",
+"editor.fontFamily": "Meslo LG M Regular ,Menlo, Monaco, 'Courier New' monospace",
+"editor.fontSize": 14,
+"materialTheme.fixIconsRunning": false,
+"workbench.iconTheme": "eq-material-theme-icons-palenight"
+```
+
+## 0x02 Clion IntelliJ
+Jetbrains全家桶简直的棒呆。Clion用来写C++的代码也是非常的爽,而且还能够调试远程Linux环境下的代码,一直苦于离开Windows平台不能好好写C++的代码的结终于解了。
+
+Clion的主题同样是Material Design,直接在`Plugin`中搜索`Material Design UI`就可以了。然后调整一下字体还有字号,再把一些没有必要的错误警告提示的下划波浪形取消,就差不多了。风格的话选择`Atom One Dark Theme`,虽然说Atom软件做的不怎么样,但是这个设计的IDE风格确实是不错。
+
+## 0x03 Iterm2
+首先是基于[这篇文章](https://medium.com/@Clovis_app/configuration-of-a-beautiful-efficient-terminal-and-prompt-on-osx-in-7-minutes-827c29391961)对Iterm2进行改造,可以实现一些很实用的功能,并且看着也不错。
+
+主题设置好了,但是标题栏还是很丑,和整个界面不搭。再设置一下这个。
+具体的配置见如下截图。
+![](https://joeltsui.github.io/assets/images/2018-6-12-mac-theme-appearance.png)
+![](https://joeltsui.github.io/assets/images/2018-6-12-mac-theme-profiles.png)
+上面主要是把标题栏下面的白线去掉,然后启动标题栏的颜色设置。但是想要把标题栏的颜色呵背景颜色设置成一样的发现无法生效。google了才知道,mac High Serria版本已经不能修改标题栏颜色了。但是有人搞出了一些很厉害的东西,不得不佩服,见[这里](https://gitlab.com/gnachman/iterm2/issues/4080),下面有个人分别对标题栏还有背景设置了不一样的颜色,但是最后显示出来就是背景与标题栏融合了。非常厉害。
+
+
+
diff --git a/source/_posts/python-deep-learning.md b/source/_posts/python-deep-learning.md
new file mode 100644
index 00000000..7c4a15ce
--- /dev/null
+++ b/source/_posts/python-deep-learning.md
@@ -0,0 +1,198 @@
+---
+title: "《Python深度学习》读书笔记"
+date: 2019-11-25
+mathjax: true
+---
+
+## TODO
+1. 深入了解**SeparableConv**、**DepthwiseConv**、**BatchNormalization**的计算公式和操作。
+2. 如何对模型进行集成。找一些kaggle的例子。
+3. word2vec算法是什么
+4. 循环神经网络中使用dropout的原理
+5. `L-BFGS`算法是什么
+
+## 第四章 机器学习基础
+现在`dropout`操作用的很多,但是我之前全部都理解错了,在训练的时候加上`dropout`,它会屏蔽一部分的节点,在测试的时候不会屏蔽,但是输出的时候要乘以`dropout`的比率系数。(这个是为什么??测试的就是就是为了检验整个模型的效果啊,也不训练参数,为啥要乘以比率)
+
+## 第五章 深度学习用于计算机视觉
+本章对我来说收益最大的是卷积神经网络的可视化。主要有三种可视化,1. 是把每一层的激活层的输出可视化,它表示经过神经网络之后,每一层的输出结果是什么。从这个可以看出来,前面的层主要是一些边缘探测器,它几乎保留了原始图像中的所有信息,随着层数的增加,提取的信息越来越抽象,越来越难以直观的理解,还有一种现象就是随着层数增加,越来越多的输出是空白的,也就是这些过滤器没有找到图像中符合的编码信息。2. 是可视化过滤器,我最开始的想法是,过滤器不就是每个卷积网络的kernel这些吗?这些不就是过滤器吗?但是这个有点过于底层,其实我们最想知道的是某一层的整体的过滤效果,而不是单个的,单个的其实很难看出什么东西。所以这里用了很巧妙的一种方法就是,我构建随机图像,然后经过过滤器,那么,当我的输入和过滤器的模式一样的时候,这样的响应是最大的,有点像模版匹配。可以利用梯度上升法,将这一层的输出相对于输入求导,然后沿着输出值最大的方向改变输入的值,使得最后的输出最大,最后得到的输入图像就是过滤器了。这部分能够看出的信息其实和第一部分是差不多的。3. 是类激活的热力图,也就是每一个像素,它预测是属于哪一种类,预测的概率是多少,这样可以看看哪些像素比较重要。该方法基于 ***Grad-CAM: visual explanations from deep networks via gradient-based localization*** 论文。主要的思路如下,卷积层的输出其实代表的就是原始图像中剩余的信息,剩余的信息就是比较重要的信息,重要性就体现在了特征图的值上,但是输出的通道很多,有512层,有128层,怎么把这些层合并成一层,然后映射到输入图像上呢。不同的层对于最后的预测结果的影响是不同的,那么按照这个影响的权重进行相加就是合理的,因此可以求出特征图中的每一层相对于最后预测的类别的梯度代表着它的重要性系数,然后把卷积层的输出进行叠加就可以了。
+
+在`keras`中,其实并不是模型为导向的,平时写模型,都是基于模型的思维在计算梯度、loss函数之类的,其实还可以基于`function`来计算,通过指定输入和输出的`Tensor`,可以生成`function`,然后和模型中用到的计算思路一样,每一次输入输入,得到输出。
+
+## 第六章 深度学习用于文本和序列
+### 处理文本数据
+> 将文本分解而成的单元(单词、字符、n-gram)叫做标记(token),分解的过程叫做分词(tokenization),再将分词的结果进行数值向量化,数值向量化的方法有**one-hot**编码和**token embedding**
+
+在图像相关的处理中,我们也会对标签进行one-hot编码,这种编码对于token比较少的情况是比较适用的,一旦量大了就会形成稀疏矩阵,这个不太好处理。
+
+所谓的token embedding其实是对原始的toekn进行进一步的加工,我觉得可以理解为在one-hot的基础上对信息进行进一步的降维。
+
+词向量位于词向量空间中,不同领域的词向量空间的表示是不一样的,比如法律文书和日常用语。**词向量之间的距离能够反应出不同词之间的语义差别**,比如精度和准确度,有时候是可以互换的,我们就希望它们的向量距离也非常小。同时,我们还希望**词向量是有方向的**,比如cat、dog、wolf、tiger,从cat到tiger的向量与从dog到wolf的向量相等,这个向量可以解释为从宠物到野生动物向量。当然还可以有其他的角度。
+
+根据不同的目的我们会尝试去构建不同的词向量空间。
+
+但是有些时候我们没有足够的数据去训练任务相关的词向量空间,这个时候就可以复用已有的结果了,因为很多的较为底层的特征是通用的。比如word2vec、GloVe等。
+
+### 循环神经网络
+#### 简单的RNN
+**前馈网络**处理数据的前提假设是数据都是独立的,数据和数据之间是没有什么关系的。但是对于序列数据来说,前面的数据是可以作为后面数据的前提的,数据之间是存在一定关系的。这就需要**循环神经网络**,它其实就是除了当前的状态,还需要加上前一时刻的状态,简单来说就是下面的公式
+
+$$
+output_t = tanh(dot(W, input_t) + dot(U, state_t) + b)
+$$
+
+对于循环神经网络而言,它的返回值有两种形式,一种是把产生的中间结果也都返回,比如`$t_1$`到`$t_n$`,中间有`$t_2$`、`$t_3$`等等都返回,另一种就是只返回最后的`$t_n$`的结果。在多个循环网络进行叠加的时候,前面的训练网络要把所有的输出都返回,最后一个循环看情况要不要把所有的都返回。
+
+上述的公式中存在一个问题,就是我只加入了前一时刻的信息,而随着网络不断往后,会出现梯度消失的问题,难以记住较为以前的信息,无法学习到长期依赖,没有什么实用价值。
+
+#### LSTM
+因此出现了**长短期记忆(LSTM)**算法。
+
+理解**LSTM**算法是本章的重点。
+
+通过[这篇文章](https://colah.github.io/posts/2015-08-Understanding-LSTMs/)可以很好的理解整个的工作原理,其实最本质的就是在上面的RNN网络的基础上,怎么把长期信息也加上去,不会把远点的信息给忘记。
+
+首先在传统神经网络中,我们把输入数据输入到网络层中,产生结果,然后到下一层中
+
+$$
+output_t = tanh(W_{ft} \dot x_t + b_t)
+$$
+
+然后为了把前面的信息加进来就引入了上一个输出结果的状态,构建了简单的RNN网络。
+
+$$
+output_t = tanh(W_{ft} \dot ([h_{t-1}, x_t]) + b_t)
+$$
+
+但是这种还不够,还需要引入长期信息的记忆能力,上面的功能只是把上一层的信息传递到后面一层去,能力还是不够。所以LSTM在这个基础上增加了一条线路,可以把很远的地方的信息也输送过来。在这个基础上构建了更为复杂的LSTM网络。
+
+现在就有这么几条线了:输入(`$x_t$`)、前一时刻的状态(`$h_{t-1}$`)、前序数据输送带(`$C_t$`)、输出(`$output_t$`)
+
+但是每一条线的信息都需要判断是否要采用,LSTM里面用了很多的所谓的`门电路`,保留这部分的信息还是过滤这部分的信息。
+
+首先是前一步的`$C_{t-1}$`的信息门电路,`$f_t = \sigma(W_{ft} \dot [h_{t-1},x_t] + b_{ft})$`,这个会产生一个`$[0,1]$`范围内的值,然后和`$C_{t-1}$`相乘,可以控制这条信息流传递下去的量,这是安装的第一个阀门。
+
+然后是属于该层的层操作,输入输入数据和前一时刻的状态,输出该层的运算结果,但是这个也得加一个阀门,来控制当前层提取到的信息保留多少,这部分产生的数据会和`$C_{t-1}$`层的数据相加,得到`$C_t$`。
+
+第三个阀门就是控制输出,`$C_t$`产生以后一方面进入前序信息携带通道,另一方面再经过计算生成当前时刻的状态,这个状态还得再加一个阀门,控制它最后产出`$h_t$`。
+
+这就是LSTM网络了,**本质上就是在简单的RNN基础上加了三个阀门**
+
+在用算法解决问题的时候,应该尽可能构建一个简单的模型先,然后以这个模型为基准,不断构建复杂的模型,复杂的模型至少要比基准模型好才可以。
+
+在本书的观察耶拿天气数据中,首先提出了基于简单假设的方法,也就是温度时间序列是连续的,第二天的温度理论上会接近当天的温度,然后在天的角度也有周期性的波动,因此第二天的温度就等于今天的温度。然后提出基于深度学习的全连接的解决方案,结果发现第二种方法和第一种方法差不多。也就是说,如果数据到目标是一个简单且表现良好的模型,但是基于深度学习这个更复杂的模型却没有找到更简单的模型,理论上更简单的模型是包含在模型空间中的,这里面的原因是,我们并没有把更简单这个假设包括在训练过程中,所以很难学习到简单且性能良好的模型。
+
+在循环神经网络中,如果和卷积神经网络中一样使用,会妨碍训练过程,并没有什么用处。循环神经网络中怎么加dropout
+
+#### 双向RNN
+如果说一种序列,并不是强前向的,那么可以考虑把反向数据输入进行训练,说不定能提升效果,但是强正向的数据就没啥用了。
+
+### 用卷积网络处理序列
+2D的卷积神经网络提取的是空间的信息,同样,可以用1D的卷积神经网络去提取序列信息,这个所谓的提取本质上其实就是信息的压缩,从冗余的低级信息中抽象出更高级的信息,1D可以依然保持信息的顺序,但是这种顺序是非常粗浅的顺序,对于一些简单一点的任务还好,复杂的就不行了。不过书中写道在音频生成和机器翻译领域取得了巨大的成功,这个就不太理解了。小型的1D卷积神经网络有个好处就是计算代价相比于RNN来说很低,因此,其实可以把1D卷积神经网络和RNN进行结合,先用1D卷积神经网络从低级信息提取出高级信息,就跟token embedding的思路一样。
+
+
+## 第七章 高级的深度学习最佳实践
+### 多模态模型构建
+在前面几章的,构建模型都是用的`Sequential`模块,把一层一层的`layer`叠加在一起,只有一个输入一个输出,但是实际上在构建模型的时候,常常会遇到多输入或者多输出的情况,还有一些中间比较复杂的模块,这个时候就要用到`Model`模块了。在`keras`中有两种模块,分别是`Mode`和`Network`,`Network`只包括网络的结构,而`Model`在这个基础上还包括了训练的部分。之前写代码我只关心整个的网络结构,训练的部分都是手工进行,这样写代码就有点不优雅。之前之所以手工写,是因为官网的例子都是很简单的例子,多输入多输出的情况都很少,在多种输入和输出的情况下,应该怎么计算loss,怎么把不同的输入和不同的输出进行对应,这点我没有想明白。其实很简单,就是每一层都有名字,输入输出层也有自己的名字,在输入对应数据的时候,通过`dict`类型进行赋值或对应。如下代码所示,同理可得,也可以分别计算loss。
+
+``` python
+brancha = Input(shape=(300,300,3), name="brancha")
+branchb = Input(shape=(300,300,3), name="branchb")
+
+xa = Dense(32,3,activation="relu")(brancha)
+xb = Dense(32,3,activation="relu")(branchb)
+
+x = Concatenate()([xa, xb])
+
+outputa = Dense(32,3,activation="softmax", name="outputa")(x)
+outputb = Dense(32,3,activation="softmax", name="outputb")(x)
+
+model = Model(inputs=[brancha, branchb], outpus = [outputa, outputb])
+
+model.fit({"brancha":inputa,"branchb":inputb},
+ {"outputa":outputa, "outputb":outputb},
+ epochs=10, batch_size=10)
+```
+
+另一方面,我从最开始写模型是通过继承`Model`这个类,然后分别写好每一层,设置好参数,然后在`__call__`中调用这些定义好的层。这在面向对象的逻辑中是成立的,但是在这里实际操作的时候就不好操作,首先,不同模型之间的复用就会变得很麻烦,会行程模型一层嵌套一层,最后把整个代码弄的很复杂,同时这么写的话,就需要考虑自己推断从输入的shape到输出的shape,同时很多的函数也没办法调用,比如`summary()`等。所以现在我转换了策略,我依然继承`Model`,但是我在初始化的时候,通过构建输入与输出,然后把构建的`inputs`和`outputs`传入到父类中去构建出整个的模型。这样,既能根据不同的模型加入不同的参数,也能用现成的keras模型。
+
+### 有用的结构和卷积
+在做卷积操作的时候,其实有两步:1.是在同一层中,用同一个卷积核遍历该特征层;2.在不同的特征层中进行运算求和。前者叫空间特征,后者叫通道特征。**1x1卷积**就是计算的通道特征,**SeparableConv**和**DepthwiseConv**就是计算的空间的特征。
+
+上述提到的非线性的模块包括了Inception模块和residual模块。residual模块之所以效果这么好一方面是因为加了shortcut模块,因为在进行卷积操作的时候,其实是把一些特征丢失的,很多丢失的信号是没办法复原的。比如把音频中的低频信号去掉,就没办法恢复了。shortcut模块可以把前面的信息再加回去。另一方面这个通道也能够在反向传播的时候发挥作用,减缓出现梯度消失的情况。
+
+书中还提到一种情况,虽然有两个输入,但是两个输入的属性一样,比如要评估两个句子之间的语意相似度,因为两个输入的句子是可以互换的,他们的相似度是对称关系,不能说用两个网络分别去处理,因为他们是把句子映射到同一特征空间,所以会用同一个模型去分别走两个句子,然后得到的结果再去评估句子的相似度。处理两个摄像头的特征也是同理。只不过这部分在实际的应用中我还没有见到。
+
+### 回调函数
+回调函数的作用其实很多方面,有一点我没有想到,就是可以设置提前训练结束还有根据loss函数,梯度等动态调整learning rate等。
+
+### 进一步提升模型的性能
+#### 批处理
+对输入数据进行标准化,可以剔除一些无关紧要的特征的影响,专注于整个图像的分布不同进行推理得到结果。从每一层的特征图出发,其实和从输入层出发一样,也需要进行标准化,可以怎么标准化,之前在ResNet中用了一组RGB的数字是统计了ImageNet的图片得到的均值和方差值。所以在`BatchNormalization`的计算中,不断更新均值等,在训练过程中保存已读取的每批的数据均值和方差的指数移动平均值,它有利于梯度传播,因此运行更深的网络。
+
+#### 超参数优化
+超参数优化需要注意的点就是,我们要用验证集来调整,不要基于测试集,不然就没啥用了,容易出现过拟合。
+
+文中也推荐了超参数优化的库:**Hyperopt**,它的内部使用Parzen估计器来预测哪组超参数更好。还有一种和keras结合的**Hyperas**库,也可以尝试一下。
+
+#### 模型集成
+模型之所以集成,是因为不同的模型从不同的侧面反应出事物的不同方面。就像盲人摸象,一个模型摸到一个地方,另一个模型摸到另一个地方,然后集成,最后勾勒出整个大象的形状。但是也不能都摸到大象的鼻子,这样的集成是没有用的,必须要保证模型的多样性,不同的模型,偏差向不同的地方。
+
+**但是,怎么去评估各个模型的得分,效果呢?**,去kaggle上多找一些例子看看。
+
+## 第八章 生成式深度学习
+### 使用LSTM生成文本
+在本节中,通过LSTM网络构建模型,在网络的最后是一层softmax层,输出各个单词的概率,但是并没有直接使用这个概率,而是在这个基础上对这个概率进行了随机采样,也就是根据概率值生成样本,然后选择出现次数最多的那个,出现次数的多少取决于概率,但是每次的结果不一样,只能说出现某个值的概率更大一些。然后又引入了一个参数`$t$`,对原来的概率分布进行重排,可以用来控制生成的字符*更随机*或者*更不随机*,所谓的*更不随机*就是更加符合我们从训练样本中得到的样本空间的分布。
+
+``` python
+def sample(preds, t = 1.0):
+ preds = np.asarray(preds).astype('float64')
+ preds = np.log(preds) / t
+ exp_preds = np.exp(preds)
+ preds = exp_preds / np.sum(exp_preds)
+ probas = np.random.multinominal(1, preds, 1)
+ return np.argmax(probas)
+```
+
+倒数第二行代码其实是根据`preds`的分布来采样,会得到和`preds`的长度一样的一个数组,数组里面的数字代表的是出现在这个位置上的样本次数,我们选择出现样本次数最大的这个索引,然后找到相应的字符。
+
+上述的这个参数`t`为什么能够改变原来的概率分布,**`t`的取值范围是(0,1],值越大,那么得到的熵越大,越不确定**。
+
+我们来看下图
+
+
+
+当我们进行`$\log$`运算以后,概率越大的部分,生成的值越小,最后处以`$t$`以后值就越大,概率大的值和概率小的值之间的差距会随着`$t$`变小而变大,然后在作用一个`$e^x$`操作,又把数值变到`$[0,1]$`之间。总结来说就是`$t$`很小的时候,原来概率越小的部分,在变换以后概率会变得更加小,大概率值与小概率值之间的差距就会变大,也就是说越来越偏向于大概率的值,最后输出的结果也就越确定,熵就会越小**
+
+### DeepDream
+DeepDream的原理其实和之前的神经网络的可视化是差不多的,就是说神经网络通过数据的学习到了模型的参数,这个参数能从图片中提取出相关的信息。通过ImageNet训练出来的模型有非常多的分类,因此有很多针对不同物体的不同的核,我们把这些信息提取出来然后画到原来的图上去。本质上还是那一套,只不过现在是用的层数更多了,并且在不同尺度上对特征进行了综合,然后为了保证清晰度,把图片放大缩小后又不断把细节填充进去。训练过程也是一样,原来的训练过程是在一张白纸上通过梯度上升,求的响应最大值,现在也是利用梯度上升。loss函数直接求的就是指定的几个输出层,毕竟最后的结果也是求得这几层的最大响应。**为了避免出现边界伪影,只包含非边界像素**,这种做法在好几个地方都看到了。
+
+### 神经风格迁移
+风格迁移的过程分为两步,一部分是我们要保存我们的目标图像的内容,这个目标图像也就是我们的输入图像,我们希望在这个图像上进行操作,同时呢,我们又想把参考图像的风格加入到我们的目标图像中,这两个分别就是图像的内容和风格的部分,抽象出来就是要保证内容损失和风格损失最小,内容风格是和目标图像进行对比,风格损失是和参考图像进行对比。内容比较好理解,我们可以选取更深层的网络层,浅层表示的是局部的浅特征,深层次的网络模型表示的是全局的更抽象的图像内容。风格其实就是图像的纹理,而所谓的纹理就是图像内部的相互关系。风格也可以在不同的纬度来表现,因此,风格的损失我们选取多层网络输出进行计算。
+
+内容损失比较好计算,直接比较在深层中的网络输出的值。风格的损失要求出一张图像内部的特征关系,这里用到了所谓的Gram Matrix,其实就是求水平向量两两之间的相似度,这就是一张图片的内部关系,然后比较一下生成图像和参考图像之间的差值。**同时提到为了促使生成的图像具有空间连续性,避免结果过度像素化,增加一个总变差损失,其实就是希望前后两个像素差别不要太大,变化具有连续性,分别在`x`和`y`方向进行计算。**不同的损失值有不同的系数,用于控制更偏向于哪个方面。
+
+我们在平时中用到的以`SGD`方法,这在数据量比较大的时候用处比较大,数据量比较小的时候可以选择`L-BFGS`算法。
+
+### 用变分自编码器生成图像
+变分自编码器(VAE, variational autoencoder),就是把图片映射到一个向量空间,这个向量空间通过平均值和方差来表示,这个过程称之为**编码器**,然后在这个向量空间中我们选择生成的均值和方差值(这个方差值增加一些噪声),再把它还原成原来的图片,这个过程称之为**解码器**。这个就是整个模型的组成部分。这个的训练过程就是只有最后比较一下生成的图像和原始的图像之间的差距。不需要外部额外计算的其他loss,是一种不需要标注集的训练。
+
+VAE得到的是高度结构化的,连续的潜在表示,比如沿着一个横截面移动,可以实现以连续的方式显示一张起始图像缓慢变化为不同图像的效果。
+
+主要原因是最后的潜在空间压缩的比较厉害,所以有种类似于主成分析中,生成的分别就会趋向于连续变化的主要成分分量。
+
+### 生成式对抗网络
+生成式对抗网络(GAN, generative adversarial network),它主要也是两个部分,一个是**生成器网络**,另一个是**判别器网络**,生成器网络从随机空间中选取随机数生成一幅图像,然后把这些图像和真实图像混在一起输入到判别器网络,判别器网络去判断是真是假。
+
+$$
+gan = discriminator(generator(x))
+$$
+
+GAN网络的训练是一个动态的过程,生成器会变化,判别器会变化。很难训练,需要对模型架构和训练参数进行很多的微调。GAN的训练方法有一些技巧,详情见该书的P259.
+
+GAN网络在训练的过程中要保持判别器的参数不变,判别器的训练是单独训练的,和GAN网络分开。
+
+## 第九章 总结
+总的来说,现阶段的深度学习其实是局部泛化,也就是说我喂进去什么数据,只能基于这个进行简单的泛化,比如输入识别人的数据,就不能识别其他动物。而人类的意识其实是极端泛化,我们不需要反复的看很多数据,能够通过**抽象**和**推理**进行更宽泛的泛化,所以,如果要实现人类一样的智慧,现在的这种方法肯定是不行的。
+
+想要实现模型的复用其实很难,模型结构可以复用,可是模型参数怎么办,模型参数是根据不同的任务训练的,是没办法复用的,所以现阶段的这种形式肯定是初级阶段的。
\ No newline at end of file
diff --git a/source/_posts/sigmoid-function.md b/source/_posts/sigmoid-function.md
new file mode 100644
index 00000000..7be0a574
--- /dev/null
+++ b/source/_posts/sigmoid-function.md
@@ -0,0 +1,169 @@
+---
+title: "机器学习实践——Logistic回归(Logistic Regression)"
+date: 2018-08-26
+mathjax: true
+---
+
+## 0x00 问题引入
+[上一节](https://joeltsui.github.io/2018/08/24/linear-regression/)中讨论了线性回归,线性回归中`$y$`的值是连续的,有无数种可能。有些问题它的`$y$`值是离散的,可能只有两种或者三种,这类回归问题也叫分类问题。我们以二元分类为例,在二元分类中,`$y$`值有两种可能,分别叫做正样本和负样本。要实现二元分类问题其实也是求一条直线,和线性回归问题一样。对于线性回归问题,是通过已有的点去拟合一条直线,使得这条直线尽可能多的代表已有的数据点。而对于分类问题,也是通过一条直线,但是这条直线是把两个类别分开,直线的这边是正样本,直线的另一边是负样本。因此我们的任务也就变成了,寻找一条可以区分正负样本的直线。
+
+
+
+
+
+## 0x01 问题概述与思路
+都是寻找一条直线,但是直线的目的不同,我们需要通过Loss函数或者最大似然估计函数的不同去求解不同的直线。`$y=ax+b$`得到的是连续值,取值范围根据`$x$`的不同在`$(-\infty,+\infty)$`之间。而我们只有正样本和负样本两个值,因此我们需要一个函数,可以把`$y$`值变成可以得到两个分类的值。我们常用的就是Sigmoid函数。
+
+$$
+g(z) = \frac{1}{1+e^{-z}}
+$$
+
+因此我们的hypothes函数就是
+
+$$
+h_{\theta}(x)=g(\theta^Tx)=\frac{1}{1+e^{-\theta^Tx}}
+$$
+
+
+Sigmoid函数也叫Logistic函数。
+
+
+
+
+我们按照图1来梳理一下整个的流程。
+图1中有`$(x_1,x_2,1)$`两个自变量,一对`$(x_1^{(i)},x_2^{(i)},1),x\in[1,m]$`有一个标签对应,表示它是正样本还是负样本,最后的那个1表示的是截距,这个表达式其实和直线方程是一致的。我们现在假设有参数`$\theta=(\theta_1, \theta_2,\theta_3)$`就是我们最后的结果,也就是图中的那条直线。
+
+(1)当`$(x_1^{(i)},x_2^{(i)})$`表示在直线上的点的时候`$\theta^Tx=0$`,
+
+(2)当`$(x_1^{(i)},x_2^{(i)})$`表示在直线下方的点时候`$\theta^Tx<0$`,并且离直线越远,`$\theta^Tx$`的值就越大。`$h_{\theta}(x)$`趋向于1。表示我们的正样本。
+
+(3)当`$(x_1^{(i)},x_2^{(i)})$`表示在直线上方的点时候`$\theta^Tx>0$`,并且离直线越远,`$\theta^Tx$`的值就越小。`$h_{\theta}(x)$`趋向于0。表示我们的负样本。
+
+
+在利用损失函数或者最大似然估计计算参数的时候,我们并不关系函数的值的大小,我们关心的是他们的趋势。当`$(x_1^{(i)},x_2^{(i)})$`是正样本的时候,我们就希望`$h_{\theta}(x)$`越接近1越好,也就是越大越好,当`$(x_1^{(i)},x_2^{(i)})$`是负样本的时候,我们就希望`$h_{\theta}(x)$`越接近0越好,也就是越小越好,也就是`$(1-h_{\theta}(x))$`越大越好。
+
+考虑到`$h_{\theta}(x)$`的表达式比较复杂,而我们又不关心绝对值,所以可以把`$h_{\theta}(x)$`和`$(1-h_{\theta}(x))$`都取`$\ln$`值。`$\ln$`函数是递增函数,因此我们的希望还是不变。
+
+现在把正负样本和起来写。
+
+$$
+l=y\ln{(h_{\theta}(x))}+(1-y)\ln{(1-h_{\theta}(x))}
+$$
+
+这个式子可以保证当为正样本(即`$y=1$`)的时候,后半部分为0,前半部分`$(h_{\theta}(x)$`越大越好,当为负样本(即`$y=0$`)的时候,前半部分为0,后半部分`$(1-h_{\theta}(x))$`越大越好。把所有的样本都加起来可以得到:
+
+$$
+L(\theta)=\sum_i^m[y^{i}\ln{h_\theta(x^{(i)})}+(1-y^{i})\ln(1-{h_\theta(x^{(i)})}]\tag{1}
+$$
+
+取`$L$`的最大值就是我们的目标。
+
+按照在线性回归中的方法,通过求导求最大值。也不是说不能做,但是整个过程会变得很复杂,求导很麻烦。
+
+因此我们换个思路。也就是**梯度上升法**。可以用简单一点的函数去理解,导数就是沿着某个方向变化最快的值,当到达最高点或者最低点的时候,导数为0。我们就沿着当前点的导数方向去调整`$\theta$`值,使得`$L$`往最大值的方向走。
+
+对于`$y=ax+b$`函数,自变量只有一个`$x$`,因此对`$x$`求导就可以,对于`$y=ax_1+bx_2+c$`,自变量有两个,需要在`$x_1$`和`$x_2$`两个方向一起去变化,分别对`$x_1$`和`$x_2$`进行求导。
+
+因此对于式(1)就需要分别对`$\theta_1,\theta_2,...,\theta_{m}$`进行求导,更新每一个`$\theta_{i}$`的值。
+
+为了进一步求导,先计算
+
+$$
+\frac{\partial{g(z)}}{\partial{z}}=g(z)(1-g(z))
+$$
+
+上述公式推导起来很简单,不多讲。
+
+以某一个`$\theta_j$`为例,求导一下。
+
+$$
+\begin{split}
+\frac{\partial{L(\theta)}}{\partial{\theta_j}}&=\sum_i^m[{y^{(i)}}\frac{1}{h_{\theta}(x^{(i)})}\frac{\partial{h_\theta}(x^{(i)})}{\partial{\theta_j}}-(1-y^{(i)})\frac{1}{1-h_\theta(x^{(i)})}\frac{\partial{h_\theta(x^{(i)})}}{\partial{\theta_j}}]\\
+&=\sum_i^m[{y^{(i)}}\frac{1}{h_{\theta}(x^{(i)})}-(1-y^{(i)})\frac{1}{1-h_\theta(x^{(i)})}]\frac{\partial{h_\theta}(x^{(i)})}{\partial{\theta_j}}\\
+&=\sum_i^m[{y^{(i)}}\frac{1}{h_{\theta}(x^{(i)})}-(1-y^{(i)})\frac{1}{1-h_\theta(x^{(i)})}]\frac{\partial{h_\theta(x^{(i)})}}{\partial{z}}\frac{\partial{z}}{\theta_{j}}\\
+&=\sum_i^m[{y^{(i)}}\frac{1}{h_{\theta}(x^{(i)})}-(1-y^{(i)})\frac{1}{1-h_\theta(x^{(i)})}]h_\theta(x^{(i)})(1-h_\theta(x^{(i)}))x^{(i)}_j\\
+&=\sum_i^m[y^{(i)}(1-h_{\theta}(x^{(i)}))+(y^{(i)}-1)h_{\theta}(x^{(i)})]x^{(i)}_j\\
+&=\sum_i^m[y^{(i)}-h_{\theta}(x^{(i)})]x^{(i)}_j
+\end{split}
+$$
+
+把`$\sum$`去掉,通过向量来表示。`$y=[y^{(1)},y^{(2)},...,y^{(m)}]^T$`,`$x_j=[x^{(1)}_j,x^{(2)}_j,...,x^{(m)}_j]^T$`
+
+$$
+\begin{split}
+\frac{\partial{L(\theta)}}{\partial{\theta_j}}&=[x_j^{(1)},x_j^{(2)},\cdots,x_j^{(m)}]
+\begin{bmatrix}
+y^{(1)}-h_\theta(x^{(1)})\\
+y^{(2)}-h_\theta(x^{(2)})\\
+\cdots\\
+y^{(m)}-h_\theta(x^{(m)})
+\end{bmatrix}
+&=(x_j)^T(y-h_\theta(x))
+\end{split}
+$$
+
+$$
+\begin{split}
+\frac{\partial{L(\theta)}}{\partial{\theta}}&=
+\begin{bmatrix}
+x_1^{(1)} & x_1^{(2)} & \cdots & x_1^{(m)}\\
+x_2^{(1)} & x_2^{(2)} & \cdots & x_2^{(m)}\\
+\cdots & \cdots & \cdots & \cdots\\
+x_n^{(1)} & x_n^{(2)} & \cdots & x_n^{(m)}
+\end{bmatrix}
+\begin{bmatrix}
+y^{(1)}-h_\theta(x^{(1)})\\
+y^{(2)}-h_\theta(x^{(2)})\\
+\cdots\\
+y^{(m)}-h_\theta(x^{(m)})
+\end{bmatrix}
+=x^T(y-h_\theta(x))
+\end{split}
+$$
+
+这样就可以通过不断的迭代使得`$\theta$`不断去靠近我们期望的值。
+
+$$
+\theta := \theta + \alpha x^T(y-h_\theta(x))
+$$
+
+上述的`$\theta=[\theta_1,\theta_2,\cdots,\theta_n]^T$`,`$x=[x^{(1)},x^{(2)},\cdots,x^{(m)}]^T$`,其中 `$x^{(i)}=[x^{(i)}_1,x^{(i)}_2,\cdots,x^{(i)}_n]$`,`$y=[y^{1},y^{(2)},\cdots,y^{(m)}]^T$`。
+
+## 0x02 Coding Example
+代码在[这里](http://q0qh4z3h0.bkt.clouddn.com/files/logRegres.py),数据集在[这里](http://q0qh4z3h0.bkt.clouddn.com/files/testSet.txt)
+
+将测试集的数据进行展示。
+
+
+
+在这个例子中`$x=[x_0,x_1,1]^T$`,最后一个的1表示截距。`$\theta=[\theta_0, \theta_1, \theta_2]^T$`,正负样本分别是标签为1和0的数据。数据为`dataMatrix`,标签数据为`labelMatrix`。其中`dataMatrix`的`$shape=100 \times 3$`,`labelMatrix`的`$shape=100 \times 1$`
+
+``` python
+def gradAscent(dataMatrix, labelMatrix):
+ m,n = dataMatrix.shape
+ theta = np.ones((n,1))
+ maxCycles = 500
+ alpha = 0.001
+
+ for k in range(maxCycles):
+ h = sigmoid(np.matmul(dataMatrix,theta))
+ delta = np.matmul(dataMatrix.transpose(),(labelMatrix - h))
+ theta = theta + alpha*delta
+ return theta
+```
+进过计算就能得到`$\theta$`的参数值了,把`$\theta^T x=0$`直线画上去,就能得到下图了。
+
+
+
+(end)
+
+
+
+
+
+
+
+
+
+
+
diff --git a/source/_posts/softmax-regression.md b/source/_posts/softmax-regression.md
new file mode 100644
index 00000000..0146a485
--- /dev/null
+++ b/source/_posts/softmax-regression.md
@@ -0,0 +1,135 @@
+---
+title: "机器学习实践——Softmax回归(Softmax Regression)"
+date: 2018-08-29
+mathjax: true
+---
+
+## 0x00 问题引入
+在Sigmoid回归问题中,我们梳理了二元的回归函数,但是很多时候类别是大于2的。比如需要区分0-9这10个数字,就需要10个类别。
+
+其实Softmax和Logistic回归本质上是一样的。在Logistic二分类的问题中,是将特征值`$x$`先经过线性方程,再经过非线性方程,最后得到一个预测值,让预测值要么等于1,要么等于0.同样的,对于多分类的问题,我们也是让特征值先经过线性方程,再经过非线性方程,最后得到一个值。只不过现在是要得到`$k$`个值。同一套的`$\theta$`肯定是不行的,我们需要给每个分类都配`$\theta$`。假设自变量总共有`$n$`个特征,最后总共有`$k$`个分类,则`$\theta$`的`$shape=n \times k$`。但是有个问题是,每一个分类都有一个值,选哪个?此时Softmax里面的`$max$`的价值就体现出来了。就选取其中值最大的出来。相当于取概率最大的那个。我们怎么去构建这块思路,就会体现在训练出来的参数上。
+
+## 0x01 问题概述与思路
+
+非线性的过程我们选取`$g(\theta^Tx)=e^{\theta^Tx}$`。
+因此可以得到
+
+$$
+h_\theta(x^{(i)})=
+\begin{bmatrix}
+p(y^{(i)}=1|x^{(i)};\theta)\\
+p(y^{(i)}=2|x^{(i)};\theta)\\
+\cdots \\
+p(y^{(i)}=k|x^{(i)};\theta)
+\end{bmatrix}
+=
+\frac{1}{\sum_{j=1}^ke^{x^{(i)}\theta_j^T}}
+\begin{bmatrix}
+e^{x^{(i)}\theta_1^T}\\
+e^{x^{(i)}\theta_2^T}\\
+\cdots\\
+e^{x^{(i)}\theta_k^T}
+\end{bmatrix}
+=
+\begin{bmatrix}
+h_{\theta_{1}}(x^{(i)})\\
+h_{\theta_{2}}(x^{(i)})\\
+\cdots \\
+h_{\theta_{k}}(x^{(i)})
+\end{bmatrix}
+$$
+
+下面就是构造损失函数或者最大似然估计函数了。按照现在的情况,好像所谓的最大似然估计函数和损失函数已经不分了,最大似然估计函数加个负号就是损失函数了。
+
+考虑一下我们期望的结果。当预测的分类是正确的时候,我们希望他对应的“概率值”`$h_{\theta_j}(x^{(i)})$`越接近1越好。
+
+我们按照Logistic中的操作,对`$h_\theta(x^{(i)})$`取`$\log$`能够简化运算。在计算之前我们先定义好矩阵。
+
+$$
+\theta=
+\begin{bmatrix}
+\theta_{11} & \theta_{12} & \cdots & \theta_{1n}\\
+\theta_{21} & \theta_{22} & \cdots & \theta_{2n}\\
+\cdots & \cdots & \cdots & \cdots\\
+\theta_{k1} & \theta_{k2} & \cdots & \theta_{kn}
+\end{bmatrix}
+$$
+
+$$
+x =
+\begin{bmatrix}
+x^{(1)}_1 & x^{(1)}_2 & \cdots & x^{(1)}_n\\
+x^{(2)}_1 & x^{(2)}_2 & \cdots & x^{(2)}_n\\
+\cdots & \cdots & \cdots & \cdots\\
+x^{(m)}_1 & x^{(m)}_2 & \cdots & x^{(m)}_n\\
+\end{bmatrix}
+$$
+
+$$
+y =
+\begin{bmatrix}
+y^{(1)}_1 & y^{(1)}_2 &\cdots &y^{(1)}_k\\
+y^{(2)}_1 & y^{(2)}_2 &\cdots &y^{(2)}_k\\
+\cdots & \cdots & \cdots & \cdots\\
+y^{(m)}_1 & y^{(m)}_2 &\cdots &y^{(m)}_k\\
+\end{bmatrix}
+$$
+
+我们将`$y$`进行`$one-hot$`编码,对应的分类的`$index$`为1,其余的为0。
+
+$$
+x^{(i)} \theta_l^T=\theta_{l1}^T x^{(i)}_{1}+\theta_{l2}^T x^{(i)}_2+\cdots+\theta_{ln}^T x^{(i)}_1n
+$$
+
+考虑一下计算最大似然估计的这个过程。有一组样本点`$(x^{(i)},y^{(i)})$`。通过这个样本点,可以计算出`$h_{\theta_l}(x^{(i)}),l\in[1,k]$`。假设`$y^{i}=s,s\in [1,k]$`。那么我们就希望`$h_{\theta_s}(x^{(i)})$`越大越好,当`$l\neq s$`时,就是属于负样本,但是这个负样本有很多种的可能,可能是除了`$s$`以外的其他值,但是概率分布上统一是`$(1- h_{\theta_s}(x^{(i)}))$`。换个角度看,其实就是还是拟合一条直线,只不过这条直线把目标标签和**其他标签**分割开来,这不就是二分类嘛。
+
+$$
+J(\theta)=
+\sum_{i=1}^m \sum_{l=1}^k[y^{(i)}_l \ln h_{\theta_s (x^{(i)})}+(1-y^{(i)}_l)\ln (1-h_{\theta_s(x^{(i)})})],where\ \ y^{(i)}=s
+$$
+
+
+
+再把这个问题简化一下,对于每一个样本,我们只能计算与`$y^{(i)}$`标签对应的那部分`$\theta$`值。比如当`$y^{(i)}=l$`,则我们只能更新`$\theta_l=[\theta_{l1},\theta_{l2},\cdots,\theta_{ln}]$`,。因为其他的`$\theta$`值更新并没有意义,他们虽然代表的是负样本,但是却是有很多种可能的负样本,不管往哪个方向走都是不合适的。因此最大似然估计的导数就可以简化成以下,后半部分和`$\theta_{sj}$`没有关系:
+
+$$
+\frac{\partial L(\theta)}{\theta_j}=
+\sum_{i=1}^m[y^{(i)}_l \frac{\partial \ln h_{\theta_s(x^{(i)})}}{\theta_{sj}}],where\ \ y^{(i)}=s \tag{1}
+$$
+
+$$
+\begin{split}
+\frac{\partial \ln h_{\theta_s(x^{(i)})}}{\partial \theta_{sj}}
+&=\frac{\partial (x^{(i)}\theta_l^T-\ln{\sum_{l=1}^ke^{x^{(i)}\theta_l^T}})}{\partial \theta_{sj}}\\
+&=x_j^{(i)}-\frac{\partial \ln{\sum_{l=1}^ke^{x^{(i)}\theta_l^T}}}{\partial \theta_{sj}}\\
+&=x_j^{(i)} - \frac{x_j^{(i)} e^{x^{(i)}\theta_s^{T}}}{\sum_{l=1}^ke^{x^{(i)}\theta_l^T}}\\
+&=x^{(i)}_j(1-h_{\theta_s (x^{(i)})})
+\end{split}
+$$
+
+所以可以`$(1)$`式
+
+$$
+\frac{\partial L(\theta)}{\theta_j}=
+\sum_{i=1}^m x^{(i)}_j(1-h_{\theta_s (x^{(i)})})
+$$
+
+然后按照之前的套路
+
+$$
+\theta_{sj} = \theta_{sj} + \alpha \sum_{i=1}^m x^{(i)}_j(1-h_{\theta_s (x^{(i)})})
+$$
+
+## 0x02 Coding Example
+
+
+
+## 0x03 参考文献
+[1] https://gist.github.com/dhammack/8071840
+
+[2] http://ufldl.stanford.edu/tutorial/supervised/SoftmaxRegression/
+
+
+
+
+
diff --git "a/source/_tmp/\bcmake\346\225\231\347\250\213.md" "b/source/_tmp/\bcmake\346\225\231\347\250\213.md"
new file mode 100644
index 00000000..b3ae5068
--- /dev/null
+++ "b/source/_tmp/\bcmake\346\225\231\347\250\213.md"
@@ -0,0 +1,8 @@
+
+
+
+
+参考文献
+1. http://derekmolloy.ie/hello-world-introductions-to-cmake/
+2. https://www.jetbrains.com/help/clion/working-with-cmake.html
+
diff --git a/source/_tmp/2018-04-17-fakeface-tutorial.md b/source/_tmp/2018-04-17-fakeface-tutorial.md
new file mode 100644
index 00000000..f7032abf
--- /dev/null
+++ b/source/_tmp/2018-04-17-fakeface-tutorial.md
@@ -0,0 +1,19 @@
+---
+title: "FakeFace实现指南"
+categories: deeplearning
+lang: zh
+---
+
+## 0x00
+
+## 0x01 训练集收集
+
+## 0x02 图片预处理
+图片预处理都处理哪些东西?为什么要进行图片预处理?
+我们要做的是对人脸进行替换,所以必须要把人脸先抠出来。对这部分数据进行训练才是更合适。但是,人脸是不规则的,怎么把这个提取出来,然后输入到神经网络中去呢?
+
+
+## 0x03 模型训练
+
+
+
diff --git a/source/_tmp/2018-05-06-linux-shell-script-tutorial.md b/source/_tmp/2018-05-06-linux-shell-script-tutorial.md
new file mode 100644
index 00000000..a4607012
--- /dev/null
+++ b/source/_tmp/2018-05-06-linux-shell-script-tutorial.md
@@ -0,0 +1,16 @@
+---
+title: "《Linux Shell脚本攻略》读书笔记"
+categories: ReID,算法
+lang: zh
+---
+
+## 第一章 小试牛刀
+
+printf 可以接受引用文本或者由空格分隔的参数。可以使用printf
+
+
+在Shell脚本中,两边没有空格的等号是赋值操作,加上空格的等号表示的是等量关系测试。
+
+使用单引号时变量不会被扩展,变量替换不会发生在单引号中。双引号允许shell解释字符串中出现的特殊符号。
+
+获取字符串的长度。${#var}
\ No newline at end of file
diff --git a/source/_tmp/2019-04-02-tensorflow-training.md b/source/_tmp/2019-04-02-tensorflow-training.md
new file mode 100644
index 00000000..22027d37
--- /dev/null
+++ b/source/_tmp/2019-04-02-tensorflow-training.md
@@ -0,0 +1,53 @@
+## 碰到的问题
+### 训练的速度太慢,基本都是GPU在跑
+这个[链接](https://github.com/tensorflow/models/issues/5719#issuecomment-437323963)说可能的原因是因为batch_size设置成太大了,导致速度慢,但是他没有提,把batch_size从24设置成1,GPU的利用率有没有上去。因为你看到的速度,影响因素包括了batch_size,这个值越大,那么一次跑的越多,一个batch结束以后过掉的图片越多。
+
+当batch_size为24的时候,在训练的初始阶段,GPU的利用率
+
+另外也提到了可能是新版的训练有问题,采用老版的试试看。
+
+老版的,batch_size=24的情况下,GPU的使用率能够维持在30%左右,说明是新版本的训练的问题!妈的。
+
+### Object Detection API中config文件参数
+
+config文件中有很多的参数没有搞懂,需要了解一下。
+```
+fine_tune_checkpoint_type: "detection"
+```
+是从detection checkpoint还是从claasification checkpoint中恢复参数用于在训练中的初始化(参数的名称需要是兼容的)。其值可以是 'classification' 'detection',默认是'detection'。[1]
+所以,其实这个值只是说明这个预训练的模型是来自于detection还是classification。但是整个的Object Detection API的项目就是用于detection的啊,所以这里的意思应该是对`detection`的过程进行参数调整还是对`classification`的参数进行调整,但是都是属于这个模型的,因为detection的过程也需要classification。
+
+```
+load_all_detection_checkpoint_vars:False
+```
+是否加载所有的detection checkpoint的参数,这个条件需要在`fine_tune_checkpoint_type:'detection'`的情况下才有效。如果是False,那么只有对应scope的变量才会加载,默认是False。这个所谓的**appropriate scopes**到底是指哪一块呢?[2]
+
+```
+from_detection_checkpoint:true
+```
+根据文献[3]的说法,当传入的checkpoint是否属于detection的时候。具体文献[4]中进行了回应。
+
+当`load_all_detection_checkpoint_vars:True`的时候,会出现很多的node不兼容,是不是因为之前没有加载这些node,现在加载了导致的?
+
+
+## 模型的转换
+### 转换成tensorflow-lite兼容的浮点模型
+1. 训练模型,得到了checkpoint数据,包括meta和index两部分。
+2. 通过`export_tflite_ssd_graph.py`生成tflite兼容的frozen graph[5],**此处存在一个问题,如果没有原始的checkpoint,只有普通的frozen graph,怎么变成tflite兼容的pb?**
+3. 通过`tflite_convert`对2中的模型进行进一步生成tflite模型
+
+### 转换成tensorflow-lite兼容的整型模型
+文献[6]详细介绍了应该怎么生成quantized的模型。在转换的时候`change_concat_input_ranges`这个参数很重要,如果没有这个参数,就会core dump。
+使用quantized的模型,但是却发现速度更慢了,大概慢了一倍。文献[7]中有提到说是因为他们只是对ARM架构的CPU进行了优化,没有对x86的进行优化,因为没有必要。
+
+实际测试,如果在训练的时候没有指明要进行quantize,后面再强制转换为quantize,得到的模型没有用处。
+
+参考链接:
+1. https://github.com/tensorflow/models/blob/17e923da9e8caba5dfbd58846ce75962206ffa64/research/object_detection/core/model.py#L337
+2. https://github.com/tensorflow/models/blob/17e923da9e8caba5dfbd58846ce75962206ffa64/research/object_detection/meta_architectures/ssd_meta_arch.py#L1155
+3. https://github.com/tensorflow/models/blob/master/research/object_detection/g3doc/configuring_jobs.md#model-parameter-initialization
+4. https://github.com/tensorflow/models/issues/3562#issuecomment-372703559
+5. https://github.com/tensorflow/models/blob/master/research/object_detection/export_tflite_ssd_graph.py
+6. https://github.com/tensorflow/models/blob/master/research/object_detection/g3doc/running_on_mobile_tensorflowlite.md
+7. https://github.com/tensorflow/tensorflow/issues/2807
+
diff --git a/source/_tmp/2019-04-23-kcf-learnning.md b/source/_tmp/2019-04-23-kcf-learnning.md
new file mode 100644
index 00000000..419e5d7b
--- /dev/null
+++ b/source/_tmp/2019-04-23-kcf-learnning.md
@@ -0,0 +1,27 @@
+## 问题
+KCF的论文中一直在讨论如何计算一些东西,和我们要实现的算法有什么关系。
+先摸清楚这种跟踪算法大体是一个什么样的过程,核心是利用什么,再来看背后的数学原理。
+
+## 算法过程
+整个的过程分为3个部分,参数初始化、首帧初始化、更新。
+总的原理是:
+首先,在首帧初始化的时候,将模版保存下来,后续更新的时候就是不断的和模版进行比较,就是基本的Correlation操作,在一张图片中,与模版相同的部分是操作后的最大值。
+
+但是,物体是进行不断运动的,模版不能是一成不变的。因此,在更新的时候也会有个训练的阶段,不断更新模版。KCF的算法中,所谓的训练其实就是把现在的特征和之前的特征进行一个加权相加。
+
+## 具体步骤
+1. 获取图片以及目标框坐标,从图片中提取出HOG特征。
+2. 提取HOG特征之前,要对滑动窗口进行初始化。可以自定义滑动窗口的大小,也可以使用ROI的大小,这里的ROI的大小都进行了放大。同时,尺寸大小要是偶数。如果是要提取HOG特征,则长宽还需要满足能被cell的大小整除。
+3. 确定特征的滑动窗口之后,将图像提取出来,计算HOG特征,然后对特征进行归一化,裁剪和PCA。
+4. 但是呢,只有特征也是不行的,还需要丰富特征信息,比如将图像上下左右移动一下,可以让特征更加稳定?
+
+
+KCF的作者的文章水平和MOSSE的还是有非常明显的差距,读完KCF完全不知道他在说什么,MOSSE写的就非常明白。
+
+$H$表示filter,也就是模版。$F$表示输入,新传入的图片。$G$表示输入和filter在频率域相乘计算后的结果,这个应该是不断更新的。
+
+
+detect的过程是:已经有了一个filter,然后我用这个filter去搜索新的图片,响应的最大值就是目标。为了能够加快这个搜索的过程,我们可以转换到频率域下进行计算。所以$G=F\odot H$就是搜索的过程,得到响应值$G$。
+然后在把响应值$G$再转换到空间域下,就能找到相似的位置了。
+首先,我们的目标就是训练一个分类器,用于判断输入的图片是否属于目标物体。这是检测的过程。
+同时,确定新的模版以后,要对分类器进行训练,
\ No newline at end of file
diff --git "a/source/_tmp/\345\276\205\345\206\231\346\270\205\345\215\225.md" "b/source/_tmp/\345\276\205\345\206\231\346\270\205\345\215\225.md"
new file mode 100644
index 00000000..29c7b4df
--- /dev/null
+++ "b/source/_tmp/\345\276\205\345\206\231\346\270\205\345\215\225.md"
@@ -0,0 +1,4 @@
+1. teamviewer远程的时候,如果没有显示器,会造成无法初始化界面出来。xorg没有运行。进行一些操作还导致整个界面运行不起来。
+2. 怎么实现autossh端口的自动分配自动上传?
+3. cmake相关的教程,写一个系列吧
+4. 《人工智能简史》里面提到了很多的人,他们之间的关系错综复杂,又相互连接,同时早就了现在很多的成就。把这个可以梳理一下。
\ No newline at end of file
diff --git a/source/favicon.png b/source/favicon.png
deleted file mode 100644
index ec33a133..00000000
Binary files a/source/favicon.png and /dev/null differ
diff --git a/source/images/avatar.jpg b/source/images/avatar.jpg
deleted file mode 100644
index 6535c29e..00000000
Binary files a/source/images/avatar.jpg and /dev/null differ
diff --git a/source/images/donate/alipayimg.png b/source/images/donate/alipayimg.png
deleted file mode 100644
index 5b56667c..00000000
Binary files a/source/images/donate/alipayimg.png and /dev/null differ
diff --git a/source/images/donate/wechatpayimg.png b/source/images/donate/wechatpayimg.png
deleted file mode 100644
index a3939c80..00000000
Binary files a/source/images/donate/wechatpayimg.png and /dev/null differ
diff --git a/source/images/favatar/SzsFox-logo.png b/source/images/favatar/SzsFox-logo.png
deleted file mode 100644
index 35e2838b..00000000
Binary files a/source/images/favatar/SzsFox-logo.png and /dev/null differ
diff --git a/source/images/favatar/chuangzaoshi-logo.png b/source/images/favatar/chuangzaoshi-logo.png
deleted file mode 100644
index 2b85f56a..00000000
Binary files a/source/images/favatar/chuangzaoshi-logo.png and /dev/null differ
diff --git a/source/images/favatar/idesign-logo.png b/source/images/favatar/idesign-logo.png
deleted file mode 100644
index f90c4c13..00000000
Binary files a/source/images/favatar/idesign-logo.png and /dev/null differ
diff --git a/source/images/xingqiu-qrcode.jpg b/source/images/xingqiu-qrcode.jpg
deleted file mode 100644
index 23798383..00000000
Binary files a/source/images/xingqiu-qrcode.jpg and /dev/null differ
diff --git a/LICENSE b/themes/pure/LICENSE
similarity index 100%
rename from LICENSE
rename to themes/pure/LICENSE
diff --git a/themes/pure/_config.yml b/themes/pure/_config.yml
new file mode 100644
index 00000000..ac4fdf39
--- /dev/null
+++ b/themes/pure/_config.yml
@@ -0,0 +1,239 @@
+# menu
+menu:
+ Home: .
+ Archives: archives # 归档
+ Categories: categories # 分类
+ Tags: tags # 标签
+ Repository: repository # github repositories
+ # Books: books # 豆瓣书单
+ # Links: links # 友链
+ About: about # 关于
+
+# Enable/Disable menu icons
+menu_icons:
+ enable: true # 是否启用导航菜单图标
+ home: icon-home-fill
+ archives: icon-archives-fill
+ categories: icon-folder
+ tags: icon-tags
+ repository: icon-project
+ # books: icon-book-fill
+ # links: icon-friendship
+ about: icon-cup-fill
+
+# rss
+rss: /atom.xml
+
+# Site
+site:
+ logo:
+ enabled: true
+ width: 40
+ height: 40
+ url: https://joeltsui-blog.oss-cn-hangzhou.aliyuncs.com/icon.jpg
+ title: 理想国 #页面title
+ favicon: https://joeltsui-blog.oss-cn-hangzhou.aliyuncs.com/icon.ico
+ board: