Keras和Tensorflow的区别

Keras 简介

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

如果读者不想了解TensorFlow 的细节, 只需要模块化, 那么Keras 是一个不错的选择. 如果将TensorFlow 比喻为编程界的Java 或C++, 那么Keras 就是编程界的Python. 它作为 TensorFlow 的高层封装, 可以与TensorFlow 联合使用, 用它很速搭建原型.

另外, Keras 兼容两种后端, 即 TheanoTensorFlow, 并且其接口形式和Torch 有几分相像. 掌握Keras 可以大幅提升对开发效率和网络结构的理解.

Keras 的优点

Keras 是高度封装的, 非常适合新手使用, 代码更新速度比较快, 示例代码也比较多, 文档和讨论区也比较完善. 最重要的是, Keras 是TensorFlow 官方支持的. 当机器上有可用的GPU时, 代码会自动调用GPU 进行并行计算.

Keras 官方网站上描述了它的几个优点, 具体如下.
– 模块化:模型的各个部分, 如神经层、成本函数、优化器、初始化、激活函数、规范化都是独立的模块, 可以组合在一起来创建模型.
– 极简主义:每个模块都保持简短和简单.
– 易扩展性:很容易添加新模块, 因此Keras 适于做进一步的高级研究.
– 使用Python 语言:模型用Python 实现, 非常易于调试和扩展.

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 文件夹里还有更多的例子, 有兴趣的读者可以参参.

Keras 的使用

我们下载Keras 代码到本地目录, 将下载后的目录命名为keras.

Keras 源代码中包含很多示例, 例如:
– CIFAR10—图片分类(使用CNN 和实时数据)
– IMDB—电影评论观点分类(使用LSTM);
– Reuters—新闻主题分类(使用多层感知器);
– MNIST—手写数字识别(使用多层感知器和CNN);
– OCR—识别字符级文本生成(使用LSTM).

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

安装

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

pip install keras

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

{
“image_dim_ordering”: “tf”,
“epsilon”: 1e-07,
“floatx”: “float32”,
“backend”: “tensorflow”
}

实现一个网络模型

模型主要分为 加载数据、模型构建、模型编译、模型训练、模型评估或者模型预测几步. 下面我们就用最简单的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’, nput_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

这是一个非常简单的例子. 尽管模型架构是不变的, 但是读者要将其应用到自己的开发领域, 一般是先读懂对应的神经网络论文, 然后用这个架构去搭建和训练模型.

模型的加载及保存

Keras 的 save_modelload_model 方法可以将Keras 模型和权重保存在一个HDF5文件中, 这里面包括模型的结构、权重、训练的配置(损失函数、优化器)等. 如果训练因为某种原因中断, 还可以从模型文件中重新加载对应变量和模型结构.

import ...

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’) # 创建一个HDF5 文件
save_model(model, fname) # 将模型存储在fname文件中.

# 从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_weightsload_weights 语句来保存和加载:

model.save_weights(‘my_model_weights.h5’)
model.load_weights(‘my_model_weights.h5’)

转载自 TensorFlow框架–Keras使用

发表评论

电子邮件地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据