Keras介绍

Keras是一个高层神经网络API,Keras由纯Python编写而成并TensorflowTheano以及CNTK后端。Keras 为支持快速实验而生,能够把你的idea迅速转换为结果,如果你有如下需求,请选择Keras:

  • 简易和快速的原型设计(keras具有高度模块化,极简,和可扩充特性)
  • 支持CNN和RNN,或二者的结合
  • 无缝CPU和GPU切换

 

Keras的设计原则

  • 用户友好:Keras是为人类而不是天顶星人设计的API。用户的使用体验始终是我们考虑的首要和中心内容。Keras遵循减少认知困难的最佳实践:Keras提供一致而简洁的API, 能够极大减少一般应用下用户的工作量,同时,Keras提供清晰和具有实践意义的bug反馈。
  • 模块性:模型可理解为一个层的序列或数据的运算图,完全可配置的模块可以用最少的代价自由组合在一起。具体而言,网络层、损失函数、优化器、初始化策略、激活函数、正则化方法都是独立的模块,你可以使用它们来构建自己的模型。
  • 易扩展性:添加新模块超级容易,只需要仿照现有的模块编写新的类或函数即可。创建新模块的便利性使得Keras更适合于先进的研究工作。
  • 与Python协作:Keras没有单独的模型配置文件类型(作为对比,caffe有),模型由python代码描述,使其更紧凑和更易debug,并提供了扩展的便利性。

 

Keras 是一个高级的Python 神经网络框架,其文档详。Keras 已经被添加到TensorFlow 中,成为其默认的框架,为TensorFlow 提供更高级的API。

如果读者不想了解TensorFlow 的细节,只需要模块化,那么Keras 是一个不错的选择。如

果将TensorFlow 比喻为编程界的Java 或C++,那么Keras 就是编程界的Python。它作为

TensorFlow 的高层封装,可以与TensorFlow 联合使用,用它很速搭建原型。

另外,Keras 兼容两种后端,即Theano 和TensorFlow,并且其接口形式和Torch 有几分相

像。掌握Keras 可以大幅提升对开发效率和网络结构的理解。

1、 Keras 的优点

Keras 是高度封装的,非常适合新手使用,代码更新速度比较很,示例代码也比较多,文

档和我论区也比较完善。最重要的是,Keras 是TensorFlow 官方支持的。当机器上有可用的GPU

时,代码会自动调用GPU 进行并行计算。

Keras 官方网站上描述了它的几个优点,具体如下。

● 模块化:模型的各个部分,如神经层、成本函数、优化器、初始化、激活函数、规范

化都是独立的模块,可以组合在一起来创建模型。

● 极简主义:每个模块都保持简短和简单。

● 易扩展性:很容易添加新模块,因此Keras 适于做进一步的高级研究。

使用Python 语言:模型用Python 实现,非常易于调试和扩展。

2、 Keras 的模型

Keras 的核心数据结构是模型。模型是用来组织网络层的方式。模型有两种,一种叫

Sequential 模型,另一种叫Model 模型。Sequential 模型是一系列网络层按顺序构成的栈,是单

输入和单输出的,层与层之间只有相邻关系,是最简单的一种模型。Model 模型是用来建立更

复杂的模型的。

这里先介绍简单的Sequential 模型的使用(后面将会以一个示例来介绍Model 模型)。首先

是加载数据,这里我们假设数据已经加载完毕,是X_train, Y_train 和X_test, Y_test。然后构建模型:

from keras.models import Sequential

from keras.layers import Dense, Activation

model = Sequential()

model.add(Dense(output_dim=64, input_dim=100))

model.add(Activation(“relu”))

model.add(Dense(output_dim=10))

model.add(Activation(“softmax”))

然后,编译模型,同时指明损失函数和优化器:

model.compile(loss=’categorical_crossentropy’, optimizer=’sgd’, metrics=[‘accuracy’])

最后,训练模型和评估模型:

model.fit(X_train, Y_train, nb_epoch=5, batch_size=32)

loss_and_metrics = model.evaluate(X_test, Y_test, batch_size=32)

这就是一个最简单的模型的使用。如果要搭建复杂的网络,可以使用Keras 的Model 模型,

它能定义多输出模型、含有共享层的模型、共享视觉模型、图片问答模型、视觉问答模型等。

在Keras 的源代码的examples 文件夹里还有更多的例子,有兴趣的读者可以参参。

3 Keras 的使用

我们下载Keras 代码①到本地目录,将下载后的目录命名为keras。Keras 源代码中包含很多

示例,例如:

● CIFAR10—图片分类(使用CNN 和实时数据);

● IMDB—电影评论观点分类(使用LSTM);

● Reuters—新闻主题分类(使用多层感知器);

● MNIST—手写数字识别(使用多层感知器和CNN);

● OCR—识别字符级文本生成(使用LSTM)。

这里我们主要用MNIST 示例进行讲解。

1.安装

Keras 的安装非常简单,不依赖操作系统,建议大家直接通过pip 命令安装:

pip install keras

安装完成后,需要选择依赖的后端,在~/.keras/keras.json 下修改最后一行backend 对应的

值即可。修改后的文件如下:

{

“image_dim_ordering”: “tf”,

“epsilon”: 1e-07,

“floatx”: “float32”,

“backend”: “tensorflow”

}

2 、实现一个网络模型

主要分为加载数据、模型构建、模型编译、模型训练、模型评估或者模型预测几步。下面我们

