26 Jun

OCR技术浅探:9. 代码共享(完)

文件说明:

1. image.py——图像处理函数,主要是特征提取;

2. model_training.py——训练CNN单字识别模型(需要较高性能的服务器,最好有GPU加速,否则真是慢得要死);

3. ocr.py——识别函数,包括单字分割、前面训练好的模型进行单字识别、动态规划提升效果;

4. main.py——主文件,用来调用1、3两个文件。

5、我们的模型中包含的字.txt(UTF-8编码)

点击阅读全文...

7 Nov

【外微分浅谈】6. 微分几何

终于开始谈到重点了,就是这部分内容促使我学习外微分的。用外微分可以方便地推导微分几何的一些内容,有时候还能方便计算。其主要根源在于:外微分本身在形式上是微分的推广,因此微分几何的东西能够使用外微分来描述并不出奇;然后,最重要的原因是,外微分把$dx^{\mu}$看成一组基,因此相当于在几何中引入了两组基,一组是本身的向量基(用张量的语言,就是逆变向量的基),这组基可以做对称的内积,另外一组基就是$dx^{\mu}$,这组基可以做反对称的外积。因此,当外微分引入几何时,微分几何就拥有了微分、积分、对称积、反对称积等各种“理想装备”,这就是外微分能够加速微分几何推导的主要原因。

标架的运动

前面已经得到
$$\begin{aligned}&\omega^{\mu}=h_{\alpha}^{\mu}dx^{\alpha}\\
&d\boldsymbol{r}=\hat{\boldsymbol{e}}_{\mu} \omega^{\mu}\\
&ds^2 = \eta_{\mu\nu} \omega^{\mu}\omega^{\nu}\\
&\langle \hat{\boldsymbol{e}}_{\mu}, \hat{\boldsymbol{e}}_{\nu}\rangle = \eta_{\mu\nu}\end{aligned} \tag{45} $$

点击阅读全文...

5 Nov

【外微分浅谈】3. 正交标架

众所周知,要掌握黎曼几何,需要强烈的几何直观感。但除此之外,用分量语言描述的黎曼几何,也需要很好的分析能力才能梳理清楚,因为有$N$多的指标在表示着分量和求和,咋看上去处处皆指标。这种繁琐的分量语言并不总讨人喜欢,甚至在不少地方是声名狼籍的。

在分量的语言中,我们本质上可以在局部建立任意形式的坐标系,也就是采用任意形式的基底$\{\boldsymbol{e}_{\mu}\}$,或者说自然标架。但不可否认,在正交标架(标准正交基)之下,很多方程会简单不少,并且得益于我们对欧氏空间的熟练,我们对正交标架下的研究可能会更有感觉。因此,如果条件允许的话,我们应当使用正交标架$\{\hat{\boldsymbol{e}}_{\mu}\}$,哪怕是活动的,这里我们用$\hat{}$标记正交标架。

比如,我们有微元
$$d\boldsymbol{r} = \boldsymbol{e}_{\mu}dx^{\mu} \tag{12} $$
是在一般标架下测量的,那么就可以得到黎曼度量

点击阅读全文...

11 Nov

【外微分浅谈】7. 有力的计算

这里我们将展示上面一节的方法对于计算黎曼曲率张量的计算是多少的有力!我们再次列出我们得到的所有公式。首先是概念式的
$$\begin{aligned}&\omega^{\mu}=h_{\alpha}^{\mu}dx^{\alpha}\\
&d\boldsymbol{r}=\hat{\boldsymbol{e}}_{\mu} \omega^{\mu}\\
&ds^2 = \eta_{\mu\nu} \omega^{\mu}\omega^{\nu}\\
&\langle \hat{\boldsymbol{e}}_{\mu}, \hat{\boldsymbol{e}}_{\nu}\rangle = \eta_{\mu\nu}\end{aligned} \tag{65} $$
然后是
$$\begin{aligned}&d\eta_{\mu\nu}=\omega_{\nu\mu}+\omega_{\mu\nu}=\eta_{\nu\alpha}\omega_{\mu}^{\alpha}+\eta_{\mu \alpha}\omega_{\nu}^{\alpha}\\
&d\omega^{\mu}+\omega_{\nu}^{\mu}\land \omega^{\nu}=0\end{aligned} \tag{66} $$
这两个可以帮助我们确定$\omega_{\nu}^{\mu}$;接着就是
$$\mathscr{R}_{\nu}^{\mu} = d\omega_{\nu}^{\mu}+\omega_{\alpha}^{\mu} \land \omega_{\nu}^{\alpha} \tag{67} $$
最后你要正交标架下的$\hat{R}^{\mu}_{\nu\beta\gamma}$,就要写出:
$$\mathscr{R}_{\nu}^{\mu}=\sum_{\beta < \gamma} \hat{R}^{\mu}_{\nu\beta\gamma}\omega^{\beta}\land \omega^{\gamma} \tag{68} $$
如果你要原始标架下的$R^{\mu}_{\nu\beta\gamma}$,就要写出
$$(h^{-1})_{\mu'}^{\mu}\mathscr{R}^{\mu'}_{\nu'}h_{\nu}^{\nu'} = \sum_{\beta < \gamma} R^{\mu}_{\nu\beta\gamma}dx^{\beta}\land dx^{\gamma} \tag{69} $$
然后依次读出$R^{\mu}_{\nu\beta\gamma}$,就像制表一样。

