Keras模型-模型参数

51 篇文章 2 订阅
28 篇文章 0 订阅

keras模型

Sequential模型

keras一般用Sequential模型作为搭建神经网络的开始,本节开始论述Sequential模型接口的主要使用方法

add

定义:add(self,layer)
用途:向模型中添加一个层
参数layer是Layer对象,也即是层

pop

定义:pop(self)
用途:弹出模型最后的一层,无返回值,该方法一般很少用到

compile()

定义:

compile(self,optimizer,loss,metrics=None,sample_weight_mode=None)
该方法编译用来配置模型的学习过程,其参数由以下这些:

  • optimizer:字符串(预定义优化器名)或优化器对象,参考优化器
  • loss:字符串或目标函数,参考损失函数
  • metrics:列表,包含评估模型在训练和测试时的网络性能的指标,典型用法是metrics=[‘accuracy’]
  • sample_weight_mode:如果你需要按时间步为样本赋权,将该值设为“temporal”,默认为“None”,代表样本赋权(1D权)
  • kwargs:使用Tensorflow作为后盾请忽略该参数,如果使用theano作为后端,kwargs的值将会传递给K.function
model = Sequential()
model.add(Dense(32,input_shape=(500,)))
model.add(Dense(10,activation='softmax'))
model.compile(optimizer='rmsprop',loss="categorical_crossentropy",metrics=['accuracy'])

该例子添加两个dense层,并用rmsprop优化器进行优化,损失函数定义为categorical_crossentroy,各种损失函数的含义在后面章节中会提高

fit

定义

fit(self,x,y,batch_size=32,epochs=10,verbose=1,callbacks=None,validation_split=0.0,validation_data=None,shuffle=True,class_weigtht=None,sample_weight=None,initial_epoch=0)

本函数将模型训练epoch轮,其参数由

  • x:输入数据。如果模型只有一个输入,那么x的类型是numpy array.如果模型有多个输入,那么x的类型应该是list,list的元素是对应于各个输入的numpy array

  • y:标签向量,numpy array类型

  • batch_size :整数,指定进行梯度下降时每个batch包含的样本数,训练时一个batch的样本会被计算一次梯度下降,使用目标函数优化一次

  • epochs:训练的轮数,每个epoch会把训练集轮一遍

  • verbose 日志显示,0为不在标准输出日志信息,1为输出进度记录,2为每个epoch输出一行记录

  • callbacks:list,其中的元素是keras.callbacks.Callback的对象。这个list中的回调函数将会在训练过程中的适当时机被调用,参考回调函数

  • validation_split:0~1之间的浮点数,用来指定训练集的一定比例数据作为验证集。注意,validation_split的划分在shuffle之前,因此如果你的数据本身是有序的,需要先手工打乱再指定validation_split,否则可能会出现验证集样本不均匀。

  • validation_data:形式为(X,y)的tuple,是指定的验证集。此参数将覆盖validation_spilt参数。

  • shuffle:布尔值或字符串,一般为布尔值,表示是否在训练过程中随机打乱输入样本的顺序。若为字符串“batch”,则是用来处理HDF5数据的特殊情况,它将在batch内部将数据打乱。

  • class_weight:字典,将不同的类别映射为不同的权值,该参数用来在训练过程中调整损失函数(只能用于训练)。

  • sample_weight:权值的numpy array,用于在训练时调整损失函数(仅用于训练)。可以传递一个1D的与样本等长的向量用于对样本进行1对1的加权,或者在面对时序数据时,传递一个的形式为<samples,sequence_length>的矩阵来为每个时间步上的样本赋不同的权。这种情况下请确定在编译模型时添加了sample_weight_mode=‘temporal’。

  • initial_epoch: 从该参数指定的epoch开始训练,在继续之前的训练时有用。

fit 函数会返回一个History的对象,其中History.history属性记录了损失函数和其他指标的数值随epoch变化的情况,如果有验证集的话,也包含了验证集的这些指标的变化情况

evaluate

定义:

evaluate(self,x,y,batch_size=32,verbose=1,sample_weight=None)

本函数按照batch计算在某些输入数据上模型的误差,其参数由

  • x:输入数据,与fit一样,是array或者numpy array的list
  • y:标签,numpy array
  • batch_size:整数,含义和fit的同名参数
  • verbose:含义和fit的同名参数,但只有取0-1
  • sample_weight:numpy array,含义同fit的同名参数

predict

predict(self,x,batch_size=32,verbose=0)

本函数按batch获得输入数据对应的预测结果,其中x是输入向量,batch_size是每批次选取的数据集数量。

函数的返回值是预测值的numpy array。

predict_classes

