⚽开发平台:jupyter lab
🎈运行环境:python3、TensorFlow2.x
第6章 ResNet实现神经网络的飞跃 | 使用ResNet对CIFAR数据集进行分类
1. 背景介绍
1.1ResNet的出现
(1) 卷积神经网络(VGG)存在的问题:根据实验发现,随着卷积神经网络层数的加深,会出现另一个问题,即在训练集上准确率难以达到100%正确,甚至产生了下降(并不能强行解释为“过拟合”,这个问题被称为“神经网络退化”)。
(2) 神经网络退化问题说明:卷积神经网络不能够被简单的使用对基层书的方法进行优化!
-------------------------------分割-------------------------------
(3) ResNet的出现:彻底改变了VGG系列所带来的的固定思维,提出了采用模块化的思想来代替整体的卷积层,通过一个个模块的堆叠来代替不断增加的卷积层。
(4) ResNet常用于:对象检测、人脸识别。
-------------------------------分割-------------------------------
(5) ResNet通过“直连”和“模块”的方法开创了一个时代,改变了人们仅仅依靠堆积神经网络层来获取更高性能的做法,在一定层度上解决了梯度消失和梯度爆炸的问题。
(6) 当简单的堆积神经网络层的做法失效时,人们开始采用模块化的思想设计网络,同时在不断“加宽”模块的内部通道。
1.2 CIFAR-10、CIFAR-100数据集解析和可视化
说明:CIFAR-10、CIFAR-100是两个常用的图像分类数据集。
(1)原因:因为其经常被使用,很多库都有该数据集的加载方法,一般直接调用即可直接构造训练、测试数据集。
(2)问题:然而,这两个数据集到底长什么样子,我们如何用自己的方法把它提取出来呢?
(3)该文章目的:今天,就尝试用我们自定义的方法来提取数据集中的图片、标签、文件名等信息,并进行一个可视化。
链接: CIFAR-10、CIFAR-100数据集解析和可视化
2.数据读取(CIFAR-10为例)
2.1 CIFAR-10-python结构目录图
说明:
(1)data_batch_1 ~ data_batch_5是划分好的训练数据,每个数据里有10000幅图片。
(2)test_batch是测试集数据,也包含10000幅图片。

