卷积神经网络学习笔记
一、卷积神经网络相关定义
卷积层(Convolutional layer):卷积神经网路中每层卷积层由若干卷积单元组成,每个卷积单元的参数都是通过反向传播算法优化得到的。通过卷积运算提取输入的不同特征实现特征映射。
(1)、卷积核(convolutional kernel)
卷积层的功能是对输入数据进行特征提取,其内部包含多个卷积核,组成卷积核的每个元素都对应一个权重系数和一个偏差量(bias vector),类似于一个前馈神经网络的神经元(neuron)。卷积层内每个神经元都与前一层中位置接近的区域的多个神经元相连,区域的大小取决于卷积核的大小
(2)、卷积层参数
卷积层参数包括卷积核大小、步长和填充,三者共同决定了卷积层输出特征图的尺寸,是卷积神经网络的超参数 。其中卷积核大小可以指定为小于输入图像尺寸的任意值,卷积核越大,可提取的输入特征越复杂 。
卷积层通常使用3x3或5x5的窗口,默认步幅为1 。
(3)、激励函数(activation function)
常用线性修正单元ReLU
线性整流层(Rectified Linear Units layer, ReLU layer ) :这一层神经的活性化函数(Activation function)使用线性整流(Rectified Linear Units, ReLU)f(x)=max(0,x)。
池化层(Pooling layer) :下采样,通常在卷积层之后会得到维度很大的特征,将特征切成几个区域,取其最大值或平均值,得到新的、维度较小的特征。
使用池化层的目的是对特征图进行下采样,通常在卷积层之后跟一层池化层,使用MaxPooling2D通过最大池化运算,特征图尺寸减半。
最大池化 :从输入特征图中提取窗口,并输出每个通道最大值。使用硬编码的max张量运算对局部图块进行变换而不是使用已经学到的卷积核线性变换。通常使用2*2的窗口和步幅2 。
进行下采样的原因:减少特征图需要处理的元素个数,通过让连续卷积层的观察窗口越来越大,引入空间过滤器的层级结构。
全连接层( Fully-Connected layer) :把所有局部特征结合变成全局特征,用来计算最后每一类的得分。
二、基本步骤
在keras模型中添加卷积层
tensorflow 代码:
卷积层
#卷积层:
tf.nn.conv2d(input, filter, strides, padding, use_cudnn_on_gpu=None, data_format=None, name=None)
每个 Conv2D 层输出的通道数量 (channels) 取决于声明层时的第一个参数。
filter:卷积核是一个4维格式的数据:shape表示为[height,width,in_channels, out_channels],分别表示卷积核的高、宽、深度(与输入的in_channels应相同)、输出 feature map的个数(即卷积核的个数)。
strides:表示步长。
padding:表示填充方式:“SAME”表示采用填充的方式,简单地理解为以0填充边缘,当stride为1时,输入和输出的维度相同;“VALID”表示采用不填充的方式,多余地进行丢弃。
#池化层:
tf.nn.max_pool( value, ksize,strides,padding,data_format=’NHWC’,name=None)
#或者
tf.nn.avg_pool(…)
#Batch Nomalization层:
batch_normalization( x,mean,variance,offset,scale, variance_epsilon,name=None)
三、数据增强
1、基本原理
从现有的训练样本中生成更多的数据
方法:利用可生成可信图像的随机变换来增加样本数量。
2、keras实现
(1)利用ImageDataGenerator来设置数据增强
#keras
#利用ImageDataGenerator来设置数据增强#参数设置:
rotation_range :角度值(0~180),表示图像随机旋转角度范围
width_shift或height_shift:垂直或水平方向平移范围
shear_range:随机错切变换角度
zoom_range:随机缩放范围
horizontal_flip:随机将一半图像水平翻转
fill_mode:填充新创建像素方法
datagen = ImageDataGenerator(
rotation_range = 40, #图像随机旋转角度范围40°
horizontal_flip = True,
....
)
(2)使用Keras preprocessing layers
常见用法:
#随机翻转类:在水平方向和垂直方向上随机翻转每张图像。
#mode:“horizontal”, “vertical”, or “horizontal_and_vertical”.默认 “horizontal_and_vertical”.
tf.keras.layers.experimental.preprocessing.RandomFlip(
mode=HORIZONTAL_AND_VERTICAL, seed=None, name=None, **kwargs
)#图像大小调整
tf.keras.layers.experimental.preprocessing.Resizing(
height, width, interpolation=‘bilinear’, name=None, **kwargs
)#缩放:将输入乘以比例并添加偏移量
tf.keras.layers.experimental.preprocessing.Rescaling(
scale, offset=0.0, name=None, **kwargs
)
#keras.layers.experimental.preprocessing.namespace
resize_and_rescale = tf.keras.Sequential([
layers.experimental.preprocessing.Resizing(IMG_SIZE, IMG_SIZE),
layers.experimental.preprocessing.Rescaling(1./255)
])
#在水平方向和垂直方向上随机翻转每张图像
data_augmentation = tf.keras.Sequential([
layers.experimental.preprocessing.RandomFlip("horizontal_and_vertical"),
layers.experimental.preprocessing.RandomRotation(0.2),
])
该详见官方文档:Module: tf.keras.layers.experimental.preprocessing
3、卷积神经网络中的应用
使用上述数据增强方法关联度仍然很高,无法有效降低过拟合,因此在神经网络模型中加入dropout层,添加在密集连接分类器(见下方常用代码注释)之前。
dropout正则化见神经网络基础笔记
四、常用代码
#卷积层
tf.nn.conv2d(input, filter, strides, padding, use_cudnn_on_gpu=None, data_format=None, name=None)
#池化层
keras.layers.MaxPooling2D((2, 2))
#分类器
keras.layers.Flatten()
keras.layers.Dense(128,activation=tf.nn.relu)
keras.layers.Dense(10,activation=tf.nn.softmax)
#查看模型结构
model.summary()
#训练模型
model.compile(optimizer=tf.optimizers.Adam(),loss=tf.losses.sparse_categorical_crossentropy,metrics=['accuracy'])
model.fit(train_images_scaled,train_labels,epochs=5)
#保存模型
model.save('file_name.h5')
keras图像处理辅助工具模块keras.preprocessing.image
五、实验代码
#标签分类
class_names = ['T-shirt/top', 'Trouser', 'Pullover', 'Dress', 'Coat',
'Sandal', 'Shirt', 'Sneaker', 'Bag', 'Ankle boot']
#加载数据集
from tensorflow import keras
import tensorflow as tf
fashion_mnist=keras.datasets.fashion_mnist
(train_images,train_labels),(test_images,test_labels)=fashion_mnist.load_data()
#数据预处理
plt.figure()
plt.imshow(train_images[0])
plt.colorbar()
plt.grid(False)
plt.show()
#构造神经元模型
#增加卷积层
model=keras.Sequential([
keras.layers.Conv2D(64, (3, 3), activation='relu', input_shape=(28,28,1)),
keras.layers.MaxPooling2D((2, 2)),
keras.layers.Conv2D(64, (3, 3), activation='relu'),
keras.layers.MaxPooling2D((2, 2)),
#分类器
keras.layers.Flatten(),
keras.layers.Dense(128,activation=tf.nn.relu),
keras.layers.Dense(10,activation=tf.nn.softmax)
])
#训练评估模型
train_images_scaled=train_images/255 #此处为了训练效果更好使其为0-1之间的数
model.compile(optimizer=tf.optimizers.Adam(),loss=tf.losses.sparse_categorical_crossentropy,metrics=['accuracy'])
model.fit(train_images_scaled.reshape(-1,28,28,1),train_labels,epochs=5)
#评估
test_images_scaled=test_images/255
model.evaluate(test_images_scaled.reshape(-1,28,28,1),test_labels)
#预测
#可以附加一个 softmax 层,将 logits 转换成更容易理解的概率
import numpy as np
probability_model = tf.keras.Sequential([model,
tf.keras.layers.Softmax()])
#预测测试集中所有模型的标签
predictions = probability_model.predict(test_images_scaled.reshape(-1,28,28,1))
np.argmax(predictions[0]) #查看置信度最大的标签
test_labels[0]
六、使用预训练的卷积神经网络
结语
模型最后一层激活函数及损失函数的选择参考另一篇笔记神经网络基础笔记
相关数学原理吴恩达教学视频
tensorflow官方学习文档
https://tensorflow.google.cn/tutorials/images/cnn