Bootstrap

深度学习框架之Keras

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使代码更简洁。门槛要求更低。

 

 

 

 

 

 

 

 

 

 

 

 

;