基于Theano的深度学习(Deep Learning)框架Keras学习随笔-05-模型

来源:互联网 发布:xd软件 编辑:程序博客网 时间:2024/05/30 19:33

目录(?)[+]

  1. 一Sequential线性叠加模型方法及属性介绍
  2. 二Sequential线性叠加模型举例说明
  3. 三Graph任意连接图模型方法及属性介绍
  4. 四Graph任意连接图模型举例说明
  5. 参考资料

原地址:http://blog.csdn.net/niuwei22007/article/details/49207187可以查看更多文章

介绍完了优化器和目标函数,那么剩下的就是训练模型了。这一小节,我们来看一下Keras的Models是如何使用的。Keras可以建立两种模型,一种是线性叠加的,层与层之间是全连接的方式,一个输入,一个输出;另外一种是图型的,输入与输出数量任意,并且可以指定层与层之间的部分连接方式。

一、Sequential(线性叠加模型)方法及属性介绍

[python] view plain copy
print?
  1. model = keras.models.Sequential()  
model = keras.models.Sequential()

线性叠加模型就是把每一层按照次序叠加起来,每层之间采用全连接方式。下面看一下对象model都有哪些方法。

add(layer):往model里边增加一层 

compile(optimizer, loss, class_model=”categorical”):

参数

  • optimizer:指定模型训练的优化器;
  • loss:目标函数;
  • class_mode: ”categorical”和”binary”中的一个,只是用来计算分类的精确度或using the predict_classes method
  • theano_mode: Atheano.compile.mode.Mode instance controllingspecifying compilation options 

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):用于训练一个固定迭代次数的模型

返回:记录字典,包括每一次迭代的训练误差率和验证误差率;

参数:

  • X:训练数据
  • y : 标签
  • batch_size : 每次训练和梯度更新块的大小。
  • nb_epoch: 迭代次数。
  • verbose : 进度表示方式。0表示不显示数据,1表示显示进度条,2表示用只显示一个数据。
  • callbacks : 回调函数列表。就是函数执行完后自动调用的函数列表。
  • validation_split : 验证数据的使用比例。
  • validation_data : 被用来作为验证数据的(X, y)元组。会代替validation_split所划分的验证数据。
  • shuffle : 类型为boolean或 str(‘batch’)。是否对每一次迭代的样本进行shuffle操作(可以参见博文Theano学习笔记01–Dimshuffle()函数)。’batch’是一个用于处理HDF5(keras用于存储权值的数据格式)数据的特殊选项。
  • show_accuracy:每次迭代是否显示分类准确度。
  • class_weigh : 分类权值键值对。原文:dictionary mapping classes to a weight value, used for scaling the lossfunction (during training only)。键为类别,值为该类别对应的权重。只在训练过程中衡量损失函数用。
  • sample_weight : list or numpy array with1:1 mapping to the training samples, used for scaling the loss function (duringtraining only). For time-distributed data, there is one weight per sample pertimestep, i.e. if your output data is shaped(nb_samples, timesteps, output_dim), your mask should be of shape (nb_samples, timesteps, 1). This allows you to maskout or reweight individual output timesteps, which is useful in sequence tosequence learning.

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已经存在,则会抛出异常。

参数:

  • fname: 文件名
  • overwrite : 如果已经存在,是否覆盖原文件。 

load_weights(fname): 加载已经存在的权值数据到程序中的模型里面。文件中的模型和程序中的模型结构必须一致。在compile之前或之后都可以调用load_ weights函数。

参数: fname文件名

 

二、Sequential(线性叠加模型)举例说明

