才权的博客


  • 首页

  • 归档

  • 标签

  • 关于

TensorFlow开发环境搭建(Ubuntu16.04+GPU+TensorFlow源码编译)

发表于 2018-01-11

由于图片外链被禁止了,图片不能显示,完整文章看这里吧:https://zhuanlan.zhihu.com/p/33089119

1 安装选择

1.1 平台

目前TensorFlow已支持Mac、Ubuntu和Windows三个主流平台(64位平台),
https://www.tensorflow.org/install/

1.2 GPU vs CPU

在安装时可以选择安装版本是否支持GPU,
https://www.tensorflow.org/install/install_linux

1.3 二进制安装 vs 源码安装

同时,安装时可以考虑采用二进制安装,还是源码安装,
https://www.tensorflow.org/install/

1.4 二进制安装选择

二进制安装可以有多种选择,
https://www.tensorflow.org/install/install_linux

1.5 实际使用选择

手头上有两台电脑,

  • MacBook Pro (Retina, 13-inch, Early 2015)
    处理器:2.7 GHz Intel Core i5
    内存:8GB 1867MHz DDR3
    显卡:Intel Iris Graphics 6100 1536MB
  • 攀升兄弟组装台式机
    处理器:英特尔 Core i7-6700 @3.40GHz 四核
    主板:华硕 B150M-ET M2 SERIES
    内存:8G(威刚DDR4 2801MHz)
    硬盘:三星 MZ7TE256HMHP-00000(256GB/固态硬盘)
    显卡:Nvidia GeForce GTX 950(2GB)

其中,
MacBook Pro采用基于Anaconda的二进制安装方式(仅支持CPU)。Anaconda是一个集成平台,包含大多数机器学习的常用工具,

  • NumPy:科学运算包
  • SciPy:在NumPy的基础上构建,功能更加强大的科学计算包
  • Matplotlib:类似Matlab的绘图工具包
  • Scikit-learn:经典机器学习工具包
  • Pandas:数据处理和分析工具包(可用于数据读写、清洗、填充和分析等场景)
    采用Anaconda安装方案,一方面MacBook Pro的开发环境很容易搭建(几句命令即可完成),另一方面,基于Anaconda的环境,也可以方便验证简单的机器学习算法。

对于台式机则采用了Ubuntu+GPU+TensorFlow源码编译的方式,进行TensorFlow环境搭建,下面我们着重介绍下这种安装方式。

2 Ubuntu16.04+TensorFlow(GPU)源码编译

2.1 Ubuntu系统安装

目前,大多数计算机,包括台式机已没有了光驱,同时,Ubuntu的系统安装盘也不易获得。针对这种情况,我们可以采用U盘来进行安装。具体步骤可以参考:《Ubuntu 16.04 U盘安装图文教程》

2.2 禁用UEFI安全启动

对于华硕 B150M-ET主板,UEFI默认是开启的。而UEFI开启会导致第三方驱动安装失败(如显卡驱动,这是源码编译安装GPU支持的TensorFlow,遇到的第一个坑)。具体步骤可以参考:《华硕主板禁用UEFI安全启动》

2.3 安装NVIDIA驱动

2.3.1 安装方式

英伟达的显卡驱动有三种方式:

  • apt-get+系统设置安装
  • 安装CUDA时顺便安装
  • 官方下载最新驱动并安装
    参考:《Ubuntu 16.04安装NVIDIA驱动》

    2.3.2 安装步骤

    本文采用第一种方案:

    sudo apt-get install nvidia-367
    

然后进入:System Settings->Software&Updates->Additional Drivers->,选择NVIDIA Corporation[Using NVIDIA binary driver]

2.3.3 验证测试

nvidia-smi #若列出GPU的信息列表,表示驱动安装成功
nvidia-settings #若弹出设置对话框,亦表示驱动安装成功

2.4 安装CUDA

CUDA(Compute Unified Device Architecture),是显卡厂商NVIDIA推出的运算平台。可以理解成基于GPU并行计算的应用层接口。
CUDA8.0下载地址
https://developer.nvidia.com/cuda-80-download-archive
安装Cuda的时候,需要关闭X服务。

sudo service lightdm stop

这时,系统会出现黑屏。此时,同时按住[CTRL + ALT + F1]三个键进入命令行模式(如果不能进入命令行模式,可以参考《alt+ctrl+F1黑屏 ,解决方案》),
然后输入[账号],[密码]后登陆。
在CUDA的下载目录运行,

sudo sh cuda_xxx.run

需要注意的是,在询问是否安装“NVIDIA Accelerated Graphics Driver”可以选择“是”,

Install NVIDIA Accelerated Graphics Driver for Linux-x86_64 361.62?
(y)es/(n)o/(q)uit: y

但在后续出现询问是否安装“X configuration”时,则需要选择“否”,否则之前安装的显卡驱动就白安装了。
CUDA安装结束后,则可以恢复到图形界面模式,

sudo service lightdm start

到这里,CUDA的安装还不算结束,需要将CUDA相关的内容添加到系统环境变量中。安装过程中Summary提示,

Please make sure that
– PATH includes /usr/local/cuda-8.0/bin
– LD_LIBRARY_PATH includes /usr/local/cuda-8.0/lib64, or, add /usr/local/cuda-8.0/lib64 to /etc/ld.so.conf and run ldconfig as root

CUDA相关的环境变量可以放在~/.bashrc中,

vi ~/.bash_profile

在其中,增加如下两行,

export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/usr/local/cuda-  8.0/lib64:/usr/local/cuda-8.0/extras/CUPTI/lib64"
export CUDA_HOME=/usr/local/cuda-8.0

2.5 安装cuDNN

cuDNN(CUDA Deep Neural Network)相比标准的cuda,它在一些常用的神经网络操作上进行了性能的优化,比如卷积,pooling,归一化,以及激活层等等。
下载地址:https://developer.nvidia.com/rdp/cudnn-download
https://developer.nvidia.com/rdp/cudnn-download

下载cuDNN后进行解压,并执行如下命令:

sudo cp cuda/include/cudnn.h /usr/local/cuda-8.0/include
sudo cp -d cuda/lib64/libcudnn* /usr/local/cuda-8.0/lib64
sudo chmod a+r /usr/local/cuda/include/cudnn.h /usr/local/cuda-8.0/lib64/libcudnn*

2.6 gcc降低版本