predict_classes(self, x, batch_size=32, verbose=1)

本函数按batch产生输入数据的类别预测结果,它和predict的区别是:

Predict返回各个类别的可能性结果,是一个n维向量,n等于类别的数量;而predict_classes返回的是最可能的类别,对每个输入返回的是类别名称。

函数的返回值是类别预测结果的numpy array或numpy。

fit_generator

fit_generator(self, generator, steps_per_epoch, epochs=1, verbose=1, callbacks=None, validation_data=None, validation_steps=None, class_weight=None, max_q_size=10, workers=1, pickle_safe=False, initial_epoch=0)

利用Python的生成器,逐个生成数据的batch并进行训练。生成器与模型将并行执行以提高效率。例如,该函数允许我们在CPU上进行实时的数据提升,同时在GPU上进行模型训练。

函数的参数是:

  • generator:生成器函数,生成器的输出应该为:

a) 一个形如(inputs,targets)的tuple。

b) 一个形如(inputs, targets,sample_weight)的tuple。所有的返回值都应该包含相同数目的样本。生成器将无限在数据集上循环。每个epoch以经过模型的样本数达到samples_per_epoch时,记一个epoch结束。

  • steps_per_epoch:整数,当生成器返回steps_per_epoch次数据时计一个epoch结束,执行下一个epoch。

  • epochs:整数,数据迭代的轮数。

  • verbose:日志显示,0为不在标准输出流输出日志信息,1为输出进度条记录,2为每个epoch输出一行记录。

  • validation_data:具有以下三种形式之一。

a) 生成验证集的生成器。

b) 一个形如(inputs,targets)的tuple。

c) 一个形如(inputs,targets,sample_weights)的tuple。

  • validation_steps: 当validation_data为生成器时,本参数指定验证集的生成器返回次数。

  • class_weight:规定类别权重的字典,将类别映射为权重,常用于处理样本不均衡问题。

  • sample_weight:权值的numpy array,用于在训练时调整损失函数(仅用于训练)。可以传递一个1D的与样本等长的向量用于对样本进行1对1的加权,或者在面对时序数据时,传递一个的形式为(samples,sequence_length)的矩阵来为每个时间步上的样本赋不同的权。这种情况下请确定在编译模型时添加了sample_weight_mode=‘temporal’。

  • workers:最大进程数。

  • max_q_size:生成器队列的最大容量。

  • pickle_safe: 若为真,则使用基于进程的线程。由于该实现依赖多进程,不能传递non picklable(无法被pickle序列化)的参数到生成器中,因为无法轻易将它们传入子进程中。

  • initial_epoch: 从该参数指定的epoch开始训练,在继续之前的训练时有用。

常用层

keras的层即是网络层的意思。包括了常用层,卷积层,池化层,嵌入层,循环层,融合层,噪音层等多种类比e

这一节介绍常用的层,常用的层对应core模块,core内部定义了一些列常用的网络层,包含了全连接层,激活层等

Dense层

Dense就是常用的全连接层,所实现的运算是output = activation(dot(input, kernel)+bias)。其中activation是逐元素计算的激活函数,kernel是本层的权值矩阵,bias为偏置向量,只有当use_bias=True才会添加。

keras.layers.core.Dense(units, activation=None, use_bias=True, kernel_initializer=‘glorot_uniform’, bias_initializer=‘zeros’, kernel_regularizer=None, bias_regularizer=None, activity_regularizer=None, kernel_constraint=None, bias_constraint=None)

如果本层的输入数据的维度大于2,则会先被压为与kernel相匹配的大小。这里是一个使用示例,将16个节点的层全连接到32个节点:

# as first layer in a sequential model:
model = Sequential()
model.add(Dense(32, input_shape=(16,)))
# now the model will take as input arrays of shape (*, 16)
# and output arrays of shape (*, 32)
  • units:大于0的整数,代表该层的输出维度。

  • activation:激活函数,为预定义的激活函数名(参考激活函数),或逐元素(element-wise)的Theano函数。如果不指定该参数,将不会使用任何激活函数(即使用线性激活函数:a(x)=x)。

  • use_bias: 布尔值,是否使用偏置项。

  • kernel_initializer:权值初始化方法,为预定义初始化方法名的字符串,或用于初始化权重的初始化器。参考initializers。

  • bias_initializer:权值初始化方法,为预定义初始化方法名的字符串,或用于初始化权重的初始化器。参考initializers。

  • kernel_regularizer:kernal权重向量的正则化函数,是Regularizer对象。

  • bias_regularizer:bias偏置向量的正则化函数,是Regularizer对象。

  • activity_regularizer:输出函数或激活函数的正则化函数,为Regularizer对象。

  • kernel_constraints:kernal权重向量的约束函数,是Constraints对象。

  • bias_constraints:bias偏移向量的约束函数,是Constraints对象。

