3
雷锋网按:本文作者铁流,雷锋网首发文章。
日前,华为新款旗舰手机P10上市后被网友曝出闪存读写速度不同。在4月18日,华为回应称,公司与多个供应商合作,向消费者提供优秀的产品体验和服务;并且还表示,一部手机的体验是否流畅,不是单纯由某个单一部件性能决定的,而是由软件系统和硬件系统综合设计和优化来决定。
据网友爆料,在华为P10闪存门事件之后,华为下架了测试软件,使用户无法通过测试软件评测闪存性能。
华为P10“闪存门”起源于一些网友在购买P10手机后,经过测试软件发现华为P10系列手机闪存速度出现了明显差异的情况。
根据网友爆料:发现P10闪存规格缩水导致的读写速度严重下降问题还真的不少。
所以能够判断的是,现售P10机型中,不同等级不同规格的闪存芯片应该是混着在用,并不全是最开始销售的那批UFS2.1,大致看了下读写速度,降速版本的P10持续读写大概是270MB/s以及123MB/s,随机读写速度大概是38MB/s和18.7MB/s,而最早第一批购买的P10持续读写速度大概是754MB/s以及181MB/s,随机读写速度大概是167MB/s和147MB/s,另外还有一个版本(手上的这台P10Plus 64GB)是持续读写速度550MB/s和143MB/s,随机读写速度94MB/s和56MB/s,降速版本的实际读写速度差不多就等于目前普通emmc5.0 64GB的水准,和最开始的满血版确实性能差距明显。
虽然有业内人士认为,根源在于不同批次生产的P10手机可能分别采用了eMMC5.1和UFS2.0和UFS2.1方案,所以导致了闪存速度差异。但降速版本的实际读写速度差不多就等于目前普通emmc5.0 64GB的水准,这个已经不是采用eMMC5.1方案能自圆其说的了。毕竟在理论上,最新的eMMC 5.1标准理论带宽为600MB/s左右(就eMMC标准纯粹从理论上说,eMMC 4.4标准的读取速度大约为104MB/s,eMMC 4.5标准则为200MB/s,eMMC 5.0标准为400MB/s),即便实际测试要打一个折扣,也不至于出现如此大的差距。
eMMC是由MMC协会所订立的、主要是针对手机或平板电脑等产品的内嵌式存储器标准规格。在核心算法上,eMMC和SSD比较相似。不过,相对于SSD需要外部的主控,eMMC的主控集成在芯片内部,所以eMMC芯片可以直接以芯片形式(比如BGA封装)焊接在电路板,通过MMC协议接入系统总线,不同厂商和制程下接口协议相同。由于现在的ARM CPU以及Intel Atom CPU都直接支持MMC协议存储,所以可以直接使用eMMC芯片而无需额外的接口控制芯片,现在的一部分手机和一部分平板电脑都是这种形式。
由此可见,eMMC方案其实就是一个迷你版的不需要外部主控(主控已经集成在芯片内部)的SSD,eMMC方案也要用到NAND Flash,而根据媒体爆料,华为部分P10采用的eMMC芯片,其中部分NAND Flash恐怕存在产品品质比较一般——有可能存在部分eMMC芯片采用了TLC存储颗粒,而且还是品质比较一般的TLC存储颗粒(有网友爆料采用的是闪迪TLC颗粒,酷比魔方999平板同款)。
其实除了MLC和TLC,还有一种更高端的SLC,先解释下什么是SLC、MLC、TLC。
SLC全称Single-Level Cell,每Cell仅存放1bit数据,速度快寿命长,价格非常昂贵,价格至少是MLC的3倍以上。
MLC全称Multi-Level Cell,每Cell仅存放2bit数据,速度一般寿命一般。
TLC全称Trinary-Level Cell,每Cell仅存放3bit数据,速度慢寿命短,价格便宜。
为什么SLC速度快寿命更长呢?SLC架构由于每Cell仅存放1bit数据,故只有高和低2种电平状态。而MLC架构每Cell需要存放2个bit,即电平至少要被分为4档。
每Cell只有开和关两种状态,非常稳定,就算其中一个Cell损坏,对整体的性能也不会有影响。而MLC有四种状态,意味着MLC存储时要更精确地控制每个存储单元的充电电压,读写时就需要更长的充电时间来保证数据的可靠性,而且一旦出现错误,就会导致2倍及以上的数据损坏。
而SLC价格更贵的原因在于SLC的一个Cell只存1bit数据,MLC或TLC的一个Cell却能存2bit或者更多的bit数据,但芯片的体积并没增加,等于压缩存储了数据,这样的结果就是相同的一块芯片存储的容量变大,因此,MLC或TLC的自然价格就便宜了。
事实上,正是因为SLC价格高、寿命长、速度快,因而很少被用于民用产品,哪怕是某实际成本200美元,售价高达六七千人民币的手机,依旧存在MLC和TLC混用的问题。
而华为本次的情况,则有可能是重复了前人的故事,而且采用的TLC品质比较一般,因而导致了降速版本的实际读写速度差不多就等于目前普通emmc5.0 64GB的水准。
USF方案是电子设备工程联合委员会提出的,UFS2.0标准和UFS2.1标准在理论性能上是优于eMMC5.1方案。因此一般在千元级上会采用eMMC5.0或eMMC5.1,在2500元以上的中高端手机上会采用UFS2.0和UFS2.1。
因此,华为P10这次引起不少用户愤怒的原因就在于将原本用在千元机上的eMMC5.1方案用到了售价高达3788元的华为高端机型上。
造成这种问题的原因很可能是供应链的问题——同样是搭载麒麟960的手机,无论是mate9还是荣耀V9,都没有被媒体爆出大规模使用emmc5.1的情况。而在华为P10上采用emmc5.1去替代ufs2.1,恐怕是今年众多高端手机采用ufs2.1方案后,特别是作为安卓机皇的三星S8即将上市,在大家抢产能的情况下,华为对供应链的掌握已然失控,只能用emmc5.1去顶替ufs2.1了。
雷峰网特约稿件,未经授权禁止转载。详情见转载须知。
| 本文作者: 刘芳平 | 2017-04-19 11:10 | 专题:Facebook F8大会 |
雷锋网消息,在刚刚开幕的 2017 年 Facebook 年度开发者大会 F8,Facebook 正式推出了VR 社交平台——Facebook Spaces,目前还是 Beta 版;同场 Facebook 还推出了一个手机 AR 平台(也是 Beta 版),结合 AI 和 SLAM 等前沿技术。扎克伯格在开场演讲中为大家憧憬了一个 AR 的未来。
在去年的 Oculus Connect 大会上,扎克伯格向大家展示了 VR 社交的一些场景,到了今年,Facebook 正式端出了这个平台的 Beta 版。
Facebook Spaces 这款应用现在已经免费登陆 Oculus Rift。(下载地址)
VR 自拍
这款产品与去年的演示的功能有些类似,用户可以化身成虚拟人像在VR空间和好友进行多种多样的社交活动。但也新增了许多功能,主要包括以下这些:
用户可以使用自己的 Facebook 照片来设计自己在 VR 里的虚拟人像;
可以在VR里和朋友分享美好回忆,平面的和360度的影像都可以;
一起创作3D物体;
记录和朋友一起在VR里的旅程,包括自拍;
在VR里和朋友通过Messenger视频通话,即便对方没在用VR也可以。
在总共一小时 20 分钟的演讲中,AR 就占到了 40 分钟的时间,这也在给业界释放一个信号:Facebook 不仅在 VR 上做出了大量的投入,在 AR 领域也没闲着。
Camera Effects 平台
大会伊始,扎克伯格就发布了 AR 平台——Camera Effects,他还表示,AR 将成为下一代计算平台。
Camera Effects 可以让用户随意在其 APP 的相机上编辑捕捉到的内容,他还可以让 2D 图片转换成 3D 效果,而整个画面看起来也更加生动,还可以添加贴纸到 Instagram 的照片上(和Snapchat有些类似)。
Facebook CTO Mike Schroepfer 还详细介绍了这一平台背后的技术。他表示,该平台集成了实时追踪物体位置的功能、SLAM 算法、机器学习以及图像识别等。
开发者已经可以开始申请这一平台的beta版,而且后续将逐步向开发者开放。
AR Studio、Frame Studio
除此之外,Facebook 还发布了一款面向开发者的工具 AR Studio,开发者可以使用这款工具来开发 AR 内容,这款工具可以实现各种动画效果,例如,你你可以用它来根据手势、面部表情设计一些效果。
Frame Studio 则更像是一款为有艺术追求的开发者而定制的工具,使用 Frame Studio 可以上传简单的静态重叠图像过滤器,而且还能在 Facebook Camera 中显示给朋友或粉丝。而且整个操作过程也非常简单,你不需要拥有代码基础,只需上传一张图片就可以使用。
当然,这些平台和工具不只是针对图片和视频来实现 AR 效果,它们也可以为游戏和一些项目增强体验。扎克伯格也在现场展示自己对 AR 的憧憬,他认为只需要使用一个手机相机视图的环境和使用它的屏幕来实现 AR 功能。
在大会 Keynote 演讲刚开始,扎克伯格就向大家描绘了一个美好的 AR 未来世界。
他介绍说,将来,戴上 AR 眼镜我们可以做的事情很多,比如抬头一看墙上就出现了虚拟的电视;和戴着 AR 眼镜的朋友一起可以在桌子上玩虚拟象棋。
“未来很多东西都可以虚拟化,节省很多成本。”扎克伯格这样说道。
但是由于 AR 眼镜要做到想像中的那样还有一段路要走,所以 Facebook 选择先在手机上基于摄像头打造一个 AR 平台。
扎克伯格也在现场演示了一些手机 AR 应用,比如 Nike Run Club app,用户可以将头带和跑步数据叠加到自拍上面并分享出去。
还有用手机对着房间,在里面摆放各种 3D 物体,甚至是让房间“充满水”。
雷锋网认为,手机现在能做到,未来 AR 眼镜可以做得更逼真。对于这样的未来,你感兴趣吗?
雷锋网程弢对此文亦有贡献。
相关文章:
F8 2017 | AR、VR、AI一个不落,Facebook 带你通往未来世界
雷峰网原创文章,未经授权禁止转载。详情见转载须知。
| 本文作者: 张伟 | 2017-04-19 10:40 | 专题:2017 上海车展 |
2017年4月19日上海国际车展,蔚来汽车创始人李斌站在聚光灯下,回顾了自己一手创办的这家电动汽车企业成立两年零五个月以来的成就。蔚来汽车也顺势完成了中国首秀。
事实上,本场发布会吸引最多关注的要数蔚来旗下首款量产车型NIO ES8的亮相。不过,在这款车亮相之前,李斌为大家增加了一道前菜。
李斌现场宣布,再生产10台电动超跑NIO EP9,在全球范围内进行限量预售,售价定在148万美元/台。而首批的6辆则分别属于蔚来汽车的创始投资人。
该场发布会高潮出现在10时15分,李斌邀请蔚来汽车高管团队走到舞台中央,共同揭开了NIO ES8的面纱。
▲ 蔚来汽车高管揭开NIO ES8的神秘面纱
而关于NIO ES8的具体性能参数,李斌并未多讲。
目前已知的信息是,ES8是一款高性能7座纯电动SUV,座椅采用2+3+2布局,车长超过5米,轴距超过3米。ES8由全铝合金车身和底盘打造,全系标配主动式空气悬挂,搭载前后双电机,采用四轮驱动。同时具备 L2-L3 级别的自动驾驶能力。此外,NIO ES8还支持换电模式,将为用户带来超越燃油车加油的能量获取体验。
目前,ES8的生产制造体系及供应链布局已搭建完毕,预计在明年正式开始交付。但是,关于这款车的价格,可能还要等到其正式上市那天公布。有信源向雷锋网新智驾透露,“ES8的目标价格是特斯拉同档次车型的1/3。”
有意思的是,蔚来汽车的另外一位创始人李想也来到现场,在媒体的镜头下谈了谈NIO ES8的设计理念。
▲ 李想正在介绍NIO ES8的外观设计
雷锋网新智驾也在持续关注蔚来汽车,这家全球初创电动汽车公司创办于 2014 年,目前已在上海、圣何塞、慕尼黑以及伦敦等 12 地设立设计、研发、生产与商务机构。
2015 年,蔚来车队获得Formula E历史上首个车手总冠军;2016 年,蔚来发布全球最快电动汽车 EP9,创造了纽博格林北环等4个国际知名赛道最快圈速纪录;2017 年,蔚来发布北美战略及首款概念车 EVE,同时,EP9 在美洲赛道创造无人驾驶时速世界纪录。
蔚来由李斌、刘强东、李想、腾讯、高瓴资本、顺为联合发起创立,并获得淡马锡、百度资本、红杉、厚朴、联想集团、华平、TPG、GIC、IDG、愉悦资本等数十家知名机构投资。
如今,蔚来有了这款量产电动汽车作为背书,前路又会走成什么样呢?
请持续关注雷锋网新智驾(AI-Drive)在上海国际车展发回的一线报道。
雷峰网原创文章,未经授权禁止转载。详情见转载须知。
雷锋网按:本文源自一位数据科学开发者的个人博客,雷锋网编译。
许多开发者向新手建议:如果你想要入门机器学习,就必须先了解一些关键算法的工作原理,然后再开始动手实践。但我不这么认为。
我觉得实践高于理论,新手首先要做的是了解整个模型的工作流程,数据大致是怎样流动的,经过了哪些关键的结点,最后的结果在哪里获取,并立即开始动手实践,构建自己的机器学习模型。至于算法和函数内部的实现机制,可以等了解整个流程之后,在实践中进行更深入的学习和掌握。
那么问题来了,既然作为初学者不需要掌握算法细节,但实现模型的过程中又必须用到相关算法,怎么办呢?答案是借助于互联网上已经实现好的函数库,例如 TensorFlow。
在本文中,我们将利用 TensorFlow 实现一个基于深度神经网络(DNN)的文本分类模型,希望对各位初学者有所帮助。文中所涉完整代码已经在 GitHub 上开源,感兴趣的朋友可以在以下链接中下载:
下面是正式的教程内容:
TensorFlow 是谷歌旗下一个开源的机器学习框架。从它的名字就能看出这个框架基本的工作原理:由多维数组构成的张量(tensor)在图(graph)结点之间定向流动(flow),从输入走到输出。
在 TensorFlow 中,每次运算都可以用数据流图(dataflow graph)的方式表示。每个数据流图都有以下两个重要元素:
● 一组 tf.Operation 对象,代表运算本身;
● 一组 tf.Tensor 对象,代表被运算的数据。
如下图所示,这里我们以一个简单的例子说明数据流图具体是怎样运行的。
假设图中的 x=[1,3,6],y=[1,1,1]。由于 tf.Tensor 被用来表示运算数据,因此在 TensorFlow 中我们会首先定义两个 tf.Tensor 常量对象存放数据。然后再用 tf.Operation 对象定义图中的加法运算,具体代码如下:
import tensorflow as tf
x = tf.constant([1,3,6])
y = tf.constant([1,1,1])
op = tf.add(x,y)
现在,我们已经定义了数据流图的两个重要元素:tf.Operation 和 tf.Tensor,那么如何构建图本身呢,具体代码如下:
import tensorflow as tf
my_graph = tf.Graph()
with my_graph.as_default():
x = tf.constant([1,3,6])
y = tf.constant([1,1,1])
op = tf.add(x,y)
至此我们已经完成了数据流图的定义,在 TensorFlow 中,只有先定义了图,才能进行后续的计算操作(即驱动数据在图的结点间定向流动)。这里 TensorFlow 又规定,要进行后续的计算,必须通过 tf.Session 来统一管理,因此我们还要定义一个 tf.Session 对象,即会话。
在 TensorFlow 中,tf.Session 专门用来封装 tf.Operation 在 tf.Tensor 基础上执行的操作环境。因此,在定义 tf.Session 对象时,也需要传入相应的数据流图(可以通过 graph 参数传入),本例中具体的代码如下:
import tensorflow as tf
my_graph = tf.Graph()
with tf.Session(graph=my_graph) as sess:
x = tf.constant([1,3,6])
y = tf.constant([1,1,1])
op = tf.add(x,y)
定义好 tf.Session 之后,我们可以通过 tf.Session.run() 方法来执行对应的数据流图。run() 方法可以通过 fetches 参数传入相应 tf.Operation 对象,并导入与 tf.Operation 相关的所有 tf.Tensor 对象,然后递归执行与当前 tf.Operation 有依赖关系的所有操作。本例中具体执行的是求和操作,实现代码如下:
import tensorflow as tf
my_graph = tf.Graph()
with tf.Session(graph=my_graph) as sess:
x = tf.constant([1,3,6])
y = tf.constant([1,1,1])
op = tf.add(x,y)
result = sess.run(fetches=op)
print(result)
>>> [2 4 7]
可以看到运算结果是 [2 4 7]。
了解 TensorFlow 的基本原理之后,下面的任务是如何构建一个预测模型。简单来说,机器学习算法 + 数据就等于预测模型。构建预测模型的流程如下图所示:
如图,经过数据训练的机器学习算法就是模型。训练好一个模型之后,输入待预测数据,就能得到相应的预测结果。大体流程如下图所示:
在本例中,我们将要构建的模型需要根据输入文本,输出相应的类别,即完成文本分类的工作。因此这里的输入应该是文本(text),输出是类别(category)。更具体地说,本例中我们已经事先获取了标记数据(即一些已经标明了类别的文本段),然后用这些数据对算法进行训练,最后再用训练好的模型对新文本分类。这一过程也就是通常所说的监督学习(supervised learning)。另外,由于我们的任务是对文本数据进行分类,所以也属于分类问题的范畴。
为了构建该文本分类模型,下面我们需要介绍一些神经网络的基础知识。
从本质上说,神经网络是计算模型(computational model)的一种。(注:这里所谓计算模型是指通过数学语言和数学概念描述系统的方法)并且这种计算模型还能够自动完成学习和训练,不需要精确编程。
最原始也是最基础的一个神经网络算法模型是感知机模型(Perceptron),关于感知机模型的详细介绍请参见这篇博客:
由于神经网络模型是模拟人类大脑神经系统的组织结构而提出的,因此它与人类的脑神经网络具有相似的结构。
如上图所示,一般的神经网络结构可以分为三层:输入层、隐蔽层(hidden layer)和输出层。
为了深入理解神经网络究竟是如何工作的,我们需要利用 TensorFlow 自己亲手构建一个神经网络模型,下面介绍一个具体的实例。(本例部分内容源自 GitHub 上的一段开源代码:链接)
本例中,我们有两个隐蔽层(关于隐蔽层层数的选择是另一个问题,更详细的内容可以参考:链接)。概括地说,隐蔽层的主要作用是将输入层的数据转换成一种输出层更便于利用的形式。
如图所示,本例中输入层的每个结点都代表了输入文本中的一个词,接下来是第一个隐蔽层。这里需要注意的是,第一层隐蔽层的结点个数选择也是一项重要的任务,通常被称为特征选择。
图中的每个结点(也被称为神经元),都会搭配一个权重。而我们下面所谓训练过程其实就是不断调整这些权重值,让模型的实际输出和预想输出更匹配的过程。当然,除了权重之外,整个网络还要加上一个偏差值。(关于偏差的详细介绍详见:链接)
对每个结点做加权和并加上一个偏差值之后,还需要经过激活函数(activation function)的处理才能输出到下一层 。实际上,这里激活函数确定了每个结点的最终输出情况,同时为整个模型加入了非线性元素。如果用台灯来做比喻的话,激活函数的作用就相当于开关。实际研究中根据应用的具体场景和特点,有各种不同的激活函数可供选择,这里屏蔽层选择的是 ReLu 函数。
另外图中还显示了第二个隐蔽层,它的功能和第一层并没有本质区别,唯一的不同就是它的输入是第一层的输出,而第一层的输入则是原始数据。
最后是输出层,本例中应用了独热编码的方式来对结果进行分类。这里所谓独热编码是指每个向量中只有一个元素是 1,其他均为 0 的编码方式。例如我们要将文本数据分为三个类别(体育、航空和电脑绘图),则编码结果为:
这里独热编码的好处是:输出结点的个数恰好等于输出类别的个数。此外,输出层和前面的隐蔽层结构类似,我们也要为每个结点搭配一个权重值,加上恰当的偏差,最后通过激活函数的处理。
但本例中输出层的激活函数与隐蔽层的激活函数不同。由于本例的最终目的是输出每个文本对应的类别信息,而这里所有类别之间又是互斥的关系。基于这些特点,我们在输出层选择了 Softmax 函数作为激活函数。该函数的特点是可以将输出值转换为 0-1 之间的一个小数值,并且这些小数值的和为 1。于是正好可以用这些小数表示每个类别的可能性分布情况。假如刚才提到的三个类别原本的输出值为 1.2、0.9 和 0.4,则通过 Softmax 函数的处理后,得到的结果为:
可以看到这三个小数的和正好为 1。
到目前为止,我们已经明确了该神经网络的数据流图,下面为具体的代码实现:
# Network Parameters
n_hidden_1 = 10 # 1st layer number of features
n_hidden_2 = 5 # 2nd layer number of features
n_input = total_words # Words in vocab
n_classes = 3 # Categories: graphics, space and baseballdef multilayer_perceptron(input_tensor, weights, biases):
layer_1_multiplication = tf.matmul(input_tensor, weights['h1'])
layer_1_addition = tf.add(layer_1_multiplication, biases['b1'])
layer_1_activation = tf.nn.relu(layer_1_addition)# Hidden layer with RELU activation
layer_2_multiplication = tf.matmul(layer_1_activation, weights['h2'])
layer_2_addition = tf.add(layer_2_multiplication, biases['b2'])
layer_2_activation = tf.nn.relu(layer_2_addition)# Output layer with linear activation
out_layer_multiplication = tf.matmul(layer_2_activation, weights['out'])
out_layer_addition = out_layer_multiplication + biases['out']return out_layer_addition
如前所述,模型训练中一项非常重要的任务就是调整结点的权重。本节我们将介绍如何在 TensorFlow 中实现这一过程。
在 TensorFlow 中,结点权重和偏差值以变量的形式存储,即 tf.Variable 对象。在数据流图调用 run() 函数的时候,这些值将保持不变。在一般的机器学习场景中,权重值和偏差值的初始取值都通过正太分布确定。具体代码如下图所示:
weights = {
'h1': tf.Variable(tf.random_normal([n_input, n_hidden_1])),
'h2': tf.Variable(tf.random_normal([n_hidden_1, n_hidden_2])),
'out': tf.Variable(tf.random_normal([n_hidden_2, n_classes]))
}
biases = {
'b1': tf.Variable(tf.random_normal([n_hidden_1])),
'b2': tf.Variable(tf.random_normal([n_hidden_2])),
'out': tf.Variable(tf.random_normal([n_classes]))
}
以初始值运行神经网络之后,会得到一个实际输出值 z,而我们的期望输出值是 expected,这时我们需要做的就是计算两者之间的误差,并通过调整权重等参数使之最小化。一般计算误差的方法有很多,这里因为我们处理的是分类问题,因此采用交叉熵误差。(关于为什么分类问题选用交叉熵,参见:连接)
在 TensorFlow 中,我们可以通过调用 tf.nn.softmax_cross_entropy_with_logits() 函数来计算交叉熵误差,因为这里我们的激活函数选择了 Softmax ,因此误差函数中出现了 softmax_ 前缀。具体代码如下(代码中我们同时调用了 tf.reduced_mean() 函数来计算平均误差):
# Construct model
prediction = multilayer_perceptron(input_tensor, weights, biases)
# Define loss
entropy_loss = tf.nn.softmax_cross_entropy_with_logits(logits=prediction, labels=output_tensor)
loss = tf.reduce_mean(entropy_loss)
得到误差之后,下面的任务是如何使之最小化。这里我们选择的方法是最常用的随机梯度下降法,其直观的原理图如下所示:
同样,用来计算梯度下降的方法也有很多,这里我们采用了 Adaptive Moment Estimation (Adam) 优化法,即自适应矩估计的优化方法,具体在 TensorFlow 中的体现是 tf.train.AdamOptimizer(learning_rate).minimize(loss) 函数。这里我们需要传入 learning_rate 参数以决定计算梯度时的步进长度。
非常方便的一点是,AdamOptimizer() 函数封装了两种功能:一是计算梯度,二是更新梯度。换句话说,调用该函数不但能计算梯度值,还能将计算结果更新到所有 tf.Variables 对象中,这一点大大降低了编程复杂度。
具体模型训练部分的代码如下所示:
learning_rate = 0.001
# Construct model
prediction = multilayer_perceptron(input_tensor, weights, biases)
# Define loss
entropy_loss = tf.nn.softmax_cross_entropy_with_logits(logits=prediction, labels=output_tensor)
loss = tf.reduce_mean(entropy_loss)
optimizer = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(loss)
本例中,我们得到的原始数据是许多英文的文本片段,为了将这些数据导入模型中,我们需要对原始数据进行必要的预处理过程。这里具体包括两个部分:
● 为每个单词编码;
● 为每个文本片段创建对应的张量表示,其中以数字 1 代表出现了某个单词,0 表示没有该单词。
具体实现代码如下:
import numpy as np #numpy is a package for scientific computing
from collections import Counter
vocab = Counter()
text = "Hi from Brazil"
#Get all words
for word in text.split(' '):
vocab[word]+=1
#Convert words to indexes
def get_word_2_index(vocab):
word2index = {}
for i,word in enumerate(vocab):
word2index[word] = i
return word2index
#Now we have an index
word2index = get_word_2_index(vocab)
total_words = len(vocab)
#This is how we create a numpy array (our matrix)
matrix = np.zeros((total_words),dtype=float)
#Now we fill the values
for word in text.split():
matrix[word2index[word]] += 1
print(matrix)
>>> [ 1. 1. 1.]
从以上代码可以看到,当输入文本是“Hi from Brazil”时,输出矩阵是 [ 1. 1. 1.]。而当输入文本只有“Hi”时又会怎么样呢,具体代码和结果如下:
matrix = np.zeros((total_words),dtype=float)
text = "Hi"
for word in text.split():
matrix[word2index[word.lower()]] += 1
print(matrix)
>>> [ 1. 0. 0.]
可以看到,这时的输出是 [ 1. 0. 0.]。
相应的,我们也可以对类别信息进行编码,只不过这时使用的是独热编码:
y = np.zeros((3),dtype=float)
if category == 0:
y[0] = 1. # [ 1. 0. 0.]
elif category == 1:
y[1] = 1. # [ 0. 1. 0.]
else:
y[2] = 1. # [ 0. 0. 1.]
至此我们已经对 TensorFlow、神经网络模型、模型训练和数据预处理等方面有了初步的了解,下面我们将演示如何将这些知识应用于实际的数据。
这里我们的数据来源是 20 Newsgroups,其中包括了 18000 篇新闻稿,覆盖率 20 个类别,开源免费,下载地址为:
首先,为了导入这些数据集,我们需要借助 scikit-learn 库。它也是个开源的函数库,基于 Python 语言,主要进行机器学习相关的数据处理任务。本例中我们只使用了其中的三个类:comp.graphics,sci.space 和 rec.sport.baseball。
最终数据会被分为两个子集,一个是数据训练集,一个是测试集。这里的建议是最好不要提前查看测试数据集。因为提前查看测试数据会影响我们对模型参数的选择,从而影响模型对其他未知数据的通用性。
具体的数据导入代码如下:
from sklearn.datasets import fetch_20newsgroups
categories = ["comp.graphics","sci.space","rec.sport.baseball"]
newsgroups_train = fetch_20newsgroups(subset='train', categories=categories)
newsgroups_test = fetch_20newsgroups(subset='test', categories=categories)
在神经网络术语中,一个 epoch 过程就是对所有训练数据的一个前向传递(forward pass)加后向传递(backward pass)的完整循环。这里前向是指根据现有权重得到实际输出值的过程,后向是指根据误差结果反过来调整权重的过程。下面我们重点介绍一下 tf.Session.run() 函数,实际上它的完整调用形式如下:
tf.Session.run(fetches, feed_dict=None, options=None, run_metadata=None)
在文章开头介绍该函数时,我们只通过 fetches 参数传入了加法操作,但其实它还支持一次传入多种操作的用法。在面向实际数据的模型训练环节,我们就传入了两种操作:一个是误差计算(即随机梯度下降),另一个是优化函数(即自适应矩估计)。
run() 函数中另一个重要的参数是 feed_dict,我们就是通过这个参数传入模型每次处理的输入数据。而为了输入数据,我们又必须先定义 tf.placeholders。
按照官方文档的解释,这里 placeholder 仅仅是一个空客,用于引用即将导入模型的数据,既不需要初始化,也不存放真实的数据。本例中定义 tf.placeholders 的代码如下:
n_input = total_words # Words in vocab
n_classes = 3 # Categories: graphics, sci.space and baseball
input_tensor = tf.placeholder(tf.float32,[None, n_input],name="input")
output_tensor = tf.placeholder(tf.float32,[None, n_classes],name="output")
在进行实际的模型训练之前,还需要将数据分成 batch,即一次计算处理数据的量。这时就体现了之前定义 tf.placeholders 的好处,即可以通过 placeholders 定义中的“None”参数指定一个维度可变的 batch。也就是说,batch 的具体大小可以等后面使用时再确定。这里我们在模型训练阶段传入的 batch 更大,而测试阶段可能会做一些改变,因此需要使用可变 batch。随后在训练中,我们通过 get_batches() 函数来获取每次处理的真实文本数据。具体模型训练部分的代码如下:
training_epochs = 10
# Launch the graph
with tf.Session() as sess:
sess.run(init) #inits the variables (normal distribution, remember?)
# Training cycle
for epoch in range(training_epochs):
avg_cost = 0.
total_batch = int(len(newsgroups_train.data)/batch_size)
# Loop over all batches
for i in range(total_batch):
batch_x,batch_y = get_batch(newsgroups_train,i,batch_size)
# Run optimization op (backprop) and cost op (to get loss value)
c,_ = sess.run([loss,optimizer], feed_dict={input_tensor: batch_x, output_tensor:batch_y})
至此我们已经针对实际数据完成了模型训练,下面到了应用测试数据对模型进行测试的时候。在测试过程中,和之前的训练部分类似,我们同样要定义图元素,包括操作和数据两类。这里为了计算模型的精度,同时还因为我们对结果引入了独热编码,因此需要同时得到正确输出的索引,以及预测输出的索引,并检查它们是否相等,如果不等,要计算相应的平均误差。具体实现代码和结果如下:
# Test model
index_prediction = tf.argmax(prediction, 1)
index_correct = tf.argmax(output_tensor, 1)
correct_prediction = tf.equal(index_prediction, index_correct)
# Calculate accuracy
accuracy = tf.reduce_mean(tf.cast(correct_prediction, "float"))
total_test_data = len(newsgroups_test.target)
batch_x_test,batch_y_test = get_batch(newsgroups_test,0,total_test_data)
print("Accuracy:", accuracy.eval({input_tensor: batch_x_test, output_tensor: batch_y_test}))
>>> Epoch: 0001 loss= 1133.908114347
Epoch: 0002 loss= 329.093700409
Epoch: 0003 loss= 111.876660109
Epoch: 0004 loss= 72.552971845
Epoch: 0005 loss= 16.673050320
Epoch: 0006 loss= 16.481995190
Epoch: 0007 loss= 4.848220565
Epoch: 0008 loss= 0.759822878
Epoch: 0009 loss= 0.000000000
Epoch: 0010 loss= 0.079848485
Optimization Finished!
Accuracy: 0.75
最终可以看到,我们的模型预测精度达到了 75%,对于初学者而言,这个成绩还是不错的。至此,我们已经通过 TensorFlow 实现了基于神经网络模型的文本分类任务。
来源:medium,雷锋网编译
雷锋网「新智造」按:本文来源于金沙江创投微信公众号,作者张清为金沙江创投合伙人,专注信息技术/人工智能在医疗健康/生命科学垂直领域的应用。原文标题为《浮夸无益、概念有毒!警惕医疗IT创业三大陷阱!》。雷锋网「新智造」已获取授权。
新智造作为雷锋网旗下频道,关注智能时代的创新与创造,目标是为创业者和投资人找到创投的机会。另外,雷锋网正在启动“新智造成长榜2017”评选活动,我们将对人工智能与机器人行业进行大规模报道、梳理和调研,并联合数十家著名投资机构根据这些创新公司的技术实力、商业能力和成长性进行深度评选,最终从多个领域分别选出一些极具潜力成长性的创新公司。如果你想参与我们的评选,可点击「报名」链接,或通过邮箱xinzhizao@leiphone.com联系我们!
医疗IT、信息化领域在中国的医疗健康投资比例中占比尚偏低,但从创业公司数量和类型来看,都保持了蓬勃的增长态势。对比美国数据,2009-2015年,共有100亿美元早期投资到500个医疗IT创业公司中。纵然,两国医疗体系有大不同,但从中国近10年的医改方向、改革速度和力度来看,改革渗透到医院服务、医药创新、医疗器械支持等多方面,相信医疗IT的改革是快马加鞭进行的。
丑话写在前面,究竟医疗IT成长艰难的原因在哪。或者说,创业公司需要避免哪几类陷阱,才能永葆青春活力、立于不败之地呢。回顾这500个医疗IT公司中,取得成功者却甚少。
生病这件事很不美好。生病,往往和疼痛、丑陋、悲伤的情绪联系在一起。人人都可能生病,但并不代表人人都有在疾病上消费的积极性。原因很简单:没有人喜欢生病。一个人只有在万不得已的时候才会想到‘医疗健康’这件事。这就注定了在医疗2C端,鲜有病毒传播的效应,且留存率低得可怕。(也许医美、孕产是个例外)。所以,针对于慢性疾病、基本健康保障类别的社交平台大都做不好。
但另一方面,消费者的确愿意为医疗服务付费,并且对价格的不敏感度惊人。尤其是在信息不对称、或者病人和支付者不是一个人的情况。但大多数情况是倾向于短期的治疗,比如,创伤恢复、重症治疗(比如肿瘤、心血管疾病等)。并且,医疗是几千或许上万个单独类别的疾病。乳腺癌3期、肝脏占位、高血压、糖尿病等患者群体根本就是不同群体,没有交集、毫无可比之处。这就导致了一个碎片化、微社区化的结局。公司只有靠提高留存率来弥补获客成本和流失成本。
更要命的是,即便是慢性病患者,大多数时候他们也感觉良好。半年、一年去看一次医生,调调药就不错了。有些病人即使有不良反应,也不一定会把副作用和药联系起来,不会主动去换药。慢性病占据了大部分医疗开销,但往往病人在购买新仪器、换其他品类的药、换服务的时候都很谨慎,动作很慢。众多的app如用药提醒、症状检测、生物体感器、患者教育等都并不火爆。即便像PatientsLikeme 这样出名的公司,基本上也只是一组人互相抱怨得病的不幸和症状的苦恼,带来的是负面情绪,很难有广泛的持久的影响力。
如果要做2C方,一定要想想,到底为老百姓解决了什么难题。
也许更安全的是专注于2B领域。在美国尤其如此。美国的医疗体系中,大多数花销还是由雇主来承担。自付比例相对低并有上限额度。慢性病以及急症患者往往会超出自付上限。另外,2B这也弥补了无病毒传播的特点,而在垂直领域深耕,留存率高,复购率有保证。大型公司同时还是非常棒的渠道合作方,能够加速触及用户,降低获客成本。但当然这也不是完美。2B的销售周期、销售成本也是不菲。下面详细阐述。在中国,2B整体不如2C端成熟,但也值得关注。随着支付政策的改革,这个变化可能来得很快、很猛烈。
如果做2B的生意,就要认真考虑,你的产品能卖给谁,能卖多少钱是个大问题。
历史数据表明,鲜有医疗服务公司会赚钱。即便是保险公司或医院的净利润最好也不过是10%。所以回报的预期要合理。时间范围尽量控制在一年中。一年也正好可以决定保险产品的续费和更换。如果2年才能看出产品价值,对企业来说就比较尴尬,会严重拖延订单的决策流程。或者会把价格压得很低。不少预测患病风险的公司都有相似的艰难经历。因为“降低重复入院率”这个价值需要更长的时间才能看得出来,才能在收支平衡表上明确。太久的效益回报难以让买家签下一大笔合同。所以,从一开始,就要明确,解决的这个问题,需要多久看得出成效?解决的问题是不是足够大?也许真正解决需要半个世纪,但我们需要看到,的确,我们从一个点开始,已经在慢慢撬动一个巨大的岩石。
明确了问题,选择用户也要非常谨慎。在医疗系统中,你为用户节省的每一块钱都是从这个生态圈里其他玩家中获得的。比如保险公司。你应该远超对手,把客户从其他人手中吸引过来。举个例子。Castlight Health是一个比价工具。仅用了6年时间,就成功IPO,市值一度达到30亿美元。Castlight能够不断为雇主节省保险开支。这些雇主成为忠实用户,为他们站台,和保险公司、PBM公司来谈判、交涉。
健康管理,大数据,精准医疗。我找不到这些词的含义。不是一个问题、解决方案、效果。
成年人,玩概念无益。
诚然,大体量、多维度、持续积累的数据可以通过建模做疾病风险预测、提供诊治建议,得到针对病人A的方案,这很炫酷。但并不是当前的突出问题,我们离实现这个理想还有段距离,我们还需要一个更加友好的医疗体系,一个机制保障,一个社会环境的支持。
在上述提到的“预测患病风险”的例子里,保险产品、临床医学都很擅长发现高危病人。事实上,医生的诊断和预测能力还是要比电脑高明,起码在当前这个阶段。对于大数据的价值,不应过于专注做替代医生的诊断、提前找出病人等,而是应该对改变风险本身带来实质的进步。而这一方面,正好是临床医生的弱项。
再举Virta Health为例。医学院里教的2型糖尿病的知识大多都是关于如何减慢疾病进展、如何预防并发症。多数病人需要警惕骇人的并发症如糖尿病足、截肢、心梗、卒中、失明等。十年前出现了治愈疾病的外科移植手术但受众群体太有限。Steve Phinney医生提出干预手段效果喜人。250名入组的患者在10周后,近90%的患者都停用或者减量了胰岛素,减重7%,糖化血红蛋白指标明显改善。91%的患者继续参与Virta的课程。
这些干预方法是基于大量的数据,来源于病人、医生、药厂。Virta进一步开始了个体化定制服务,力图更有效逆转糖尿病。节省每年大笔的胰岛素药物开销。如果没有这样的数据和算法,有效的干预手段不可能出现。医生还是会日复一日、苦口婆心的劝说病人“管住嘴、迈开腿”,病人呢?是妥协生活质量,还是妥协对并发症的恐惧?无从选择。
医疗IT可以提高医疗健康质量、降低花销(提高生产力),让医疗服务流程尽量简化、低成本、提高就医体验。对病人来说,在选择(计划)、购买、随访等步骤中都有收益。但真正的需求在哪,产品如何设计,如果把技术落实为商业成功,还是要多家斟酌。期待和有热情的朋友们多沟通、多交流。
我们是金沙江,助力下一个独角兽!
雷锋网4月19日消息,今日下午两点,小米将在北京工业大学举行发布会,发布新一代旗舰手机——小米6。然而,就在昨晚,有网友在微博上曝出了疑似小米6的官方宣传海报,甚至还有上手视频。
从海报中可以看出,小米6依然采用5.15英寸屏幕,配置方面则是高通骁龙835 + 6GB RAM,不过目前还不知道6GB RAM是不是小米6的标配。
之前小米在预热微博里宣传的“四曲面”概念一直让人费解,因为小米6采用的并不是曲面屏,从这张海报里可以看出,所谓的“四曲面”指的其实是手机的后壳。而小米6的后壳除了采用四曲面的设计之外,预计还会有陶瓷和玻璃材质两种版本。
虽然清晰度很低,但是视频中的小米6与上面宣传海报中的相似度很高,因此基本可以确定小米6将会采用前置指纹识别方案,并搭载双摄像头。有消息称,小米6将不会延续小米5S的超声波指纹识别方案。
此外,视频中的小米6样机似乎并没有3.5mm的耳机接口,难道小米也要学乐视和苹果?有一种说法是,小米6为了防水功能去掉了3.5mm的耳机接口,不过这个说法还未得到验证。
今日下午,雷锋网也将出席小米6的发布会,并为读者带来最新消息,敬请关注。
*图片来自网络
【招聘】雷锋网坚持在人工智能、无人驾驶、VR/AR、Fintech、未来医疗等领域第一时间提供海外科技动态与资讯。我们需要若干关注国际新闻、具有一定的科技新闻选题能力,翻译及写作能力优良的外翻编辑加入。
简历投递至 wudexin@leiphone.com,工作地 北京。
| 本文作者: 吴德新 | 2017-04-19 09:11 | 专题:2017 上海车展 |
雷锋网新智驾4月19日在上海车展前方报道:百度今日发布一项名为“Apollo”的自动驾驶平台开放计划,将向汽车行业及自动驾驶领域的合作伙伴提供一个“开放、完整、安全”的软件平台,帮助他们结合车辆和硬件系统,快速搭建一套属于自己的完整的自动驾驶系统。
百度官方表示将把自己所拥有的最强、最成熟、最安全的自动驾驶技术开放给业界,旨在建立一个以合作为中心的生态体系,发挥百度在人工智能领域的技术优势,为合作伙伴赋能,共同促进自动驾驶技术的发展和普及。
据悉,百度即将推出的Apollo项目提供一套完整的的软硬件和服务的解决方案,包括车辆平台、硬件平台、软件平台、云端数据服务等四大部分。百度将开放环境感知、路径规划、车辆控制、车载操作系统等功能的代码或能力,并且提供完整的开发测试工具。百度还将在车辆和传感器等领域选择协同度和兼容性最好的合作伙伴,共同组成协作联盟,推荐给项目参与方使用,进一步降低无人车的研发门槛,促进技术的快速普及。
百度开放自动驾驶技术平台具体的时间线为:
今年七月份将率先开放封闭场地的自动驾驶能力;
年底输出在城市简单路况下的自动驾驶能力;
在2020年前逐步开放至高速公路和普通城市道路上的全自动驾驶。
在官方的新闻稿中,陆奇表示,“中国作为全球最大的汽车生产和销售市场,汽车品牌众多,合作环境更加开放。百度这次主动开放自动驾驶技术,将与汽车行业碰撞出非常多的创新机会,能更广泛地释放我们技术积累的价值,带动行业快速变革。而放眼美国及其他汽车产业较为发达的市场,百度所倡导的开放创新的行业生态,也将对自动驾驶的加速发展起到促进作用 。”
“此外,通过技术开放,我们的技术成果也能快速在广泛领域里得到应用,能促进技术本身的快速迭代,这对每一个有志于投身自动驾驶技术的人才也是非常有吸引力的。”
奇瑞股份公司总经理陈安宁表示,
自动驾驶技术研发门槛较高,从0到1非一日之功,所以百度自动驾驶平台的开放对汽车行业意义重大,奇瑞汽车非常欢迎百度的这一举措。同时也必须认识到,车企与互联网科技企业在自动驾驶上的合作,有一个渐入佳境的过程,数据、技术共享越充分,创新成果越突出,双方获益也越大,也能尽早在智能驾驶领域确立车企自身的竞争优势,目前我们与百度在自动驾驶领域的合作已经进入深度定制阶段。
蔚来汽车创始人、董事长李斌则表示,
百度在自动驾驶领域软实力储备深厚,百度开放无人驾驶所需要的人工智能、大数据和地图等软件能力,对无人驾驶行业有很重要意义。加上开放平台整合带来的硬件成本的下降,无人驾驶的普及可能会比大部分人想象来的快很多。未来,汽车行业的价值链将会被重塑,个性化的体验将会是定义汽车品牌的一个基础和未来发展的方向。
百度在上海车展公布开放自动驾驶技术可谓行业内的深水炸弹。 稍后,新智驾(AI-Drive)即将采访陆奇,听听新的智能驾驶事业群组怎样用开放撬动自动驾驶行业。
雷峰网原创文章,未经授权禁止转载。详情见转载须知。