作者简介:akshay pai,数据科学工程师,热爱研究机器学习问题。Source Dexter网站创办人。
TensorFlow是Google的开源深度学习库,你可以使用这个框架以及Python编程语言,构建大量基于机器学习的应用程序。而且还有很多人把TensorFlow构建的应用程序或者其他框架,开源发布到GitHub上。
这次跟大家分享一些GitHub上令人惊奇的TensorFlow项目,你可以直接在你的应用中使用,或者根据自身所需进一步予以改进。
TensorFlow简介
如果你已经知道TensorFlow是什么,以及它是如何工作的,建议直接跳到下一节。如果你对使用Python学习TensorFlow感兴趣,网上也有相关的教程可以参考。
这一节内容比较傲适合初学者。如前所述,TensorFlow是一个深度学习库,使用这一框架,可以用来构建和测试深度神经网络。
深度学习让我们能够以极高的准确性构建复杂的应用程序。图像、视频、文本、音频等领域的问题,都可以通过深度学习解决。TensorFlow可以用于实现前述所有应用。
2015年11月9日,Google正式发布并开源TensorFlow,目前官方正式版本为TensorFlow 1.2。下面这段视频,是当年TensorFlow刚发布时,Google发布的一个官方介绍短片,Jeff Dean等出镜讲述。
TensorFlow很快成为GitHub上用户最多的深度学习框架。这个库之所以如此流行,是因为开发人员可以轻松的用其来搭建、测试和部署机器学习应用。
TensorFlow使用数据流图,上面是一个TensorFlow的示意图。我们不用关心这张图具体代表什么,但你需要知道,其中的椭圆和正方形代表节点,节点就是一些数学函数,你可以将节点分组形成各种数学计算,并得到输出。
箭头代表流动到各个节点的数据。所以TensorFlow也被成为数据流库。
OK,简介到此,下面分享四个我非常喜欢的TensorFlow GitHub项目。
项目一:Neural Style
这是最酷的TensorFlow GitHub项目之一。神经风格是将一张照片的风格迁移到另一张照片上的过程,同时保留相关的特张。简单的来说,通过这个项目,你可以使用TensorFlow创建自己的Prisma应用程序。
如上图所示,把梵高画作的风格,迁移到一张狮子的照片上,就得到一个星空风格的狮子照片,这就是所谓的风格迁移。下面再展示一组这个项目的风格迁移,能把这张狮子的照片,变成哪些非常有趣的效果。
这个项目在风格迁移的同时,还能对图像进行语义分割。进而实现对内容的前景、背景进行不同的风格迁移处理。这个过程如下图所示:
另外这个算法还能适用于视频处理。
上述图片处理使用的软硬件如下:
- CPU: Intel Core i7-6800K@3.4GHz×12
- GPU: NVIDIA GeForce GTX 1080/PCIe/SSE2
- OS: Linux Ubuntu 16.04.1 LTS 64-bit
- CUDA: 8.0
- python: 2.7.12
- tensorflow: 0.10.0rc
- opencv: 2.4.9.1
GitHub地址如下:
https://github.com/cysmith/neural-style-tf
项目二:Mozilla Deep Speech
这个GitHub项目使用TensorFlow将语音转换为文本。语音转文本是一个热门的机器学习领域,然而各地的人们有着不同的口音,这也是一个难以解决的问题。不过仍然可以通过深度学习实现非常不错的准确性。
其实这个项目,是一个基于百度DeepSpeech架构的TensorFlow实现。换句话说,这个项目是百度的内核,Google的外貌。
百度的相关论文地址在此:
https://arxiv.org/abs/1412.5567
DeepSpeech是吴恩达带领百度团队研发出的成果,最早发布于2014年底。今年初,百度基于DeepSpeech2,开发出一款名为SwiftScribe的应用(swiftscribe.ai),可以把语音文件更为快速、便捷的转换为文字。目前只限于英文。
回到这个项目。
所需软件环境如下:
- Git Large File Storage
- TensorFlow 1.0 or 1.1
- SciPy
- PyXDG
- python_speech_features (nb: deprecated)
- python sox
- pandas
- DeepSpeech native client libraries
如果你有至少8GB显存的英伟达GPU,强烈建议安装支持GPU的TensorFlow,因为使用GPU的训练比CPU快得多。
GitHub地址如下:
https://github.com/mozilla/DeepSpeech
项目三:句子分类
句子分类就是识别句子类型的过程。例如,对于“食物非常糟糕”这个句子,你可能希望将其分类为正面句子或负面句子,这也被称为情绪分析。这个问题的难点在于:句子结构带来的复杂性。
利用卷积神经网络,我们可以尝试构建一个强大的文本分类器。
这里介绍的项目,是Yoon Kim论文《Convolutional Neural Networks for Sentence Classification(使用卷积神经网络进行句子分类)》的简单实现。这个论文的地址如下:
https://arxiv.org/abs/1408.5882
通过一个简单的CNN卷积神经网络,只进行很少的超参数调整和静态矢量,就可以得到出色的句子分类结果。
所需软件环境如下:
- Python 3
- Tensorflow > 0.12
- Numpy
GitHub地址如下:
https://github.com/dennybritz/cnn-text-classification-tf
项目四:图像分类/物体识别
图像分类,也就是训练系统识别猫猫狗狗,或者车道、海滩、天际线等场景。计算机视觉是一个范围巨大的领域,从面部识别到情感识别,甚至可以进行视觉气体泄漏检测。虽然实现流程各异,但底层系统是相通的。
所以作者创建了一个TensorFlow GitHub库,其中包括两个相互关联的部分。第一部分:能够识别1000个对象的TensorFlow图像分类器。第二部分:创建并训练一个全新的图像分类器。
我们先来看看第一部分。
Google的TensorFlow图像识别系统是目前最准确的图像分类软件。所谓图像识别,就是对图片中的内容进行识别,然而这并非对任意图片都能识别。
只有被训练过的对象,系统才能识别。例如,我们用三个类型训练分类器:猫、狗和牛。三个分类器只能识别相应类别中的一个。如果给出一张骆驼的图片会怎样?图片仍会通过一个分类器,但是置信率会非常的低。
如何快速创建一个TensorFlow图像分类器?只需要简单的三步。当然前提是你已经装好了TensorFlow,而且懂编程、会用Python。
第一步:下载
下载预训练的模型、图片和脚本。使用如下命令即可。
git clone https://github.com/akshaypai/tfClassifier
cd tfClassifier
第二步:运行脚本找到最佳预测
给定一个图片,运行脚本来进行分类。默认情况下,会显示最佳预测。
Python classifier.py --image_file file_path_to_image
为了获得top n分类,可以使用如下参数。
|
示例:比方我们给出这样一张图片。
python classifier.py --image_file ~/Pictures/fruit.jpg
pomegranate (score = 0.98216)
分类器表示:这是石榴,准确率98%。
第三步:运行脚本获得top n识别分类
现在我们尝试给出一个具有更多属性的图像,如下图的房子。
python classifier.py --image_file ~/Pictures/house.jpg --num_top_predictions 5
picket fence, paling (score = 0.95750)
worm fence, snake fence, snake-rail fence, Virginia fence (score = 0.03615)
beacon, lighthouse, beacon light, pharos (score = 0.00018)
boathouse (score = 0.00013)
patio, terrace (score = 0.00007)
从上面的结果可以看出,分类器以95%的可能性预测图片中有一个栅栏,另外分类器还发现了其他围栏、庭院、露台等。
到此为止,你已经学到如何设置TensorFlow图像识别系统。虽然,这个系统被限制在预训练模型的几个分类器之间。
那么我们接下来看看第二部分,如何增加一些新的分类器。
也是三个步骤。
第一步:下载预训练模型以及所需脚本
我已经把全部所需的文件整合进一个git仓库里。使用下面的命令可以下载。
git clone https://github.com/akshaypai/tfClassifier
cd tfClassifier
第二步:设置图像文件夹
这个步骤用于设置文件夹结构,以便数据流图可以简单地拾取分类。假设,你想重新训练五种新的花朵分类器:玫瑰、郁金香、蒲公英、五月花和万寿菊,那么需要如下的三个步骤来创建相应的文件夹结构:
1、为每种花型创建一个文件夹,文件夹的名称就是类型的名称
2、将花的所有图像添加到各自的文件夹中,所有的玫瑰放入玫瑰花文件夹
3、将所有的文件夹,添加到一个父文件夹中,可以命名为:花
然后我们就得到如下的结构:
~/flowers
~/flowers/roses/img1.jpg
~/flowers/roses/img2.jpg
...
~/flowers/tulips/tulips_img1.jpg
~/flowers/tulips/tulips_img2.jpg
~/flowers/tulips/tulips_img3.jpg
...
这样,文件夹结构已经OK了。
第三步:运行预训练脚本
使用如下命令运行脚本。
python retrain.py --model_dir ./inception --image_dir ~/flowers --output_graph ./output --how_many_training_steps 500
部分命令行参数:
- -model_dir 这个参数给出了预训练模型的位置。
- -image_dir 在步骤二中创建的文件夹路径
- -output_graph 存储新训练图的位置
- -how_many_training_steps 这代表要执行的迭代次数,默认为4000
好了,以上就是如何重新训练一个TensorFlow Inception模型。一旦你有了模型,就能开始用来进行分类处理。
结论
我希望你们也能体会到上述这些项目的精彩之处。学习一件事最好的方法就是动手去做。如果你还有更值得推荐的TensorFlow GitHub项目,可以留言给我们,让更多的人看到。今天就先到这里吧。休息,休息一下~
【完】