[python] view plain copy
print?
  1. from keras.models import Sequential  
  2. from keras.layers.core import Dense, Dropout, Activation  
  3. from keras.optimizers import SGD  
  4.    
  5. model = Sequential()  
  6. model.add(Dense(2, init=‘uniform’, input_dim=64))  
  7. model.add(Activation(’softmax’))  
  8.    
  9. model.compile(loss=’mse’, optimizer=‘sgd’)  
  10.    
  11. ”’ 
  12. Verbose=1或2的结果演示 
  13. ”’  
  14. model.fit(X_train, y_train, nb_epoch=3, batch_size=16, verbose=1)  
  15. # 输出信息  
  16. ”’ 
  17. Train on 37800 samples, validate on 4200 samples 
  18. Epoch 0 
  19. 37800/37800 [==============================] - 7s - loss: 0.0385 
  20. Epoch 1 
  21. 37800/37800 [==============================] - 8s - loss: 0.0140 
  22. Epoch 2 
  23. 10960/37800 [=======>………………….] - ETA: 4s - loss: 0.0109 
  24. ”’  
  25.    
  26. model.fit(X_train, y_train, nb_epoch=3, batch_size=16, verbose=2)  
  27. # 输出信息  
  28. ”’ 
  29. Train on 37800 samples, validate on 4200 samples 
  30. Epoch 0 
  31. loss: 0.0190 
  32. Epoch 1 
  33. loss: 0.0146 
  34. Epoch 2 
  35. loss: 0.0049 
  36. ”’  
  37.    
  38. ”’ 
  39. show_accuracy=True的演示,会输出误差率-正确率 
  40. ”’  
  41. model.fit(X_train, y_train, nb_epoch=3, batch_size=16, verbose=2, show_accuracy=True)  
  42. # 输出信息  
  43. ”’ 
  44. Train on 37800 samples, validate on 4200 samples 
  45. Epoch 0 
  46. loss: 0.0190 - acc.: 0.8750 
  47. Epoch 1 
  48. loss: 0.0146 - acc.: 0.8750 
  49. Epoch 2 
  50. loss: 0.0049 - acc.: 1.0000 
  51. ”’  
  52.    
  53. ”’ 
  54. validation_split=0.1表示总样本的10%用来进行验证。比如下方实例,样本总数42000,则验证数据占10%,即4200,剩余的37800为训练数据。 
  55. ”’  
  56. model.fit(X_train, y_train, nb_epoch=3, batch_size=16, validation_split=0.1, show_accuracy=True, verbose=1)  
  57. # outputs  
  58. ”’ 
  59. Train on 37800 samples, validate on 4200 samples 
  60. Epoch 0 
  61. 37800/37800 [==============================] - 7s - loss: 0.0385 - acc.:0.7258 - val. loss: 0.0160 - val. acc.: 0.9136 
  62. Epoch 1 
  63. 37800/37800 [==============================] - 8s - loss: 0.0140 - acc.:0.9265 - val. loss: 0.0109 - val. acc.: 0.9383 
  64. Epoch 2 
  65. 10960/37800 [=======>………………….] - ETA: 4s - loss: 0.0109 -acc.: 0.9420 
  66. ”’  
