原地址:http://blog.csdn.net/niuwei22007/article/details/49207187可以查看更多文章
介绍完了优化器和目标函数,那么剩下的就是训练模型了。这一小节,我们来看一下Keras的Models是如何使用的。Keras可以建立两种模型,一种是线性叠加的,层与层之间是全连接的方式,一个输入,一个输出;另外一种是图型的,输入与输出数量任意,并且可以指定层与层之间的部分连接方式。
model = keras.models.Sequential()
线性叠加模型就是把每一层按照次序叠加起来,每层之间采用全连接方式。下面看一下对象model都有哪些方法。
add(layer):往model里边增加一层
compile(optimizer, loss, class_model=”categorical”):
参数:
fit(X, y, batch_size=128, nb_epoch=100, verbose=1, validation_split=0,validation_data=None,shuffle=True,show_accuracy=False,callbacks=[],class_weight=Noe, sample_weight=None):用于训练一个固定迭代次数的模型
返回:记录字典,包括每一次迭代的训练误差率和验证误差率;
参数:
evalute(X, y, batch_size=128, show_accuracy=False,verbose=1, sample_weight=None): 展示模型在验证数据上的效果
返回:误差率或者是(误差率,准确率)元组(if show_accuracy=True)
参数:和fit函数中的参数基本一致,其中verbose取1或0,表示有进度条或没有
predict(X, batch_size=128, verbose=1): 用于对测试数据的预测
返回:对于测试数据的预测数组
参数:和fit函数中的参数一样。
predict_classes(X, batch_size=128, verbose=1): 用于对测试数据的分类预测
返回:对于测试数据的预测分类结果数组
参数:和evaluate函数中的参数一样。
train_on_batch(X, y, accuracy=False, class_weight=None, sample_weight=None): 对数据块进行计算并梯度更新
返回:数据块在现有模型中的误差率或者元组(if show_accuracy=True)
参数:和evaluate函数中的参数一样。
test_on_batch(X, y, accuracy=False, sample_weight=None): 用数据块进行性能验证
返回:数据块在现有模型中的误差率或者元组(误差率,准确率)(if show_accuracy=True)
参数:和evaluate函数中的参数一样。
save_weights (fname, overwrite=False): 将所有层的权值保存为HDF5文件
返回:如果overwrite=False并且fname已经存在,则会抛出异常。
参数:
load_weights(fname): 加载已经存在的权值数据到程序中的模型里面。文件中的模型和程序中的模型结构必须一致。在compile之前或之后都可以调用load_ weights函数。
参数: fname文件名
from keras.models import Sequential
from keras.layers.core import Dense, Dropout, Activation
from keras.optimizers import SGD
model = Sequential()
model.add(Dense(2, init='uniform', input_dim=64))
model.add(Activation('softmax'))
model.compile(loss='mse', optimizer='sgd')
'''
Verbose=1或2的结果演示
'''
model.fit(X_train, y_train, nb_epoch=3, batch_size=16, verbose=1)
# 输出信息
'''
Train on 37800 samples, validate on 4200 samples
Epoch 0
37800/37800 [==============================] - 7s - loss: 0.0385
Epoch 1
37800/37800 [==============================] - 8s - loss: 0.0140
Epoch 2
10960/37800 [=======>......................] - ETA: 4s - loss: 0.0109
'''
model.fit(X_train, y_train, nb_epoch=3, batch_size=16, verbose=2)
# 输出信息
'''
Train on 37800 samples, validate on 4200 samples
Epoch 0
loss: 0.0190
Epoch 1
loss: 0.0146
Epoch 2
loss: 0.0049
'''
'''
show_accuracy=True的演示,会输出误差率-正确率
'''
model.fit(X_train, y_train, nb_epoch=3, batch_size=16, verbose=2, show_accuracy=True)
# 输出信息
'''
Train on 37800 samples, validate on 4200 samples
Epoch 0
loss: 0.0190 - acc.: 0.8750
Epoch 1
loss: 0.0146 - acc.: 0.8750
Epoch 2
loss: 0.0049 - acc.: 1.0000
'''
'''
validation_split=0.1表示总样本的10%用来进行验证。比如下方实例,样本总数42000,则验证数据占10%,即4200,剩余的37800为训练数据。
'''
model.fit(X_train, y_train, nb_epoch=3, batch_size=16, validation_split=0.1, show_accuracy=True, verbose=1)
# outputs
'''
Train on 37800 samples, validate on 4200 samples
Epoch 0
37800/37800 [==============================] - 7s - loss: 0.0385 - acc.:0.7258 - val. loss: 0.0160 - val. acc.: 0.9136
Epoch 1
37800/37800 [==============================] - 8s - loss: 0.0140 - acc.:0.9265 - val. loss: 0.0109 - val. acc.: 0.9383
Epoch 2
10960/37800 [=======>......................] - ETA: 4s - loss: 0.0109 -acc.: 0.9420
'''
任意连接图可以有任意数量的输入和输出,每一个输出都由专门的代价函数进行训练。图模型的最优化取决于所有代价函数的总和。看过代码就,就会感觉很清晰,完全就是一张节点连接图。可以很清晰的画出该有向图。适用于部分连接的模型。
model = keras.models.Graph()
下面看一下对象model都有哪些方法。
add_input (name, input_shape, dtype='float'):往model里边增加一输入层
参数:
add_output (name, input=None, inputs=[], merge_mode=’concat’):增加一个连接到input或inputs的输出层
参数:
add_node (layer, name, input=None,inputs=[], merge_mode='concat'):增加一个连接到input或inputs的输出层(就是除去输入输出之外的隐层)
参数:
compile (optimizer, loss):往input或inputs里边增加一输出层
参数:
fit(data, batch_size=128, nb_epoch=100, verbose=1, validation_split=0,validation_data=None, shuffle=True, callbacks=[]):用于训练一个固定迭代次数的模型
返回:记录字典,包括每一次迭代的训练误差率和验证误差率;
参数:
evalute(data, batch_size=128, verbose=1): 展示模型在验证数据上的效果
返回:误差率
参数:和fit函数中的参数基本一致,其中verbose取1或0,表示有进度条或没有
predict(data, batch_size=128, verbose=1): 用于对测试数据的预测
返回:键值对。键为输出层名,值为对应层的预测数组
参数:和fit函数中的参数一样。输入层需要在data中声明。
train_on_batch(data): 对数据块进行计算并梯度更新
返回:数据块在现有模型中的误差率
参数:和evaluate函数中的参数一样。
test_on_batch(data): 用数据块对模型进行性能验证
返回:据块在现有模型中的误差率
参数:和evaluate函数中的参数一样。
save_weights (fname, overwrite=False): 将所有层的权值保存为HDF5文件
返回:如果overwrite=False并且fname已经存在,则会抛出异常。
参数:
load_weights (fname): 加载已经存在的权值数据到程序中的模型里面。文件中的模型和程序中的模型结构必须一致。在compile之前或之后都可以调用load_ weights函数。
# 含一输入,两输出的graph model
graph = Graph()
graph.add_input(name='input', input_shape=(32,))
graph.add_node(Dense(16), name='dense1', input='input')
graph.add_node(Dense(4), name='dense2', input='input')
graph.add_node(Dense(4), name='dense3', input='dense1')
graph.add_output(name='output1', input='dense2')
graph.add_output(name='output2', input='dense3')
graph.compile('rmsprop', {'output1':'mse', 'output2':'mse'})
history = graph.fit({'input':X_train, 'output1':y_train, 'output2':y2_train}, nb_epoch=10)
# 含两输入,两输出的graph model
graph = Graph()
graph.add_input(name='input1', input_shape=(32,))
graph.add_input(name='input2', input_shape=(32,))
graph.add_node(Dense(16), name='dense1', input='input1')
graph.add_node(Dense(4), name='dense2', input='input2')
graph.add_node(Dense(4), name='dense3', input='dense1')
graph.add_output(name='output', inputs=['dense2', 'dense3'], merge_mode='sum')
graph.compile('rmsprop', {'output':'mse'})
history = graph.fit({'input1':X_train, 'input2':X2_train, 'output':y_train}, nb_epoch=10)
predictions = graph.predict({'input1':X_test, 'input2':X2_test}) # {'output':...}
参考资料