keras是一个开源是的python深度学习库,可以基于theano或者tenserflow,为了下步实现猫狗大战代码,现对几个要用到的模块进行学习。
keras中有许多定义好的层,我们可以直接调用,包括常用层(Core)、卷积层(Convolutional)、池化层(Pooling)、局部连接层、递归层(Recurrent)、嵌入层( Embedding)、高级激活层、规范层、噪声层、包装层。当然也可以编写自己的层。
全连接的核心操作就是矩阵向量乘积,本质就是由一个特征空间线性变换到另一个特征空间。因此,dense层的目的是将前面提取的特征,在dense经过非线性变化,提取这些特征之间的关联,最后映射到输出空间上。比如下图
我们用一个3x3x5的filter 去卷积激活函数的输出,得到的结果就是全连接层的输出。
Dense(output_dim, init='glorot_uniform', activation='linear', weights=None, W_regularizer=None, b_regularizer=None, activity_regularizer=None, W_constraint=None, b_constraint=None, bias=True, input_dim=None)
参数:
output_dim:大于0的整数,代表该层的输出维度。
init:初始化该层权重的方法
activation:该层的激活函数
weights:numpy array的list。该list应含有一个形如(input_dim,output_dim)的权重矩阵和一个形如(output_dim,)的偏置向量
regularizer:正则项,w为权重的、b为偏执的,activity为输出的
constraints:约束项
bias:是否包含偏执向量,是布尔值
input_dim:输入数据的维度
keras.layers.core.Dropout(rate, noise_shape=None, seed=None)
Dropout层为输入数据施加Dropout,即在训练过程中每次更新参数时按一定概率(rate)随机断开输入神经元,用于防止过拟合。
rate:0~1的浮点数,控制需要断开的神经元的比例
要对图像进行处理,我们要用到卷积池化操作,对于keras来说,卷积可以用到Conv2D这一函数,下面是它的参数。
tf.keras.layers.Conv2D(
filters,
kernel_size,
strides=(1, 1),
padding="valid",
data_format=None,
dilation_rate=(1, 1),
groups=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,
**kwargs
)
参数:
filters: 整数,输出空间的维数(即在卷积中输出滤波器的数量)。
kernel_size:一个整数或2个整数的元组/列表,指定二维卷积窗口的高度和宽度。
strides: 一个整数或两个整数的元组/列表,指定沿高度和宽度的卷积的步长。
padding: 卷积会导致输出图像越来越小,图像边界信息丢失,若想保持卷积后的图像大小不变,需要设置padding参数为same
dilation_rate: 一个整数或两个整数的元组/列表,指定用于扩展卷积的扩展率。
activation: 使用激活函数,如“relu”或者“sigmoid”。 如果不特别指定,将不会使用任何的激活函数。
use_bias:Boolean,该层是否使用偏置向量。
kernel_initializer:kernel权重矩阵的初始化器
bias_initializer:偏置向量的初始化器
kernel_regularizer:应用于kernel权重矩阵的正则化函数
bias_regularizer:应用于偏置向量的正则化函数
activity_regularizer:应用于图层输出的正则化函数
kernel_constraint:应用于内核矩阵的约束函数
bias_constraint:应用于偏置向量的约束函数
此外,当使用此层作为模型的第一层时,需提供关键字参数input_shape(整数元组,不包括样本轴(不需要写batch_size)),例如。
input_shape=(128, 128, 3)表示 128x128的 RGB 图像。
池化可以用到MaxPooling2D这一函数,下面是它的参数。
MaxPooling2D(
pool_size=(2, 2),
strides=None,
padding='valid',
data_format=None
)
参数:
pool_size:一个整数或2个整数的元组/列表,代表在两个方向(竖直,水平)上的下采样因子,如取(2,2)将使图片在两个维度上均变为原长的一半。
strides: 一个整数或两个整数的元组/列表,指定沿高度和宽度的池化的步长。
padding:可为“same”或者“valid”。
data_format:一个字符串,表示输入中维度的顺序。可为channels_last(默认)和channels_first。以128x128的RGB图像为例,“channels_first”应将数据组织为(3,128,128),而“channels_last”应将数据组织为(128,128,3)。
Flatten层用来将输入“压平”,即把多维的输入一维化,常用在从卷积层到全连接层的过渡。
优化器是编译Keras模型必要的两个参数之一。可以在调用model.compile()之前初始化一个优化器对象,然后传入该函数,也可以在调用model.compile()时传递一个预定义优化器名,如sgd表示随机梯度下降。
第一种方法如下所示
sgd = optimizers.SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True)
model.compile(loss='binary_crossentropy', optimizer=sgd)
lr表示学习速率
momentum表示动量项
decay是学习速率的衰减系数(每个epoch衰减一次)
Nesterov的值是False或者True,表示使不使用Nesterov momentum
除了sgd,还可以选择的优化器有RMSprop(适合递归神经网络)、Adagrad、Adadelta、Adam、Adamax、Nadam。
keras中的ImageDataGenerator模块能够帮助我们对图像进行读取和处理。
keras.preprocessing.image.ImageDataGenerator(
featurewise_center=False,
samplewise_center=False,
featurewise_std_normalization=False,
samplewise_std_normalization=False,
zca_whitening=False,
zca_epsilon=1e-6,
rotation_range=0.,
width_shift_range=0.,
height_shift_range=0.,
shear_range=0.,
zoom_range=0.,
channel_shift_range=0.,
fill_mode='nearest',
cval=0.,
horizontal_flip=False,
vertical_flip=False,
rescale=None,
preprocessing_function=None
)
参数:
featurewise_center:布尔值,使输入数据集去中心化(均值为0), 按feature执行
samplewise_center:布尔值,使输入数据的每个样本均值为0
featurewise_std_normalization:布尔值,将输入除以数据集的标准差以完成标准化, 按feature执行
samplewise_std_normalization:布尔值,将输入的每个样本除以其自身的标准差
zca_whitening:布尔值,对输入数据施加ZCA白化
zca_epsilon: ZCA使用的eposilon,默认1e-6
rotation_range:整数,数据提升时图片随机转动的角度
width_shift_range:浮点数,图片宽度的某个比例,数据提升时图片水平偏移的幅度
height_shift_range:浮点数,图片高度的某个比例,数据提升时图片竖直偏移的幅度
shear_range:浮点数,剪切强度(逆时针方向的剪切变换角度)
zoom_range:浮点数或形如[lower,upper]的列表,随机缩放的幅度,若为浮点数,则相当于[lower,upper] = [1 - zoom_range, 1+zoom_range]
channel_shift_range:浮点数,随机通道偏移的幅度
fill_mode:;‘constant’,‘nearest’,‘reflect’或‘wrap’之一,当进行变换时超出边界的点将根据本参数给定的方法进行处理。其中,constant是以指定常数填充、nearest是以离边界最近的元素填充、reflect反射复制边缘填充
cval:浮点数或整数,当fill_mode=constant时,指定要向超出边界的点填充的值
horizontal_flip:布尔值,进行随机水平翻转
vertical_flip:布尔值,进行随机竖直翻转
rescale: 重放缩因子,默认为None. 如果为None或0则不进行放缩,否则会将该数值乘到数据上(在应用其他变换之前)
preprocessing_function: 将被应用于每个输入的函数。该函数将在任何其他修改之前运行。该函数接受一个参数,为一张图片(秩为3的numpy array),并且输出一个具有相同shape的numpy array
上述的函数等同于我们要对读入的图片进行怎样的设置,接下来利用flow_from_directory 这一函数对图像进行处理。先来看看它的一些参数
flow_from_directory(
directory,
target_size=(256, 256), color_mode='rgb',
classes=None, class_mode='categorical',
batch_size=32, shuffle=True, seed=None,
save_to_dir=None,
save_prefix='',
save_format='jpeg',
follow_links=False
)
参数:
directory: 目标文件夹路径,对于每一个类,该文件夹都要包含一个子文件夹.子文件夹中任何JPG、PNG、BNP、PPM的图片都会被生成器使用。
target_size: 一个整数或2个整数的元组/列表,默认为(256, 256). 图像将被resize成该尺寸。
color_mode: 颜色模式,为"grayscale",“rgb"之一,默认为"rgb”.代表这些图片是否会被转换为单通道或三通道的图片.
classes: 可选参数,为子文件夹的列表,如[‘dogs’,‘cats’]默认为None. 若未提供,则该类别列表将从directory下的子文件夹名称/结构自动推断。每一个子文件夹都会被认为是一个新的类。(类别的顺序将按照字母表顺序映射到标签值)。通过属性class_indices可获得文件夹名与类的序号的对应字典。
class_mode: “categorical”, “binary”, "sparse"或None之一. 默认为"categorical. 该参数决定了返回的标签数组的形式, "categorical"会返回2D的one-hot编码标签,"binary"返回1D的二值标签."sparse"返回1D的整数标签,如果为None则不返回任何标签, 生成器将仅仅生成batch数据, 这种情况在使用model.predict_generator()和model.evaluate_generator()等函数时会用到.
batch_size: batch数据的大小,默认32
shuffle: 是否打乱数据,默认为True
seed: 可选参数,打乱数据和进行变换时的随机数种子
save_to_dir: None或字符串,该参数能让你将提升后的图片保存起来,用以可视化
save_prefix:字符串,保存提升后图片时使用的前缀, 仅当设置了save_to_dir时生效
save_format:“png"或"jpeg"之一,指定保存图片的数据格式,默认"jpeg”
flollow_links: 是否访问子文件夹中的软链接
设置好了方法后,接下来就是输入数据了。使用fit_generator函数可以帮助我们处理较大的数据集,并且可以执行数据增强以避免过拟合并增加我们的模型的泛化能力。
fit_generator(generator,
steps_per_epoch=None,
epochs=1,
verbose=1,
callbacks=None,
validation_data=None,
validation_steps=None,
class_weight=None,
max_queue_size=10,
workers=1,
use_multiprocessing=False,
shuffle=True,
initial_epoch=0)
参数:
generator:生成器。
steps_per_epoch:这个是我们在每个epoch中需要执行多少次生成器来生产数据,fit_generator函数没有batch_size这个参数,是通过steps_per_epoch来实现的。
epochs:即我们训练的迭代次数。
verbose:0, 1 或 2。日志显示模式。 0 = 安静模式, 1 = 进度条, 2 = 每轮一行
callbacks:在训练时调用的一系列回调函数。
validation_data:和我们的generator类似,只是这个使用于验证的,不参与训练。
validation_steps:和前面的steps_per_epoch类似。
class_weight:可选的将类索引(整数)映射到权重(浮点)值的字典,用于加权损失函数(仅在训练期间)。
max_queue_size:整数。生成器队列的最大尺寸。默认为10.
workers:整数。使用的最大进程数量,如果使用基于进程的多线程。 如未指定,workers 将默认为 1。如果为 0,将在主线程上执行生成器。
use_multiprocessing:布尔值。如果 True,则使用基于进程的多线程。默认为False。
shuffle:是否在每轮迭代之前打乱 batch 的顺序。 只能与Sequence(keras.utils.Sequence) 实例同用。
initial_epoch: 开始训练的轮次(有助于恢复之前的训练)