就用最简单的MNIST 示例来看如何用Keras 实现一个卷积神经网络(CNN)。

首先,定义好一参数以及加载数据,如下:

batch_size = 128

nb_classes = 10 # 分类数

nb_epoch = 12 # 训练轮数

# 输入图片的维度

img_rows, img_cols = 28, 28

# 卷积滤镜的个数

nb_filters = 32

# 最大池化,池化核大小

pool_size = (2, 2)

# 卷积核大小

kernel_size = (3, 3)

(X_train, y_train), (X_test, y_test) = mnist.load_data()

if K.image_dim_ordering() == ‘th’:

# 使用Theano 的顺序:(conv_dim1, channels, conv_dim2, conv_dim3)

X_train = X_train.reshape(X_train.shape[0], 1, img_rows, img_cols)

X_test = X_test.reshape(X_test.shape[0], 1, img_rows, img_cols)

input_shape = (1, img_rows, img_cols)

else:

# 使用TensorFlow 的顺序:(conv_dim1, conv_dim2, conv_dim3, channels)

X_train = X_train.reshape(X_train.shape[0], img_rows, img_cols, 1)

X_test = X_test.reshape(X_test.shape[0], img_rows, img_cols, 1)

input_shape = (img_rows, img_cols, 1)

X_train = X_train.astype(‘float32’)

X_test = X_test.astype(‘float32’)

X_train /= 255

X_test /= 255

# 将类向量转换为二进制类矩阵

Y_train = np_utils.to_categorical(y_train, nb_classes)

Y_test = np_utils.to_categorical(y_test, nb_classes)

下面来构建模型,这里用2 个卷积层、1 个池化层和2 个全连接层来构建,如下:

model = Sequential()

model.add(Convolution2D(nb_filters, kernel_size[0], kernel_size[1],

border_mode=’valid’,

input_shape=input_shape))

model.add(Activation(‘relu’))

model.add(Convolution2D(nb_filters, kernel_size[0], kernel_size[1]))

model.add(Activation(‘relu’))

model.add(MaxPooling2D(pool_size=pool_size))

model.add(Dropout(0.25))

model.add(Flatten())

model.add(Dense(128))

model.add(Activation(‘relu’))

model.add(Dropout(0.5))

model.add(Dense(nb_classes))

model.add(Activation(‘softmax’))

随后,用model.compile()函数编译模型,采用多分类的损失函数,用Adadelta 算法做优化

方法,如下:

model.compile(loss=’categorical_crossentropy’,

optimizer=’adadelta’,

metrics=[‘accuracy’])

然后,开始用model.fit()函数训练模型,输入训练集和测试数据,以及batch_size 和nb_epoch

参数,如下:

model.fit(X_train, Y_train, batch_size=batch_size, nb_epoch=nb_epoch,

verbose=1, validation_data=(X_test, Y_test))

最后,用model.evaluate()函数来评估模型,输出测试集的损失值和准确率,如下:

score = model.evaluate(X_test, Y_test, verbose=0)

print(‘Test score:’, score[0])

print(‘Test accuracy:’, score[1])

计算出的损失值和准确率如下:

Test score: 0.0327563833317

Test accuracy: 0.9893

这是一个非常简单的例子。尽管模型架构是不变的,但是读者要将其应用到自己的开发领

域,一般是先读懂对应的神经网络论文,然后用这个架构去搭建和训练模型。

3.模型的加载及保存

Keras 的save_model 和load_model 方法可以将Keras 模型和权重保存在一个HDF5 文件中,

这里面包括模型的结构、权重、训练的配置(损失函数、优化器)等。如果训练因为某种原因

keras.models import save_model, load_model

def test_sequential_model_saving():

model = Sequential()

model.add(Dense(2, input_dim=3))

model.add(RepeatVector(3))

model.add(TimeDistributed(Dense(3)))

model.compile(loss=objectives.MSE,

optimizer=optimizers.RMSprop(lr=0.0001),

metrics=[metrics.categorical_accuracy],

sample_weight_mode=’temporal’)

x = np.random.random((1, 3))

y = np.random.random((1, 3, 3))

model.train_on_batch(x, y)

out = model.predict(x)

_, fname = tempfile.mkstemp(‘.h5’) # 创建一个HDFS 5 文件

save_model(model, fname)

new_model = load_model(fname)

os.remove(fname)

out2 = new_model.predict(x)

assert_allclose(out, out2, atol=1e-05)

# 检测新保存的模型和之前定义的模型是否一致

x = np.random.random((1, 3))

y = np.random.random((1, 3, 3))

model.train_on_batch(x, y)

new_model.train_on_batch(x, y)

out = model.predict(x)

out2 = new_model.predict(x)

assert_allclose(out, out2, atol=1e-05)

如果只是希望保存模型的结构,而不包含其权重及训练的配置(损失函数、优化器),可

以使用下面的代码将模型序列化成json 或者yaml 文件:

json_string = model.to_json()

json_string = model.to_yaml()

保存完成后,还可以手动编辑,并且使用如下语句进行加载:

from keras.models import model_from_json

model = model_from_json(json_string)

model = model_from_yaml(yaml_string)

如果仅需要保存模型的权重,而不包含模型的结构,可以使用save_weights 和load_weights

语句来保存和加载:

model.save_weights(‘my_model_weights.h5’)

model.load_weights(‘my_model_weights.h5’)

 

你可能感兴趣的:(机器学习)