padding和卷积的区别_TF2.0 卷积CBAPD特征提取器+六步法【卷积+BN+激活+丢弃+池化】实现Baseline基准神经网络cifar10分类...

目录:

〇.引言

           -为什么要有卷积层?

               -什么是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()展成一维】

cc32e276e6709f7b257d06f2a9198386.png

我们可以看到:仅仅两层全连接层网络,就有一万多的参数。 正如在机器学习中,我们拿超高阶方程去拟合带噪声的一元线性方程,立即会产生过拟合现象。因此需要一个来 提取特征的东西——卷积层
问题二:什么是CBAPD特征处理器? 文中会对每部分CBAPD的意义,函数,选择建议详细说明 卷积-BN-激活-池化-舍弃(可不丢弃) d021e91ac3941d00780d1ae0c9c3ac6b.png

e98e4c8a29fadc45d8df9c81a7c6e066.png   

本文实践对cifar10数据集的Baseline网络的搭建

【baseline基准:就是很差效果的模型】

e96368e71b86b182c6f676ceffb58589.png

Ⅰ.卷积

①为何有卷积层出现:    

    引言中提到:之前建模的两层全连接层,参数有101770个之多。 

    这还只是针对 28*28的单通道图片 

241000c4883302a04e65d547a5da1bc0.png

    实际项目中:多是高分辨率彩色图【红绿蓝三通道】

能否将这种图片也送入全连接网络?不可。

        送入全连接网络的输入特征数过多,随着影藏层数目增加,网络规模过大,待优化的参数就会过多,极容易导致模型过拟合

5306977b8f24bca5ceba5fc5c9252e39.png

为了减少待训练参数,实际应用时会先对原始图片进行若干层特征提取,因此发明了卷积层。

②卷积运算作用和过程:2ace8eb179e117ca51359d828018d555.png

③卷积核的深度,卷积核的个数

4fc35298717de0a07799220e2a2a4e05.png

④常用卷积核:3*3*1,3*3*3,5*5*3:

04e456607591ce40771d79d5813d0f3f.png

⑤卷积运算的过程:

69af37f615dff376ee4d02fbd08a1796.png

Ⅱ.感受野与Padding

①感受野是什么?    

    指输出特征图中的每个像素点,映射到原始输入图片的区域大小

    是卷积核的特征提取能力!

②为什么常用3*3而不是用5*5? 这两者感受野是一样的

d56c6909f39de733eae6a83368376359.png

③如何使得卷积运算保持输入特征的尺度呢?Padding

bdde8d9a2d3ca0e3c62d52818d426077.png

④怎么算出特征图边长?

ea306356a17ef39319424e22b6351dc0.png

Ⅲ.C:TF描述Conv2D

747051fbd3451192b5ccc3830e671d0f.png

Ⅳ.B:BN层批标准化

①为什么要有BN?

e47729a423ab2252361da806412514fc.png

e734c7f21d85c71b3579b4d5c10b7181.png

②BN的计算方式:

e1aba2cf91bf7587b563a3c0bb4697f0.png

③为什么要用BN?

d496d41ca0991331450116bcb778bf27.png

④BN不只是作最简单的标准化-MEAN:0,标准差:1

   其还引入了缩放因子,和偏移因子

4b3902afdc949ee62cd1173a67c44324.png

⑤BN用在哪?

d60fa1f517d6df801f28b74a018f1b57.png

Ⅴ.P:Pooling池化层

①池化的作用和主要方法

8f39f7c9559a242a056017050f936c97.png

②池化函数:

cb89088b3151123bf30896afefbaf04f.png

Ⅵ.D:Dropout舍弃层

0c63b43fcd12d725e4fcf3188a979018.png

Ⅶ.Basline六步法+CBAPD

数据集:cifar10

1a3ec49eeb0d6de11c04f44f34dae298.png

提供5万张 32*32 像素点的10分类彩色图片和标签,用于训练

提供1万张 32*32 像素点的10分类彩色图片和标签,用于测试

    Baseline模型

e96368e71b86b182c6f676ceffb58589.png

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模型:

0f3375f6a3b84980d789700972515450.png

训练过程:

f308d87d7cf9359f4ec417cb4fd113ab.png

acc/loss可视化:

14c2405ad48951c4bd78f56dba60a9f2.png


小结:

    每一部分的知识都是精心总结,在此不再总结。

    CBAPD+六步法搭建神经网络模型,是惯用套路。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值