CNN原理及参数

  • CNN原理
    • 1.1卷积层
      • 1.1.1卷积过滤器
      • 1.1.2 Padding
      • 1.1.3 单层卷积
    • 1.2 池化
    • 1.3 全连接层
  • 2. 代码及参数
    • 2.1 卷积Conv2D 参数
    • 2.2 池化pooling参数
    • 2.3 全连接层参数
    • 2.4 Dropout
    • 2.5 Flatten
  • 3.模型编译
    • 3.1 编译
    • 3.2 优化器 (optimizer)
    • 3.3 fit
    • 3.4 evaluate
    • 3.5 predict
  • 4. 经典网络
    • 4.1 LeNet-5详解
    • 4.2 cifar10

CNN原理

在卷积神经网络中,通常有三种层:

(1) 卷积层(CONV);

(2) 池化层(POOL);

(3) 全连接层(FC)

1.1卷积层

1.1.1卷积过滤器

这个6×6的图片,将其与这个3×3的过滤器进行卷积,能够过滤出图片的某一种特征。

参数:过滤器大小 f*f
卷积步长(Strided convolutions) s

1.1.2 Padding

p是填充的数量,在这个案例中,p=1,我们在周围都填充了一个像素点,输出也就变成了 (n+2p-f+1)×(n+2p-f+1), 和输入的图像一样大。

1.1.3 单层卷积

如果对于RGB图像,输入矩阵是三维矩阵,滤波器也是三维矩阵,输出是二维矩阵。

如果想要同时检测水平边缘和垂直边缘,就需要使用两个滤波器,那么就得到如下两个二维矩阵输出,将两个输出堆叠起来得到一个新的立方。

对卷积后得到的矩阵,采用非线性激活函数,例如ReLU函数,并加上偏差b,然后将输出堆叠起来,就得到了卷积神经网络的一层,如下:
引用:https://cuijiahua.com/blog/2018/01/dl_3.html
卷积层输入图片:3232
卷积核大小:5
5
卷积核种类:6
输出featuremap大小:2828 (32-5+1)=28
神经元数量:28
286
可训练参数:(5
5+1) * 6(每个滤波器55=25个unit参数和一个bias参数,一共6个滤波器)
连接数:(5
5+1)628*28=122304

1.2 池化

最大池化(Max Pooling)只有两个参数,滤波器大小f和步长s,输出为每个子矩阵的最大元素。例如如下矩阵,f = 2, s = 2:
而平均池化(Average Pooling),则是取每个子矩阵的平均值,如下:
对于维度为nH × nW × nC的输入矩阵,输出的维度为: ⌊nH−fs+1⌋×⌊nH−fs+1⌋×nC

1.3 全连接层

计算输入向量和权重向量之间的点积,再加上一个偏置,结果通过sigmoid函数输出。
参数:节点数

理解:
假如我们用一个3x3x5的filter 去卷积激活函数的输出,得到的结果就是一个fully connected layer 的一个神经元的输出,这个输出就是一个值。因为我们有84个神经元。我们实际就是用一个3x3x5x84的卷积层去卷积激活函数的输出。

全连接层有84个节点,对应于一个7x12的比特图,-1表示白色,1表示黑色,这样每个符号的比特图的黑白色就对应于一个编码。

该层的训练参数和连接数是(3x3x5 + 1)x84=3864。

卷积取的是局部特征,全连接就是把以前的局部特征重新通过权值矩阵组装成完整的图。因为用到了所有的局部特征,所以叫全连接。
假设你是一只小蚂蚁,你的任务是找小面包。你的视野还比较窄,只能看到很小一片区域。当你找到一片小面包之后,你不知道你找到的是不是全部的小面包,所以你们全部的蚂蚁开了个会,把所有的小面包都拿出来分享了。全连接层就是这个蚂蚁大会~

2. 代码及参数

from keras.layers.convolutional import Conv2D
from keras.layers.convolutional import MaxPooling2D
from keras.layers import Dense
from keras.layers import Dropout
from keras.layers import Flatten

model = Sequential()

2.1 卷积Conv2D 参数