2.2 显示数据
import pickle ## 因为这几个文件是通过pickle产生的,所以在读取时也许用到这个包
filename = './datasets/cifar-10-python/cifar-10-batches-py/test_batch'
with open(filename,'rb') as f:
dataset = pickle.load(f, encoding='bytes')
print(type(dataset)) ## out:<class 'dict'>
print(dataset.keys())
# out: dict_keys([b'batch_label', b'labels', b'data', b'filenames'])
** 参数说明:
*** dict_keys([b'batch_label', b'labels', b'data', b'filenames'])
1.batch_label:对应的值是一个字符串,用来表明当前文件的一些基本信息。
2.labels:对应的值是一个长度为10000的列表,每个数字取值范围0~9,代表当前图片所属类别。
3.data:10000*3072的二维数组,每一行代表一幅图片的像素值。
filenames:对应一个长度为10000的列表,依次存储图片文件名。
2.3 读取数据的完整代码
* 步骤:
*** 1.导入所需的工具包
*** 2.获取训练集数据
*** 3.获取测试集数据
*** 4.统一获取训练集数据和测试集数据,并返回
*** 5.主函数调用
*
## 1.导入所需的工具包
import pickle
import numpy as np
import os
## 2.获取训练集数据
def get_cifar100_train_data_and_label(root = ''):
def load_file(filename):
with open(filename,'rb') as fo:
data = pickle.load(fo,encoding='latin1')
return data
data_batch_1 = load_file(os.path.join(root,'data_batch_1'))
data_batch_2 = load_file(os.path.join(root,'data_batch_2'))
data_batch_3 = load_file(os.path.join(root,'data_batch_3'))
data_batch_4 = load_file(os.path.join(root,'data_batch_4'))
data_batch_5 = load_file(os.path.join(root,'data_batch_5'))
dataset = []
labelset = []
for data in [data_batch_1,data_batch_2,data_batch_3,data_batch_4,data_batch_5]:
img_data = (data['data'])
img_label = (data['labels'])
dataset.append(img_data)
labelset.append(img_label)
## np.concatenate()是numpy中对array进行拼接的函数
dataset = np.concatenate(dataset)
labelset = np.concatenate(labelset)
return dataset,labelset
## 3.获取测试集数据
def get_cifar100_test_data_and_label(root = ''):
def load_file(filename):
with open(filename,'rb') as fo:
data = pickle.load(fo,encoding='latin1')
return data
data_batch_1 = load_file(os.path.join(root,'test_batch'))
dataset = []
labelset = []
for data in [data_batch_1]:
img_data = (data['data'])
img_label = (data['labels'])
dataset.append(img_data)
labelset.append(img_label)
dataset = np.concatenate(dataset)
labelset = np.concatenate(labelset)
return dataset,labelset
## 4.统一获取训练集数据和测试集数据,并返回
def get_CIFAR100_dataset(root = ''):
train_dataset,label_dataset = get_cifar100_train_data_and_label(root = root)
test_dataset,test_label_dataset = get_cifar100_test_data_and_label(root = root)
return train_dataset,label_dataset,test_dataset,test_label_dataset
## 5.主函数
train_dataset,label_dataset,test_dataset,test_label_dataset = get_CIFAR100_dataset(root='./datasets/cifar-10-python/cifar-10-batches-py/')
** out:
(array([[ 59, 43, 50, ..., 140, 84, 72],
[154, 126, 105, ..., 139, 142, 144],
[255, 253, 253, ..., 83, 83, 84],
...,
[ 35, 40, 42, ..., 77, 66, 50],
[189, 186, 185, ..., 169, 171, 171],
[229, 236, 234, ..., 173, 162, 161]], dtype=uint8),
array([6, 9, 9, ..., 9, 1, 1]),
array([[158, 159, 165, ..., 124, 129, 110],
[235, 231, 232, ..., 178, 191, 199],
[158, 158, 139, ..., 8, 3, 7],
...,
[ 20, 19, 15, ..., 50, 53, 47],
[ 25, 15, 23, ..., 80, 81, 80],
[ 73, 98, 99, ..., 94, 58, 26]], dtype=uint8),
array([3, 8, 8, ..., 5, 1, 7]))
3.使用ResNet对数据集进行分类(以CIFAR-100为例)
3.1 CIFAR-100-python结构目录图

3.2 定义resnet_Model()函数
- RstNet结构图:

ResNet完整地实现需要较高性能的显卡,因此这里对其做了修改,去掉了pooling层,并降低了每次filter的数目和每层的层数。
* 步骤:
*** 1.导入所需的工具包
*** 2.定义resnet_model
*** 3.获取测试集数据
*** 4.统一获取训练集数据和测试集数据,并返回
*** 5.主函数调用
*
### 定义resnet_model
def identity_block(input_tensor,out_dim):
## conv1:为最上层。是模型的输入层,定义了输入的维度,此处:卷积核[7,7],步进[2,2],作为第一层。
### out_dim//4 确保为整数。
conv1 = tf.keras.layers.Conv2D(out_dim//4,kernel_size = 1,padding = 'SAME',activation=tf.nn.relu)(input_tensor)
conv2 = tf.keras.layers.BatchNormalization()(conv1)
conv3 = tf.keras.layers.Conv2D(out_dim//4,kernel_size=3,padding='SAME',activation=tf.nn.relu)(conv2)
conv4 = tf.keras.layers.BatchNormalization()(conv3)
conv5 = tf.keras.layers.Conv2D(out_dim,kernel_size=1,padding='SAME')(conv4)
out = tf.keras.layers.Add()([input_tensor,conv5])
out = tf.nn.relu(out)
return out
def resnet_Model(n_dim = 10):
input_xs = tf.keras.Input(shape = [32,32,3])
conv_1 = tf.keras.layers.Conv2D(filters = 64,kernel_size = 3,padding='SAME',activation=tf.nn.relu)(input_xs)
##[3,4,4,6]
##第一层
out_dim = 64
identity_1 = tf.keras.layers.Conv2D(filters = out_dim,kernel_size=3,padding='SAME',activation=tf.nn.relu)(conv_1)
identity_1 = tf.keras.layers.</

最低0.47元/天 解锁文章
4万+

被折叠的 条评论
为什么被折叠?



