keras笔记

一、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)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值