CNN原理及模型参数
CNN原理及参数
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
卷积核大小:55
卷积核种类:6
输出featuremap大小:2828 (32-5+1)=28
神经元数量:28286
可训练参数:(55+1) * 6(每个滤波器55=25个unit参数和一个bias参数,一共6个滤波器)
连接数:(55+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 数组(或数组列表)。