一、keras套路
序贯模型是多个网络层的线性堆叠。Sequential的第一层需要接受一个关于输入数据shape的参数,
后面的各个层则可以自动的推导出中间数据的shape,因此不需要为每个层都指定这个参数
指定模型Sequential( )
---->堆叠模块 .add( )
---->编译模型 .compile( )
---->在训练数据上迭代 .fit( )
---->评估 .evaluate( )
---->对新数据的预测 .predict( )
import keras
from keras.models import Sequential
from keras.layers import Dense, Dropout, Flatten
from keras.layers import Conv2D, MaxPooling2D
from keras.optimizers import SGD
第一步 指定模型
model = Sequential()
第二步 堆叠模块
model.add()
第一层需要接受一个关于输入数据shape的参数,后面的各个层可以自动推导出中间数据的shape.这个参数可以由input_shape(),input_dim(),input_length()等方法传递,还可以通过传递batch_size参数来指定一个固定大小的batch.注意,input_dim=x意味着传入一个x维向量,也就等同于一个一阶张量,即input_shape=(x,).
第三步 编译模型
model.compile(loss='categorical_crossentropy',
optimizer=sgd,
metrics=['accuracy'])
compile()用于编译模型,它接收三个参数:
优化器(optimizer):已预定义的优化器名或一个Optimizer类对象,模型采用的优化方式
损失函数(loss):已预定义的损失函数名或一个损失函数,模型试图最小化的目标函数
指标列表(metrics):已预定义指标的名字或用户定制的函数,用于评估模型性能
第四步 训练模型
model.fit(x_train, y_train, batch_size=16, epochs=10)
fit()用于训练模型,需要传入Numpy数组形式的输入数据和标签,可以指定epochs和batch_size等参数.
# #fit参数详情
# keras.models.fit(
# self,
# x=None, #训练数据
# y=None, #训练数据label标签
# batch_size=None, #每经过多少个sample更新一次权重,defult 32
# epochs=1, #训练的轮数epochs
# verbose=1, #0为不在标准输出流输出日志信息,1为输出进度条记录,2为每个epoch输出一行记录
# callbacks=None,#list,list中的元素为keras.callbacks.Callback对象,在训练过程中会调用list中的回调函数
# validation_split=0., #浮点数0-1,将训练集中的一部分比例作为验证集,然后下面的验证集validation_data将不会起到作用
# validation_data=None, #验证集 validation_data=(val_data, val_targets)
# shuffle=True, #布尔值和字符串,如果为布尔值,表示是否在每一次epoch训练前随机打乱输入样本的顺序,如果为"batch",为处理HDF5数据
# class_weight=None, #dict,分类问题的时候,有的类别可能需要额外关注,分错的时候给的惩罚会比较大,所以权重会调高,体现在损失函数上面
# sample_weight=None, #array,和输入样本对等长度,对输入的每个特征+个权值,如果是时序的数据,则采用(samples,sequence_length)的矩阵
# initial_epoch=0, #如果之前做了训练,则可以从指定的epoch开始训练
# steps_per_epoch=None, #将一个epoch分为多少个steps,也就是划分一个batch_size多大,比如steps_per_epoch=10,则就是将训练集分为10份,不能和batch_size共同使用
# validation_steps=None, #当steps_per_epoch被启用的时候才有用,验证集的batch_size
# **kwargs #用于和后端交互
# )
#
# 返回的是一个History对象,可以通过History.history来查看训练过程,loss值等等
第五步 评估模型
score = model.evaluate(x_test, y_test, batch_size=16)
在测试模式下返回模型的误差值和评估标准值
对新数据的预测 .predict( )
###
model.save(filepath)可以保存模型及权重,配置信息在一个HDF5文件中,models.load_model(filepath)可以重新实例化模型.
“冻结”一个层指的是该层将不参加网络训练,即该层的权重永不会更新。在进行fine-tune时我们经常会需要这项操作。在使用固定的embedding层处理文本输入时,也需要这个技术。可以通过向层的构造函数传递trainable参数来指定一个层是不是可训练的。
keras.utils.to_categorical(y, num_classes=None)
to_categorical(y, num_classes=None, dtype='float32')进行onehot编码
verbose:日志显示
verbose = 0 为不在标准输出流输出日志信息
verbose = 1 为输出进度条记录
verbose = 2 为每个epoch输出一行记录
注意: 默认为 1
二、常用层
1、激活层
激活函数可以通过设置单独的激活层实现,也可以在构造层对象时通过传递activation参数实现
model.add(Activation('tanh'))
2、全连接层
keras.layers.Dense(units)
参数:
units: 正整数,输出空间维度
activation: 激活函数
##
kernel_initializer: kernel 权值矩阵的初始化器
例子:
model.add(Dense(64, activation='relu', input_dim=20))
model.add(Dense(10, activation='softmax'))
3、Dropout
keras.layers.Dropout(rate, noise_shape=None, seed=None)
参数:
rate: 在 0 和 1 之间浮动。需要丢弃的输入比例
在各个框架的源码中,都会对Dropout的输出除以(1-rate)。这样在测试时不用进行处理
例子:
model.add(Dropout(0.5))
4、Flatten
keras.layers.Flatten(data_format=None)
将输入展平。常用在从卷积层到全连接层的过渡。Flatten不影响batch的大小。
例子:
model.add(Flatten())
5、Conv2D层,对图像的空域卷积
keras.layers.Conv2D(filters, kernel_size, strides=(1, 1), padding='valid', data_format=None, activation=None)
参数:
filters: 整数,输出空间的维度 (即卷积中滤波器的输出数量)
kernel_size: 一个整数,或者 2 个整数表示的元组或列表, 指明 2D 卷积窗口的宽度和高度。 可以是一个整数,为所有空间维度指定相同的值。
strides: 一个整数,或者 2 个整数表示的元组或列表, 指明卷积沿宽度和高度方向的步长。 可以是一个整数,为所有空间维度指定相同的值。
padding: "valid" 或 "same" (大小写敏感)。
data_format: 字符串, channels_last (默认) 或 channels_first 之一,表示输入中维度的顺序。 channels_last 对应输入尺寸为 (batch, height, width, channels), channels_first 对应输入尺寸为 (batch, channels, height, width)。 它默认为从 Keras 配置文件 ~/.keras/keras.json 中 找到的 image_data_format 值。 如果你从未设置它,将使用 "channels_last"。
例子:
model.add(Conv2D(32, (3, 3), activation='relu', input_shape=(100, 100, 3)))
model.add(Conv2D(64, (3, 3), activation='relu'))
6、MaxPooling2D
keras.layers.MaxPooling2D(pool_size=(2, 2), strides=None, padding='valid', data_format=None)
参数:
pool_size:
整数,或者 2 个整数元组,(垂直方向,水平方向)缩小比例的因数。(2,2)会把输入张量的两个维度都缩小一半。 如果只使用一个整数,那么两个维度都会使用同样的窗口长度。
strides: 整数,整数元组或者是 None。 步长值。 如果是 None,那么默认值是 pool_size。
padding: "valid" 或者 "same" (区分大小写)。
data_format: 一个字符串,channels_last (默认值)或者 channels_first。 输入张量中的维度顺序。 channels_last 代表尺寸是 (batch, height, width, channels) 的输入张量,而 channels_first 代表尺寸是 (batch, channels, height, width) 的输入张量。 默认值根据 Keras 配置文件 ~/.keras/keras.json 中的 image_data_format 值来设置。 如果还没有设置过,那么默认值就是 "channels_last"。
7、LSTM 长短期记忆网络层
keras.layers.LSTM(units, activation='tanh', recurrent_activation='hard_sigmoid')
参数:
units: 正整数,输出空间的维度。
activation: 要使用的激活函数 。 如果传入 None,则不使用激活函数 (即 线性激活:a(x) = x)。
recurrent_activation: 用于循环时间步的激活函数。
dropout: 在 0 和 1 之间的浮点数。 单元的丢弃比例,用于输入的线性转换。
8、BatchNormalization
keras.layers.BatchNormalization(axis=1, momentum=0.99, epsilon=0.001)
参数:
axis: 整数,需要标准化的轴 (通常是特征轴)。 例如,在 data_format="channels_first" 的 Conv2D 层之后, 在 BatchNormalization 中设置 axis=1。
momentum: 移动均值和移动方差的动量。
epsilon: 增加到方差的小的浮点数,以避免除以零。
在每个batch上将前一层的激活值重新规范化,使得其输出数据的均值接近0,标准差接近1.
BN层的作用:
加速收敛
控制过拟合
降低网络对初始化权重不敏感
允许使用较大学习率
三、损失函数和优化器
损失函数
### https://www.cnblogs.com/laurdawn/p/5841192.html
binary_crossentropy(亦称作对数损失,logloss)
categorical_crossentropy:亦称作多类的对数损失
mean_squared_error:均方误差,也称标准差,缩写为MSE,可以反映一个数据集的离散程度
例子:
loss='binary_crossentropy',
优化器
from keras import optimizers
optimizers.Adam(lr=0.001, beta_1=0.9, beta_2=0.999, epsilon=None, decay=0.0, amsgrad=False)
optimizers.SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True)
optimizers.RMSprop(lr=0.001, rho=0.9, epsilon=None, decay=0.0)
optimizers.Adagrad(lr=0.01, epsilon=None, decay=0.0)
optimizers.Adadelta(lr=1.0, rho=0.95, epsilon=None, decay=0.0)
例子:
sgd = optimizers.SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True)
model.compile(loss='mean_squared_error', optimizer=sgd)
##也有默认的优化器
model.compile(optimizer='rmsprop',loss='binary_crossentropy',metrics=['accuracy'])
评价函数
评价函数用于评估当前训练模型的性能。当模型编译后(compile),评价函数应该作为 metrics 的参数来输入。
metrics=['mae', 'acc']
metrics=[metrics.mae, metrics.categorical_accuracy]
评价函数和 损失函数 相似,只不过评价函数的结果不会用于训练过程中。
binary_accuracy: 对二分类问题,计算在所有预测值上的平均正确率
categorical_accuracy:对多分类问题,计算再所有预测值上的平均正确率
sparse_categorical_accuracy:与categorical_accuracy相同,在对稀疏的目标值预测时有用
top_k_categorical_accracy: 计算top-k正确率,当预测值的前k个值中存在目标类别即认为预测正确
sparse_top_k_categorical_accuracy:与top_k_categorical_accracy作用相同,但适用于稀疏情况
自定义评价函数
自定义评价函数应该在编译的时候(compile)传递进去。该函数需要以 (y_true, y_pred) 作为输入参数,并返回一个张量作为输出结果。
import keras.backend as K
def mean_pred(y_true, y_pred):
return K.mean(y_pred)
model.compile(optimizer='rmsprop',
loss='binary_crossentropy',
metrics=['accuracy', mean_pred])
四、保存和加载模型
model = Sequential([
layers.Dense(10, activation='softmax', input_shape=(32,)),
layers.Dense(10, activation='softmax')
])
model.compile(optimizer='rmsprop',
loss='categorical_crossentropy',
metrics=['accuracy'])
model.fit(data, labels, batch_size=32, epochs=5)
不建议使用 pickle 或 cPickle 来保存 Keras 模型
1、仅保存权重
model.save_weights('my_model_weights.h5')
# load之前需要建立一个和原来模型一样的神经网络
model.load_weights('my_model_weights.h5')
如果你需要将权重加载到不同的结构(有一些共同层)的模型中,
例如微调或迁移学习,则可以按层的名字来加载权重
model.load_weights('my_model_weights.h5', by_name=True)
"""
假设原始模型如下所示:
model = Sequential()
model.add(Dense(2, input_dim=3, name='dense_1'))
model.add(Dense(3, name='dense_2'))
...
model.save_weights(fname)
"""
# 新模型
model = Sequential()
model.add(Dense(2, input_dim=3, name='dense_1')) # 将被加载
model.add(Dense(10, name='new_dense')) # 将不被加载
# 从第一个模型加载权重;只会影响第一层,dense_1
model.load_weights(fname, by_name=True)
2、保存整个模型
将 Keras 模型保存到单个 HDF5 文件中,该文件将包含:
模型的结构,允许重新创建模型
模型的权重
训练配置项(损失函数,优化器)
优化器状态,允许准确地从你上次结束的地方继续训练。
model.save('my_model.h5')
# HDF5 file, you have to pip3 install h5py if don't have it
model = load_model('my_model.h5')
3、只保存配置不保存参数
只需要保存模型的结构,而非其权重或训练配置项
# 保存为 JSON
json_string = model.to_json()
# 保存为 YAML
yaml_string = model.to_yaml()
# 从 JSON 重建模型:
from keras.models import model_from_json
model = model_from_json(json_string)
# 从 YAML 重建模型:
from keras.models import model_from_yaml
model = model_from_yaml(yaml_string)
五、回调函数
tb_cb = keras.callbacks.TensorBoard(log_dir=log_filepath, write_images=1, histogram_freq=1)
# 设置log的存储位置,将网络权值以图片格式保持在tensorboard中显示,设置每一个周期计算一次网络的
# Create checkpoint callback
cp_callback = keras.callbacks.ModelCheckpoint(
checkpoint_path, verbose=1, save_weights_only=True,
period=5)