《统计学习方法》中指出,机器学习的三个要素是模型,策略和优算法,这当然也适用于深度学习,而我个人觉得keras训练也是基于这三个要素的,先建立深度模型,然后选用策略(目标函数),采用优化器,编译和训练模型。
- Sequential模型,顾名思义,就是多个网络层的线性堆叠
建立模型有两种方式:一是向layer添加list的方式,二是通过.add()
方式一层层添加(一个add为一层),具体可见如下代码
from keras.models import Sequential
from keras.layers import Dense, Activation
model = Sequential([Dense(32, input_dim=784),Activation('relu'),Dense(10),Activation('softmax'),])
model = Sequential()
model.add(Dense(32, input_dim=784))
model.add(Activation('relu'))
- 输入数据shape
Sequential只需在第一层需接受一个关于输入数据shape的参数,后面的各个层则可自动推导出中间数据的shape。
input_shape
是一个tuple
类型的数据,其中也可以填入None
,如果填入None
则表示此位置可能是任何正整数。数据的batch大小不应包含在其中。
传递一个batch_input_shape
的关键字参数给第一层,该参数包含数据的batch大小。该参数在指定固定大小batch时比较有用。事实上,Keras在内部会通过添加一个None
将input_shape
转化为batch_input_shape
有些2D层,如Dense,支持通过指定其输入维度input_dim
来隐含的指定输入数据shape
。一些3D的时域层支持通过参数input_dim
和input_length
来指定输入shape
。
model = Sequential()
model.add(Dense(32, input_shape=(784,)))
model = Sequential()
model.add(Dense(32, batch_input_shape=(None, 784)))
model = Sequential()
model.add(Dense(32, input_dim=784))
model.compile(optimizer='rmsprop',
loss='categorical_crossentropy',
metrics=['accuracy'])
model.compile(optimizer='rmsprop',
loss='binary_crossentropy',
metrics=['accuracy'])
model.compile(optimizer='rmsprop',
loss='mse')
- 训练
编译完毕之后,下一步就是要训练模型了,训练模型一般使用fit
函数
left_branch = Sequential()
left_branch.add(Dense(32, input_dim=784))
right_branch = Sequential()
right_branch.add(Dense(32, input_dim=784))
merged = Merge([left_branch, right_branch], mode='concat')
model = Sequential()
model.add(merged)
model.add(Dense(10, activation='softmax'))
model.compile(optimizer='rmsprop',
loss='categorical_crossentropy',
metrics=['accuracy'])
import numpy as np
from keras.utils.np_utils import to_categorical
data_1 = np.random.random((1000, 784))
data_2 = np.random.random((1000, 784))
labels = np.random.randint(10, size=(1000, 1))
labels = to_categorical(labels, 10)
model.fit([data_1, data_2], labels, nb_epoch=10, batch_size=32)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
-
Merge层
多个Sequential可经由一个Merge层合并到一个输出
Merge层支持一些预定义的合并模式,包括:
sum(defualt):逐元素相加
concat:张量串联,可以通过提供concat_axis的关键字参数指定按照哪个轴进行串联
mul:逐元素相乘
ave:张量平均
dot:张量相乘,可以通过dot_axis关键字参数来指定要消去的轴
cos:计算2D张量(即矩阵)中各个向量的余弦距离
具体看以下代码示例:
from keras.layers import Merge
left_branch = Sequential()
left_branch.add(Dense(32, input_dim=784))
right_branch = Sequential()
right_branch.add(Dense(32, input_dim=784))
merged = Merge([left_branch, right_branch], mode='concat')
final_model = Sequential()
final_model.add(merged)
final_model.add(Dense(10, activation='softmax'))
final_model.compile(optimizer='rmsprop', loss='categorical_crossentropy')
final_model.fit([input_data_1, input_data_2], targets)
merged = Merge([left_branch, right_branch], mode=lambda x: x[0] - x[1])
Sequential模型方法
compile(self, optimizer, loss, metrics=[], sample_weight_mode=None)
----------
fit(self, x, y, batch_size=32, nb_epoch=10, verbose=1, callbacks=[], validation_split=0.0, validation_data=None, shuffle=True, class_weight=None, sample_weight=None)
fit函数返回一个History的对象,其History.history属性记录了损失函数和其他指标的数值随epoch变化的情况,如果有验证集的话,也包含了验证集的这些指标变化情况
----------
evaluate(self, x, y, batch_size=32, verbose=1, sample_weight=None)
本函数返回一个测试误差的标量值(如果模型没有其他评价指标),或一个标量的list(如果模型还有其他的评价指标)。model.metrics_names将给出list中各个值的含义
----------
predict(self, x, batch_size=32, verbose=0)
本函数按batch获得输入数据对应的输出,其参数有:函数的返回值是预测值的numpy array
----------
predict_classes(self, x, batch_size=32, verbose=1)
本函数按batch产生输入数据的类别预测结果,函数的返回值是类别预测结果的numpy array或numpy
predict_proba(self, x, batch_size=32, verbose=1)
本函数按batch产生输入数据属于各个类别的概率,函数的返回值是类别概率的numpy array
train_on_batch(self, x, y, class_weight=None, sample_weight=None)
本函数在一个batch的数据上进行一次参数更新,函数返回训练误差的标量值或标量值的list,与evaluate的情形相同。
test_on_batch(self, x, y, sample_weight=None)
本函数在一个batch的样本上对模型进行评估,函数的返回与evaluate的情形相同
predict_on_batch(self, x)
本函数在一个batch的样本上对模型进行测试,函数返回模型在一个batch上的预测结果
----------
fit_generator(self, generator, samples_per_epoch, nb_epoch, verbose=1, callbacks=[], validation_data=None, nb_val_samples=None, class_weight=None, max_q_size=10)
一个形如(inputs,targets)的tuple
一个形如(inputs, targets,sample_weight)的tuple。所有的返回值都应该包含相同数目的样本。生成器将无限在数据集上循环。每个epoch以经过模型的样本数达到samples_per_epoch时,记一个epoch结束
生成验证集的生成器
一个形如(inputs,targets)的tuple
一个形如(inputs,targets,sample_weights)的tuple
函数返回一个History对象
----------
evaluate_generator(self, generator, val_samples, max_q_size=10)
本函数使用一个生成器作为数据源评估模型,生成器应返回与test_on_batch的输入数据相同类型的数据。该函数的参数与fit_generator同名参数含义相同
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
- 100
- 101
- 102
- 103
- 104
- 105
- 106
- 107
- 108
- 109
- 110
- 111