简介
keras提供了两种模型,一种是Sequential,译做序列型模型。另一种是Functional,译做函数型模型。二者可以从使用形式来区分,序列模型可以看做是面向对象的方法,一系列对象协作完成任务。函数模型则是一系列的过程调用来完成任务。
序列模型的概念比较简单,就是把一些基础神经网络层组件一个个串联起来形成一个完整的模型,在此模型上进行训练,从而完成学习任务。
函数模型就是一系列的方法调用,一步步的过程来保证完成学习任务。
序列模型
序列模型实现在keras.models模块内,模块提供了模型的保存和重新加载的功能,方便我们可以中断和重新开始一个训练过程。
- save_model(model,path)
- load_model(path)
Sequential类
- add(layer) 向链尾追加一层神经网络层
- pop() 删除尾部的神经网络层
- compile(optimizer,loss,metrics) 配置模型的训练参数
- optimizer 选择使用的优化方法,提供下列可选项
- loss 选择损失函数,提供下列可选项
- mean_squared_error mse
- mean_absolute_error mae
- binary_crossentropy 二分类问题交叉熵
- categorical_crossentropy 多分类交叉熵,y需要转为one_hot形式
- cosine_proximity 余弦距离平均值的相反数
- poisson (predictions - targets * log(predictions))的均值
- metrics 选择计算结果
- accuracy
- binary_accuracy
- categorical_accuracy
- top_k_categorical_accracy
- optimizer 选择使用的优化方法,提供下列可选项
- fit(x,y,batch_size,epochs) 使用数据对模型进行epochs轮的训练
- evaluate(x,y,batch_size) 对模型在测试数据集上进行评估
- predict/predict_class/predict_probe(x,batch_size,verbose=0) 使用模型对数据进行预测
- train_on_batch/test_on_batch/predict_on_batch 系列方法均在一批数据上进行训练,测试与预测
- fit_generator/evaluate_generator/predict_generator 系列方法均使用数据生成器产生的数据进行训练,测试与预测
- get/set_weights()
- save/load_weights(path) 模型训练参数的保存与加载
示例:mnist数据集训练
在例子中,mnist数据集使用tensor自带的dataset。其中数据分两部分,其中训练集60000条,测试集10000条。训练集中图像部分由(60000,28*28)的矩阵表示,矩阵的每个元素表示图像每个像素点的黑白取值,标签部分由(60000,1)矩阵表示,每行数字表示对应图像识别出的数字。关于mnist数据集的详细说明见此链接:http://yann.lecun.com/exdb/mnist/
# coding=utf-8
import keras
from keras.models import Sequential
from keras.layers import Dense
from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets(one_hot=True)
img_train,label_train = mnist.train.next_batch(60000)
img_test,label_test = mnist.test.next_batch(10000)
#构建模型
model = Sequential()
model.add(Dense(512,activation='relu',input_dim=784))
model.add(Dense(512,activation='relu'))
model.add(Dense(10,activation='softmax'))
model.compile(optimizer='Adagrad',loss='categorical_crossentropy',metrics=['accuracy'])
#训练及评估模型
hist = model.fit(img_train,label_train)
loss,accu = model.evaluate(img_test,label_test)
print("loss is %f accu is %f"%(loss,accu))
函数模型
在了解了序列模型的基础上,只需要再理解到,在keras中,模型是可调用的,就可以使用函数模型了。参考下面的代码,和上面是等效的。
import keras
from keras.layers import Dense,Input
from keras.models import Model
from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets(one_hot=True)
img_train,label_train = mnist.train.next_batch(60000)
img_test,label_test = mnist.test.next_batch(10000)
input = Input(shape=(784,))
layer1 = Dense(512,activation='relu')(input)
layer2 = Dense(512,activation='relu')(layer1)
pred = Dense(10,activation='softmax')(layer2)
model = Model(inputs=input,outputs=pred)
model.compile(optimizer='rmsprop',loss='categorical_crossentropy',metrics=['accuracy'])
hist = model.fit(img_train,label_train,epochs=10)
loss,accu = model.evaluate(img_test,label_test)
print("loss is %f accu is %f"%(loss,accu))
结语
从示例来看,keras提供了一种非常高层的神经网络机器学习模型的封装,我们可以使用20行左右代码就能完成在tensorflow中需要上百行才能完成的任务。