Keras 速成 构建卷积神经网络

Posted 江 月

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Keras 速成 构建卷积神经网络相关的知识,希望对你有一定的参考价值。

Keras 速成 构建卷积神经网络

一、介绍


Keras是TensorFlow下面的一个十分好用的构建卷积神经网络的模块。

Keras 是一个用 Python 编写的高级神经网络 API,它能够以 TensorFlow, CNTK, 或者 Theano 作为后端运行。Keras 的开发重点是支持快速的实验。能够以最小的时延把你的想法转换为实验结果,是做好研究的关键。

Keras 兼容的 Python 版本: Python 2.7-3.6。

Keras广受人们的欢迎:

二、30秒入门Keras

Keras 的核心数据结构是 model,一种组织网络层的方式。最简单的模型是 Sequential 顺序模型,它由多个网络层线性堆叠。对于更复杂的结构,你应该使用 Keras 函数式 API,它允许构建任意的神经网络图。

Sequential 模型

from keras.models import Sequential
# 导入模块

model = Sequential()
# 创建对象 Sequential Object

.add() 来堆叠模型

from keras.layers import Dense

model.add(Dense(units=64, activation='relu', input_dim=100))
# 添加卷积层
model.add(Dense(units=10, activation='softmax'))
# 进行分类输出

.compile() 来配置学习过程

model.compile(loss='categorical_crossentropy',
              optimizer='sgd',
              metrics=['accuracy'])

训练数据

这是一个简单的训练数据的方法。

model.fit(x_train, y_train, epochs=5, batch_size=32)

三、安装并且配置环境

Python环境是不用说的,这个必须要有,而且很好配置。

主要是需要安装keras模块

pip install keras

四、Keras的模型

在 Keras 中有两类主要的模型:

Sequential 顺序模型

使用函数式 API 的 Model 类模型。

Model 类模型

方法功能
model.layers是包含模型网络层的展平列表。
model.inputs是模型输入张量的列表。
model.outputs是模型输出张量的列表。
model.summary()打印出模型概述信息。 它是 utils.print_summary 的简捷调用。
model.get_config()返回包含模型配置信息的字典。
model.get_weights()返回模型中所有权重张量的列表,类型为 Numpy 数组。
model.set_weights(weights)从 Numpy 数组中为模型设置权重。列表中的数组必须与 get_weights() 返回的权重具有相同的尺寸。
model.to_json()以 JSON 字符串的形式返回模型的表示。请注意,该表示不包括权重,仅包含结构。
model.to_yaml()以 YAML 字符串的形式返回模型的表示。
model.save_weights(filepath) 将模型权重存储为 HDF5 文件。
model.load_weights(filepath, by_name=False): 从 HDF5 文件(由 save_weights 创建)中加载权重。

Sequential 顺序模型

compile(optimizer, 
loss=None, 
metrics=None, 
loss_weights=None, 
sample_weight_mode=None, 
weighted_metrics=None, 
target_tensors=None)

参数的含义:

参数功能
optimizer:字符串(优化器名)或者优化器对象。
loss字符串(目标函数名)或目标函数或 Loss 实例。 如果模型具有多个输出,则可以通过传递损失函数的字典或列表,在每个输出上使用不同的损失。模型将最小化的损失值将是所有单个损失的总和。
metrics在训练和测试期间的模型评估标准。 通常你会使用 metrics = [‘accuracy’]。要为多输出模型的不同输出指定不同的评估标准, 还可以传递一个字典,如 metrics={‘output_a’: ‘accuracy’, ‘output_b’: [‘accuracy’, ‘mse’]}。 你也可以传递一个评估指标序列的序列 (len = len(outputs)) 例如 metrics=[[‘accuracy’], [‘accuracy’, ‘mse’]] 或 metrics=[‘accuracy’, [‘accuracy’, ‘mse’]]。
loss_weights指定标量系数(Python浮点数)的可选列表或字典,用于加权不同模型输出的损失贡献。 模型将要最小化的损失值将是所有单个损失的加权和,由 loss_weights 系数加权。 如果是列表,则期望与模型的输出具有 1:1 映射。 如果是字典,则期望将输出名称(字符串)映射到标量系数。
sample_weight_mode如果你需要执行按时间步采样权重(2D 权重),请将其设置为 temporal。 默认为 None,为采样权重(1D)。如果模型有多个输出,则可以通过传递 mode 的字典或列表,以在每个输出上使用不同的 sample_weight_mode。
weighted_metrics在训练和测试期间,由 sample_weight 或 class_weight 评估和加权的度量标准列表。
target_tensors默认情况下,Keras 将为模型的目标创建一个占位符,在训练过程中将使用目标数据。 相反,如果你想使用自己的目标张量(反过来说,Keras 在训练期间不会载入这些目标张量的外部 Numpy 数据), 您可以通过 target_tensors 参数指定它们。它应该是单个张量(对于单输出 Sequential 模型)。
**kwargs当使用 Theano/CNTK 后端时,这些参数被传入 K.function。当使用 TensorFlow 后端时,这些参数被传递到 tf.Session.run。
fit(x=None, 
y=None, 
batch_size=None, 
epochs=1, 
verbose=1, 
callbacks=None, 
validation_split=0.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)

