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_split | 0 和 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构建卷积神经网络(CNN(Convolutional Neural Networks))进行图像分类模型构建和学习