Keras中文 https://keras.io/zh/layers/convolutional/#conv2d
Keras英文 https://keras.io/api/layers/convolution_layers/convolution2d/
https://www.cnblogs.com/yjybupt/p/11646846.html

model.add(Conv2D(32, (3, 3), input_shape=(3, 32, 32), padding=‘same’, activation=‘relu’, kernel_constraint=maxnorm(3)))

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)

filters: 整数,输出空间的维度 (即卷积中滤波器的数量)。
kernel_size: 一个整数,或者 2 个整数表示的元组或列表, 指明 2D 卷积窗口的宽度和高度。 可以是一个整数,为所有空间维度指定相同的值。
strides: 一个整数,或者 2 个整数表示的元组或列表, 指明卷积沿宽度和高度方向的步长。 可以是一个整数,为所有空间维度指定相同的值。 指定任何 stride 值 != 1 与指定 dilation_rate 值 != 1 两者不兼容。
padding: “valid” 或 “same” (大小写敏感)。 valid padding就是不padding,而same padding就是指padding完尺寸与原来相同
图像识别一般来说都要padding,尤其是在图片边缘的特征重要的情况下。padding多少取决于我们需要的输出是多少
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。
dilation_rate: 一个整数或 2 个整数的元组或列表, 指定膨胀卷积的膨胀率。 可以是一个整数,为所有空间维度指定相同的值。 当前,指定任何 dilation_rate 值 != 1 与 指定 stride 值 != 1 两者不兼容。
activation: 要使用的激活函数 (详见 activations)。 如果你不指定,则不使用激活函数 (即线性激活: a(x) = x)。
use_bias: 布尔值,该层是否使用偏置向量。
kernel_initializer: kernel 权值矩阵的初始化器 (详见 [initializers])。
bias_initializer: 偏置向量的初始化器 (详见 initializers)。
kernel_regularizer: 运用到 kernel 权值矩阵的正则化函数 (详见 regularizer)。
bias_regularizer: 运用到偏置向量的正则化函数 (详见 regularizer)。
activity_regularizer: 运用到层输出(它的激活值)的正则化函数 (详见 regularizer)。
kernel_constraint: 运用到 kernel 权值矩阵的约束函数 (详见 constraints)。
bias_constraint: 运用到偏置向量的约束函数 (详见 constraints)。

输入尺寸

如果 data_format=‘channels_first’, 输入 4D 张量,尺寸为 (samples, channels, rows, cols)。
如果 data_format=‘channels_last’, 输入 4D 张量,尺寸为 (samples, rows, cols, channels)。

输出尺寸

如果 data_format=‘channels_first’, 输出 4D 张量,尺寸为 (samples, filters, new_rows, new_cols)。
如果 data_format=‘channels_last’, 输出 4D 张量,尺寸为 (samples, new_rows, new_cols, filters)。

2.2 池化pooling参数

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

pool_size: 整数,或者 2 个整数表示的元组,沿(垂直,水平)方向缩小比例的因数。(2,2)会把输入张量的两个维度都缩小一半。如果只使用一个整数,那么两个维度都会使用同样的窗口长度。
strides: 整数,2 个整数表示的元组,或者是 None。表示步长值。如果是 None,那么默认值是 pool_size。
padding: “valid” 或者 “same” (区分大小写)。
data_format: 字符串,channels_last (默认)或 channels_first 之一。 表示输入各维度的顺序。
channels_last 对应输入尺寸为 (batch, steps, features),
channels_first 对应输入尺寸为 (batch, features, steps)。

2.3 全连接层参数

https://keras.io/zh/layers/core/

model.add(Flatten())
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)

https://www.jianshu.com/p/3855908b4c29
如果该层的输入的秩大于2,那么它首先被展平然后再计算与 kernel 的点乘。

tf.layers.dense( input, units=k )会在内部自动生成一个权矩阵kernel和偏移项bias,各变量具体尺寸如下:对于尺寸为[m, n]的二维张量input, tf.layers.dense()会生成:尺寸为[n, k]的权矩阵kernel,和尺寸为[m, k]的偏移项bias。内部的计算过程为y = input * kernel + bias,输出值y的维度为[m, k]。

