windows下Google Protocol Buffer 编译安装教程 | 蒲公英的博客

mikel阅读(1043)

    protobuf的全称是Protocol Buffer,它是google 的一种数据交换的格式,可用于用于分布式应用之间的数据通信或者异构环境下的数据交换,

来源: windows下Google Protocol Buffer 编译安装教程 | 蒲公英的博客

protobuf的全称是Protocol Buffer,它是google 的一种数据交换的格式,可用于用于分布式应用之间的数据通信或者异构环境下的数据交换,

最近因为项目的需求,需要接触Protobuf,在官方提供的压缩包中,提供了Linux下的编译脚本,但是,由于项目在windows下开发,因此,需要在Windows编译和安装Protobuf,结合自己的探索,希望能够帮助到初次接触到protobuf的朋友

1.下载Google Protocol Buffer源码包

下载可以到protobuf官网下载:http://code.google.com/p/protobuf/downloads/list,一般下载第一个或是第二个,因为第一,二个是源码包,第三个是可执行文件

2.解压压缩包

解压压缩包后,会得到类似于下面的文件列表:

文件列表

3.编译vs工程

  • 在解压后的文件夹中,打开vsprojects目录,目录中的文件如图所示:

vsprotects目录文件

打开libprotobuf.vcproj(这个是vs的工程文件,打开前请确认安装了vs2005 或vs2008,vs2010等等),在打开工程中,   可能需要转换工程,直接转换就行了

打开后,vs的工程页面如图所示:

工程列表

右键分别生成libprotobuf,libprotobuf-lite,libprotoc,protoc这四个工程(编译模式为Release 模式):

4.编译完成

编译完成后,可以在vsprojects\Release下发现3个lib和一个exe文件,他们分别是libprotobuf.lib,libprotobuf-lite.lib,libprotoc.lib和protoc.exe :

lib文件列表

protoc.exe文件

5.拷贝文件到windows目录下:

将得到的libprotobuf.lib,libprotobuf-lite.lib,libprotoc.lib和protoc.exe拷贝到系统盘的windows目录下。如果你的系统安装在C盘,那么就拷贝到c:\windows目录下

6.编译proto文件,生成c++文件

假设在E:\test目录下有一个名为addressbook.proto的proto文件,那么打开CMD,输入下面的命令就可以生成C++源码了:

1
protoc.exe -I=e:\test --cpp_out=e:\test e:\test\addressbook.proto

生成c++源码文件

生成了addressbook.pb.h和addressbook.pb.cc文件,将这个文件拷贝到需要用到的工程里就可以直接用了:
生成源码文件成功

至此,protobuf的编译和使用教程就这么多了,如果有错误的地方,还请多多指出

Google Protocol Buffer缺陷 - newzai的个人页面

mikel阅读(1171)

Google Protocol Buffer缺陷

来源: Google Protocol Buffer缺陷 – newzai的个人页面

之所以要列出protobuf的缺陷,就是为了在使用Protobuf的时候可以规避这些缺陷;没有一个工具是十全十美的,我们在使用工具的时候需要扬长避短,因此要对其优点和缺点都有所了解才可以设计出更好的软件系统!!!

1. repeated字段二义性

repeated字段代表传输0~N个数据对象。当传输的数据对象个数大于0时,接收方可以按照覆盖的方式,使用新的数据,替换之前的所有数据。但是,当传输的数据对象个数等于0的时候,接收方如何意会发送方的意图呢?是保留不变还是删除列表?

解决办法:影子字段,为每个repeated type name = i;增加一个include影子字段, optional bool include_name = i+1; 当 include_name 的值为true时,表示需要修改内容,当include_name为false时,接收方忽略name字段。

2. repeated字段冗余

repeated字段每次传输的是一个列表的所有对象的数据。列表的内容改变时,特别是有时候真是新增或者减少几个数据对象时,依旧需要传输整个完整的列表数据。这在数据量比较少的时候不成问题,但是如果列表的成员为成千上万个的时候,恐怕使用单一的repeated字段是无法满足的。在此时最好是repeated字段只传输那些变动的数据对象,例如值传输所有新增的,或者值传输所有被删除的。

解决办法:因此再次最好增加一个枚举和一个字段。

enum RepteateFieldOpType { add = 0; del = 1; replace = 3;}

optional      RepteateFieldOpType  op_name = i+2 [ default = replace];

3.消息对象冗余

protoc.exe代码生成器生成的消息对象不但引用了protobuf库的基础消息,而且还添加了很多额外的字段。生成的消息类无法直接用在工程的业务逻辑对象中。

因此,需要在工程中,重复定义一套业务对象,数据结构和protobuf 的message对象相当。并且在业务对象和消息对象之间进行数据的赋值。

解决办法:工程中,涉及到和业务逻辑对象相关的消息,最好采用自动化工具从class对象中提取字段,并且映射为消息。并使用工具自动生成class对象和protobuf 消息对象之间的负值,如toMessage和fromeMessage等方法。

4.数据类型单一