kernel_regularizer,bias_regularizer,activity_regularizer,kernel_constraints,bias_constraints这些参数一般都使用默认值,不需要专门设置。

输入

形如(nb_samples, …, input_shape[1])的nD张量,最常见的情况为(nb_samples, input_dim)的2D张量。

输出

形如(nb_samples, …, units)的nD张量,最常见的情况为(nb_samples, output_dim)的2D张量。

Activation层

Activation层用于设置激活函数,激活函数用于在模型中引入非线性。

激活函数sigmoid 与 tanh 曾经很流行,但现在很少用于视觉模型了,主要原因在于当输入的绝对值较大时,其导数接近于零,梯度的反向传播过程将被中断,出现梯度消散的现象。
在这里插入图片描述
ReLU 是一个很好的替代:
在这里插入图片描述
相比于 sigmoid 与 tanh,它有两个优势:

  • 没有饱和问题,大大缓解了梯度消散的现象,加快了收敛速度。

  • 实现起来非常简单,加速了计算过程。

Keras中设置激活函数使用下列方法:

keras.layers.core.Activation(activation)

参数

activation:将要使用的激活函数,为预定义激活函数名或一个Tensorflow/Theano的函数。可选值包括:tanh,relu,elu,softsign,linear,softmax等等,具体可参考预定义激活函数。

输入shape

任意,当使用激活层作为第一层时,要指定input_shape。

输出shape

与输入shape相同。

预定义激活函数

softmax:对输入数据的最后一维进行softmax,输入数据应形如(nb_samples, nb_timesteps, nb_dims)或(nb_samples,nb_dims)

elu
softplus
softsign
relu
tanh

sigmoid
hard_sigmoid
linear

Dropout层

keras.layers.core.Dropout(rate, noise_shape=None, seed=None)

为输入数据施加Dropout。Dropout将在训练过程中每次更新参数时随机断开一定百分比(rate)的输入神经元,Dropout层用于防止过拟合。

参数

  • rate:0-1的浮点数,控制需要断开的神经元的比例

Flatten层

Flatten层用来将输入“压平”,即把多维的输入一维化,常用在从卷积层到全连接层的过渡。Flatten不影响batch的大小。

model = Sequential()
model.add(Convolution2D(64, 3, 3,
            border_mode='same',
            input_shape=(3, 32, 32)))
# now: model.output_shape == (None, 64, 32, 32)

model.add(Flatten())
# now: model.output_shape == (None, 65536)

卷积操作将(3,32,32)格式的图像数据转换成(64,32,32)格式,Flatten的结果则是643232=65536。

卷积层

以下内容来自于Keras官网,为简单起见,本书只讨论1D和2D卷积,并且举一个2D卷积的例子。其他卷积方式可参考官网文档。

什么叫卷积?比如(3,3)卷积,其含义就是每次将3*3=9个特征值根据卷积算法合并成一个特征值,常用的卷积算法有以下几种:

  • 平均值:取9个特征值的平均值作为新的特征值。

  • 最大值:取9个特征值中最大值作为新的特征值。

  • 最小值:取9个特征值中最小值作为新的特征值。

当然还可以有其他类型的卷积算法。

卷积的时候还有个重要的概念就是步长,用参数strides表示。下面举例说明:

如果步长是(1,1),那么第一个卷积从[0,0]到[2,2]这9个特征合并成一个值,下一次卷积从[1,1]到[3,3],对于99大小的矩阵,全部卷积后就是77大小的矩阵。

Conv1D层

keras.layers.convolutional.Conv1D(filters, kernel_size, strides=1, padding='valid', dilation_rate=1, activation=None, use_bias=True, kernel_initializer='glorot_uniform', bias_initializer='zeros', kernel_regularizer=None, bias_regularizer=None, activity_regularizer=None, kernel_constraint=None, bias_constraint=None)

一维卷积层(即时域卷积),作用是在一维输入信号上进行邻域滤波。当使用该层作为首层时,需要提供关键参数input_shape。例如(10,128)代表一个长为10的序列,序列中每个信号为128向量。而(None, 128)代表变长的128维向量序列。

该层将输入信号与卷积核按照单一的空域(或时域)方向进行卷积。如果use_bias=True,则还会加上一个偏置项,若activation不为None,则输出为经过激活函数的输出。

Conv2D层