from keras.models import Sequentialfrom keras.layers.core import Dense, Dropout, Activationfrom keras.optimizers import SGDmodel = 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 samplesEpoch 037800/37800 [==============================] - 7s - loss: 0.0385Epoch 137800/37800 [==============================] - 8s - loss: 0.0140Epoch 210960/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 samplesEpoch 0loss: 0.0190Epoch 1loss: 0.0146Epoch 2loss: 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 samplesEpoch 0loss: 0.0190 - acc.: 0.8750Epoch 1loss: 0.0146 - acc.: 0.8750Epoch 2loss: 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 samplesEpoch 037800/37800 [==============================] - 7s - loss: 0.0385 - acc.:0.7258 - val. loss: 0.0160 - val. acc.: 0.9136Epoch 137800/37800 [==============================] - 8s - loss: 0.0140 - acc.:0.9265 - val. loss: 0.0109 - val. acc.: 0.9383Epoch 210960/37800 [=======>......................] - ETA: 4s - loss: 0.0109 -acc.: 0.9420'''

三、Graph(任意连接图模型)方法及属性介绍

任意连接图可以有任意数量的输入和输出,每一个输出都由专门的代价函数进行训练。图模型的最优化取决于所有代价函数的总和。看过代码就,就会感觉很清晰,完全就是一张节点连接图。可以很清晰的画出该有向图。适用于部分连接的模型。

[python] view plain copy
print?
  1. model = keras.models.Graph()  
model = keras.models.Graph()

下面看一下对象model都有哪些方法。

add_input (name, input_shape, dtype=’float’):往model里边增加一输入层

参数:

  • name: 输入层的唯一字符串标识
  • input_shape: 整数元组,表示新增层的shape。例如(10,)表示10维向量;(None, 128)表示一个可变长度的128维向量;(3, 32, 32) 表示一张3通道(RGB)的32*32的图片。
  • dtype:float或者int;输入数据的类型。 

add_output (name, input=None, inputs=[], merge_mode=’concat’):增加一个连接到input或inputs的输出层

参数:

  • name: 输出层的唯一字符串标识
  • input: 输出层要连接到的隐层的名字。只能是input或inputs中的一个。
  • inputs:新增层要连接到的多个隐层的名字列表。
  • merge_mode: “sum”或”concat”。在指定inputs时有效,将不同的输入合并起来。

add_node (layer, name, input=None,inputs=[], merge_mode=’concat’):增加一个连接到input或inputs的输出层(就是除去输入输出之外的隐层)

参数:

  • layer: Layer实例(Layer后边会介绍到)
  • name:隐层的唯一字符串标识
  • input: 新增隐层要连接到的某隐层或输入层的名字。只能是input或inputs中的一个。
  • inputs:新增隐层要连接到的多个隐层的名字列表。
  • merge_mode: “sum”或”concat”。在指定inputs时有效,将不同的输入合并起来。 

compile (optimizer, loss):往input或inputs里边增加一输出层

参数:

  • optimizer: 优化器名或者优化器对象
  • loss: 字典键值对。键为输出层的name,值为该层对应的目标函数名或目标函数对象。 

fit(data, batch_size=128, nb_epoch=100, verbose=1, validation_split=0,validation_data=None, shuffle=True, callbacks=[]):用于训练一个固定迭代次数的模型

返回:记录字典,包括每一次迭代的训练误差率和验证误差率;

参数:

  • data:字典。键为输入层或输出层的名,值为具体的输入数据或输出数据。可见下方的示例。
  • batch_size : 每次训练和梯度更新的数据块大小
  • nb_epoch: 迭代次数
  • verbose : 进度表示方式。0表示不显示数据,1表示显示进度条,2表示用只显示一个数据。
  • callbacks : 回调函数列表
  • validation_split : 验证数据的使用比例。
  • validation_data : 被用来作为验证数据的(X, y)元组。Will override validation_split.
  • shuffle : 类型为boolean或 str(‘batch’)。是否对每一次迭代的样本进行shuffle操作(可以参见博文Theano学习笔记01–Dimshuffle()函数)。’batch’是一个用于处理HDF5(keras用于存储权值的数据格式)数据的特殊选项。

 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已经存在,则会抛出异常。

参数:

  • fname: 文件名
  • overwrite : 如果已经存在,是否覆盖原文件。 

load_weights (fname): 加载已经存在的权值数据到程序中的模型里面。文件中的模型和程序中的模型结构必须一致。在compile之前或之后都可以调用load_ weights函数。


四、Graph(任意连接图模型)举例说明

[python] view plain copy
print?
  1. # 含一输入,两输出的graph model  
  2. graph = Graph()  
  3. graph.add_input(name=’input’, input_shape=(32,))  
  4. graph.add_node(Dense(16), name=‘dense1’, input=‘input’)  
  5. graph.add_node(Dense(4), name=‘dense2’, input=‘input’)  
  6. graph.add_node(Dense(4), name=‘dense3’, input=‘dense1’)  
  7. graph.add_output(name=’output1’, input=‘dense2’)  
  8. graph.add_output(name=’output2’, input=‘dense3’)  
  9.   
  10. graph.compile(’rmsprop’, {‘output1’:‘mse’‘output2’:‘mse’})  
  11. history = graph.fit({’input’:X_train, ‘output1’:y_train, ‘output2’:y2_train}, nb_epoch=10)  
  12.   
  13.   
  14. # 含两输入,两输出的graph model  
  15. graph = Graph()  
  16. graph.add_input(name=’input1’, input_shape=(32,))  
  17. graph.add_input(name=’input2’, input_shape=(32,))  
  18. graph.add_node(Dense(16), name=‘dense1’, input=‘input1’)  
  19. graph.add_node(Dense(4), name=‘dense2’, input=‘input2’)  
  20. graph.add_node(Dense(4), name=‘dense3’, input=‘dense1’)  
  21. graph.add_output(name=’output’, inputs=[‘dense2’‘dense3’], merge_mode=‘sum’)  
  22. graph.compile(’rmsprop’, {‘output’:‘mse’})  
  23.   
  24. history = graph.fit({’input1’:X_train, ‘input2’:X2_train, ‘output’:y_train}, nb_epoch=10)  
  25. predictions = graph.predict({’input1’:X_test, ‘input2’:X2_test}) # {‘output’:…}  
# 含一输入,两输出的graph modelgraph = 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 modelgraph = 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':...}

参考资料

  • 官方教程
阅读全文
0 0
原创粉丝点击