网上说cuda8.0不支持5.0以上的编译器,因此需要降级,把编译器版本降到4.9,但我看了CUDA8.0的安装手册《NVIDIA CUDA INSTALLATION GUIDE FOR
LINUX》,并没有发现这一条,
《NVIDIA CUDA INSTALLATION GUIDE FOR
LINUX》
在实际使用中,还是将GCC做了降级(PS,在安装时可以先不降级,看看是否会出问题),GCC降级方法如下,

sudo apt-get install g++-4.9
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.9 20
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-5 10
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.9 20
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-5 10
sudo update-alternatives --install /usr/bin/cc cc /usr/bin/gcc 30
sudo update-alternatives --set cc /usr/bin/gcc
sudo update-alternatives --install /usr/bin/c++ c++ /usr/bin/g++ 30
sudo update-alternatives --set c++ /usr/bin/g++

2.7 安装Bazel

Bazel是一个构建工具,即一个可以运行编译和测试来组装软件的工具,跟Make、Ant、Gradle、Buck、Pants和Maven一样。TensorFlow的编译是基于Bazel完成的。
Bazel官方地址:https://docs.bazel.build/versions/master/install.html
https://docs.bazel.build/versions/master/install.html

2.7.1 安装准备

https://docs.bazel.build/versions/master/install-ubuntu.html

2.7.2 安装

Bazel可以通过apt-get和下载安装两种方式完成,本文中,采用下载安装的方式实现,

chmod +x PATH_TO_INSTALL.SH 
./PATH_TO_INSTALL.SH --user 

2.8 第三方库安装

sudo apt-get install python-numpy swig python-dev python-wheel
sudo apt-get install libcupti-dev
sudo apt-get install git

2.9 TensorFlow源码编译

2.9.1 下载

git clone https://github.com/tensorflow/tensorflow

2.9.2 编译配置

cd ~/tensorflow
./configure

2.9.3 编译安装

bazel build -c opt //tensorflow/tools/pip_package:build_pip_package
bazel build -c opt --config=cuda //tensorflow/tools/pip_package:build_pip_package
bazel-bin/tensorflow/tools/pip_package/build_pip_package /tmp/tensorflow_pkg
sudo pip install /tmp/tensorflow_pkg/tensorflow-0.10.0-cp2-none-any.whl

至此,便完成了支持GPU的TensorFlow源码编译。

2.10 环境测试

可以通过如下代码进行测试,

# Python
import tensorflow as tf
hello = tf.constant('Hello, TensorFlow!')
sess = tf.Session()
print(sess.run(hello))

正常测试输出,

Hello, TensorFlow!

3 资料参考

《Ubuntu 16.04 U盘安装图文教程》
《华硕主板禁用UEFI安全启动》
《Ubuntu 16.04安装NVIDIA驱动》
《alt+ctrl+F1黑屏 ,解决方案》
《Ubuntu16.04 下安装GPU版TensorFlow(包括Cuda和Cudnn)》
《ubuntu16.04下安装TensorFlow(GPU加速)》

机器学习/深度学习入门资料汇总

发表于 2017-11-12

由于图片外链被禁止了,图片不能显示,完整文章看这里吧:https://zhuanlan.zhihu.com/p/30980999

经常被同学和朋友询问机器学习或深度学习入门,有哪些不错的参考资料。老实讲,这个问题在网上随便一搜就是一大把的答案。我自己在最开始的时候也有同样的困惑,同样在搜索引擎和论坛里翻找答案。但大多数答案并不怎么让人满意:搜索结果要么星稀零散,只见树木不见森林;要么过于详尽,让人无从下手(很多资料作者自己都没看过)。
在这篇文章里,我把自己在学习过程中的参考资料进行了梳理。一方面,希望能给你一个相对系统的学习路线参考;另一方面,自己真实的实践经历,遇过坎,掉过坑,希望能给正准备入门的同学更多真实的借鉴。

入门视频

机器学习

很多人会推荐吴恩达在斯坦福的公开课CS229,但对于初学的同学来说,我觉得并不适合。虽然Andrew在课的最开始就说了,他的这门看更侧重于实践。但真实情况是,里面有太多的数学推导和证明。直接使用这门课来入门,对初学的同学来说,在信心上会是不小的打击。特别是很多从应用开发转到机器学习的同学,毕竟在平常的工作中,大学的数学知识在实际的开发中应用的并不多,估计很多现在都已经生疏了。
对于机器学习,我推荐吴恩达在Coursera开设的机器学习课程,课程免费,侧重于基本的原理和工程实现,对初学者相对友好。字幕中英可选。
课程链接:https://www.coursera.org/learn/machine-learning

深度学习

大家可能看过《一天搞懂深度学习》的PPT,作者是台湾大学的李宏毅老师。其实,李宏毅老师还有门深度学习的课程,视频也挂在网上。这门课主要针对初学者,而且,不需要有经典的机器学习基础(其实,深度学习入门,比经典的机器学习更容易)。课程的内容深入浅出,训练和预测样本都是各种数码宝贝和二次元卡通人物,绝对让你耳目一新。好像没有字幕,中文授课(台湾腔)。
课程链接:http://speech.ee.ntu.edu.tw/~tlkagk/courses_ML17.html

在看李宏毅老师的视频时,Andrew的《深度学习工程师》项目还没开始。后来把Andrew的课程看完(一共五部分,目前只出了前四部分),觉得Andrew的课程同样很棒。两者对比,李宏毅老师的课,课时相对较短,内容相对全面(对无监督学习、对抗学习、强化学习都有介绍),课程偏重概念介绍,但涉及到数学的部分跳跃性较大,不容易跟上。Andrew的课学时相对较长(一共五个大的部分),内容相对集中(主要讲解监督学习,集中在DNN、CNN和RNN),但讲解和分析更加细致,学习曲线相对平坦。针对于初学者可以先看李宏毅老师的课程对深度学习有个整体的框架认识,然后看Andrew的课程把握更多的细节知识。Andrew的课程本来是Coursera的付费课程,目前跟网易云课堂合作,不用翻墙就可以看了。
课程链接:https://mooc.study.163.com/smartSpec/detail/1001319001.htm

入门书籍

机器学习

《机器学习》

机器学习的入门书籍,当仁不让的就是周志华老师的西瓜书《机器学习》了。这本书基本囊括了绝大多数经典的机器学习方法。但坦白的讲,这本书入门也不是那么轻松,大量篇幅的数学推导和证明。建议初学者可以在第一遍的时候跳过具体的数学推导,更侧重在知识框架和原理的学习和提炼,后面可以通过第二遍或第三遍来深入其中的数学原理。

深度学习