普通数据类型单一,可以使用最大化的方式解决。而复杂数据,protobuf只有一种模式,message。对于java,C#语言来说,可以认为是引用。但是对于C++语言来说,是映射为指针对象呢?还是普通的复合对象成员呢?一般情况下可以根据optional或者required来关联。复合对象使用required字段,指针对象使用optional字段。另外repeated代表的是一个列表,repeated message,是值对象的列表还是值引用(指针)的列表,这个也不好区分。  map(字典)也不能直接映射到protobuf.

以C++为例的解决方案:

对于C++ class中的普通数据成员,直接映射为protobuf的相应的数据成员。

对于C++class,映射为一个 message

对于 C++ class中的普通复合成员,直接映射为 required message即可。

对于C++ class中的指针复合成员,直接映射为optional message即可。既然是指针,那么传输的对象如果是整个类,和普通的复合成员也就没有多大的区别。但是如果此类设计到继承时,传输的时候可以只传输基类的内容,使得接收方可以根据基类的相关信息找到业务对象,而不是从新创建一个业务对象。因此还需要为每个指针复合成员定义一个find方法,用于把消息中的值,映射为业务对象。

5.继承问题

C++,Java,C++的类都很少是无父类的,在一个稍微复杂点的系统,业务对象都有自己的继承体系的。而protobuf的message和C的struct一样,是没有结构的概念的。

如何把C++中的继承体系映射到protobufmessage中,可以借鉴一下C的struct的做法。

有1中方式。第一种是分散式的,每个继承的子类都使用一个独立的消息,在消息中的第一个字段为父类的消息,并且名称固定为base。例如

Class A {}; Class B : public {}

message B {

required A base = 1;

…..

}

在多继承模式下,个人无能为力,那位有更好的 !!

另外一种方式是集中式,整个继承体系使用一个独立的类,把所有的子类都封装在一起,使用起来类似于C中的union。

例如

Class A ;

Class B : public A;

class C : public A;

message XX {

required message A a =1;

optional message B b = 2;

optional message C c = 3;

}

树莓派摄像头监控 - 爱板网经验频道 - Eeboard爱板网

mikel阅读(1327)

来源: 树莓派摄像头监控 – 爱板网经验频道 – Eeboard爱板网

树莓派有网口,又有摄像头可以用,当然不能浪费资源,下面我就用红外摄像头来做个昼夜均可使用的摄像头监控~

连接好树莓派的CSI摄像头,我用的是带有红外灯的,并且有光感控制的,只有在夜间红外灯才会自动亮起。这样可以省电并且保证红外灯的工作效率。

然后,树莓派用有线连接,因为我是从楼上拉到楼下,用无线会不稳定,所以用有线和树莓派连接。连接好后确认树莓派的网络是通的,最好设置树莓派的IP是固定IP,方便以后查看摄像头数据。

接下来就是监控配置,一样写个脚本,让树莓派进入监控。监控其实就是录像了……但是树莓派录像有个弊端,就是录像只能HDMI输出,或者只能输出不能记录。那我在这就用网络的方式来进行记录。首先树莓派的存储卡要大,或者你外接个U盘或者硬盘也可以。然后,开启摄像头并用VLC传输。

如果没有安装VLC先安装

  1. apt-get -y install vlc

然后写脚本:

  1. raspivid -o – -t 0 -w 640 -h 360 -fps 25|cvlc -vvv stream:///dev/stdin –sout ‘#standard{access=http,mux=ts,dst=:8090}’ :demux=h264 &> /dev/null

上面是记录分辨率是640×360的录像,帧数是25帧,并把摄像头数据通过8090端口发送出去。

那么怎么保存记录呢?其实我们可以利用127.0.0.1这个localhost的,

wget 127.0.0.1:8090 -O /save/$(date).h264

这样就可以把摄像头数据保存在树莓派上了。

同时我们也能通过VLC在电脑上查看,首先记住你树莓派的IP,比如是192.168.1.4,那么就在电脑或者其他客户端打开VLC

打开网络串流,输入IP点打开即可

于是,你就可以一边保存监控数据一边在电脑或者其他客户端查看实时的监控数据了。【可能会有几秒钟的延迟,因为网络和摄像头数据处理的原因】

树莓派使用USB摄像头和motion实现监控 - 博客频道 - CSDN.NET

mikel阅读(869)

来源: 树莓派使用USB摄像头和motion实现监控 – 博客频道 – CSDN.NET

本文同步至个人博客:cyang.tech

一、工具

  • 1、树莓派3B
  • 2、USB摄像头

二、操作步骤

  • 1、安装motion
sudo apt-get install motion
  • 1
  • 2、配置motion

(1)

sudo nano /etc/default/motion
  • 1

将里面的no修改成yes,让motion可以一直在后台运行:start_motion_daemon=yes

这里写图片描述

(2)

sudo nano /etc/motion/motion.conf
  • 1

修改配置文件,这个文件比较长,请确保一下参数的配置。在nano编辑器下,可以使用^w快速查找到如下配置内容。也可以使用^v向下翻页。

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

  • 3、启动motion
sudo motion
  • 1
  • 4、查看视频数据
    在局域网内的设备,不管是手机还是电脑,均可打开浏览器访问树莓派IP:8081