参数的含义

参数功能
x输入数据。可以是:一个 Numpy 数组(或类数组),或者数组的序列(如果模型有多个输入)。一个将名称匹配到对应数组/张量的字典,如果模型具有命名输入。一个返回 (inputs, targets) 或 (inputs, targets, sample weights) 的生成器或 keras.utils.Sequence。None(默认),如果从本地框架张量馈送(例如 TensorFlow 数据张量)。
y目标数据。与输入数据 x 类似,它可以是 Numpy 数组(序列)、 本地框架张量(序列)、Numpy数组序列(如果模型有多个输出) 或 None(默认)如果从本地框架张量馈送(例如 TensorFlow 数据张量)。 如果模型输出层已命名,你也可以传递一个名称匹配 Numpy 数组的字典。 如果 x 是一个生成器,或 keras.utils.Sequence 实例,则不应该 指定 y(因为目标可以从 x 获得)。
batch_size整数或 None。每次梯度更新的样本数。如果未指定,默认为 32。 如果你的数据是符号张量、生成器或 Sequence 实例形式,不要指定 batch_size, 因为它们会生成批次。
epochs整数。训练模型迭代轮次。一个轮次是在整个 x 或 y 上的一轮迭代。 请注意,与 initial_epoch 一起,epochs 被理解为「最终轮次」。 模型并不是训练了 epochs 轮,而是到第 epochs 轮停止训练。
verbose整数,0, 1 或 2。日志显示模式。 0 = 安静模式, 1 = 进度条, 2 = 每轮一行。
callbacks一系列的 keras.callbacks.Callback 实例。一系列可以在训练和验证(如果有)时使用的回调函数。 详见 callbacks。
validation_split0 和 1 之间的浮点数。用作验证集的训练数据的比例。 模型将分出一部分不会被训练的验证数据,并将在每一轮结束时评估这些验证数据的误差和任何其他模型指标。 验证数据是混洗之前 x 和y 数据的最后一部分样本中。 这个参数在 x 是生成器或 Sequence 实例时不支持。
validation_data用于在每个轮次结束后评估损失和任意指标的数据。 模型不会在这个数据上训练。validation_data 会覆盖 validation_split。 validation_data 可以是:元组 (x_val, y_val) 或 Numpy 数组或张量;元组 (x_val, y_val, val_sample_weights) 或 Numpy 数组。数据集或数据集迭代器。对于前两种情况,必须提供 batch_size。 对于最后一种情况,必须提供 validation_steps。
shuffle布尔值(是否在每轮迭代之前混洗数据)或者字符串 (batch)。 batch 是处理 HDF5 数据限制的特殊选项,它对一个 batch 内部的数据进行混洗。 当 steps_per_epoch 非 None 时,这个参数无效。
class_weight可选的字典,用来映射类索引(整数)到权重(浮点)值,用于加权损失函数(仅在训练期间)。 这可能有助于告诉模型「更多关注」来自代表性不足的类的样本。
sample_weight训练样本的可选 Numpy 权重数组,用于对损失函数进行加权(仅在训练期间)。 你可以传递与输入样本长度相同的平坦(1D)Numpy 数组(权重和样本之间的 1:1 映射), 或者在时序数据的情况下,可以传递尺寸为 (samples, sequence_length) 的 2D 数组,以对每个样本的每个时间步施加不同的权重。 在这种情况下,你应该确保在 compile() 中指定 sample_weight_mode=“temporal”。 这个参数在 x 是生成器或 Sequence 实例时不支持,应该提供 sample_weights 作为 x 的第 3 元素。
initial_epoch整数。开始训练的轮次(有助于恢复之前的训练)。
steps_per_epoch整数或 None。 在声明一个轮次完成并开始下一个轮次之前的总步数(样品批次)。 使用 TensorFlow 数据张量等输入张量进行训练时,默认值 None 等于数据集中样本的数量除以 batch 的大小,如果无法确定,则为 1。
validation_steps只有在提供了 validation_data 并且时一个生成器时才有用。 表示在每个轮次结束时执行验证时,在停止之前要执行的步骤总数(样本批次)。
validation_freq只有在提供了验证数据时才有用。整数或列表/元组/集合。 如果是整数,指定在新的验证执行之前要执行多少次训练,例如,validation_freq=2 在每 2 轮训练后执行验证。 如果是列表、元组或集合,指定执行验证的轮次,例如,validation_freq=[1, 2, 10] 表示在第 1、2、10 轮训练后执行验证。
max_queue_size整数。仅用于生成器或 keras.utils.Sequence 输入。 生成器队列的最大尺寸。若未指定,max_queue_size 将默认为 10。
workers整数。仅用于生成器或 keras.utils.Sequence 输入。 当使用基于进程的多线程时的最大进程数。若未指定,workers 将默认为 1。若为 0,将在主线程执行生成器。
use_multiprocessing布尔值。仅用于生成器或 keras.utils.Sequence 输入。 如果是 True,使用基于进程的多线程。若未指定,use_multiprocessing 将默认为 False。 注意由于这个实现依赖于 multiprocessing,你不应该像生成器传递不可选的参数,因为它们不能轻松地传递给子进程。
**kwargs用于向后兼容。