《深度学习》
这一本称为目前深度学习领域的圣经,而作者们也确实做到了深入浅出,循序渐进。不是单纯的抛一个结论,而是逐步的深入,最终阐明原理。建议像《机器学习》一样使用:不要求第一遍就能全部吸收,可以先从框架和基本原理入手,跳过部分细节,后面再逐步深入。

数学基础

看前面的视频和书籍,对于很多从事应用开发的同学来说,可能最大的障碍就是对数学的恐惧。这种感觉大概就像没经历过算法训练的同学面对算法面试一样。其实,恐惧只要能直面它,那就一定能够克服掉。就好比在LeetCode这样的OJ平台刷完200道左右的题目,再去面试算法一样。以前觉得是天大的障碍,现在回过头来,也不觉得有什么了不起。
我个人的经验是,通过前面的视频和书籍已经对机器学习和深度学习有了基本的系统框架和原理认识,同时,也积累了对数学知识进行系统复习的强烈欲望。这时候就可以有的放矢的复习大学知识了。数学知识的复习,我都是通过看网易公开课来完成的。

微积分

MIT《单变量微积分》:http://open.163.com/special/sp/singlevariablecalculus.html
虽说是MIT的课程,但坦白的讲,老师的节奏真是比国内的课程还要慢,真正做到了通俗易懂。
网易公开课还有MIT的《多变量微积分》,但我没有看,我觉得复习完单变量微积分,也就基本够用了。

线性代数

MIT《线性代数》
http://open.163.com/special/opencourse/daishu.html
这门课就没有上面的《单变量微积分》那么Nice了,老师思路跳跃性很强,稍一走神就不知道讲到什么地方了 。但这门课有个很大的优点,就是从一开始就引入了向量空间的概念,而且贯穿始终。不像国内的课程,直到课程结束都以为线性代数只是求解方程组的另一种表达形式。

概率 / 统计

可汗学院《概率》
http://open.163.com/special/Khan/probability.html
可汗学院《统计学》
http://open.163.com/special/Khan/khstatistics.html
老实讲,可汗的公开课真是太细致了,细致到觉得拖沓(可能是复习,而不是初学者的缘故)。建议根据自己的需要做适当的跳跃。同时,两门课有部分内容是完全重合的,可以直接跳过。

Python

有了前面的基础相信你已经跃跃欲试了,但别急,工欲善其事必先利其器。可能你已经有MATLAB、C/C++、Java的编程经验,但建议再入手一款新武器-Python。虽然前面的语言也可以用于机器学习和深度学习相关的研究和开发,但Python的使用范围更广,参考资料也更加丰富。
我的自己经验是,

  • 1-在网上找一篇Python入门的帖子,搭建环境,运行简单的例子(半天)
  • 2-找一本基础书籍,系统的熟悉下语言的基本特性和完整框架(1~2天)
    ps:我之前有C/C++和Java的语音基础
  • 3-开始正常使用Python进行开发,遇到问题,求助搜索引擎(2个月以上)
  • 4-觉得自己对语言就基本的掌握后,可以根据选择进行进阶学习了
    上面1~2天时间来系统的熟悉Python语言特性和语言框架的书籍我推荐,
    《Python基础教程》
    (这本书很厚,初期把目录扫完就可以了,后面当做字典来使用)

Python基础教程

进阶阶段,推荐,
《流畅的Python》
流畅的Python

动手实践

初级

好了现在我们终于可以动手实践了,
《Python机器学习及实践:从零开始通往Kaggle竞赛之路》
Python机器学习及实践:从零开始通往Kaggle竞赛之路
这是很薄的一本书,但对于初学者实践来说却是非常棒的一本书。书中的大多数算法都是基于sk-learn来实现的。使用现成的Python库,而不用关心具体算法实现过程,可以快速体验机器学习算法的效果。同时,书的最后比较细致的介绍了Kaggle竞赛平台的使用,实战性更强。

进阶

《Python机器学习及实践:从零开始通往Kaggle竞赛之路》使用现成的Python库(工程中也大多是这样的)。但很多同学还是更希望能手工实现具体的算法,觉得这样基本功才扎实,那下面的这两本书就能很好的满足有这样想法的同学了。
《机器学习实战》
机器学习实战
经典的机器学习算法手工实现,书中包含大量的代码实例。但这本书出本的比较早,深度学习内容基本没有涉猎。针对这种情况,就有了下面这本的推荐,

《TensorFlow Machine Learning Cookbook》
TensorFlow Machine Learning Cookbook
这本书主要是基于TensorFlow的,手工编织网络。而且,书的内容就像它的名字一样,结构编排跟类似菜谱:开始前需要准备什么,开始后需要遵从哪些步骤,最后又会得到怎样的结果,条理非常清晰。目前这本书已经有了中文版。

领域应用

虽然我们花费了很长的时间,投入了很多精力,但我们目前的阶段仍然像做大学作业,跟真实的工业场景相差很远。那机器学习和深度学习在实际的AI场景是如何应用的呢?带着这样的问题,我推荐两本书,
《数学之美》
数学之美
吴军老师的经典之作。虽然这本书火的时候,AI都还没有现在这么火,但书中介绍的很多场景,使用的很多技术,基本都是来自我们学习的机器学习。

《统计自然语言处理》
统计自然语言处理
选择这边书是因为自己当前的工作跟自然语言处理相关。当然了,这也是自然语言处理领域非常经典的一本书,内容全面丰富。但学术的气息比较重,读起来又找到了当初读研看Paper的感觉。

杂项

比较正统的学习基本就算介绍完毕了。其实,除了上面的主线内容外,很多比较零散的资料,对于学习来说也还是很有裨益的。
《莫烦视频》
莫烦的个人主页有很多机器学习和深度学习相关的个人录制视频。以非常简洁的方式介绍了机器学习和深度学习相关的概念和框架,对初学者快速建立概念很有帮助(PS:92年的小鲜肉,真是不得了)。
地址:https://morvanzhou.github.io/about/
《深度学习简化版》
形式跟莫凡的视频类似,是老外录制的。相比于莫烦的视频,内容更丰富多样,形式更新颖。通过YouTube播放,需要翻墙。
地址:https://www.youtube.com/watch?list=PLjJh1vlSEYgvGod9wWiydumYl8hOXixNu&v=b99UVkWzYTQ
《AI技术内参》
这是《极客时间》的一个付费专栏。主要推送AI相关的技术历史、当前行业信息和科研成果,从目前的使用情况来说,在品质上还是有保障的。

好啦,暂时就先这样吧,后面有更好的内容再更新,也欢迎大家分享自己的学习经验。

Step by Step带你玩转DuerOS - DuerOS客户端架构设计(6)