这里写图片描述

  • 5、退出motion
killall -TERM motion
  • 1

或者

service motion stop
  • 1

三、可能出现的问题

  • 1、配置错误
    出现Unknown config option "sdl_threadnr"
    这里写图片描述
    解决方法:
    在配置文件中,直接将这一行内容进行注释。不是下图光标所在处,是光标下面sdl_threadnr 0这一行,注释成# sdl_threadnr 0即可。
    这里写图片描述
  • 2、8081页面无法显示
    在8081端口,无法显示数据,但是在8080端口可以看到motion的信息。
    这里写图片描述
    解决方法:
    这可能是摄像头没有被识别,可以将摄像头拔下重新插入。

.NET实现自动编译 - 拖拉机大叔 - 博客园

mikel阅读(1635)

来源: .NET实现自动编译 – 拖拉机大叔 – 博客园

前言

因每次发布版本的时候,都需要打开vs项目,然后进行编译。如果刚好手里有文件在修改,就需要先签入之类的。所以想找个可以实现自动编译的工具。

在网上查询了不少资料,终于基本上实现了自动编译的功能。因为自动部署涉及到服务器管理,本人也不熟悉,就不讨论了。

 

一、环境准备

1.  我这边使用的是git,也可以用svn之类的其他版本控制器。git服务器用的是gitlab.

2. 下载git windows客户端,在自动编译服务器上安装。

3. 下载TortoiseGit  windows客户端, 安装。

4. 在任意目录上右键,选择Git Bash here, 输入ssh-keygen, 一直默认回车。 之后会在用户目录(c:\user\你的系统用户名\.ssh)下生成2个文件: id_rsa和id_rsa.pub.

5. 打开开始菜单,打开TortioseGit里面的PuTTYGen 。 点击Conversion下的Import Key, 打开之前生成的id_rsa(不带后缀的)。复制输入框中的ssh-rsa那一大串文字到gitlab里面的ssh keys.  点击Save private key, 保存文件为id_rsa.ppk。

6. 下载jenkins安装。需要安装的插件:git plugin, msbuild plugin, credentials binding plugin, Parameterized trigger plugin.

7. 下载nuget.exe.

 

二、编写msbuild

1.  新建一个空解决方案Lake, 里面有Lake.Web这个web项目。

2. 在解决方案根目录增加一个文件: build.msbuild。

msbuild

这里面有几个目录:

$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), common.targets))\release\Lake.Web   这个是表示从当前目录,一直往上找,找到一个common.targets的文件,最终的的发布文件会在这个目录里面的release\Lake.web下。

..\Published\Lake.Web  这个目录表示编译后的输出目录。

3. 签入提交到git.

 

三、配置Jenkins

1.  打开Manager Jenkins/Configure System,  点击Home directory 下的Advanced…,  其中Workspace Root Directory就是以后所有的git repoistory放置的目录。

我这里设置的是: D:\git/${ITEM_FULLNAME} .

然后在这个目录下(d:\git)新建一个空文件: common.targets.

把之前下载的nuget.exe也复制到这里。

2.  Manager Jenkins/ Global Tool Configuration

Git-Path to Git executable, 这个是你的git安装地址: C:\Program Files\Git\bin\git.exe

MSBuild-> MSBuild installations: Name:Dotnet4.0, Path to MSBuild: C:\Program Files (x86)\MSBuild\14.0\Bin\  注: 这个path是看你安装的.net版本.

 

四、发布任务

1.  New Item

Enter an item name, 然后选择Freestyle project.

2. Git

Repositoryies: git@192.168.1.8:.net/Lake.git  (git里面可以查看到)

Credentials: 点击Add, 在key里面输入之前id_rsa.ppk内容。

 

Repository browser: gitlab

version: 6.5

3. Build: Add build step -> Build a Visual Studio project or solution using MSBuild

MSBuild Version: 之前MSBuild输入的Dotnet4.0

MSBuild Build File:  D:\git\Lake\build.msbuild

4. 如果这个任务依赖于别的任务,在此项目之前,必须编译另外一个任务,在Add build step里面选择Trigger/call builds onother projects. 然后输入另外一个Projects的名称。 勾选Block until.

5. 还原Nuget包

Add build step -> Execute Windows batch command.

输入: d:\git\nuget.exe restore “D:\git\Lake\Lake.sln”

6. Post-build Actions

Archive the artifacts(这个主要是为了nuget下载的包,每次编译之前保留)

