hello keras

Keras是一个高级别的神经网络库,其中包括一些类似于Scanoit学习的API在Theano或TensorFlow后端。

由于与scikit学习的相似之处,并且强调神经网络设计和测试现在可供大家访问,我将给您一个关于如何使用Keras的快速教程,将其与scikit-learning

Scikit学习是Python开发人员使用的最受欢迎的功能完整的古典机器学习库。在Scikit学习的许多伟大的事情中,我最喜欢的是它的简单,一致和一致的API,它围绕“Estimator”对象构建。 API是对许多工程师已经熟悉的机器学习工作流程的一个很好的描述,并且在整个包装中始终如一地应用。

我们开始导入我们需要的库:scikit-learn,Keras和一些绘图功能

%matplotlib inline
import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np

from sklearn.cross_validation import train_test_split
from sklearn.linear_model import LogisticRegressionCV

from keras.models import Sequential
from keras.layers.core import Dense, Activation
from keras.utils import np_utils

iris数据

着名的iris数据集(由Ronald Fisher于1936年出版)是展示机器学习框架API的好方法。 在某些方面,这是机器学习的“Hello world”。数据很简单,我们的目标是探索从数据到工作分类器所需的代码,而不是模型设计和选择的细节。
虹膜数据集内置于许多机器学习库中。

iris = sns.load_dataset("iris")
iris.head()
iris
iris

对于每个示例(即,花),存在五个数据。 四个是花的尺寸(厘米)的标准尺寸,第五是iris的种类。 有三种:setosa,verscicolor和virginica。 我们的工作是建立一个分类器,给定两个花瓣和两个萼片测量,可以预测虹膜的种类。 在开始模型构建之前,让我们浏览一下数据情况:

sns.pairplot(iris, hue='species');
image.png

拆分数据进行训练和测试

首先我们需要将原始数据从“iris”数据帧中拉出来。 我们将花瓣和萼片数据保存在数组“X”中,并将物体标签保存在相应的数组“y”中。

X = iris.values[:, :4]
y = iris.values[:, 4]

按照监督机器学习的标准,我们将训练一些数据,并用剩余的数据来衡量我们的模型的性能。 这是很简单的手工做,但也被内置在scikit学习作为train_test_split()功能。

train_X, test_X, train_y, test_y = train_test_split(X, y, train_size=0.5, random_state=0)

训练一个scikit学习分类器

我们将训练一个逻辑回归分类器。 这样做,内置的超参数交叉验证,是scikit学习中的一条线。 像所有scikit学习“Estimator”对象一样,LogisticRegressionCV分类器具有一个.fit()方法,可以处理最适合训练数据的学习模型参数的gory数值细节。 所以我们需要做的方法是:

lr = LogisticRegressionCV()
lr.fit(train_X, train_y)

评估分类器准确性

现在我们可以计算训练分类器正确分类的测试集的分数(即精度)。

print("Accuracy = {:.2f}".format(lr.score(test_X, test_y)))
Accuracy = 0.83

keras登场

Keras是由FrançoisChollet在Google创建的高级神经网络库。去年3月27日,公开的Github资料库的初始承诺是一年之久。
正如我们刚刚看到的,scikit学习使得构建分类器非常简单:

  • 一行实例化分类器
  • 一行训练
  • 和一行来衡量其表现

建立分类器在keras也不复杂。数据更新有点变化,我们必须做一些工作来定义网络,然后再将其实例化为分类器,否则与使用scikit学习非常相似。
首先有一点数据显示:scikit-learn的分类器接受字符串标签,例如“setosa”。但是keras要求标签是一个热编码的。这意味着我们需要转换类似的数据
setosa
云芝
setosa
弗吉尼亚
...
看起来像一张桌子
西葫芦
1 0 0
0 1 0
1 0 0
0 0 1
有很多方法可以做到这一点。如果你熟悉pandas,那么那里有pandas.get_dummies(),而一个热编码是在scikit学习。我们只是使用Keras实用程序和一些麻烦。

def one_hot_encode_object_array(arr):
    '''One hot encode a numpy array of objects (e.g. strings)'''
    uniques, ids = np.unique(arr, return_inverse=True)
    return np_utils.to_categorical(ids, len(uniques))

train_y_ohe = one_hot_encode_object_array(train_y)
test_y_ohe = one_hot_encode_object_array(test_y)

构建神经网络模型

除了在这种特殊情况下需要的数据外,使用Keras最重要在于您必须在实例化和使用之前指定模型的结构。
在scikit学习,这些模型是现成的。但是keras是一个神经网络库。因此,虽然数据中的特征/类别数量提供了约束,但您可以确定模型结构的所有其他方面:层数,层的大小,层之间的连接的性质等
因此,建立一个最小的分类器比scikit学习所需的一个工作要多一些。
在我们的例子中,我们将建立一个非常简单的网络。其中两个选择是由我们的数据。我们有四个特征和三个等级,所以输入层必须有四个单位,输出层必须有三个单位。我们只需要定义隐藏层。我们只有这个项目有一个隐藏层,我们给它16个单位。从GPU的角度来看,16是一个整数!当您使用神经网络时,您将看到很多2倍数的值。
我们将以最常见的方式定义我们的模型:作为序贯模型的层。后面的文章我们介绍计算图

model = Sequential()

接下来的两行定义了输入层的大小(input_shape =(4,)),隐藏层的大小和激活功能

model.add(Dense(16, input_shape=(4,)))
model.add(Activation('sigmoid'))

...下一行定义输出层的大小和激活功能。

model.add(Dense(3))
model.add(Activation('softmax'))

最后我们指定优化策略和损失函数进行优化。 我们还定义模型计算准确性。

model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=["accuracy"])

使用神经网络分类器

现在我们已经定义了结构模型并对其进行了编译,我们有一个对象,其API与scikit-learn中的分类器几乎相同。特别是它有.fit()和.predict()方法。我们来训练神经网络通常涉及“小型化”的概念,这意味着向网络显示数据的一个子集,调整权重,然后再显示数据的另一个子集。当网络看到所有的数据一次,这被称为“epochs”。

model.fit(train_X, train_y_ohe, nb_epoch=100, batch_size=1, verbose=0);

编译的keras模型和scikit学习分类器之间唯一的语法API差异是Keras与scikit-learn .score()方法的等价物称为.evaluate()。
evaluate()返回损失函数以及编译模型时我们要求的其他指标。 在我们的例子中,我们要得到精度,我们可以比较我们从scikit学习LogisticRegressionCV分类器的.score()方法得到的精度。

loss, accuracy = model.evaluate(test_X, test_y_ohe, verbose=0)
print("Accuracy = {:.2f}".format(accuracy))
Accuracy = 0.99

如您所见,神经网络模型的测试精度优于简单逻辑回归分类器。
这是令人放心的,但并不奇怪。即使我们非常简单的神经网络具有比logisitic回归学习更复杂的分类表面的灵活性,所以当然它比logisitic回归更好。
而且它隐含了神经网络的一个危险:过度拟合。后文中我们介绍如何防止神经网络过拟合。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,390评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,821评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,632评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,170评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,033评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,098评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,511评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,204评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,479评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,572评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,341评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,893评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,171评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,486评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,676评论 2 335

推荐阅读更多精彩内容