发表于 2017-11-11

由于图片外链被禁止了,图片不能显示,完整文章看这里吧:https://www.jianshu.com/p/ab3ae8067bb8

在前面的系列文章中,我们完整的分析了智能语音系统的系统组成,然后,我们提供了一个基于Python的DuerOS客户端供大家实际体验。这时候很多同学可能想:我能不能从零开始,完全的基于DuerOS提供的后台能力接口,用自己喜欢的语言(如C/C++、Java、ObjectC、Python、NodeJS),在自己熟悉的平台上(如Android、iOS、Linux、Windows、树莓派、单片机),自己独立完成DurOS的客户端开发呢?特别是对有产品化想法的同学,把DurOS的能力集成到自己的项目平台中。
这篇文章就跟大家一起来熟悉下DuerOS客户端实现的架构设计,主要是侧重对DuerOS客户端协议的解析(对于设备端开发过程中涉及到的更多细节,如AEC、采样率转换、音频焦点管理、混音处理),会在后面的文章中一一作出介绍和解析),希望这篇文章能对你的开发和工作有帮助。

DuerOS客户端核心任务

简单的说,客户端的主要任务就是,将用户的语音数据通过网络传给DuerOS后台,然后,执行DuerOS后台经过语音处理后的结果。
当然了如果,真是这么简单就好了~
具体的说,客户端需要完成的工作主要有,

  • 同DuerOS后台建立长链接,接收并处理DuerOS后台的推送命令(Directive)
  • 上传用户录音数据到DuerOS后台服务器
  • 执行上传录音后,DuerOS后台返回的控制命令(Directive)
  • 上传设备事件[Event]到DuerOS后台服务端
  • 通过Ping的方式保持链接
    其中,
    Directive:指DurOS服务端对客户端的控制命令,如播放一个语音,设置一个闹钟,播放一个音乐等等。
    Event:指客户端上报当前发生的事件到DuerOS服务端,如音乐播放开始了,音乐播放结束了,闹铃开始响了,设备被唤醒并开始接受用户语音请求等等。在上传Event时,会附带设备当前的状态信息(ClientContext,如当前是否有音乐正在播放,播放到哪里了,设备端是否有设置闹铃,闹铃状态等等)。

    代码实现

    下面我们就结合具体场景和代码,逐个的来看各个部分是如何实现的。
    分析场景:
  • 用户语音输入“播放周杰伦的歌”
  • 客户端上传用户的语音数据到DurOS后台服务器
  • DuerOS后台服务判断用户输入结束,下发停止录音Directive
  • 客户端响应停止录音的Directive
  • 客户端响应录音通道,服务端返回的需要播放歌曲的Directive
  • 客户端上报开始音乐播放的状态到DuerOS后台服务器

    1. 同DuerOS后台建立长链接,接收并处理DuerOS后台的推送命令(Directive)

    长链接主要实现DuerOS后台主动向客户端发送命令。比如,客户端一直向DuerOS后台发送数据,当DuerOS后台检测到用户输入结束时(VAD检测),DuerOS后台会主动通知客户端停止录音,并上传录音数据。
    DuerOS的所有能力都是基于Http的(没有使用TCP/IP),为了实现长链接DuerOS的做法是:
  • 客户端向DuerOS服务端发送get请求(设置较长的超时时间)
  • DuerOS服务端收到get请求后,并不立即回复
  • DuerOS服务端需要主动下发命令给客户端时,返回get结果
  • 客户端通过接收get的返回内容,完成DuerOS服务端主动推动内容的接收
    Python DuerOS客户端对应的代码实现(sdk/dueros_core.py),
    长链接建立:
    长链接建立

DuerOS 下发Directive接收

DuerOS 下发Directive接收

2. 上传用户录音数据到DuerOS后台服务器

上传用户录音数据不单单是用户说话的音频流PCM数据,同时包括设备的状态信息(ClientContext),和开始录音的Event(ListenStarted)。状态和数据发送通过Post完成,Http的Body内容如下所示,

用户录音数据上传报文格式

其中,ClientContext、Event、和音频流PCM通过multipart+chunk的Http Post方式进行上传(后面可能会添加一个帖子,专门介绍下Http 1.0、1.1、 2.0、multipart、chunk传输等内容)。
Python DuerOS客户端对应实现(sdk/dueros_core.py),
用户录音数据上传

###3. 执行上传录音后,DuerOS后台返回的控制命令(Directive)
用户语音输入“播放周杰伦的音乐”后,语音上传通道会收到DuerOS后台服务器返回需要播放的音乐的Directive。

录音上传后返回的Directive

4. 客户端上传音乐开始播放的Event

音乐开始播放后,客户端上传音乐开始播放的Event到DuerOS服务端(sdk/interface/audio_player.py)
上传音乐开始播放的Event

5. Ping

Ping主要为了链接的维护。Http 1.0中每次Http 请求都需要进行TCP/IP的3次握手和4次挥手,Http1.1后支持连接复用,一次TCP/IP连接可以完成多次Http请求和回复。DuerOS使用Http2.0,为了避免链路上长时间没有数据传输而断开,使用Ping维持链接。
sdk/dureos_core.py
Ping

总结

通路总结

客户端同DuerOS服务端的通路一共有3个:

  • 长链接通路

长链接

双向
客户端发送get请求
服务端通过get response的形式推送消息(如停止录音Directive)

  • 事件上报通路

事件上报

双向
客户端发送post请求(包含开始录音的Event、当前设备状态ClientContext、录音数据PCM)
服务端返回语音请求的结果(如播放歌曲的Directive)
客户端单独上传事件到DurOS服务端(如开始播放音乐)

  • Ping通路

Ping

单向
客户端通过get形式在链路没数据时发送Ping数据包

注意事项

  • 事件(Event)和设备当前状态(ClientContext)一定是一起发送的
  • Directive下发通道
    长链接通道和事件上报通路(录音数据上传)都会下发Directive(如,长链接会下发停止录音的Directive,录音上传通道会下发包含音乐播放内容的音乐播放Directive)
  • Event上传通道
    录音数据上传(包括开始录音Event、当前设备状态ClientContext和录音数据PCM)和单独的事件上报(如音乐开始播放)共用同一通道
  • Http技术细节
    Http2.0特性
    链接复用
    MultiPart
    Chunk
    Ping连接维护
    关于Http相关的技术细节后面专门写篇帖子吧

Step by Step带你玩转DuerOS - 唤醒词替换(5)

发表于 2017-11-11

由于图片外链被禁止了,图片不能显示,完整文章看这里吧:https://www.jianshu.com/p/96284d314cbe

