利用 TensorFlow 高级 API Keras 实现 MLP,CNN,LSTM

TensorFlow 代码长,不好读,不好理解,这可能是很多初学者的痛。在一些开发者努力下基于 TF 构建了更高级的 API,无需再用冗长难记的底层 API 构建模型。在众多高级 API 中,Keras 和 TFLearn 较为流行。

我们前面文章《利用 TFLearn 快速搭建经典深度学习模型》介绍了 TFLearn 高级 API,今天内容可以作为对照进行学习。 


Keras 是一个高级神经网络库,用 Python 语言写成,可以运行在 TensorFlow 或者 Theano 之上。它关注快速试验和原型设计。“以最短的时间将想法转换为结果是做好研究的关键”。

如果你需要一个这样的深度学习库:

  • 允许简单快速的原型设计(完全模块化,最小化,可扩展);

  • 支持 CNN 和 RNN,以及二者的结合物;

  • 支持任意连接图(多输入、多输出训练);

  • 在 CPU 和 GPU 上无缝运行;

那你选 Keras 就选对了。

更多文档请访问:https://keras.io/



安装 Keras 很简单,只需在一台安装了 TensorFlow 的机器上,先下载 Keras 源码:


$ git clone https://github.com/fchollet/keras.git --recursive

$ cd keras/

$ sudo python setup.py install


最后一步会根据当前环境情况下载、安装一些依赖包,像 numpy, scipy, pyyaml, HDF5 和 h5py 等。安装结束后,就能直接运行例程了。例程位于 keras/examples/ 目录下。

先看一个 MLP 的例子(mnist_mlp.py):


# 加载 Keras 模型相关的 Python 模块

from keras.models import Sequential

from keras.layers.core import Dense, Dropout, Activation

from keras.optimizers import RMSprop


# 构建 MLP 网络

model = Sequential()    

model.add(Dense(512, input_shape=(784,))) # 全连接层

model.add(Activation('relu')) # ReLU

model.add(Dropout(0.2)) # Dropout

model.add(Dense(512)) # 全连接层

model.add(Activation('relu')) # ReLU

model.add(Dropout(0.2)) # Dropout

model.add(Dense(10)) # 分类层

model.add(Activation('softmax')) # Softmax

model.summary() # 打印模型

model.compile(loss='categorical_crossentropy',

              optimizer=RMSprop(),

              metrics=['accuracy']) # 生成模型


学过 Torch 的同学会意识到,Keras 的 API 与 Torch 构建模型的 API 比较相似。


运行例程:

$ python mnist_mlp.py

运行输出能显示网络的结构:


经过 20 个 epoch,分类准确率达到 98.48%



下面是一个 CNN 例子(mnist_cnn.py):


# 加载 Keras 模型相关的 Python 模块

from keras.models import Sequential

from keras.layers import Dense, Dropout, Activation, Flatten

from keras.layers import Convolution2D, MaxPooling2D

# 构建 CNN 网络

model = Sequential()

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

                        border_mode='valid',

                        input_shape=input_shape)) # 卷积层

model.add(Activation('relu')) # ReLU

model.add(Convolution2D(nb_filters, kernel_size[0], kernel_size[1])) # 卷积层

model.add(Activation('relu')) # ReLU

model.add(MaxPooling2D(pool_size=pool_size)) # Maxpooling

model.add(Dropout(0.25)) # Dropout

model.add(Flatten()) # 将响应转换为一维向量

model.add(Dense(128)) # 全连接层

model.add(Activation('relu')) # ReLU

model.add(Dropout(0.5)) # Dropout

model.add(Dense(nb_classes)) # 分类层

model.add(Activation('softmax')) # Softmax

model.compile(loss='categorical_crossentropy',

              optimizer='adadelta',

              metrics=['accuracy']) # 生成模型

运行例程:


$ python mnist_cnn.py


如下图显示了 CNN 模型的结构(如果没有显示,需要在代码中model.compile 前面增加一行 model.summary() ):

最后显示分类准确率:

准确率提升到 99%。


接着看一个 LSTM 例子(imdb_lstm.py),完成 IMDB 上句子分类任务:


# 加载 Keras 模型相关的 Python 模块

from keras.models import Sequential

from keras.layers import Dense, Activation, Embedding

from keras.layers import LSTM

# 构建 LSTM 模型

model = Sequential()

model.add(Embedding(max_features, 128, dropout=0.2)) # 词嵌入

model.add(LSTM(128, dropout_W=0.2, dropout_U=0.2))  # LSTM 层

model.add(Dense(1))    # 二分类层

model.add(Activation('sigmoid')) # Sigmoid 

model.summary()  # 打印模型

model.compile(loss='binary_crossentropy',

              optimizer='adam',

              metrics=['accuracy']) # 生成模型


运行这个例子:


$ python imdb_lstm.py


查看网络结构:


最终实现了 81.9% 的分类准确率。


通过本文内容,可以发现利用高级 API  Keras 能很快搭建各种模型,无需人工对底层运算符进行连接和调试,节省了开发时间。


小技巧 1:如何让 Keras 后端从 TensorFlow 切换为 Theano?

# cat ~/.keras/keras.json

{

    "image_dim_ordering": "tf",

    "epsilon": 1e-07,

    "floatx": "float32",

    "backend": "tensorflow"

}

只需将 "backend" 后面对应的值改为 "theano",保存,下次运行 Keras 时会生效。生效后输出会有提示:

实测用同样的模型 mnist_mlp.py, backend 采用 Theano 相比 TensorFlow 慢 10 倍以上。如果希望提速,需要对 Theano 做一些参数配置。


小技巧 2:下载数据集太慢怎么破?

关注本公众号,回复“20170219”,获得本文用到的数据集下载地址。例如 MNIST 例程,只需将 mnist.pkl.gz 放在 ~/.keras/datasets/ 目录下,运行例程即可跳过下载数据过程。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值