点击阅读全文...

25 Nov

三顾碎纸复原:基于CNN的碎纸复原

赛题回顾

不得不说,2013年的全国数学建模竞赛中的B题真的算是数学建模竞赛中百年难得一遇的好题:题目简洁明了,含义丰富,做法多样,延伸性强,以至于我一直对它念念不忘。因为这个题目,我已经在科学空间写了两篇文章了,分别是《一个人的数学建模:碎纸复原》《迟到一年的建模:再探碎纸复原》。以前做这道题的时候,还只有一点数学建模的知识,而自从学习了数据挖掘、尤其是深度学习之后,我一直想重做这道题,但一直偷懒。这几天终于把它实现了。

如果对题目还不清楚的读者,可以参考前面两篇文章。碎纸复原共有五个附件,分别代表了五种“碎纸片”,即五种不同粒度的碎片。其中附件1和2都不困难,难度主要集中在附件3、4、5,而3、4、5的实现难度基本是一样的。做这道题最容易想到的思路就是贪心算法,即随便选一张图片,然后找到与它最匹配的图片,然后继续匹配下一张。要想贪心算法有效,最关键是找到一个良好的距离函数,来判断两张碎片是否相邻(水平相邻,这里不考虑垂直相邻)。

点击阅读全文...

6 Aug

【不可思议的Word2Vec】6. Keras版的Word2Vec

前言

看过我之前写的TF版的Word2Vec后,Keras群里的Yin神问我有没有Keras版的。事实上在做TF版之前,我就写过Keras版的,不过没有保留,所以重写了一遍,更高效率,代码也更好看了。纯Keras代码实现Word2Vec,原理跟《【不可思议的Word2Vec】5. Tensorflow版的Word2Vec》是一样的,现在放出来,我想,会有人需要的。(比如,自己往里边加一些额外输入,然后做更好的词向量模型?)

由于Keras同时支持tensorflow、theano、cntk等多个后端,这就等价于实现了多个框架的Word2Vec了。嗯,这样想就高大上了,哈哈~

代码

点击阅读全文...

17 Sep

变分自编码器(四):一步到位的聚类方案

由于VAE中既有编码器又有解码器(生成器),同时隐变量分布又被近似编码为标准正态分布,因此VAE既是一个生成模型,又是一个特征提取器。在图像领域中,由于VAE生成的图片偏模糊,因此大家通常更关心VAE作为图像特征提取器的作用。提取特征都是为了下一步的任务准备的,而下一步的任务可能有很多,比如分类、聚类等。本文来关心“聚类”这个任务。

一般来说,用AE或者VAE做聚类都是分步来进行的,即先训练一个普通的VAE,然后得到原始数据的隐变量,接着对隐变量做一个K-Means或GMM之类的。但是这样的思路的整体感显然不够,而且聚类方法的选择也让我们纠结。本文介绍基于VAE的一个“一步到位”的聚类思路,它同时允许我们完成无监督地完成聚类和条件生成。

理论

一般框架

回顾VAE的loss(如果没印象请参考《变分自编码器(二):从贝叶斯观点出发》):
$$KL\Big(p(x,z)\Big\Vert q(x,z)\Big) = \iint p(z|x)\tilde{p}(x)\ln \frac{p(z|x)\tilde{p}(x)}{q(x|z)q(z)} dzdx\tag{1}$$
通常来说,我们会假设$q(z)$是标准正态分布,$p(z|x),q(x|z)$是条件正态分布,然后代入计算,就得到了普通的VAE的loss。

点击阅读全文...

27 Sep

关于维度公式“n > 8.33 log N”的可用性分析

在之前的文章《最小熵原理(六):词向量的维度应该怎么选择?》中,我们基于最小熵思想推导出了一个词向量维度公式“$n > 8.33\log N$”,然后在《让人惊叹的Johnson-Lindenstrauss引理:应用篇》中我们进一步指出,该结果与JL引理所给出的$\mathcal{O}(\log N)$是吻合的。

既然理论上看上去很完美,那么自然就有读者发问了:实验结果如何呢?8.33这个系数是最优的吗?本文就对此问题的相关内容做一个简单汇总。

词向量

首先,我们可以直接,当$N$为10万时,$8.33\log N\approx 96$,当$N$为500万时,$8.33\log N\approx 128$。这说明,至少在数量级上,该公式给出的结果是很符合我们实际所用维度的,因为在词向量时代,我们自行训练的词向量维度也就是100维左右。可能有读者会质疑,目前开源的词向量多数是300维的,像BERT的Embedding层都达到了768维,这不是明显偏离了你的结果了?

点击阅读全文...