当前Python版本的DuerOS只能通过[小度小度]进行唤醒。论坛里和群里很多同学问:“那如果我想通过[大白大白],[叮当叮当]或者[你好]这样的自定义唤醒词来唤醒DuerOS改怎么做呢?”
自定义唤醒词其实超简单,下面我们就一步一步的来更换唤醒词。

1 在snowboy平台训练自己的唤醒词

先附上snowboy的官方地址:https://snowboy.kitt.ai/

登陆

登陆入口

创建自定义的唤醒词

自定义唤醒词创建

下载唤醒模型

在线训练完成后,下载训练模型(本例中我的训练唤醒词为“小白”)

唤醒模型下载

下载的模型为”小白.pmdl”

2 下载snowboy python接口代码

snowboy GitHub地址: https://github.com/Kitt-AI/snowboy

Clone snowboy接口代码

git clone https://github.com/Kitt-AI/snowboy.git

生成平台代码

在snowboy/swig/Python目录执行“make”命令,
平台代码生成

snowboy GitHub README.md

获得snowboy python接口组件

将snowboy/examples目录下的Python目录更名为snowboy

image.png

3 Python DuerOS SDK代码更新

有了上面的定制唤醒模型(小白.pmdl)和snowboy python接口组件,下面就可以更新Python DuerOS SDK的代码了。

Python DuerOS 中的app/snowboy目录内容更新

先删除Python DuerOS中的app/snowboy文件夹,然后再将步骤2中生成的snowboy文件夹拷贝到app/目录下,然后,将训练好的唤醒模型(小白.pmdl)拷贝到app/snowboy目录中。

snowboy目录

修改app/snowboy/snowboydecoder.py

####[1]修改 init ()函数
注释掉self.audio和self.stream_in
__init__

[2] 添加feed_data()方法

添加feed_data()方法

####[3] 修改terminate()方法

更新terminate()方法

修改app/wakeup_trigger_main.py

在main()方法中更新唤醒模型,

唤醒模型更新

注意事项

经过上面的步骤,我们便能够更新成自己喜欢的唤醒词。但我们自定义的唤醒词还不是完美的。在测试中会发现唤醒率并不高。根本的原因在于我们自定义的唤醒词,训练语料条太少了(可能只有1组,3条)。要达到一个很好的唤醒率,需要进行大量丰富的语音样本训练才行。

训练样本

Step by Step带你玩转DuerOS - OAuth2.0全面解析 (4)

发表于 2017-11-11

由于图片外链被禁止了,图片不能显示,完整文章看这里吧:https://www.jianshu.com/p/c0219b8a50cd

