对CNN经典案例学习的笔记总结
所用到的所用函数库(有些可能已经植入到别的库)
import pandas as pd # 我们十分熟悉的pandas库,用于对数据的获取与处理
import numpy as np
import matplotlib.pyplot as plt # 图形绘制库
import matplotlib.image as mpimg # 这里好像没有用到
import seaborn as sns # 同样是绘图库
%matplotlib inline # 使图像能jupyter 中直接显示
np.random.seed(2)
from sklearn.model_selection import train_test_split # 用于数据分离
from sklearn.metrics import confusion_matrix #
import itertools
from keras.utils.np_utils import to_categorical # convert to one-hot-encoding
from keras.models import Sequential # 用来建立模型很重要
from keras.layers import Dense, Dropout, Flatten, Conv2D, MaxPool2D # 各种神经网路所需要的层
from keras.optimizers import RMSprop # 优化器
from keras.preprocessing.image import ImageDataGenerator # 数据增强器
from keras.callbacks import ReduceLROnPlateau
sns.set(style='white', context='notebook', palette='deep')
数据整理
1.加载数据
pd.read_csv
2,将数据分为标签集与特征集
例如下面的例子
Y_train = train["label"]
X_train = train.drop(labels = ["label"],axis = 1)
drop():
参数:
labels:要删除的行或者列的标签,
axis:要删除的行或者列的轴,0表示行,1表示列
index:行的索引
conlunmns:列名
inplace:是否在原Dataset上操作一般默认False
操作后记得删除原数据集
3.检查数据是否有遗漏
这里我们可以使用isnull.any().describle()用来判断每一列是否有残缺值,会返回一个布尔类型的Series
X_train.isnull().any().describe()
3.归一化处理
例如一个灰度图像,那么对每个数据集/255(最大灰度值)
# Normalize the data
X_train = X_train / 255.0
test = test / 255.0
4.重塑处理
X_train = X_train.values.reshape(-1,28,28,1)
test = test.values.reshape(-1,28,28,1)
使用 .values 将其转换为 NumPy 数组后,通过 .reshape() 方法将其形状调整为四维的张量。
reshape()作用于对形状的调整:
-1 表示根据其他维度的大小自动计算该维度的大小,以保持数据总量不变。因为为灰度图像所以通道数为1.
5.独热编码
作用:将标签归一化
Y_train = to_categorical(Y_train, num_classes = 10)
to_categorical(y, num_classes=None):
y:待转换的整数标签数组或列表。
num_classes:可选参数,表示输出的类别数量。如果不指定,则会根据 y 中的唯一值自动确定。
函数返回一个矩阵,其中每一行都是对应标签的独热编码表示。
6.分离训练集与测试集
# Set the random seed
random_seed = 2
# Split the train and the validation set for the fitting
X_train, X_val, Y_train, Y_val = train_test_split(X_train, Y_train, test_size = 0.1, random_state=random_seed)
train_test_split 函数会按照指定的比例(test_size = 0.1 表示验证集占总数据的10%)将输入的训练数据 X_train 和标签 Y_train 划分为训练集和验证集。random_state=random_seed 用于设定随机种子,以确保每次运行时划分的结果一致。
7.观察其中一个例子
g = plt.imshow(X_train[0][:,:,0])
切片操作:行,列,通道
inshow():
cmap:指定颜色映射,用于控制图像的颜色显示方式,常见的取值有 ‘viridis’、‘gray’、‘hot’ 等。
aspect:指定纵横比,可以设置为 ‘auto’、‘equal’ 等。
interpolation:指定插值方法,控制图像放大或缩小时的像素插值方式,常见取值有 ‘nearest’、‘bilinear’、‘bicubic’ 等。
alpha:指定透明度,用于调整图像的透明度,取值范围为 0~1。
extent:指定图像显示范围,以列表形式传入 [xmin, xmax, ymin, ymax]。
vmin 和 vmax:指定显示的数值范围,用于控制图像显示的亮度和对比度。
origin:指定图像的原点位置,可以选择 ‘upper’ 或 ‘lower’。
CNN模型的构建
1.建立模型
model = Sequential()
Sequential()为keras库的函数
2.构建网络神经
model.add(Conv2D(filters = 32, kernel_size = (5,5),padding = 'Same',
activation ='relu', input_shape = (28,28,1)))
model.add(Conv2D(filters = 32, kernel_size = (5,5),padding = 'Same',
activation ='relu'))
model.add(MaxPool2D(pool_size=(2,2)))
model.add(Dropout(0.25))
Sequential()用于建立一个模型
各个参数的作用:
Conv2D: 这是一个用于在 Keras 模型中添加 2D 卷积层的函数。
filters = 32: 这指定了卷积层的卷积核个数,也就是输出的通道数(也可以理解为提取的特征数)。
kernel_size = (5,5): 这表示卷积核的大小为 5x5。
padding = ‘Same’: 使用 ‘same’ padding 表示在进行卷积操作时会在输入图像的边缘补零,以保持输出特征图与输入特征图相同的尺寸(能够对边缘数据充分利用)
activation = ‘relu’: 这表示在卷积层后使用 ReLU 激活函数来引入非线性。
input_shape = (28,28,1): 这是输入数据的形状,表示输入图像的尺寸为 28x28,并且是单通道的 (灰度图像)。
MaxPool2D:提取最大特征的池化层
Dropout(0.25):随机去除百分之25的神经元
3.输出
model.add(Flatten())
model.add(Dense(256, activation = "relu"))
model.add(Dropout(0.5))
model.add(Dense(10, activation = "softmax"))
Flatten():将所提取的特征数据转化为一维向量
Dense(256, activation = “relu”):全连接层,含有256个神经元,并使用激活函数relu引入非线性
softmax():正则化操作,令输出的特征值为概率值
4.定义优化器
optimizer = RMSprop(lr=0.001, rho=0.9, epsilon=1e-08, decay=0.0)
每个参数的含义:
lr:学习率(learning rate)
学习率决定了每次参数更新的步长或速度。较高的学习率可能导致模型无法收敛,而较低的学习率可能导致训练时间过长。在这里,学习率被设置为 0.001。
rho:衰减率(decay rate)
衰减率用于计算梯度平方的指数加权平均值。它表示了之前梯度平方的重要性,对应于 RMSprop 算法中的动量项。在这里,衰减率被设置为 0.9。
epsilon:数值稳定性参数
epsilon 是一个非常小的数,用于防止除以零的数值稳定性问题。在这里,epsilon 被设置为 1e-08。
decay:学习率衰减
学习率衰减是指在训练过程中逐渐降低学习率的过程。通过衰减学习率,可以使模型更好地收敛到最优解。在这里,学习率衰减被设置为 0.0,即没有学习率衰减。
5.定义训练模型
model.compile(optimizer = optimizer , loss = "categorical_crossentropy", metrics=["accuracy"])
参数含义:
优化器为上代码段定义的optimizer,损失函数为交叉熵损失函数,以准确值为评估指标。
# Set a learning rate annealer
learning_rate_reduction = ReduceLROnPlateau(monitor='val_acc',
patience=3,
verbose=1,
factor=0.5,
min_lr=0.00001)
参数作用:
monitor:检测指标,这里以验证的准确性为检测指标
patience:当验证指标在经过多少个 epoch 后仍然没有改善时,就会触发学习率的调整
verbose:1为详细模式,0为简略模式
factor:当验证指标不再改善时,学习率将被缩小的因子。
min_lr:最小学习率
epochs = 1 # Turn epochs to 30 to get 0.9967 accuracy
batch_size = 86
设置该回调函数(在深度学习中,回调函数对于监控和改进模型训练过程非常有用)的参数:步数为1,一次打包86个样本
数据增强
我们知道在样本数量有限的情况下,容易出现过拟合的情况所以这里使用样本增强的方法来避免这种情况
datagen = ImageDataGenerator(
featurewise_center=False, # set input mean to 0 over the dataset
samplewise_center=False, # set each sample mean to 0
featurewise_std_normalization=False, # divide inputs by std of the dataset
samplewise_std_normalization=False, # divide each input by its std
zca_whitening=False, # apply ZCA whitening
rotation_range=10, # randomly rotate images in the range (degrees, 0 to 180)
zoom_range = 0.1, # Randomly zoom image
width_shift_range=0.1, # randomly shift images horizontally (fraction of total width)
height_shift_range=0.1, # randomly shift images vertically (fraction of total height)
horizontal_flip=False, # randomly flip images
vertical_flip=False) # randomly flip images
datagen.fit(X_train)
看不懂,以后一定得补充
拟合模型
history = model.fit_generator(datagen.flow(X_train,Y_train, batch_size=batch_size),
epochs = epochs,
validation_data = (X_val,Y_val),verbose = 2,
steps_per_epoch=X_train.shape[0] // batch_size,
callbacks=[learning_rate_reduction])
参数的作用解释:
datagen.flow(X_train, Y_train, batch_size=batch_size):生成器函数,用于从训练集中生成批量的图像数据和对应的标签。
epochs:整数值,表示训练周期的数量。
validation_data=(X_val, Y_val):用于验证模型性能的数据集,包括验证图像数据和对应的标签。
verbose:整数值,控制训练过程中打印信息的详细程度。0表示不打印任何信息,1表示打印进度条,2表示打印每个epoch的详细信息。
steps_per_epoch:整数值,表示每个epoch中迭代的次数。通常设置为训练集总样本数除以批次大小。
callbacks=[learning_rate_reduction]:回调函数列表,用于在训练过程中执行特定操作。在这个例子中,learning_rate_reduction是一个学习率衰减的回调函数,在训练过程中动态地调整学习率。