参考链接: C atol()
Keras是一个高层神经网络API,Keras由纯Python编写而成并基Tensorflow、Theano以及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’)