DuerOS的开发平台在创建产品时,有一步需要进行OAuth设置(http://open.duer.baidu.com/doc/overall/console-guide_markdown),
DuerOS OAuth配置
很多同学到这个步骤估计会很困惑,OAuth是什么?这里设置的URL有是什么呢?那我们这篇文章就好好讲一讲OAuth到底是什么?在DuerOS的接入过程中又是怎么使用的。

什么是OAuth

其实OAuth在我们日常中是非常常见的,但可能你没有专门的关注过功能背后的实现原理。这里有一篇阮一峰老师专门介绍OAuth的文章《理解OAuth 2.0》(http://www.ruanyifeng.com/blog/2014/05/oauth_2_0.html),这是我目前为止见得对OAuth讲解最浅显又是最全面的一篇(ps 阮一峰老师的文章质量都很高呀)。

DuerOS是如何使用OAuth的

OAuth有4中授权模式,

OAuth授权模式

而DuerOS使用的便是其中功能最完整、流程最严密的授权码模式。下面我们通过Python版本的DuerOS客户端来分析下DuerOS对OAuth的使用。

认证流程组成单元

授权码模式的认证流程如下所示,

授权码模式认证流程

主要涉及到4个基本单元:

  • A-用户客户端
  • B-用户端浏览器(完成URI重定向)
  • C-用户客户端对应的后台服务器
  • D-认证服务器

针对于DuerOS Python客户端,A、B、C、D分别对应:

  • A-auth.sh(app/auth.py)
  • B-系统浏览器
  • C-app/auth.py中创建的Tornado WebServer
  • D-百度的认证服务器

    OAuth认证流程

    下面我们结合代码,一步一步的解析OAuth的整个过程
    ####1.用户客户端(A)对应的后台服务器(C)创建
    运行,

    ./auth.sh

    Python客户端会创建一个本地的Tornado WebServer,

Tornado WebServer创建(app/auth.py)

这个Tornado WebServer只是为了调试方便被部署在本地,实际项目应用中会作为独立的Web服务,部署在云端的。

2. 客户端(A)吊起本地浏览器(B)访问客户端对应的后台服务器(C)

好像有些绕(汗。。。)

app/auth.py

其中,URL(http://127.0.0.1:3000)就是客户端对应的后台服务器(C)的地址。

3. 客户端对应的后台服务器(C)通过重定向的方式让客户端浏览器(B)对百度认证服务器(D)发送认证请求

哎,好像更绕了(再汗。。。)

app/auth.py

####4. 百度认证服务器(D)向客户端浏览器(B)返回用户登录页面
用户登录页面

前面的步骤,用户客户端(A)、用户客户端对应的后台服务器(C)、百度认证服务器(D),三者之间的通信都需要客户端浏览器(B)进行重定向做请求转发。这样的过程是不是感觉很困惑呢?为啥非要通过浏览器(B)来做重定向请求转发呢?为啥不直接进行Http请求呢?
现在看到这个页面应该有答案了吧:需要由浏览器(B)来展示来自百度认证服务器(D)的认证页面,并完成用户身份认证的交互。

####5. 百度认证服务器(D)将授权码通过客户端浏览器(B)转发给客户端对应的后台服务器(C)
用户在第4步中输入账号、密码后,点击登录并授权。百度的认证服务器(D)会收到用户登录请求,然后将授权码通过客户端浏览器(B)重定向的方式发送给客户端对应的后台服务器(C)。

app/auth.py

6. 客户端后台服务器(C)通过授权码向百度认证服务器(D)请求Token

客户端后台服务器(C)通过上一步获得的授权码向百度认证服务器(D)请求授权,并获取Token,

app/auth.py

7. 用户客户端(A)从客户端的后台服务器(C)中获取Token

由于Python DuerOS客户端中的后台服务器(Tornado WebServer)就在本地,所以,Token可以直接获得,

8. token使用

千辛万苦通过OAuth流程获取的Token其实在DuerOS的后续请求中只是一个字段而已,

请求中的token字段

Step by Step带你玩转DuerOS - Python DuerOS SDK[树莓派平台] (3)

发表于 2017-11-11

由于图片外链被禁止了,图片不能显示,完整文章看这里吧:https://www.jianshu.com/p/e689d770d99d

在前一个帖子中,给大家带来了Python版本的DuerOS SDK。但DuerOS的测试环境却声明为Ubuntu,相信很多同学会疑惑:Python不是跨平台的吗?为什么要限制测试平台呢?真实的情况呢是这样的:
首先,Python跨平台这个没毛病。但问题在于DuerOS运行所需要的依赖环境确实跟平台相关的。比如DuerOS是基于Http2 ALPN的,但树莓派官方镜像的OpenSSL并不支持,而对应的Python库依赖于OpenSSL。为了在树莓派平台上支持Python的DuerOS SDK,专门交叉编译了OpenSSL和Python。
所以,这里限制了平台主要是方便同学能将DuerOS快速的Run起来。当然,如果想在MacOS、Windows平台运行DuerOS Python SDK也是没问题的,只是在依赖配置方面可能要多花些时间。
好了,废话不多说,直接上干货:

树莓派DuerOS Python 版本支持

##准备
按照个人版使用说明完成如下3步(http://open.duer.baidu.com/doc/device-devkit/intro_markdown)

  • 镜像下载,烧录安装
  • 配网
  • 验证“小度小度”

开始

  1. 停止现有小度功能,因为会占用MIC资源

    sudo systemctl disable duer
    sudo systemctl stop duer
    
  2. 安装依赖包

    sudo apt-get update
    sudo apt-get install python-dateutil
    sudo apt-get install gir1.2-gstreamer-1.0
    sudo apt-get install python-pyaudio
    sudo apt-get install libatlas-base-dev
    sudo apt-get install python-dev        
    sudo pip install tornado
    sudo pip install hyper
    

    hyper库用来支持http2.0 client, pyaudio用来支持录音,tornado用来完成oauth认证。

  3. 下载编译好的openssl和Python安装包,并进行安装, 需要更新openssl才能支持python sdk的使用。

    *从如下地址下载openssl安装包*(链接: https://pan.baidu.com/s/1skAP6WH 密码: wknz)
    *从如下地址下载python2.7.14安装包*(链接: https://pan.baidu.com/s/1o8MHkzK 密码: ngx4)
    
     tar -zxvf openssl1.1.tar.gz -C /usr
     tar -zxvf python2.7.14.tar.gz -C /usr/local/
     sudo rm -rf /usr/bin/python
     sudo ln -s /usr/local/python2.7.14/bin/python /usr/bin/python
    
  4. 下载Python SDK和参考示例代码

    git clone https://github.com/MyDuerOS/DuerOS-Python-Client.git
    cd DuerOS-Python-Client
    git checkout raspberry-dev
    

##运行和测试

  1. 授权

    ./auth.py
    

    直接运行使用默认的client_id和client_secret,开发者可以替换成自己在DuerOS开放平台申请的client_id和client_secret,进而实现在控制台自定义的配置属性。

app/auth.py

其中,
需要在开放平台中“安全设置”的“授权回调页”,设置成

http://127.0.0.1:3000/authresponse

授权回调页设置

  1. 唤醒加识别

    ./wakeup_trigger_start.sh
    
  2. enter按键触发识别

    ./enter_trigger_start.sh
    

Step by Step带你玩转DuerOS - DuerOS能力初体验(2)

发表于 2017-11-11

由于图片外链被禁止了,图片不能显示,完整文章看这里吧:https://www.jianshu.com/p/267334be6954

有了前面两篇文章的介绍,相信大家已经跃跃欲试了,想最快的体验DuerOS的能力?那当然是下载DuerOS App啦,

度秘App

如果想在硬件上体验,可以尝试树莓派版本,

基于树莓派的个人开发套件

项目地址:http://open.duer.baidu.com/doc/device-devkit/intro_markdown

但不论是手机端的App还是基于树莓派的个人开发套件,但都有一个开发者不能忍缺陷:只能“看”,不能“玩”。作为机智神勇的开发者,肯定需要能定制、能修改、能改造的。

新的选择

针对上面的情况,这里提供了一个Python版本的DuerOS。
项目地址:https://github.com/MyDuerOS/DuerOS-Python-Client
之所以选择Python主要出于以下方面的考量:

  • 简单易学,即便是没有编程经验的同学也能快速上手
  • 环境搭建简单,避免各种编译、链接问题
  • AI时代必备技能,AI时代你还不会Python?

当前版本支持功能:

  • 完成OAuth 2.0认证
  • 通过[Enter]键触发唤醒状态
  • 支持天气、百科等TTS播放功能
  • 支持音乐播放功能
  • 支持闹铃功能
  • 云端下发Directive显示

后续会支持跟多的功能,比如,

  • [小度,小度]语音唤醒
  • 接入百度的技能平台,完成自定义功能

希望大家把使用过程中遇到的问题提出来,便于后续的优化

DuerOS-Python-Client使用说明

运行依赖

  • gstreamer1.0
  • gstreamer1.0-plugins-good
  • gstreamer1.0-plugins-ugly
  • python-gi
  • python-gst
  • gir1.2-gstreamer-1.0

    测试环境

  • Ubuntu 16.04
  • Python 2.7.12

    使用说明

    项目获取

    通过git下载代码到本地

    git clone https://github.com/MyDuerOS/DuerOS-Python-Client.git

认证授权

在DuerOS-Python-Client目录下执行

# ./auth.sh

通过[Enter]键触发唤醒状态

在DuerOS-Python-Client目录下执行

# ./enter_trigger_start.sh

然后,每次单击[Enter]键后进行语音输入

通过[小度小度]触发唤醒状态

在DuerOS-Python-Client目录下执行(暂时该功能还不支持)

# ./wakeup_trigger_start.sh

然后,每次通过[小度小度]进行唤醒,然后,进行语音输入

代码结构

DuerOS-Python-Client代码结构如下图所示,

代码结构

其中,

DuerOS-Python-Client:项目根目录

  • DuerOS-Python-Client/auth.sh:认证授权脚本
  • DuerOS-Python-Client/enter_trigger_start.sh:[Enter]按键触发唤醒脚本
  • DuerOS-Python-Client/wakeup_tirgger_start.sh:[小度小度]触发唤醒脚本

DuerOS-Python-Client/app:应用目录

  • DuerOS-Python-Client/app/auth.py:认证授权实现模块
  • DuerOS-Python-Client/app/enter_trigger_main.py:[Enter]按键触发唤醒实现模块
  • DuerOS-Python-Client/app/wakeup_tirgger_main.py:[小度小度]触发唤醒实现模块
  • DuerOS-Python-Client/app/framework:平台相关目录
  • DuerOS-Python-Client/app/framework/mic.py:录音模块(基于pyaudio)
  • DuerOS-Python-Client/app/framework/player.py:播放模块(基于GStreamer)
  • DuerOS-Python-Client/app/snowboy:snowboy唤醒引擎

DuerOS-Python-Client/sdk:dueros sdk目录

  • DuerOS-Python-Client/sdk/auth.py:授权相关实现
  • DuerOS-Python-Client/sdk/dueros_core.py:dueros交互实现
  • DuerOS-Python-Client/sdk/interface:端能力接口实现

SDK接口说明

授权模块(sdk/auth)

授权接口

用户通过授权接口完成基于OAuth2.0的认证授权流程

def auth_request(client_id=CLIENT_ID, client_secret=CLIENT_SECRET):
'''
发起认证
:param client_id:开发者注册信息
:param client_secret: 开发者注册信息
:return:
'''

DuerOS核心模块(sdk/dueros_core)

directive监听注册

通过监听注册接口,用户可以获得云端下发的directive内容

def set_directive_listener(self, listener):
'''
directive监听器设置
:param listener: directive监听器
:return:
'''

Step-by-Step带你玩转DuerOS-智能语音系统的系统组成(1)

发表于 2017-09-30

一个完整的智能语音系统主要由如下几个核心部分组成:

  • 麦克风阵列
  • 唤醒识别
  • 语音识别(ASR)
  • 自然语言处理(NLP/NLU)
  • 内容召回
    下面我们逐个介绍各个组成部分

    麦克风阵列

    麦克风用来将模拟的声音信号转换为数字信号,核心器件是ADC(Analog to Digital Controller)控制器,我们在日常生活中常见的麦克风大多是单麦克风,外形如下图所示:

单麦克风

而在智能语音系统中,大多使用麦克风阵列,外形如下图所示:

麦克风阵列
麦克风阵列在硬件上可以简单的理解成,一个麦克风阵列由多个麦克风组成。图中的麦克风阵列,每个红框就是一个麦克风。
麦克风阵列和普通的单麦克风相比有什么样的优点和缺点呢?

优点

首先麦克风阵列具有更好的远场拾音效果,举个不太严谨的例子,使用单麦克风打电话,手机需要放在半米的范围之内,对方才能听清说话的声音;但使用麦克风阵列,手机放在3~5米的范围之内,对方也能清晰的听到语音。
其次,麦克风阵列能够获取声源的角度信息,也就是说能够辨别声音的来源,但单麦克风做不到。
所以,在大多的智能语音系统中均采用麦克风阵列,而百度的DuerOS个人开发套件使用的就是麦克风阵列(包含两个麦克风)。

缺点

最显著的缺点就是麦克风阵列的成本相比于单麦克风而言,价格会高出很多。

技术点

  • 麦克风选型:驻极体/数字麦克风
  • 麦克风一致性
  • AEC
  • 波束合成
  • 盲源分离
    对具体的技术细节感兴趣的同学可以逐条了解下,这里就不逐一展开了。

    语音唤醒

    语音唤醒的常见场景就是用户使用唤醒词(如百度的“小度小度”,亚马逊的“Alex”)将设备激活。
    实际上设备在通过唤醒词激活之前也是一直在工作的,设备一直在录音,并检查录音的数据中是否包含预设的唤醒词(如“小度小度”、“Alexa”),当检测到有唤醒词,设备便进入唤醒状态。
    当前对于个人开发者相对友好的免费的唤醒引擎主要有:
  • SnowBoy (https://snowboy.kitt.ai/)
  • Pocketsphinx (https://cmusphinx.github.io/wiki/tutorialpocketsphinx/)
  • Sensory (http://www.sensory.com)
    目前,百度已全资收购了KITTAI(SnowBoy是KITTAI旗下产品),建议开发者直接使用SnowBoy作为唤醒引擎,同时,SnowBoy的唤醒词训练,及唤醒引擎的集成使用也很简洁方便。

    语音识别(ASR)

    语音识别(ASR)简单的说就是讲语音转化为文本,目前几乎所有的语音系统都是先将语音转化为文本,然后再基于文本进行后续的语义理解和处理的。

    自然语言处理(NLP/NLU)

    有了语言识别(ASR)获取的文本信息,后面就进入了自然语言处理单元了,可以说这个步骤是最接近我们概念上理解的人工智能了。这个部分会从输入文本中获取用户的意图和对应的关键信息。举个例子,对应用户输入请求:“我想听周杰伦的歌”,NLU会将请求拆解成如下的结构化结果:
  • 意图:听歌
  • 词槽:周杰伦
    有了NLU的处理结果,就可以获取用户请求的结果了。

    内容召回

    假设你有两个资源库,其中,一个是电影库,一个是歌曲库。当接收NLU的处理结果后,从意图(听歌)上,你可以判别用户希望从歌曲库中获取资源,从词槽(周杰伦)可以判断用户想听歌曲的类别。有了意图和词槽就能从资源库中检索到用户期望的结果,并将结果按请求的路径返回。

    完整过程

    下面我们将上面的各个核心部分连贯起来,想象茶几上放着一个智能音响,用户坐在两米外的沙发上,用户通过语音发出请求“小度小度”,音响的提示灯亮起指示激活状态,用户说“我想听周杰伦的歌”,稍后,音响播放周杰伦的青花瓷。
  • 满足远场(3~5米)拾音:麦克风阵列
  • 提示灯亮起指示设备激活:唤醒引擎
  • 语音请求转化为文本:语音识别(ASR)
  • 从文本中识别出意图(听歌)和词槽(周杰伦):自然语言处理(NLU)
  • 通过意图和词槽返回结果:内容召回

Step-by-Step带你玩转DuerOS-写在最前面(0)

发表于 2017-09-30

07年之前的互联网时代,我们习惯于借助键盘鼠标跟智能设备进行交互;07年之后的移动互联网时代,我们习惯于借助触摸屏跟智能设备进行交互;如今人工智能技术逐渐成熟,借助智能语音交互系统,我们可通过自然的语音交互来控制设备,实现打电话、听音乐,看电视的需求。相信不久的将来,人和设备的对话交互会变成最自然的输入方式,变成生活中自然的习惯。那么,有没有可能我们自己打造一个属于自己的语音个人助手呢?比如,通过语音来控制家里的灯,风扇,帮我们做日程管理。答案是肯定的,借助DuerOS的能力,普通的开发者也能打造属于自己的个人语音助手。

DuerOS开发当前面临的问题

虽然DuerOS的新闻铺天盖地,但DuerOS具体是怎样的一种形态?具有怎样的能力?DuerOS的开发者网站有很多详细的信息,但对于普通的开发者又该如何开始使用DuerOS呢?是不是你也和我一样有如下的困惑呢?

  • 智能语音系统是如何组成的?麦克风阵列、AEC、唤醒、ASR、VAD、NLU、自定义Bot是什么意思?
  • 百度的DuerOS从开发者的角度看,是怎样的一种形态?能够提供怎样的能力?
  • 亚马逊的AVS是什么?百度的AVS兼容协议是什么?百度的DCS协议跟前两者又有什么区别?
  • 认证授权是什么?OAuth2.0是什么?
  • Http2.0是什么?为什么选择Http2.0,而不是Http1.1或Http1.0?
  • 什么是设备发现?什么是配网?什么是登陆?
  • DuerOS中的长链接建立,Ping机制,Directive下发,Event上传是什么?

    这个博客系列会包含哪些内容

    这个博客系列主要针对初级的开发者,一步一步的展示一个基于DuerOS平台的智能语音交互系统具体实现,在实现的过程中也会逐步解释背后的实现原理。希望能够通过这个博客系列,普通的开发者能够顺利搭建属于自己的智能语音系统。

    技术要求

  • 硬件平台:树莓派3B+DuerOS阵列版
  • 编程语言:Python

    当前进度

    目前已经基于DuerOS的DCS协议实现了Python版本的初级原型https://github.com/MyDuerOS/MyAssistant
    目前还存在一些问题,比如使用SnowBoy训练”小度小度”唤醒词,训练样本太少,唤醒不怎么灵敏,后期会逐步完善。

    后期规划

    后期会从零开始搭建基于DuerOS的智能语音助手,大概会遵从如下的步骤:
  • 智能语音系统的系统组成
  • DuerOS开发者个人注册
  • 树莓派硬件环境搭建
  • DuerOS系统组成
  • OAuth2.0认证授权
  • DuerOS中长链接建立,Ping机制,Directive下发,Event上传
  • 设备发现,配网,认证
  • 自定义Bot认证
    欢迎搭建提出更多的问题,我会在后续的博客中进行补充。

    项目git地址:

    https://github.com/MyDuerOS

基于word2vec的词语相似度计算

发表于 2017-09-30

应用场景

假设你有一个商品的数据库,比如:

商品名称 价格
椅子 200元/个
香蕉 6元/斤
冰箱 2000元/台

现在通过用户的输入来检索商品的价格,最简单的方法就是通过字符串进行匹配,比如,
用户输入“椅子”,就用“椅子”作为关键字进行搜索,很容易找到椅子的价格就是200元/个。
但有时用户输入的是“凳子”,如果按照字符串匹配的方法,只能返回给用户,没有此商品。但实际上可以把“椅子”的结果返回给用户参考。这种泛化的能力,通过简单的字符串匹配是显然不能实现的。

词语相似度计算

在上面的例子中,“凳子”跟“椅子”的语意更相近,跟“香蕉”或“冰箱”的语意相对较远。在商品搜索的过程中,可以计算用户输入的关键字与数据库中商品名间的相似度,在商品数据库中找出相似度最大的商品,推荐给用户。这种相近的程度就是词语的相似度。在实际的工程开发中可以通过word2vec实现词语相似度的计算。

代码实现

from sklearn.datasets import fetch_20newsgroups

news = fetch_20newsgroups(subset='all')
X, y = news.data, news.target

from bs4 import BeautifulSoup
import nltk, re


# 把段落分解成由句子组成的list(每个句子又被分解成词语)
def news_to_sentences(news):
    news_text = BeautifulSoup(news, 'lxml').get_text()
    tokenizer = nltk.data.load('tokenizers/punkt/english.pickle')
    raw_sentences = tokenizer.tokenize(news_text)

    # 对每个句子进行处理,分解成词语
    sentences = []
    for sent in raw_sentences:
        sentences.append(re.sub('[^a-zA-Z]', ' ', sent.lower().strip()).split())
    return sentences


sentences = []

for x in X:
    sentences += news_to_sentences(x)

# import numpy
# # 将预处理过的"词库"保存到文件中,便于调试
# numpy_array = numpy.array(sentences)
# numpy.save('sentences.npy', numpy_array)
#
# # 将预处理后的"词库"从文件中读出,便于调试
# numpy_array = numpy.load('sentences.npy')
# sentences = numpy_array.tolist()

num_features = 300
min_word_count = 20
num_workers = 2
context = 5
downsampling = 1e-3

from gensim.models import word2vec

model = word2vec.Word2Vec(sentences, workers=num_workers,         size=num_features, min_count=min_word_count, window=context,
                      sample=downsampling)

model.init_sims(replace=True)

# 保存word2vec训练参数便于调试
# model.wv.save_word2vec_format('word2vec_model.bin', binary=True)
# model.wv.load_word2vec_format('word2vec_model.bin', binary=True)

print '词语相似度计算:'
print 'morning vs morning:'
print model.n_similarity('morning', 'morning')
print 'morning vs afternoon:'
print model.n_similarity('morning', 'afternoon')
print 'morning vs hello:'
print model.n_similarity('morning', 'hellow')
print 'morning vs shell:'
print model.n_similarity('morning', 'shell')

运行结果

/Users/liucaiquan/anaconda/bin/python /Users/liucaiquan/PycharmProjects/WordSimilarityCalculation/src/test.py
词语相似度计算:
morning vs morning:
1.0
morning vs afternoon:
0.871482091583
morning vs hello:
0.731609166442
morning vs shell:
0.709714434122

调试技巧

在开发调试的过程中,会出现错误,需要重新运行程序。如果每次修改后,都从头开始执行,肯定会消耗很多无用的时间。比如,预处理后的文本结果和word2vec的训练参数,这些中间结果可以保持下来,当遇到问题时,就可以从文件中读取结果,而不需要每次都从头开始。

源码下载地址

https://github.com/CaiquanLiu/MachineLearning

代码参考

《Python机器学习及实践:从零开始通往Kaggle竞赛之路》

1…345…8
Liu Caiquan

Liu Caiquan

71 日志
11 标签
© 2019 Liu Caiquan
由 Hexo 强力驱动
主题 - NexT.Mist
本站总访问量次