深度学习:从Python到TensorFlow应用实战
上QQ阅读APP看书,第一时间看更新

1.2 准备开发环境

当前,很多语音识别应用都是在Linux操作系统下开发的。Linux是围绕Linux内核构建的免费和开源软件操作系统系列。Linux来源于UNIX,是UNIX操作系统的开放源代码实现。Linux发行版是一个基于Linux内核的由软件集合构成的操作系统。通常,Linux用户通过下载一个Linux发行版获得操作系统。Linux有一些常用的发行版,如CentOS和Ubuntu等版本。Ubuntu是由Canonical公司开发的基于Debian的开源Linux操作系统;CentOS是Red Hat Enterprise Linux的免费复制版。本节首先介绍在Ubuntu和CentOS下安装Python,然后介绍在Linux下开发Python应用的编辑器Micro。

在Windows下,可以使用Sublime这样的文本编辑器编写Python代码,也可以使用PyDev或者PyCharm集成开发环境。

1.2.1 Linux基础

有些语音识别系统运行在Linux服务器中。为了远程登录Linux服务器,可以安装KiTTY(https://www.fosshub.com/KiTTY.html)。在KiTTY的配置界面输入IP地址,用户名和密码后登录Linux服务器。如果是用root账户登录,则终端提示符是#,否则终端提示符是$。

查看Ubuntu操作系统版本号:

或者:

获取Ubuntu的代号:

ls命令用于列出当前目录下的文件。有的命令比较长,为了快速输入,可以用Tab键补全命令。History是显示历史命令,用上箭头选择最近运行过的命令可再次执行。

可以使用支持SSH协议的终端仿真程序SecureCRT连接到远程Linux服务器。因为可以保存登录密码,所以比较方便。除了SecureCRT,还可以使用开源软件PuTTY(http://www.chiark.greenend.org.uk/~sgtatham/putty),以及可以保存登录密码的PuTTY Connection Manager。

在终端启动的进程断开连接后进程会停止运行。为了让进程继续运行,可以使用nohup命令。

如果需要安装软件,可以下载对应的RPM安装包,然后使用RPM安装。但操作系统对应的RPM安装包找起来往往比较麻烦。一个软件包可能依赖其他的软件包。为了安装一个软件可能需要下载其他几个它所依赖的软件包。

为了简化安装操作,可以使用黄狗升级管理器,一般简称yum。yum会自动计算出程序之间的相互关联性,并且计算出完成软件包的安装需要哪些步骤。这样在安装软件时,不会再被那些关联性问题所困扰。

yum软件包管理器自动从网络下载并安装软件。yum有点类似360软件管家,但是不会有商业倾向的推销软件。例如安装支持wget和rzsz命令的软件:

Windows格式文本文件的换行符为\r\n,而Linux文件的换行符为\n。

dos2unix是将Windows格式文件转换为Linux格式的实用命令。dos2unix命令其实就是将文件中的\r\n转换为\n。

开发语音识别系统的过程中,可能会用到大量的数据文件。如需要在Linux操作系统上维护同一文件的两份或多份副本,除了保存多份单独的物理文件副本之外,还可以采用保存一份物理文件副本和多个虚拟副本的方法。这种虚拟的副本就称为链接。链接是目录中指向文件真实位置的占位符。在Linux中有两种不同类型的文件链接:符号链接和硬链接。

符号链接就是一个实实在在的文件,它指向存放在虚拟目录结构中某个地方的另一个文件。这两个通过符号链接在一起的文件,彼此的内容并不相同。

如果现有空间不够用,可以增加存储设备后扩容。首先用lsblk命令查看现有空间情况。在一个Linux账号中显示如下:

创建一个要扩展的目录:

     #mkdir /ext

加载文件系统到这个目录下:

     #mount /dev/xvde /ext

确认加载成功:

对于大的文件可以使用wget命令在后台下载。

     #wget -bc <path>

这里的参数b表示在后台运行;参数c表示支持断点续传。

可以在Windows下编辑文本文件,然后使用Perl把Windows下的文本文件转换成Linux可识别的格式:

     #perl -p -e 's/\r$//' < winfile.txt > unixfile.txt

在Ubuntu操作系统下安装Python3:

     #apt install python3

Ubuntu系统上默认的root密码是随机生成的,而root权限是通过sudo命令授予的。可以在终端输入命令sudo passwd,然后输入当前用户的密码,按回车键,终端会提示输入新的密码并确认,此时的密码就是root新密码。修改成功后,输入命令su root,再输入新的密码即可。

可以使用sed(Stream EDitor)命令查找和替换文件中的文本。例如:

     #sed -i 's/original/new/g' file.txt

命令行参数说明如下:

-i:-i = in-place(保存回原始文件)。

命令字符串说明如下:

s:s =替换命令。

original:original =描述要替换的单词的正则表达式(或者只是单词本身)。

new:new =用来替换的目标文本。

g:g = global(即替换所有而不仅仅是第一次出现的)。

file.txt:file.txt =文件名。

例如把cmd.sh中的queue.pl替换成为run.pl,替换结果输出到cmd.local.sh文件。

     #sed 's/queue.pl/run.pl/g' cmd.sh > cmd.local.sh

1.2.2 Micro编辑器

为了方便在服务器端开发Python、Perl、Shell、C++相关应用,可以采用Micro(https://github.com/zyedidia/micro)这样的终端文本编辑器。

可以在/home/soft/micro目录下运行:

     #curl https://getmic.ro | bash

设置成在任意路径均可运行Micro:

或者编辑/etc/profile文件,增加micro所在的路径到PATH环境变量/home/soft/micro。

     #./micro /etc/profile

增加如下行:

     export PATH=/home/soft/micro:$PATH

可以使用它编辑配置文件:

     #./micro  run.pl

输入:

     die "run.pl: Hello Error";

这里的die表示终止脚本运行,并显示出die后面的双引号中的内容。

保存文件后,按Ctrl+Q组合键退出。

1.2.3 Shell基础

Shell是用户和Linux内核之间的接口程序。在命令行提示符下输入的每个命令都由Shell先解释然后传给Linux内核。

Shell是一个命令语言解释器,拥有自己内建的Shell命令集。此外,Shell也能被系统中其他有效的Linux实用程序和应用程序所调用。

Shell具有如下主要功能。

命令解释功能:将用户可读的命令转换成计算机可理解的命令,并控制命令执行。

输入/输出重定向:操作系统将键盘作为标准输入,将显示器作为标准输出。当这些定向不能满足用户需求时,用户可以在命令中用符号“>”或“<”重新定向。

管道处理:利用管道将一个命令的输出送入另一个命令,实现多个命令组合完成复杂命令的功能。

系统环境设置:用Shell命令设置环境变量,维护用户的工作环境。

程序设计语言:Shell命令本身可以作为程序设计语言,将多个Shell命令组合起来,编写能实现系统或用户所需功能的程序。

Shell有很多种,如zshell和fish。这里介绍Bash(Bourne Again Shell)。

可以使用ps命令查看当前使用的是哪种shell。

在屏幕上打印“Hello”:

     echo "Hello"

将ABC分配给a:

     a=ABC

输出a的值:

     echo $a

在屏幕上打印ABC。

将ABC.log分配给b:

     b=$a.log

输出b的值:

把文件“ABC.log”的内容写入到testfile:

     cat $b > testfile

“指令--help”会输出帮助信息。

可以把重复执行的Shell脚本写入一个文本文件。在Linux中,文件扩展名不作为系统识别文件类型的依据,但是可以作为我们识别文件的依据,可以简单地将脚本文件名以.sh结尾。

在Linux下,可以通过vi命令创建一个诸如script.sh的文件:vi script.sh。创建好脚本文件后就可以在文件内按脚本语言要求的格式编写脚本程序了。

在创建的脚本文件中输入以下代码并保存退出:

添加脚本文件的可执行运行权限chmod 777 script.sh,之后运行文件./script.sh得到结果:

     hello world!

Shell脚本中用#表示注释,相当于C语言的//注释。但如果#位于第一行开头,并且是#!(称为Shebang)则例外,它表示该脚本使用后面指定的解释器/bin/sh解释执行。每个脚本程序必须在开头包含这个语句。

使用参数n检查语法错误,例如:

     #bash -n ./test.sh

如果Shell脚本有语法错误,则会提示错误所在行;否则,不输出任何信息。

if语句的语法是:

这里的fi就是if反过来写。

例如,为了判断某个命令是否存在,可以使用如下的格式:

判断yum是否存在的例子:

case语句的语法是:

这里的esac就是case反过来写。例如:

这里使用“|”把“jpg”和“jpeg”这两个模式连接到了一起。

1.2.4 Linux下安装Python

首先检查Python 3是否已经正确安装,以及所使用的版本号:

检查Python 3所在的路径:

     #which python3
     /usr/bin/python3

如果使用CentOS,可以使用yum安装Python 3。首先查找可供安装的Python版本:

     #yum search python3

然后安装想要的版本:

     #yum install python36

如果使用Ubuntu操作系统,首先运行以下命令更新软件包列表并将所有系统软件升级到可用的最新版本:

     #sudo apt-get update && sudo apt-get -y upgrade

然后安装pip包管理系统:

     #sudo apt-get install python3-pip

1.2.5 选择Python版本

Linux系统中有可能同时存在多个可用的Python版本,每个Python版本都对应一个可执行二进制文件。可以使用ls命令来查看系统中有哪些Python的二进制文件可供使用。

     $ ls /usr/bin/python*

python命令执行Python 2。可以使用python3命令执行Python 3。如何使用python命令执行Python 3?

一种简单安全的方法是使用别名。将如下命令放入~/.bashrc或~/.bash_aliases文件中:

     alias python=python3

最好在终端中使用'python3'命令,在Python 3.x文件中使用shebang行'#!/usr/bin/env python3'。

1.2.6 使用AWK

典型的AWK程序充当过滤器。它从标准输入读取数据,并输出标准输出的过滤数据。它一次读取数据的一个记录。默认情况下,一次读取一行文本。每次读取记录时,AWK自动将记录分隔到字段中。字段在默认情况下也是由空格分隔的。每个字段被分配给一个变量,该变量有一个数字名称。变量$ 1是第一个字段,$ 2是第二个字段,以此类推。$ 0表示整个记录。此外,还设置了一个名为NF的变量,其中包含在记录中检测到的字段的数目。

来试试一个很简单的例子。过滤ls命令的输出:

     #ls -l ./ | awk '{print $0}'

显示文本文件nohup.out匹配(含有)字符串“sun”的所有行:

     #awk '/sun/{print}' nohup.out

由于显示整个记录(全行)是awk的默认动作,因此可以省略action项。

例如,得到Python的版本号:

这里的2>&1意思是:把标准错误重定向到标准输出。

1.2.7 Windows下安装Python

在图形化用户界面出现之前,人们就是用命令行来操作计算机的。Windows命令行是通过Windows系统目录下的cmd.exe执行的。执行这个程序最直接的方式是找到这个程序,然后双击。但cmd.exe并没有一个桌面的快捷方式,所以这样太麻烦。

可以在开始菜单的运行窗口直接输入程序名,回车后运行这个程序。打开“开始”→“运行”,这样就会打开资源管理器中的运行程序窗口。或者使用快捷键—窗口键+R,打开运行程序窗口。总之,输入要运行的程序名cmd后单击“确定”按钮,出现命令提示窗口。因为能够通过这个黑屏的窗口直接输入命令来控制计算机,所以也称为控制台窗口。

开始的路径往往是C:\Users\Administrator。就像公园的地图上往往会标出游客的当前位置。Windows命令行也有个当前目录的概念。这个C:\Users\Administrator就是当前路径。

可以用cd命令改变当前路径,例如改变到C:\Python\Python27路径。

     C:\Users\Administrator>cd C:\Python\Python27

系统约定从指定的路径找可执行文件。这个路径通过PATH环境变量指定。环境变量是一个“变量名=变量值”的对应关系,每一个变量都有一个或者多个值与之对应。如果是多个值,则这些值之间用分号隔开。例如PATH环境变量可能对应这样的值:“C:\Windows\system32;C:\Windows”。表示Windows会从C:\Windows\system32和C:\Windows两个路径找可执行文件。

设置或者修改环境变量的具体操作步骤是:首先在Windows桌面右键“计算机”,在弹出的“属性”对话框中选择“高级”→“环境变量”,然后设置用户变量,或者系统变量,接着再设置环境变量PATH的值。

需要重新启动命令行才能让环境变量设置生效。为了检查环境变量是否设置正确,可以在命令行中显示指定环境变量的值。需要用到echo命令。echo命令用来显示一段文字。

     C:\Users\Administrator>echo Hello

执行上面的命令将在命令行输出:Hello。

如果要引用环境变量的值,可以用前后两个百分号把变量名包围起来:“%变量名%”。echo命令用来显示一个环境变量中的值。

     C:\Users\Administrator>echo %PATH%

假设把Python安装在D:\Python\Python27目录下,则可以在计算机属性中手工设置PATH环境变量,然后检查环境变量的值:

用如下命令检查Python是否正确安装,以及所使用的版本号:

     >python –version

或者用where命令检查系统是否已经安装了Python:

如果没有安装Python,则可以使用Chocolatey(https://chocolatey.org)安装Python 3:

     >choco install python3

1.2.8 搭建PyDev集成开发环境

在Windows下可以使用PyDev(https://github.com/fabioz/Pydev)开发Python应用。

首先检查Windows操作系统中是否已经安装了JDK:

如果没有,则可以使用软件包管理器Chocolatey(https://chocolatey.org/)安装JDK:

     >choco install jdk

从Eclipse官方网站下载Eclipse。

解压pydev插件后,会发现有features、plugins两个文件夹,然后把features文件夹下的所有文件移到D:\Program Files\eclipse\features目录下,把plugins文件夹下的所有文件移到D:\Program Files\eclipse\plugins目录下。

注意:D:\Program Files\eclipse为Eclipse安装目录。

重启Eclipse,在windows->preferences出现PyDev配置项,表示PyDev插件安装成功。

创建新项目,项目属性改成UTF-8编码。创建Python模块:

单击工具栏的Run按钮运行。控制台视图显示输出结果:

     hi

这里使用了print函数输出一个字符串到控制台。

Eclipse默认是英文界面,如果习惯用中文界面,可以从http://www.eclipse.org/babel/downloads.php下载支持中文的语言包。

如果想要切换回英文开发环境,则可以使用命令行进入Eclipse主目录后输入:

     eclipse –nl en

切换回简体中文:

     eclipse -nl zh_CN

然后安装插件,配置路径。

插件通过Eclipse的软件安装机制安装。从“帮助”菜单中选择“安装新软件”。输入网址http://pydev.org/updates,并选择PyDev执行next开始安装,安装完需要重启Eclipse。

必须配置PyDev才能与Eclipse和Python设置一起正常工作。从Eclipse主菜单中选择Window→Preferences。这将打开“首选项”对话框。选择Pydev→Interpreter - Python:

“Quick Auto-Config”按钮可以按照用户希望的方式设置Eclipse,但前提是选择了某个版本的Python 3。如果找到早期版本的Python,请确保使用“删除”按钮将其删除,然后手动选择python.exe文件所在的路径。