目录:
〇.引言
-为什么要有卷积层?
-什么是CBAPD?
Ⅰ.卷积
-卷积计算过程
-常用卷积核:3*3*1,3*3*3,5*5*3
Ⅱ.感受野,全0填充Padding
-两层3*3卷积和一层5*5卷积的区别
Ⅲ. C:TF2.0描述卷积层Conv2D
Ⅳ. B:BN层批标准化
-使得微小特征能够更明显的提现到激活函数
-引入缩放因子和偏移因子,随其他训练参数一同优化
-BN用在哪?卷积之后,激活之前
A:Activation('relu'/'sigmoid'/'tanh'/'softmax)激活
Ⅴ:P:Pooling池化层
-最大池化:提取图片纹理
-平均池化:保留特征
Ⅶ:D:Dropout舍弃
-缓解过拟合,
-按一定比例临时舍弃部分神经元,使用时候依旧恢复
Ⅷ:六步法【使用class】+CBAPD建模
-对cifar10数据集建立baseline网络
〇.引言(目录)
问:卷积是什么?
答:特征提取器CBAPD
引言:
问题一:为什么要有卷积层?
提取特征,降低参数量
要记住:卷积层=特征提取器,且有套路CBAPD
之前使用的是mnist也好,fashion数据集,都是:28*28的单通道灰度图象。且我们仅仅使用了神经网络中的全连接Dense层。
使用的模型如下:两层全连接层
【ps:全连接层是用来接受输入特征的,输入全连接层前必定要先Flatten()展成一维】
我们可以看到:仅仅两层全连接层网络,就有一万多的参数。 正如在机器学习中,我们拿超高阶方程去拟合带噪声的一元线性方程,立即会产生过拟合现象。因此需要一个来 提取特征的东西——卷积层 。问题二:什么是CBAPD特征处理器? 文中会对每部分CBAPD的意义,函数,选择建议详细说明 卷积-BN-激活-池化-舍弃(可不丢弃)
本文实践对cifar10数据集的Baseline网络的搭建
【baseline基准:就是很差效果的模型】
Ⅰ.卷积
①为何有卷积层出现:
引言中提到:之前建模的两层全连接层,参数有101770个之多。
这还只是针对 28*28的单通道图片
实际项目中:多是高分辨率彩色图【红绿蓝三通道】
能否将这种图片也送入全连接网络?不可。
送入全连接网络的输入特征数过多,随着影藏层数目增加,网络规模过大,待优化的参数就会过多,极容易导致模型过拟合!
为了减少待训练参数,实际应用时会先对原始图片进行若干层特征提取,因此发明了卷积层。
②卷积运算作用和过程:
③卷积核的深度,卷积核的个数
④常用卷积核:3*3*1,3*3*3,5*5*3:
⑤卷积运算的过程:
Ⅱ.感受野与Padding
①感受野是什么?
指输出特征图中的每个像素点,映射到原始输入图片的区域大小
是卷积核的特征提取能力!
②为什么常用3*3而不是用5*5? 这两者感受野是一样的
③如何使得卷积运算保持输入特征的尺度呢?Padding
④怎么算出特征图边长?
Ⅲ.C:TF描述Conv2D
Ⅳ.B:BN层批标准化
①为什么要有BN?
②BN的计算方式:
③为什么要用BN?
④BN不只是作最简单的标准化-MEAN:0,标准差:1
其还引入了缩放因子,和偏移因子
⑤BN用在哪?
Ⅴ.P:Pooling池化层
①池化的作用和主要方法
②池化函数:
Ⅵ.D:Dropout舍弃层
Ⅶ.Basline六步法+CBAPD
数据集:cifar10
提供5万张 32*32 像素点的10分类彩色图片和标签,用于训练
提供1万张 32*32 像素点的10分类彩色图片和标签,用于测试
Baseline模型
import tensorflow as tfimport osimport numpy as npfrom matplotlib import pyplot as pltfrom tensorflow.keras.layers import Conv2D, BatchNormalization, Activation, MaxPool2D, Dropout, Flatten, Densefrom tensorflow.keras import Modelcifar10 = tf.keras.datasets.cifar10(x_train,y_train),(x_test,y_test) = cifar10.load_data()x_train,x_test = x_train/255.,x_test/255.#搭建网络(当网络复杂时候用class类)class Baseline(Model): def __init__(self): super(Baseline, self).__init__() self.c1 = Conv2D(filters=6, kernel_size=(5,5),strides=1,padding='same')# C self.b1 = BatchNormalization() # B self.a1 = Activation('relu')# A self.p1 = MaxPool2D(pool_size=(2*2),strides=2,padding='same')# P self.d1 = Dropout(0.2) # 输入到密集层必须把输入特征都展成一维,送入全连接 self.flatten = Flatten() self.f1 = Dense(128,activation='relu') # 按20%比例随机休眠神经元 self.d2 = Dropout(0.2) self.f2 = Dense(10,activation='softmax')# 十分类:softmax使得输出符合概率分布 # 向前传播,从输入到输出返回推理结果y def call(self,x): x = self.c1(x) x = self.b1(x) x = self.a1(x) x = self.p1(x) x = self.d1(x) x = self.flatten(x) x = self.f1(x) x = self.d2(x) y = self.f2(x) return y model = Baseline()model.compile(optimizer = 'adam', loss = tf.keras.losses.SparseCategoricalCrossentropy(from_logits=False), metrics = ['sparse_categorical_accuracy'])#存模型checkpoint_save_path = "./checkpoint/Baseline.ckpt"if os.path.exists(checkpoint_save_path+'./index'): print('——————加载模型——————') model.load_weights(checkpoint_save_path)cp_callback = tf.keras.callbacks.ModelCheckpoint(filepath=checkpoint_save_path, save_weights_only=True, save_best_only=True) #训练history = model.fit(x_train,y_train,batch_size=32,epochs=5, validation_data=(x_test,y_test),validation_freq=1,callbacks=[cp_callback])model.summary# 记录权重file = open('./weights.txt', 'w')for v in model.trainable_variables: file.write(str(v.name) + '\n') file.write(str(v.shape) + '\n') file.write(str(v.numpy()) + '\n')file.close()# 显示训练集和验证集的acc和loss曲线plt.rcParams['font.sans-serif'] = ['SimHei']acc = history.history['sparse_categorical_accuracy']val_acc = history.history['val_sparse_categorical_accuracy']loss = history.history['loss']val_loss = history.history['val_loss']plt.subplot(1, 2, 1)plt.plot(acc, label='训练集准确度')plt.plot(val_acc, label='测试集准确度')plt.ylim(0,0.8)plt.title('准确度')plt.legend()plt.subplot(1, 2, 2)plt.plot(loss, label='训练集损失')plt.plot(val_loss, label='测试集损失')plt.title('损失')plt.legend()plt.show()
baseline模型:
训练过程:
acc/loss可视化:
小结:
每一部分的知识都是精心总结,在此不再总结。
CBAPD+六步法搭建神经网络模型,是惯用套路。