Keras是一个抽象层次高的API,其后台也支持tensorflow框架。他的目的是让大家能够更快的构建深度学习网络模型。他可以理解为在tensorflow的API上又封装的一层API。该模块具有编程简单,模块化清晰,门槛低等优点,但是该模块支持的语言有限,目前只支持Python语言。下面简单介绍一下如何使用该模块生成对应的卷积神经网络。
1. 模块概述:
Keras提供了两种模式范式,第一种是顺序(sequential),第二种是函数式(model)。顺序就相和我们通过tengsorflow原生的API一层一层搭建网络一样,是一种顺序结构。函数式是一种模块结构,就相当于我们调用别人设计好的模型一样,只关注输入和输出即可,不关注中间过程。
2. 基于顺序模式构建网络结构
使用顺序模式构建模型结构主要包括创建模型,编译模型,训练模型三部分。创建模型分为两种方式,一种是接受参数构建网络实例,第二种是先构造实例再使用add的方式创建。但不管使用哪一种都要注意,顺序很重要,顺序表示的是每一步进行的计算。具体如下:构建一个两层的卷积网络,输入784的向量,一层是输出为32的全连接,接着是一个relu激活层,然后又是一个输出为10的全连接层,最后采用了softmax函数作为分类。
from keras.models import Sequential
from keras.layers import Dense, Activation
# 第一种
model = Sequential([Dense(32, units = 784), Activation('relu'), Dense(10), Activation ('softmax'),])
#第二种
model = Sequential()
model.add(Dense(32, input_shape = (784,)))
model.add(Activation('relu')
model.add(Dense(10))
model.add(Activation('softmax'))
模型构建完之后需要编译模型,编译模型的时候需要告诉模型采用什么样的优化函数,什么样的损失函数,什么样的度量指标。
该部分使用model.compile来完成,其中必填参数为optimizer(优化器),loss(损失函数),其他的以键值对的方式填写在metrics字典中,例如:
model.compile(optimizer = 'rmsprop', loss = 'binary_crossentropy' metrics = ['accuracy', correct_prediction]) 其中correct_prediction是自己定义的函数。也可以不要只写一个['accuracy']表示调用内置的准确率衡量函数。
编译完模型就开始训练模型,训练模型直接使用model.fit(data, labels, epochs = 10, batch_size = 32)即可。参数都是根据自己需求填写的。
训练完之后就要保存模型。直接使用model.save_weights()就直接将模型权重保存到指定路径中。
由上述过程可以看出,使用Keras构建顺序模型只需要调用几个接口即可。完全不用考虑内部的代码逻辑。
3. 函数式模型
函数式模型在使用过程中只需要指定模型的输入和输出即可,因此可以更灵活的使用,大部分是在使用已有模型进行微调时使用。该模式在构建一个初始的网络架构时跟tensorflow一样,需要先写出每一步的计算,然后调用Model.model(input,output)即可。具体如下:
from keras.layers import Input, Dense
from keras.models import Model
import numpy as np
inputs = Input(shape = (784))
x = Dense(64, activation= 'relu' )(inputs)
x = Dense(64, activation= 'relu')(x)
predictions = Dense(10, activation= 'softmax')(x)
model = Model(input = inputs, outputs = predictions)
data = np.random.random((1000,100))
labels = np.random.randint(2, size = (1000, 1))
构造完模型之后同样需要编译训练和保存
model.compile(optimizer = 'rmsprop', loss = 'binary_crossentropy' metrics = ['accuracy'])
model.fit(data, labels)
model.save()
如果要复用这个模型直接导入这个模型,使用y = model(x) 其中x表示输入。
4 . keras和tensorflow原生API的比较
相较于tensorflow原生API,Kerase要方便的多,在构建网络模型的时候,他只需要指出输入,输出,训练的时候也只需要一条model.fit即可,不用人为的设计初始化,训练步骤等代码,恢复模型也只需要使用model.load_weights() 即可。而如果使用Tensorflow原声API往往需要:
saver = tf.train.Saver()
with tf.Sesion() as sess :
saver.restore(sess, '.ckpt')
另外对于深度学习来说,往往需要导入已有的模型进行微调,如果使用Keras往往能够更加简单。以导入inception_v3为例,使用keras只需要执行:
from keras_applications.inception_v3 import InceptionV3
base_model = InceptionV3(weight=None)
X = base_model.output
X = Dense(3, .........)
.......
prediction = ......
Model(input = ......,out_put = prediction)
这样就构建出来自己微调的模型,如果要使用tensorflow原生API往往需要执行更多的代码,具体可见
https://blog.csdn.net/hh_2018/article/details/83511470
由此可见,使用keras使代码更简洁。门槛要求更低。