keras.layers.convolutional.Conv2D(
filters, kernel_size,strides=(1,1),
padding=‘valid’,
data_format=None,
dilation_rate=(1,1),
activation=None,
use_bias=True,
kernel_initializer=‘glorot_uniform’,
bias_initializer=‘zeros’,
kernel_regularizer=None,
bias_regularizer=None,
activity_regularizer=None,
kernel_constraint=None,
bias_constraint=None)

将二维向量进行卷积,当使用该层作为第一层时,应提供input_shape参数。

二维卷积层对二维输入进行滑动窗卷积,当使用该层作为第一层时,应提供input_shape参数。例如input_shape = (128,128,3)代表128*128的彩色RGB图像(data_format=‘channels_last’),通道数放在最后一个维度,还有一种是input_shape = (3,128,128) ,通道数放在第一个维度。
参数

filters:卷积核的数目(即输出的维度)。

kernel_size:单个整数或由两个整数构成的list/tuple,卷积核的宽度和长度。如为单个整数,则表示在各个空间维度的相同长度。

strides:单个整数或由两个整数构成的list/tuple,为卷积的步长。如为单个整数,则表示在各个空间维度的相同步长。任何不为1的strides均与任何不为1的dilation_rata均不兼容。

padding:补0策略,为“valid”, “same”。“valid”代表只进行有效的卷积,即对边界数据不处理。“same”代表保留边界处的卷积结果,通常会导致输出shape与输入shape相同。

activation:激活函数,为预定义的激活函数名(参考激活函数),或逐元素(element-wise)的Theano函数。如果不指定该参数,将不会使用任何激活函数(即使用线性激活函数:a(x)=x)。

dilation_rate:单个整数或由两个个整数构成的list/tuple,指定dilated convolution中的膨胀比例。任何不为1的dilation_rata均与任何不为1的strides均不兼容。

data_format:字符串,“channels_first”或“channels_last”之一,代表图像的通道维的位置。该参数是Keras 1.x中的image_dim_ordering,“channels_last”对应原本的“tf”,“channels_first”对应原本的“th”。以128x128的RGB图像为例,“channels_first”应将数据组织为(3,128,128),而“channels_last”应将数据组织为(128,128,3)。该参数的默认值是~/.keras/keras.json中设置的值,若从未设置过,则为“channels_last”。

use_bias:布尔值,是否使用偏置项。

kernel_initializer:权值初始化方法,为预定义初始化方法名的字符串,或用于初始化权重的初始化器。参考initializers。

bias_initializer:权值初始化方法,为预定义初始化方法名的字符串,或用于初始化权重的初始化器。参考initializers。

kernel_regularizer:施加在权重上的正则项,为Regularizer对象。

bias_regularizer:施加在偏置向量上的正则项,为Regularizer对象。

activity_regularizer:施加在输出上的正则项,为Regularizer对象。

kernel_constraints:施加在权重上的约束项,为Constraints对象。

bias_constraints:施加在偏置上的约束项,为Constraints对象。

输入shape

‘channels_first’模式下,输入形如(samples,channels,rows,cols)的4D张量。

‘channels_last’模式下,输入形如(samples,rows,cols,channels)的4D张量。

注意这里的输入shape指的是函数内部实现的输入shape,而非函数接口应指定的input_shape。
输出shape

‘channels_first’模式下,为形如(samples,nb_filter, new_rows, new_cols)的4D张量。

‘channels_last’模式下,为形如(samples,new_rows, new_cols,nb_filter)的4D张量。

输出的行列数和卷积核的大小以及填充方法有关。

例子

一般我们说一张图片的宽度为width:W,高度为height:H,这张图片的的通道数为D,一般目前都用RGB三通道的D=3,但是为了通用性表示为D。

卷积核大小为KK,因为处理的图片是D通道的,因此卷积核其实也就是KKD大小的,RGB三通道,指定了kernel_size的前提下,真正的卷积核大小是kernel_sizekernel_size*3。

对于D各通道而言,是在每个通道上分别执行二维卷积,然后将D个通道加起来,得到该位置的二维卷积输出,对于RGB三通道而言,就是在R,G,B三个通道上分别使用对应的每个通道上的kernel_sizekernel_size大小的核去卷积每个通道上的WH的图片,然后将三个通道卷积得到的输出相加,得到M个二维卷积输出结果,在有padding的情况下,能保持输出图片大小和原来的一样。

在VALID模式下,抛弃右边不够卷积的元素,本例子采用默认滑动窗口大小(1,1)。

对于Samples为10的‘channels_first’张量,假设输入shape为(10,3,28,28),并设置卷积核数目为32,卷积核大小为(3,3),则输出张量为(10,32,26,26)。

对于VALID模式,用(3,3)卷积核来卷积shape大小为(28,28)的向量时,最右边的(2,2)元素被抛弃,因此输出shape为(26,26)。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值