机器学习之keras:keras中的complie、fit、predict、save函数说明

一、模型定义

    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。

二、model.compile函数

    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加上权重。比如用分类交叉熵:

loss = lw_1*(-\widehat{y_1}log^{y_1}-(1-\widehat{y_1})log^{(1-y_1)})+...+\\ ...\quad\quad\quad lw_{10}*(-\widehat{y_{10}}log^{y_{10}}-(1-\widehat{y_{10}})log^{(1-y_{10})})

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"])

 三、model.fit

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)

四、evaluate和predict函数

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)

五、save and load函数

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/

原创文章 26 获赞 33 访问量 1908

猜你喜欢

转载自blog.csdn.net/qq_40765537/article/details/105570569