units: 正整数,输出空间维度。
activation: 激活函数(详见 activations)。若不指定,则不使用激活函数(即,「线性」激活: a(x) = x)。
use_bias: 布尔值,该层是否使用偏置向量。
kernel_initializer: kernel 权值矩阵的初始化器(详见 initializers)。
bias_initializer: 偏置向量的初始化器(see initializers).
kernel_regularizer: 运用到 kernel 权值矩阵的正则化函数(详见 regularizer)。
bias_regularizer: 运用到偏置向的的正则化函数(详见 regularizer)。
activity_regularizer: 运用到层的输出的正则化函数(它的 “activation”)。(详见 regularizer)。
kernel_constraint: 运用到 kernel 权值矩阵的约束函数(详见 constraints)。
bias_constraint: 运用到偏置向量的约束函数(详见 constraints)。

2.4 Dropout

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

将 Dropout 应用于输入。Dropout 包括在训练中每次更新时,将输入单元的按比率随机设置为 0,这有助于防止过拟合。
rate: 在 0 和 1 之间浮动。需要丢弃的输入比例。
noise_shape: 1D 整数张量,表示将与输入相乘的二进制 dropout 掩层的形状。例如,如果你的输入尺寸为(batch_size, timesteps, features),然后你希望 dropout 掩层在所有时间步都是一样的,你可以使用 noise_shape=(batch_size, 1, features)。
seed: 一个作为随机种子的 Python 整数。
Dropout: A Simple Way to Prevent Neural Networks from Overfitting

2.5 Flatten

keras.layers.Flatten(data_format=None)
将输入展平。不影响批量大小。

3.模型编译

3.1 编译

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

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

参数:
optimizer: 字符串(优化器名)或者优化器实例。详见 optimizers。
loss: 字符串(目标函数名)或目标函数。详见 losses。如果模型具有多个输出,则可以通过传递损失函数的字典或列表,在每个输出上使用不同的损失。模型将最小化的损失值将是所有单个损失的总和。
metrics: 在训练和测试期间的模型评估标准。通常你会使用 metrics = [‘accuracy’]。
要为多输出模型的不同输出指定不同的评估标准,还可以传递一个字典,如 metrics = {‘output_a’:‘accuracy’}。
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 参数指定它们。它可以是单个张量(单输出模型),张量列表,或一个映射输出名称到目标张量的字典。
**///kwargs: 当使用 Theano/CNTK 后端时,这些参数被传入 K.function。
当使用 TensorFlow 后端时,这些参数被传递到 tf.Session.run。

3.2 优化器 (optimizer)

各种优化器的总结 https://ruder.io/optimizing-gradient-descent/
中文版总结摘录:https://www.cnblogs.com/zhangbojiangfeng/p/6362963.html
sgd = keras.optimizers.SGD(lr=0.01, momentum=0.0, decay=0.0, nesterov=False)

3.3 fit

model.fit(x=x_train, y=y_train, epochs=epochs, batch_size=32, verbose=2)

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)

参数:
x: 训练数据的 Numpy 数组(如果模型只有一个输入),或者是 Numpy 数组的列表(如果模型有多个输入)。如果模型中的输入层被命名,你也可以传递一个字典,将输入层名称映射到 Numpy 数组。如果从本地框架张量馈送(例如 TensorFlow 数据张量)数据,x 可以是 None(默认)。
y: 目标(标签)数据的 Numpy 数组(如果模型只有一个输出),或者是 Numpy 数组的列表(如果模型有多个输出)。如果模型中的输出层被命名,你也可以传递一个字典,将输出层名称映射到 Numpy 数组。如果从本地框架张量馈送(例如 TensorFlow 数据张量)数据,y 可以是 None(默认)。
batch_size: 整数或 None。每次梯度更新的样本数。如果未指定,默认为 32。
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 数据的最后一部分样本中。
validation_data: 元组 (x_val,y_val) 或元组 (x_val,y_val,val_sample_weights),用来评估损失,以及在每轮结束时的任何模型度量指标。模型将不会在这个数据上进行训练。这个参数会覆盖 validation_split。
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”。
initial_epoch: 整数。开始训练的轮次(有助于恢复之前的训练)。
steps_per_epoch: 整数或 None。
在声明一个轮次完成并开始下一个轮次之前的总步数(样品批次)。
使用 TensorFlow 数据张量等输入张量进行训练时,默认值 None 等于数据集中样本的数量除以 batch 的大小,如果无法确定,则为 1。
validation_steps: 只有在指定了 steps_per_epoch 时才有用。停止前要验证的总步数(批次样本)。