File to archive: packages/**

7. 如果有时候提示git没有权限,则进入服务,切换Jenkins的运行在为当前用户。

8. Build Now, 可以看到成功还是失败。

9. 所有的编译文件,都在之前build.msbuild里面的release\Lake.web

 

 

五、参考资料

1. 用MSBuild和Jenkins搭建持续集成环境(1)

2. .NET Web Development and Tools Blog

3. Configure NuGet Package Restoration

当机器人取代程序员写代码,会发生什么呢? - 开源中国社区

mikel阅读(1096)

来源: 当机器人取代程序员写代码,会发生什么呢? – 开源中国社区

编者按:在过去的十年时间里,软件开发行业已经发生了非常大的变化。过去,程序员需要在大学或工作中花费好几年时间才能学习掌握一些编程知识,熟悉了解一些昂贵的服务器性能,而现在,只需几周时间就能搞定一项网页开发编程语言了。基于人工智能生成的代码,为整个行业带来了颠覆创新,也让我们处在了下一代范式快速转型中,身处在这个拐点上,我们不得不说,未来网页开发很可能会不复存在,以后甚至都不需要任何编程劳动力了。

“计算机想要在围棋上击败人类,可能还要等100年!”——《纽约时报》,1997年

“围棋大师被谷歌计算机程序击败!”——《纽约时报》,2016年

下面,就让我们来看看当机器人取代程序员写代码,会带来哪些范式转型吧。

转型一:WordPress

WordPress是在 2003 年 5 月 27 日发布的,在它丰富的插件和网站主题内容支持下,很多没有技术背景的创业者无需编写代码,就能推出自己的网站,WordPress 平台也因此很快便在全世界风靡起来。虽然这个平台存在一定的局限性,但是它依然占据了全部互联网网页开发 26.5% 的市场份额,那么剩下的 73.5% 的市场份额会是什么样呢?让我们再进入转型二来做进一步了解。

转型二:开源代码、Node 和框架

Node 一开始曾被广泛认为是一种玩具编程语言,但是它已经快速接管了网页开发,并且培育出了一个异常庞大的开源社区。对于那些还不太熟悉Node 的人,先简单介绍一下:Node.js是一个基于 Chrome JavaScript 运行时建立的平台, 用于方便地搭建响应速度快、易于扩展的网络应用。Node.js 使用事件驱动, 非阻塞I/O 模型而得以轻量和高效,非常适合在分布式设备上运行数据密集型的实时应用。Node 最厉害的地方,就是让那些只开发客户端代码(前端网页开发)的程序员,可以无需切换编程语言就能编写后端代码。

不仅如此,Node 已经构建了一个令人难以置信的庞大社区,很多人都在为开源做贡献。现在,Node 基础设施和开源软件包都已经非常强大了,允许开发人员不仅仅去解决他们自己的问题,而且能够构建出一套为整个社区解决问题的方法。如今,使用 Node 开发软件产品就像是拼乐高积木,你只需花些时间把每块“积木”连接起来就可以了。

转型三:只需要一个应用程序接口,就能搞定 SaaS、BaaS、以及其他框架

你新开发的照片 App 需要面部识别功能吗?如果你想要解读人们在照片中的表情,又该怎么办?所有这些问题都可以靠一个应用程序接口搞定,事实上,如今你能想到的一切东西,都有一个应用程序接口(出于所有集中性非技术目的,应用程序接口就像是另一种乐高积木)。

那么,这具体意味着什么呢?现在,任何一款软件都能够通过开源工具、或是带有某些特定应用功能的应用程序接口开发出来。如果你给某位网页开发人员两周时间,告诉他们克隆市场上某款主流的消费者产品,他们至少可以使用相关工具,快速制作出一款基本版出来。

当然啦,开发一款应用程序和创立一家公司是两回事儿,但有一件事不可否认的是,现在独立程序员的生产力已经变得十分惊人了!当然,我们并不是说过去的程序员不行,毕竟现在的程序员也是站在巨人的肩膀上,才能做出一些成绩。

我们现在处在哪个阶段?

你需要一个网站?根本无需编写代码;你又需要一款高度定制的网页应用,来为用户提供一些专属功能或服务?Node 程序包提供的“玩具编程语言”就能轻松搞定。你还需要一款移动 App?写一个 JavaScript,然后就能从代码库里获得一款安卓和 iOS 原生移动应用。需要在你的应用里加入先进的机器学习技术?有应用程序接口来帮你搞定。你的公司找不到程序员?给 bootcamp 打个电话,他们有足够的编程达人。这一切是不是听上去都很不错?但实际上,我们能做的也只有这些了。如今程序员所接受的培训内容,其实都是最终能被机器人所取代的,一些强大的自动化工具完全可以智能生成代码。

未来,利用开源软件包、强大的开发工具和混合框架,企业只需招聘一些毕业生,短短 4个月时间就能学会如何编程,这在今天是难以想象的,只要有了商业想法,任何人都能轻松打造出一款高性能、可扩展且可维护的应用程序。

目前,已经有公司(比如 codefree.co)开始提供相关服务,允许没有编程背景的人无需写任何代码就能开发出一款个性化的网页应用;还有公司利用机器学习技术帮助企业开发、设计东西。尽管现阶段依然存在一些定制化问题,但相信随着时间的推移,各种问题都会逐步解决。

我们要到什么时候,才能看到人人都会开发程序?

显然,我们并不是说要让每个人都能轻松开发程序,如果说有 1000 个程序员使用开源程序包(乐高模块),总是要有一个人去开发源程序。我们需要教授人们如何构建乐高模块,需要更多工程师,而不是那些“打补丁”的人。所以从这个角度来看,如果你只想招聘一些毕业生,花 4 个月时间是根本无法做到的,别说 4 个月,可能 4 年时间都难以实现。

因此,我们需要鼓励更多程序员提升自己的技能水平,深入学习人工智能、虚拟现实、增强现实、计算机视觉、以及机器学习等技术。这些都是未来程序员所必备的技能,但是今天已经起步了,凡是不关注这些技术的人或企业,几年后可能会就要花更多成本去学习。

网页饱和了,移动也饱和了,你能想到的商业想法,市场上早就已经有三、四款同类产品了。所以,现在摆在我们面前的,是要去尝试解决更难的问题,掌握更强大的技能。

现在我们该怎么做?

教育是唯一的“出路”,相对于快速的市场发展速度,传统教育机构其实已经非常滞后了。如果你是一个企业老板,可能现在得想想如何去培训你手下的技术人员,在这方面,谷歌已经开始这么做了。假设你是一个网页开发人员,如果还是把重心放在 JavaScript、Ruby on Rails、或是 PHP 这些编程语言上,可能现在需要做些调整了。尝试学习机器学习或计算机视觉技术,虽然可能目前不会立即给你带来丰厚的收益,但至少能确保未来你不会被淘汰。

转自:36Kr

选择好特征 (Good Features)

mikel阅读(1346)

Morvan’s Python tutorials

来源: 莫烦 Python

选择好特征 (Good Features)

作者: Morvan    编辑: Morvan

我们在这次视频中会分享到怎么选择一个好特征, 和好特征意味着什么. 那什么是好的特征, 你怎么知道它的好或坏呢?

注: 本文不会涉及数学推导. 大家可以在很多其他地方找到优秀的数学推导文章.

我们在这次视频中会分享到怎么选择一个好特征, 和好特征意味着什么.

我们用机器学习的分类器作为贯穿这次视频的例子. 分类器只有在你提供了好特征的时候才能发挥最好的效果. 这也意味着找到好特征, 是机器学习能学好最为重要的前提之一. 那什么是好的特征, 你怎么知道它的好或坏呢?

我们用特征描述一个物体, 比如在A, B两种类型中, 我们有长度, 颜色两种特征属性. 那么在用这些特征描述类别的时候, 好的特征能够让我们更轻松辨别出相应特征所代表的类别. 而不好的特征, 会混乱我们的感官, 带来些没有用的信息, 浪费了我们的分析,计算资源.

所以, 我们来谈谈我们最喜欢的可爱狗狗. 金毛和吉娃娃. 他们有很多特征可以对比, 比如眼睛颜色, 毛色, 体重, 身高, 长度等等.

为了简化接下来的问题, 我们主要会需要观察毛色和身高这两组特征属性. 而且我们假设这两种狗只会存在偏黄色和偏白色两种情况. 那么我们先来对比毛色.

我们看看,这个虚拟世界上有偏黄色和偏白色的金毛各有多少只? 结果发现偏白和偏黄 的金毛都基本上各占一半. 吉娃娃呢? 同样也发现吉娃娃的颜色也是基本上对半分. 那我们把这点用数据的形式展示出来.

我们假设世界上的金毛和吉娃娃只有两种颜色, 偏黄, 偏白 . 然后我们用蓝色和红色分别代表吉娃娃和金毛所占的比例 . 如果在偏黄这边, 比例是这样 ,就可以说明, 在偏黄的方面, 吉娃娃和金毛所占的比例基本相同, 同样 , 如果偏白色的吉娃娃和金毛数量也基本相同. 这组数据就说明, 如果给你一个毛色是偏黄色的特征, 你是没有办法大概判断这只狗是吉娃娃还是金毛的. 这意味着. 通过毛色来观察这两种品种, 是不恰当的, 这个特征在区分品种上没有起到作用 . 那我们再换一个特征看看, 吉娃娃和金毛能不能用身高来分类呢? 虽然说身高是一些数字, 不过我们同样可以可视化这些身高和分类的关联. 接下来我们使用 python 来进行可视化的操作

我们先输入 python 中需要的模块, matplotlib 和 numpy. 然后用两个简称定义金毛和吉娃娃, gold 和 chihh, 定义每种狗都有500个样本. 然后开始生成一些身高的数据. 我们假定金毛的平均升高时40cm, 吉娃娃是25cm, 然后因为每只狗不一定都一样高, 所以我们用 normal distribution 给身高加上一个随机数, 金毛的的随机幅度可能大一点, 吉娃娃的随机幅度可能小一点. 最后我们用柱状图来可视化化这些高度数据. 红色代表金毛的高度的个数, 蓝色代表吉娃娃的高度个数.

我们拿这张图具体说说, 图里面有很多数据, 我们先举一这条来说明 , 可以看出, 在这组数据中, 如果给出高度50cm, 基本上我们就能够判定这只狗是金毛啦, 同样, 大于50cm 的, 都将是金毛. 当我们看到这一条数据 , 我们也可以有相当大的信心说, 在这个高度范围的, 很可能是只吉娃娃, 不过, 当我们再切换到这组数据 , 我们还能不能那么肯定地说这是那种狗呢? 这个高度范围, 因为两种狗都存在, 而且每种狗的数量都差不多, 所以在这个高度区间的狗狗我们就没办法判断. 所以高度是一个很有用的特征, 但是并不完美, 这就是我们为什么需要整合更多的特征来处理机器学习中的问题.

如果要收集更多的信息, 我们就需要排除掉那些并不具备区分力的信息. 就像我们刚刚我们提到的颜色可能并不是有用的信息, 而高度比较有用. 然后我们还需要更多的信息来弥补高度不能反映出的问题. 比如说, 两种狗能跑多快? 体重是多少? 耳朵长怎样?

有时候, 我们会有很多特征信息的数据, 可是, 有一些特征, 虽然他们没有重复, 可是意义却是相近的. 比如说在描述距离的时候, 数据里有 里,和公里两种单位. 虽然他们在数字上并不重复, 可是他们实际上都是同一个意思. 虽然机器学习中, 特征越多越好, 但是把这两种特征信息都放入机器学习, 并不会对他有任何帮助. 所以我们要避免重复性的信息

同样还是这张图片, 如果我想让机器学习预测从 A 走到 B 的时间, 如果我有两种输入特征信息可以选, 一种是 A, B的经纬度, 另一种是 AB间的距离. 虽然这些信息都属于地理位置的信息, 不过让计算机计算经纬度可能会比计算距离麻烦很多. 所以我们在挑选特征信息的时候也要加上这一条, 避免复杂的信息. 因为在特征与结果之间的关系越简单, 机器学习就能越快的学到东西.

所以, 在选择特征的时候,我们得要时刻回想起这三点. 避免无意义的信息, 避免重复性的信息, 避免复杂的信息. 这就是我们这次机器学习简介中所聊到的如何区分好用的特征. 如果你想了解更多简单易懂, 但是又很有用的机器学习小知识, 欢迎订阅我的频道, 留意我的更新. 也欢迎留言与我讨论你在机器学习中遇到的问题 和 你想知道哪些机器学习的知识. 我们下次见~ 拜拜

如果你觉得这篇文章或视频对你的学习很有帮助, 请你也分享它, 让它能再次帮助到更多的需要学习的人.

莫烦没有正式的经济来源, 如果你也想支持 莫烦Python 并看到更好的教学内容, 请拉倒屏幕最下方, 赞助他一点点, 作为鼓励他继续开源的动力.

特征标准化 (Feature Normalization)

mikel阅读(3756)

Morvan’s Python tutorials

来源: 莫烦 Python

特征标准化 (Feature Normalization)

作者: Morvan    编辑: Morvan

  • 学习资料:
    • Sklearn: feature normalization 教程

今天我们会来聊聊机器学习所需要的数据,为了让机器学习方面消化, 我们需不需要对数据动些手脚呢. 所以今天就会提到特征数据的标准化, 也可以说正常化, 归一化, 正规化等等.

注: 本文不会涉及数学推导. 大家可以在很多其他地方找到优秀的数学推导文章.

现实中的数据

在说特征标准化之前, 我们先来说说现实生活中, 我们的数据是什么样的. 它们很可能来自不同的地方, 被不同的人采集, 有着不同的规格. 用最经典的房价预测例子来和大家说说. 我们用机器学习从房屋的各个层面来预测房价, 房屋的特征可能包括, 离市中心的距离, 房屋楼层, 房屋面积, 所在城市, 几室几厅等等. 这些数据的取值范围往往差距悬殊, 比如楼层一般在2-30层以内, 面积可能上百, 离市中心距离可以以千来记.

数据方程

回到机器学习中, 如果我们以一个简单的线性回归方程来预测房屋的价格, 那方程可能会是这样 . 价格= a* 离市中心 + b * 楼层 + c * 面积. 其中的 a b c 就是机器学习需要努力努力再努力 来优化的参数.

我们说的在具体一点, 用 abc 算出来的价格是预测价格 . 机器学习需要计算预测值和实际值的差别, 然后对这个误差进行一些数学上的处理, 使之变成进步的阶梯, 然后反向地传递回参数 a b c 来提升下次的预测准确度. 好了. 这些概念和我们要提到的标准化有什么关系呢?

举例说明

我们可以把 abc 想想成3个人. 他们共同努力解决一个问题, 在某一个问题中, a工作的时候总是不知道发生了什么, b 的能力适中, c 工作能力最强, 老板看了他们一起工作的结果, 发现还有很多可以提高的地方, 然后不屑地说: 你们这个结果和我期望的还有很大差距, 你们快去缩小差距. 老板给的要求只是缩小差距. 可是 abc 都不知道差距在哪. 所以他们这次只好平分接下来的任务, 不过 c 很快就做完了, b 第二, a 做得很慢, 所以花的总时间很长, c 和 b 都要等 a 把剩下的工作做完才能再给老板看结果, 这样 效率并不高.

把这个问题放在机器学习中, 为了好理解, 我们把 b 先排除掉. 再把房价问题也简化一下, 留下两个特征. 因为面积的跨度一般可以从0 到 2-300, 而离市中心的距离跨度一般在10以内. 所以在这个公式中, c 只要稍稍变化一点, 他乘以面积的变化就会很大, 因为面积的值可以很大, 但是当a也变化那一点点时, 他对预测价格的影响力不会像 c 那样巨大. 这样的差别就会影响最终的工作效率. 所以, 我们要提高效率, 特征的标准化就可以帮上忙. 我们在机器学习训练之前, 先对数据预先处理一下, 取值跨度大的特征数据, 我们浓缩一下, 跨度小的括展一下, 使得他们的跨度尽量统一.

通常用于 特征标准化的途径有两种, 一种叫做 min max normalization, 他会将所有特征数据按比例缩放到0-1的这个取值区间. 有时也可以是-1到1的区间. 还有一种叫做 standard deviation normalization, 他会将所有特征数据缩放成 平均值为0, 方差为1. 使用这些标准化手段. 我们不仅可以快速推进机器学习的学习速度, 还可以避免机器学习 学得特扭曲.

如果你觉得这篇文章或视频对你的学习很有帮助, 请你也分享它, 让它能再次帮助到更多的需要学习的人.

莫烦没有正式的经济来源, 如果你也想支持 莫烦Python 并看到更好的教学内容, 请拉倒屏幕最下方, 赞助他一点点, 作为鼓励他继续开源的动力.

检验神经网络 (Evaluation)

mikel阅读(1562)

检验神经网络 (Evaluation) 作者: Morvan 编辑: Morvan 学习资料: Theano: l1 l2 regularization 教程 Scikit-learn: cross validation 教程1 Scikit-learn: cross validation 教程2 Scikit-learn: cross validation 教程3 Tensorflow: dropout 教程 今天我们会来聊聊在做好了属于自己的神经网络之后, 应该如何来评价自己的神经网络, 从评价当中如何改进我们的神经网络. 其实评价神经网络的方法, 和评价其他机器学习的方法大同小异. 我们首先说说为什么要评价,检验学习到的神经网络. 注: 本文不会涉及数学推导. 大家可以在很多其他地方找到优秀的数学推导文章. 在神经网络的训练当中, 神经网络可能会因为各种各样的问题, 出现学习的效率不高, 或者是因为干扰太多, 学到最后并没有很好的学到规律 . 而这其中的原因可能是多

来源: 莫烦 Python

检验神经网络 (Evaluation)

作者: Morvan    编辑: Morvan

  • 学习资料:
    • Theano: l1 l2 regularization 教程
    • Scikit-learn: cross validation 教程1
    • Scikit-learn: cross validation 教程2
    • Scikit-learn: cross validation 教程3
    • Tensorflow: dropout 教程

今天我们会来聊聊在做好了属于自己的神经网络之后, 应该如何来评价自己的神经网络, 从评价当中如何改进我们的神经网络. 其实评价神经网络的方法, 和评价其他机器学习的方法大同小异. 我们首先说说为什么要评价,检验学习到的神经网络.

注: 本文不会涉及数学推导. 大家可以在很多其他地方找到优秀的数学推导文章.

在神经网络的训练当中, 神经网络可能会因为各种各样的问题, 出现学习的效率不高, 或者是因为干扰太多, 学到最后并没有很好的学到规律 . 而这其中的原因可能是多方面的, 可能是数据问题, 学习效率 等参数问题.

Training/Test data

为了检验,评价神经网络, 避免和改善这些问题, 我们通常会把收集到的数据分为训练数据 和 测试数据, 一般用于训练的数据可以是所有数据的70%, 剩下的30%可以拿来测试学习结果.如果你想问为什么要分开成两批, 那就想想我们读书时的日子, 考试题和作业题大部分都是不一样的吧. 这也是同一个道理.

误差曲线

接着, 对于神经网络的评价基本上是基于这30%的测试数据. 想想期末考试虽然花的时间少, 但是占得总成绩肯定要比你平时作业的分多吧. 所以说这30%虽然少, 但是很重要. 然后, 我们就可以开始画图啦! 评价机器学习可以从误差这个值开始, 随着训练时间的变长, 优秀的神经网络能预测到更为精准的答案, 预测误差也会越少 . 到最后能够提升的空间变小, 曲线也趋于水平 . 班上的差生, 从不及格到80分已经不容易啦, 再往上冲刺100分, 就变成了更难的事了. 机器学习也一样. 所以, 如果你的机器学习的误差曲线是这样一条曲线, 那就已经是很不错的学习成果啦.

准确度曲线

同样, 除了误差曲线, 我们可以看他的精确度曲线. 最好的精度是趋向于100%精确. 比如在神经网络的分类问题中, 100个样本中, 我有90张样本分类正确, 那就是说我的预测精确度是90%. 不过, 不知道大家有没有想过对于回归的问题呢? 怎样看预测值是连续数字的精确度? 这时, 我们可以引用 R2 分数在测量回归问题的精度 . R2给出的最大精度也是100%, 所以分类和回归就都有的统一的精度标准. 除了这些评分标准, 我们还有很多其他的标准, 比如 F1 分数 , 用于测量不均衡数据的精度. 由于时间有限, 我们会在今后的视频中继续详细讲解.

正规化

有时候, 意外是猝不及防的, 比如有时候我们明明每一道作业习题都会做, 可是考试分数为什么总是比作业分数低许多? 原来, 我们只复习了作业题,并没有深入, 拓展研究作业反映出来的知识. 这件事情发生在机器学习中, 我们就叫做过拟合. 我们在回到误差曲线, 不过这时我们也把训练误差画出来. 红色的是训练误差, 黑色的是测试误差. 训练时的误差比测试的误差小, 神经网络虽然学习到了知识, 但是对于平时作业太过依赖, 到了考试的时候, 却不能随机应变, 没有成功的把作业的知识扩展开来. 在机器学习中, 解决过拟合也有很多方法 , 比如 l1, l2 正规化, dropout 方法.

交叉验证

神经网络也有很多参数, 我们怎么确定哪样的参数能够更有效的解决现有的问题呢? 这时, 交叉验证 就是最好的途径了. 交叉验证不仅仅可以用于神经网络的调参, 还能用于其他机器学习方法的调参. 同样是选择你想观看的误差值或者是精确度, 不过横坐标不再是学习时间, 而是你要测试的某一参数 (比如说神经网络层数) . 我们逐渐增加神经层, 然后对于每一个不同层结构的神经网络求出最终的误差或精度, 画在图中. 我们知道, 神经层越多, 计算机所需要消耗的时间和资源就越多, 所以我们只需要找到那个能满足误差要求, 有节约资源的层结构. 比如说误差在0.005一下都能接受 , 那我们就可以采用30层的神经网络结构 .

如果你觉得这篇文章或视频对你的学习很有帮助, 请你也分享它, 让它能再次帮助到更多的需要学习的人.

莫烦没有正式的经济来源, 如果你也想支持 莫烦Python 并看到更好的教学内容, 请拉倒屏幕最下方, 赞助他一点点, 作为鼓励他继续开源的动力.

自编码 (Autoencoder)

mikel阅读(1452)

Morvan’s Python tutorials

来源: 莫烦 Python

自编码 (Autoencoder)

作者: Morvan    编辑: Morvan

  • 学习资料:

今天我们会来聊聊用神经网络如何进行非监督形式的学习. 也就是 autoencoder, 自编码.

注: 本文不会涉及数学推导. 大家可以在很多其他地方找到优秀的数学推导文章.

自编码 autoencoder 是一种什么码呢. 他是不是 条形码? 二维码? 打码? 其中的一种呢? NONONONO. 和他们统统没有关系. 自编码是一种神经网络的形式.如果你一定要把他们扯上关系, 我想也只能这样解释啦.

压缩与解压

有一个神经网络, 它在做的事情是 接收一张图片, 然后 给它打码, 最后 再从打码后的图片中还原. 太抽象啦? 行, 我们再具体点.

假设刚刚那个神经网络是这样, 对应上刚刚的图片, 可以看出图片其实是经过了压缩,再解压的这一道工序. 当压缩的时候, 原有的图片质量被缩减, 解压时用信息量小却包含了所有关键信息的文件恢复出原本的图片. 为什么要这样做呢?

原来有时神经网络要接受大量的输入信息, 比如输入信息是高清图片时, 输入信息量可能达到上千万, 让神经网络直接从上千万个信息源中学习是一件很吃力的工作. 所以, 何不压缩一下, 提取出原图片中的最具代表性的信息, 缩减输入信息量, 再把缩减过后的信息放进神经网络学习. 这样学习起来就简单轻松了. 所以, 自编码就能在这时发挥作用. 通过将原数据白色的X 压缩, 解压 成黑色的X, 然后通过对比黑白 X ,求出预测误差, 进行反向传递, 逐步提升自编码的准确性. 训练好的自编码中间这一部分就是能总结原数据的精髓. 可以看出, 从头到尾, 我们只用到了输入数据 X, 并没有用到 X 对应的数据标签, 所以也可以说自编码是一种非监督学习. 到了真正使用自编码的时候. 通常只会用到自编码前半部分.

编码器 Encoder

这 部分也叫作 encoder 编码器. 编码器能得到原数据的精髓, 然后我们只需要再创建一个小的神经网络学习这个精髓的数据,不仅减少了神经网络的负担, 而且同样能达到很好的效果.

这是一个通过自编码整理出来的数据, 他能从原数据中总结出每种类型数据的特征, 如果把这些特征类型都放在一张二维的图片上, 每种类型都已经被很好的用原数据的精髓区分开来. 如果你了解 PCA 主成分分析, 再提取主要特征时, 自编码和它一样,甚至超越了 PCA. 换句话说, 自编码 可以像 PCA 一样 给特征属性降维.

如果你觉得这篇文章或视频对你的学习很有帮助, 请你也分享它, 让它能再次帮助到更多的需要学习的人.

莫烦没有正式的经济来源, 如果你也想支持 莫烦Python 并看到更好的教学内容, 请拉倒屏幕最下方, 赞助他一点点, 作为鼓励他继续开源的动力.