keras中模型定义十分简单,主要通过add函数来添加layers,而这些layers包含比如卷积层Conv2D、池化层Pool,全连接层Dense, 激活函数层Activation等。 下面是一个浅卷积网络的例子:
from keras.models import Sequential
from keras.layers.convolutional import Conv2D
from keras.layers.core import Activation
from keras.layers.core import Flatten
from keras.layers.core import Dense
from keras import backend as K
class ShallowNet:
@staticmethod
def build(width, height, depth, classes):
model = Sequential()
inputShape = (height, width, depth)
if K.image_data_format() == "channels_first":
inputShape = (depth, height, width)
model.add(Conv2D(filters=32, kernel_size=(3,3), \
padding="same", input_shape=inputShape))
model.add(Activation("relu"))
model.add(Flatten())
model.add(Dense(classes))
model.add(Activation("softmax"))
return model
keras中有两种image_data_format,一个就是”channels_first"就是通道数在前,数据格式是(depth, height, width), 另一种是"channels_last", 数据格式是(height, width, depth),depth就相当于channels,一般的数据格式都是channels_last。你可以在~/.keras/keras.json中修改默认的image_data_format。
def compile(optimizer, loss=None, metrics=None, loss_weights=None, sample_weight_mode=None, weighted_metrics=None, target_tensors=None, **kwargs)
optimizer | 优化器,比如SGD |
loss | 损失函数,比如categorical_crossentropy |
metrics | 想要在模型训练和测试过程中要评估的内容所组成的度量标准列表,比如包含准确度,["accuracy"] |
loss_weights | loss_weights的长度需要跟输出的个数一样,作用于多个输出,可以通过设置不同输出的loss的权重来决定训练过程,比如在手写数字识别中有10个输出,分别代表属于每个数字的概率,loss_weights就是给这十个输出的loss加上权重。比如用分类交叉熵: |
sample_weight_mode | 如果你需要执行按时间步采样权重(2D 权重),请将其设置为 temporal 。 默认为 None ,为采样权重(1D)。具体的sample_weight是再fit函数中设定,可以看下面的说明。 |
weighted_metrics | 在训练和测试期间,由 sample_weight 或 class_weight 评估和加权的度量标准列表 |
target_tensors | 不常用,通常来讲,keras会给模型的目标张量创建占位符,然后在训练的时候把目标张量读入到这些占位符,如果你指定的target_tensors的话,keras就不会在训练的时候从外部再读入目标张量。它可以是单个张量(单输出模型),张量列表,或一个映射输出名称到目标张量的字典。 |
opt = SGD(learning_rate=0.005)
model.compile(optimizer=opt, loss="categorical_crossentropy",
metrics=["accuracy"])
def fit(x=None, y=None, batch_size=None, epochs=1, verbose=1, callbacks=None, validation_split=0., validation_data=None, shuffle=True, class_weight=None, sample_weight=None, initial_epoch=0, steps_per_epoch=None, validation_steps=None, validation_freq=1, max_queue_size=10, workers=1, use_multiprocessing=False, **kwargs)
x, y | 训练数据, y是标签 |
batch_size | 整数或 None 。每次梯度更新的样本数。如果未指定,默认为 32 |
epochs | epochs: 整数。训练模型迭代轮次。一个轮次是在整个 x 和 y 上的一轮迭代 |
initial_epochs | 整数。开始训练的轮次(有助于恢复之前的训练)。真正训练的次数是epochs-initial_epochs |
verbose | 0, 1 或 2。日志显示模式。 0 = 安静模式, 1 = 进度条, 2 = 每轮一行。 |
callbacks | 一系列的 keras.callbacks.Callback 实例。一系列可以在训练时使用的回调函数。 |
validation_split | : 0 和 1 之间的浮点数。用作验证集的训练数据的比例。 模型将分出一部分不会被训练的验证数据,并将在每一轮结束时评估这些验证数据的误差和任何其他模型指标 |
validation_data | 元组 (x_val,y_val) 或元组 (x_val,y_val,val_sample_weights) , 用来评估损失,以及在每轮结束时的任何模型度量指标。 模型将不会在这个数据上进行训练。这个参数会覆盖 validation_split |
shuffle | 布尔值(是否在每轮迭代之前混洗数据) |
sample_weight | 采样权重主要解决的时样本质量不同的问题,比如前1000个样本的可信度高,它的权重就设置高一点,后以前个样本可信度第,权重就相应要低,这就是采用权重1D,它的长度通常和你的样本量是一致的。按时间采样权重是指在不同的训练阶段赋予不同的权重,它是2D的。 |
class_weight | 主要针对的上数据不均衡问题,比如:异常检测的二项分类问题,异常数据仅占1%,正常数据占99%; 此时就要设置不同类对loss的影响。这里的class_weight和上面的loss_weights还是有区别的,class_weight其实跟sample_weight更相近,sample_weight是可以每个样本的loss对于总的loss的影响权重,class_weight是训练数据中每一类的loss对于总的loss的影响权重,而loss_weights是每个样本的每个输出对于该样本的loss的影响权重。 |
其它的不太常用,可以到官方文档查看。
H = model.fit(trainX, trainY, validation_data=(testX, testY),
batch_size=32, epochs=100, verbose=1)
1. def evaluate(x=None, y=None, batch_size=None, verbose=1, sample_weight=None, steps=None, callbacks=None, max_queue_size=10, workers=1, use_multiprocessing=False)
如果再fit过程中传入了validation_data,则这步一般可以省略
2. def predict(x, batch_size=None, verbose=0, steps=None)
predictions = model.predict(testX, batch_size=32)
1.save
#save the network to disk
print("[INFO] serializing network")
filepath = ""
model.save(filepath=filepath)
2.load
print("[INFO] loading pre-trained network...")
filepath = ""
model = load_model(filepath)
#加载训练好的模型可以直接拿来预测
print("[INFO] predicting ...")
preds = model.predict(data, batch_size=32).argmax(axis=1)
文章是学习总结,如果有错误的地方,欢迎指出。
https://keras.io/models/model/