Call backs:
You can use callbacks to:

Write TensorBoard logs after every batch of training to monitor your metrics
Periodically save your model to disk
Do early stopping
Get a view on internal states and statistics of a model during training
…and more

3.4 evaluate

score = model.evaluate(x=x_validation, y=y_validation, verbose=0)

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

x: 测试数据的 Numpy 数组(如果模型只有一个输入),或者是 Numpy 数组的列表(如果模型有多个输入)。如果模型中的输入层被命名,你也可以传递一个字典,将输入层名称映射到 Numpy 数组。如果从本地框架张量馈送(例如 TensorFlow 数据张量)数据,x 可以是 None(默认)。
y: 目标(标签)数据的 Numpy 数组,或 Numpy 数组的列表(如果模型具有多个输出)。如果模型中的输出层被命名,你也可以传递一个字典,将输出层名称映射到 Numpy 数组。如果从本地框架张量馈送(例如 TensorFlow 数据张量)数据,y 可以是 None(默认)。
batch_size: 整数或 None。每次评估的样本数。如果未指定,默认为 32。
verbose: 0 或 1。日志显示模式。0 = 安静模式,1 = 进度条。
sample_weight: 测试样本的可选 Numpy 权重数组,用于对损失函数进行加权。
您可以传递与输入样本长度相同的扁平(1D)Numpy 数组(权重和样本之间的 1:1 映射),或者在时序数据的情况下,传递尺寸为 (samples, sequence_length) 的 2D 数组,以对每个样本的每个时间步施加不同的权重。在这种情况下,你应该确保在 compile() 中指定 sample_weight_mode=“temporal”。
steps: 整数或 None。声明评估结束之前的总步数(批次样本)。默认值 None。

返回
标量测试误差(如果模型只有一个输出且没有评估标准)或标量列表(如果模型具有多个输出 和/或 评估指标)。属性 model.metrics_names 将提供标量输出的显示标签。

3.5 predict

predict(x, batch_size=None, verbose=0, steps=None)

参数

x: 输入数据,Numpy 数组
(或者 Numpy 数组的列表,如果模型有多个输出)。
batch_size: 整数。如未指定,默认为 32。
verbose: 日志显示模式,0 或 1。
steps: 声明预测结束之前的总步数(批次样本)。默认值 None。

返回
预测的 Numpy 数组(或数组列表)。

4. 经典网络

4.1 LeNet-5详解

https://cuijiahua.com/blog/2018/01/dl_3.html

4.2 cifar10

基于Keras:CIFAR-10-分类