以上的fit函数会返回History对象。

五、Keras的网络层

Keras 核心网络层

这是全连接网络层

keras.layers.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)

激活

这是进行激活的层

keras.layers.Activation(activation)

Dropout

这是Dropout层

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

Flatten

这是展平层

keras.layers.Flatten(data_format=None)

卷积层

这里展示一部分比较常用的卷积层。

Conv1D

1D 卷积层 (例如时序卷积)。

keras.layers.Conv1D(filters, 
kernel_size, 
strides=1, 
padding='valid', 
data_format='channels_last', 
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)

Conv2D

2D 卷积层 (例如对图像的空间卷积)。
(这个可以用于图像的处理了啦)

keras.layers.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)

SeparableConv1D

深度方向的可分离 1D 卷积。

keras.layers.SeparableConv1D(filters, 
kernel_size, 
strides=1, 
padding='valid', 
data_format='channels_last', 
dilation_rate=1, 
depth_multiplier=1, 
activation=None, 
use_bias=True, 
depthwise_initializer='glorot_uniform', 
pointwise_initializer='glorot_uniform', 
bias_initializer='zeros', 
depthwise_regularizer=None, 
pointwise_regularizer=None, 
bias_regularizer=None, 
activity_regularizer=None, 
depthwise_constraint=None, 
pointwise_constraint=None, 
bias_constraint=None)

SeparableConv2D

深度方向的可分离 2D 卷积。

keras.layers.SeparableConv2D(filters, 
kernel_size, 
strides=(1, 1), 
padding='valid', 
data_format=None, 
dilation_rate=(1, 1), 
depth_multiplier=1, 
activation=None, 
use_bias=True, 
depthwise_initializer='glorot_uniform', 
pointwise_initializer='glorot_uniform', 
bias_initializer='zeros', 
depthwise_regularizer=None, 
pointwise_regularizer=None, 
bias_regularizer=None, 
activity_regularizer=None, 
depthwise_constraint=None, 
pointwise_constraint=None, 
bias_constraint=None)

Conv3D

3D 卷积层 (例如立体空间卷积)。

keras.layers.Conv3D(filters, 
kernel_size, 
strides=(1, 1, 1), 
padding='valid', 
data_format=None, 
dilation_rate=(1, 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)

池化层

这里展示一部分比较常用的池化层。

MaxPooling1D

对于时序数据的最大池化。

keras.layers.MaxPooling1D(pool_size=2, strides=None, padding='valid', data_format='channels_last')

MaxPooling2D

对于空间数据的最大池化。

keras.layers.MaxPooling2D(pool_size=(2, 2), strides=None, padding='valid', data_format=None)

MaxPooling3D

对于 3D(空间,或时空间)数据的最大池化。

keras.layers.MaxPooling3D(pool_size=(2, 2, 2), strides=None, padding='valid', data_format=None)

如果需要参考案例,可以参见下面的文章:

听说越来越卷,那我们就用卷积神经网络CNN来识别狗狗吧!!

https://blog.csdn.net/m0_54218263/article/details/119811416?spm=1001.2014.3001.5501

以上是关于Keras 速成 构建卷积神经网络的主要内容,如果未能解决你的问题,请参考以下文章

基于CNN卷积神经网络的TensorFlow+Keras深度学习的人脸识别

Keras深度学习实战——卷积神经网络详解与实现

人工智能--Keras卷积神经网络

keras构建卷积神经网络(CNN(Convolutional Neural Networks))进行图像分类模型构建和学习

怎样用python构建一个卷积神经网络?

怎样用python构建一个卷积神经网络