CNN原理及模型参数相关推荐

  1. 【PEST++】02 新安江模型参数自动率定

    文章目录 PEST++系列文章 一.背景 1.1 模型简介 1.2 PEST++简介 1.3 所用程序 二.原理 2.1 目标函数 2.2 参数范围 三.过程 3.1 准备文件 3.1.1 实测值文件 ...

  2. 基于keras的CNN图片分类模型的搭建以及参数调试

    基于keras的CNN图片分类模型的搭建与调参 更新一下这篇博客,因为最近在CNN调参方面取得了一些进展,顺便做一下总结. 我的项目目标是搭建一个可以分五类的卷积神经网络,然后我找了一些资料看了一些博 ...

  3. 线性方程组数学原理、矩阵原理及矩阵变换本质、机器学习模型参数求解相关原理讨论...

    1. 线性方程组 0x1:无处不在的线性方程组 日常生活或生产实际中经常需要求一些量,用未知数 x1,x2,....,xn表示这些量,根据问题的实际情况列出方程组,而最常见的就是线性方程组(当然并不是 ...

  4. 机器学习——XGBoost大杀器,XGBoost模型原理,XGBoost参数含义

    0.随机森林的思考 随机森林的决策树是分别采样建立的,各个决策树之间是相对独立的.那么,在我们得到了第k-1棵决策树之后,能否通过现有的样本和决策树的信息, 对第m颗树的建立产生有益的影响呢?在随机森 ...

  5. CNN原理与实践指南

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 卷积神经网络CNN是深度学习中的基础知识.本文对CNN的基础原理及 ...

  6. 【深度学习系列】卷积神经网络CNN原理详解(一)——基本原理(1)

    上篇文章我们给出了用paddlepaddle来做手写数字识别的示例,并对网络结构进行到了调整,提高了识别的精度.有的同学表示不是很理解原理,为什么传统的机器学习算法,简单的神经网络(如多层感知机)都可 ...

  7. 系统学习深度学习(四) --CNN原理,推导及实现源码分析

    之前看机器学习中,多层感知器部分,提到可以在设计多层感知器时,对NN的结构设计优化,例如结构化设计和权重共享,当时还没了解深度学习,现在看到CNN,原来CNN就是这方面的一个代表.CNN由纽约大学的Y ...

  8. Pytorch 如何 优化/调整 模型参数

    Pytorch 如何自动优化/调整 模型超参 文章目录 Pytorch 如何自动优化/调整 模型超参 背景 优化模型参数 贝叶斯优化 深度学习框架下的参数优化 平台安装 使用参考 参考 背景 对于优化 ...

  9. bert cnn知识抽取模型_BERT的神奇应用

    注:本文已首发到机器之心上. 作者:Zeng Xiangji; 编辑:Hao Wang 引言:2019年5月ACM图灵大会上,朱松纯教授(加州大学洛杉矶分校)与沈向洋博士(微软全球执行副总裁)在谈到& ...

最新文章

  1. MBG 相关资源链接
  2. ajax如何将数据写入文本框,ajax 从数据库读到文本框
  3. redis hash 储存mysql_Redis系列-存储hash主要操作命令
  4. 自学python免费教材-Python 有哪些入门学习方法和值得推荐的经典教材?
  5. Web 2.0下一个版本是什么 3.0就要到来了吗?
  6. AjaxUpload
  7. 聊天室软件(服务器+图形界面客户端)
  8. 大气压力换算公式_大气压换算公式(大气压与温度换算公式)
  9. 计算机上数字代表那个音符,音符时值
  10. 分类问题——逻辑回归与XGBoost
  11. 关闭和重启脚本合二为一orderlist.sh
  12. Datawhale- DS- Jun - 第一章:第一节数据载入及初步观察-课程
  13. 生僻字用计算机的歌词,生僻字歌词翻译成常用汉字 陈柯宇生僻字歌曲翻译谐音版...
  14. 炒白菜怎么做(保姆级教程 爸妈吃了都说好)
  15. springboot搭建redis时提示RedisCommandExecutionException: CLUSTERDOWN Hash slot not served解决办法
  16. 景联文科技:为扫地机器人AI训练提供数据采集标注解决方案
  17. 17 重定向(Redirect) vs 转发(Forward)
  18. 百度地图 - 添加区划覆盖物 - 循环打点
  19. 单向链表的创建与遍历(先进先出和先进后出)
  20. 有理数加法 (15分)(PTA)

热门文章

  1. ORACLE ASSETS 11i资产管理
  2. 汉澳sinox2019操作系统AI企业版发布
  3. java web logout_java – spring-security login?logout重定向到登录
  4. 【drag】HTML5 drag API
  5. 卓越人生的两大利器——任务分解与保持节奏
  6. java中容易产生空指针异常:NullPointerException的场景
  7. 朱会灿:搜索引擎演变史【腾讯大讲堂第3期】
  8. 盛世传承“富三代”品牌让你的家族基业长青
  9. zookeeper 监控
  10. Eclipse 插件大全